@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
@@ -19,14 +19,44 @@ export declare class Observer<T> {
19
19
  unsubscribe(listener: (data: T) => void): void;
20
20
  notify(data: T): void;
21
21
  }
22
+ export declare class MutationObserver<T> implements IMutationObserver<T> {
23
+ private listeners;
24
+ subscribe(listener: (oldValue: T, newValue: T) => void): void;
25
+ unsubscribe(listener: (oldValue: T, newValue: T) => void): void;
26
+ notify(oldValue: T, newValue: T): void;
27
+ }
28
+ export declare const OBSERVABLE_SYMBOL: unique symbol;
29
+ /**
30
+ * Check if a value is an Observable
31
+ */
32
+ export declare function isObservable<T = any>(value: any): value is Observable<T>;
33
+ /**
34
+ * Observable - простой реактивный контейнер без Proxy.
35
+ *
36
+ * Для доступа к значению используйте getObject():
37
+ * const user = new Observable({ name: 'Alice', age: 25 });
38
+ * user.getObject().name // 'Alice'
39
+ * user.setObject({ name: 'Bob', age: 30 }); // triggers subscribers
40
+ *
41
+ * В шаблонах синтаксис прозрачный:
42
+ * @(user.name) - автоматически распознаётся как user.getObject().name
43
+ */
22
44
  export default class Observable<T> {
23
45
  private object;
24
46
  private observer;
47
+ private mutationObserver;
48
+ readonly [OBSERVABLE_SYMBOL] = true;
25
49
  constructor(object: T);
26
50
  getObject(): T;
27
51
  getObserver(): Observer<T>;
52
+ getMutationObserver(): MutationObserver<T>;
28
53
  subscribe(listener: (data: T) => void): void;
29
54
  unsubscribe(listener: (data: T) => void): void;
55
+ /**
56
+ * Subscribe to mutation events (oldValue, newValue)
57
+ */
58
+ subscribeMutation(listener: (oldValue: T, newValue: T) => void): void;
59
+ unsubscribeMutation(listener: (oldValue: T, newValue: T) => void): void;
30
60
  setObject(object: T): void;
31
61
  }
32
62
  //# sourceMappingURL=Observer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACzB;AACD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CAC1C;AACD,MAAM,WAAW,oBAAoB,CAAC,CAAC,EAAE,CAAC;IACtC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACtE,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACxE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,qBAAa,QAAQ,CAAC,CAAC;IACnB,OAAO,CAAC,SAAS,CAAgC;IAE1C,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAG5C,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAI9C,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;CAG/B;AACD,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,MAAM,EAAE,CAAC;IAId,SAAS,IAAI,CAAC;IAGd,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC;IAI1B,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAG5C,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAI9C,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;CAIpC"}
1
+ {"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"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"}
@@ -10,9 +10,43 @@ export class Observer {
10
10
  this.listeners.forEach(listener => listener(data));
11
11
  }
12
12
  }
13
+ export class MutationObserver {
14
+ listeners = [];
15
+ subscribe(listener) {
16
+ this.listeners.push(listener);
17
+ }
18
+ unsubscribe(listener) {
19
+ this.listeners = this.listeners.filter(l => l !== listener);
20
+ }
21
+ notify(oldValue, newValue) {
22
+ this.listeners.forEach(listener => listener(oldValue, newValue));
23
+ }
24
+ }
25
+ // Symbol to identify Observable instances
26
+ export const OBSERVABLE_SYMBOL = Symbol.for('Observable');
27
+ /**
28
+ * Check if a value is an Observable
29
+ */
30
+ export function isObservable(value) {
31
+ return value && value[OBSERVABLE_SYMBOL] === true;
32
+ }
33
+ /**
34
+ * Observable - простой реактивный контейнер без Proxy.
35
+ *
36
+ * Для доступа к значению используйте getObject():
37
+ * const user = new Observable({ name: 'Alice', age: 25 });
38
+ * user.getObject().name // 'Alice'
39
+ * user.setObject({ name: 'Bob', age: 30 }); // triggers subscribers
40
+ *
41
+ * В шаблонах синтаксис прозрачный:
42
+ * @(user.name) - автоматически распознаётся как user.getObject().name
43
+ */
13
44
  export default class Observable {
14
45
  object;
15
46
  observer = new Observer();
47
+ mutationObserver = new MutationObserver();
48
+ // Mark as Observable
49
+ [OBSERVABLE_SYMBOL] = true;
16
50
  constructor(object) {
17
51
  this.object = object;
18
52
  }
@@ -22,15 +56,29 @@ export default class Observable {
22
56
  getObserver() {
23
57
  return this.observer;
24
58
  }
59
+ getMutationObserver() {
60
+ return this.mutationObserver;
61
+ }
25
62
  subscribe(listener) {
26
63
  this.observer.subscribe(listener);
27
64
  }
28
65
  unsubscribe(listener) {
29
66
  this.observer.unsubscribe(listener);
30
67
  }
68
+ /**
69
+ * Subscribe to mutation events (oldValue, newValue)
70
+ */
71
+ subscribeMutation(listener) {
72
+ this.mutationObserver.subscribe(listener);
73
+ }
74
+ unsubscribeMutation(listener) {
75
+ this.mutationObserver.unsubscribe(listener);
76
+ }
31
77
  setObject(object) {
78
+ const oldObject = this.object;
32
79
  this.object = object;
33
80
  this.observer.notify(this.object);
81
+ this.mutationObserver.notify(oldObject, this.object);
34
82
  }
35
83
  }
36
84
  //# sourceMappingURL=Observer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Observer.js","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACT,SAAS,GAA6B,EAAE,CAAC;IAE1C,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,IAAO;QACjB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;CACJ;AACD,MAAM,CAAC,OAAO,OAAO,UAAU;IACnB,MAAM,CAAI;IACV,QAAQ,GAAgB,IAAI,QAAQ,EAAK,CAAC;IAElD,YAAY,MAAS;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,SAAS;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IACM,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IACM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAEM,SAAS,CAAC,MAAS;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACJ"}
1
+ {"version":3,"file":"Observer.js","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACT,SAAS,GAA6B,EAAE,CAAC;IAE1C,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,IAAO;QACjB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;CACJ;AAED,MAAM,OAAO,gBAAgB;IACjB,SAAS,GAA8C,EAAE,CAAC;IAE3D,SAAS,CAAC,QAA4C;QACzD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACM,WAAW,CAAC,QAA4C;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,QAAW,EAAE,QAAW;QAClC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC;CACJ;AAED,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,YAAY,CAAU,KAAU;IAC5C,OAAO,KAAK,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;AACtD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IACnB,MAAM,CAAI;IACV,QAAQ,GAAgB,IAAI,QAAQ,EAAK,CAAC;IAC1C,gBAAgB,GAAwB,IAAI,gBAAgB,EAAK,CAAC;IAE1E,qBAAqB;IACL,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAE3C,YAAY,MAAS;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,SAAS;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEM,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,mBAAmB;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAEM,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,QAA4C;QACjE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,mBAAmB,CAAC,QAA4C;QACnE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAEM,SAAS,CAAC,MAAS;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;CACJ"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * BalancedParser - утилита для парсинга сбалансированных скобок (), {}.
3
+ * Корректно обрабатывает строки и комментарии.
4
+ */
5
+ export default class BalancedParser {
6
+ /**
7
+ * Найти все сбалансированные выражения с заданным opener.
8
+ * @param input - входная строка
9
+ * @param opener - открывающая последовательность, например '@(' или '@for('
10
+ * @returns массив объектов с content и позициями
11
+ */
12
+ static parseBalanced(input: string, opener: string, closerChar?: ')' | '}'): Array<{
13
+ content: string;
14
+ start: number;
15
+ end: number;
16
+ }>;
17
+ /**
18
+ * Парсить блочные Rule типа @for(...) { ... }
19
+ * @returns объект с condition (содержимое скобок) и block (содержимое фигурных скобок)
20
+ */
21
+ static parseBlockRule(input: string, opener: string): Array<{
22
+ condition: string;
23
+ block: string;
24
+ start: number;
25
+ end: number;
26
+ }>;
27
+ /**
28
+ * Парсить @if/@elseif/@else цепочки
29
+ */
30
+ static parseIfChain(input: string): Array<{
31
+ type: 'if' | 'elseif' | 'else';
32
+ condition?: string;
33
+ block: string;
34
+ start: number;
35
+ end: number;
36
+ }>;
37
+ /**
38
+ * Skip over a string literal (handles escape sequences)
39
+ */
40
+ private static skipString;
41
+ /**
42
+ * Skip single-line comment
43
+ */
44
+ private static skipLineComment;
45
+ /**
46
+ * Skip block comment
47
+ */
48
+ private static skipBlockComment;
49
+ /**
50
+ * Извлечь простые @(expression) без блоков
51
+ */
52
+ static parseExpressions(input: string): Array<{
53
+ content: string;
54
+ start: number;
55
+ end: number;
56
+ }>;
57
+ }
58
+ //# sourceMappingURL=BalancedParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BalancedParser.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/BalancedParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAE/B;;;;;OAKG;WACW,aAAa,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,GAAG,GAAG,GAAS,GAC5B,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAwDzD;;;OAGG;WACW,cAAc,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACf,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAqH1E;;OAEG;WACW,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAC7C,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;IAwFF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IA0BzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;OAEG;WACW,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAGxG"}
@@ -0,0 +1,301 @@
1
+ /**
2
+ * BalancedParser - утилита для парсинга сбалансированных скобок (), {}.
3
+ * Корректно обрабатывает строки и комментарии.
4
+ */
5
+ export default class BalancedParser {
6
+ /**
7
+ * Найти все сбалансированные выражения с заданным opener.
8
+ * @param input - входная строка
9
+ * @param opener - открывающая последовательность, например '@(' или '@for('
10
+ * @returns массив объектов с content и позициями
11
+ */
12
+ static parseBalanced(input, opener, closerChar = ')') {
13
+ const results = [];
14
+ const openerChar = closerChar === ')' ? '(' : '{';
15
+ let i = 0;
16
+ while (i < input.length) {
17
+ const idx = input.indexOf(opener, i);
18
+ if (idx === -1)
19
+ break;
20
+ const contentStart = idx + opener.length;
21
+ let pos = contentStart;
22
+ let depth = 1;
23
+ while (pos < input.length && depth > 0) {
24
+ const ch = input[pos];
25
+ // Skip string literals
26
+ if (ch === '"' || ch === "'" || ch === '`') {
27
+ pos = this.skipString(input, pos, ch);
28
+ continue;
29
+ }
30
+ // Skip single-line comments
31
+ if (ch === '/' && input[pos + 1] === '/') {
32
+ pos = this.skipLineComment(input, pos);
33
+ continue;
34
+ }
35
+ // Skip multi-line comments
36
+ if (ch === '/' && input[pos + 1] === '*') {
37
+ pos = this.skipBlockComment(input, pos);
38
+ continue;
39
+ }
40
+ if (ch === openerChar)
41
+ depth++;
42
+ else if (ch === closerChar)
43
+ depth--;
44
+ pos++;
45
+ }
46
+ if (depth === 0) {
47
+ results.push({
48
+ content: input.slice(contentStart, pos - 1),
49
+ start: idx,
50
+ end: pos
51
+ });
52
+ i = pos;
53
+ }
54
+ else {
55
+ // Unbalanced, skip this opener and continue
56
+ i = idx + 1;
57
+ }
58
+ }
59
+ return results;
60
+ }
61
+ /**
62
+ * Парсить блочные Rule типа @for(...) { ... }
63
+ * @returns объект с condition (содержимое скобок) и block (содержимое фигурных скобок)
64
+ */
65
+ static parseBlockRule(input, opener // например '@for', '@if'
66
+ ) {
67
+ const results = [];
68
+ const openerLower = opener.toLowerCase();
69
+ let i = 0;
70
+ while (i < input.length) {
71
+ // Case-insensitive search
72
+ const lowerInput = input.toLowerCase();
73
+ let idx = lowerInput.indexOf(openerLower, i);
74
+ if (idx === -1)
75
+ break;
76
+ // Check for @@ escape
77
+ if (idx > 0 && input[idx - 1] === '@') {
78
+ i = idx + 1;
79
+ continue;
80
+ }
81
+ // Find opening parenthesis
82
+ let parenStart = idx + opener.length;
83
+ while (parenStart < input.length && /\s/.test(input[parenStart])) {
84
+ parenStart++;
85
+ }
86
+ if (input[parenStart] !== '(') {
87
+ i = idx + 1;
88
+ continue;
89
+ }
90
+ // Parse balanced parentheses for condition
91
+ let pos = parenStart + 1;
92
+ let depth = 1;
93
+ while (pos < input.length && depth > 0) {
94
+ const ch = input[pos];
95
+ if (ch === '"' || ch === "'" || ch === '`') {
96
+ pos = this.skipString(input, pos, ch);
97
+ continue;
98
+ }
99
+ if (ch === '/' && input[pos + 1] === '/') {
100
+ pos = this.skipLineComment(input, pos);
101
+ continue;
102
+ }
103
+ if (ch === '/' && input[pos + 1] === '*') {
104
+ pos = this.skipBlockComment(input, pos);
105
+ continue;
106
+ }
107
+ if (ch === '(')
108
+ depth++;
109
+ else if (ch === ')')
110
+ depth--;
111
+ pos++;
112
+ }
113
+ if (depth !== 0) {
114
+ i = idx + 1;
115
+ continue;
116
+ }
117
+ const condition = input.slice(parenStart + 1, pos - 1);
118
+ const conditionEnd = pos;
119
+ // Find opening brace for block
120
+ let braceStart = conditionEnd;
121
+ while (braceStart < input.length && /\s/.test(input[braceStart])) {
122
+ braceStart++;
123
+ }
124
+ if (input[braceStart] !== '{') {
125
+ i = idx + 1;
126
+ continue;
127
+ }
128
+ // Parse balanced braces for block
129
+ pos = braceStart + 1;
130
+ depth = 1;
131
+ while (pos < input.length && depth > 0) {
132
+ const ch = input[pos];
133
+ if (ch === '"' || ch === "'" || ch === '`') {
134
+ pos = this.skipString(input, pos, ch);
135
+ continue;
136
+ }
137
+ if (ch === '/' && input[pos + 1] === '/') {
138
+ pos = this.skipLineComment(input, pos);
139
+ continue;
140
+ }
141
+ if (ch === '/' && input[pos + 1] === '*') {
142
+ pos = this.skipBlockComment(input, pos);
143
+ continue;
144
+ }
145
+ if (ch === '{')
146
+ depth++;
147
+ else if (ch === '}')
148
+ depth--;
149
+ pos++;
150
+ }
151
+ if (depth !== 0) {
152
+ i = idx + 1;
153
+ continue;
154
+ }
155
+ const block = input.slice(braceStart + 1, pos - 1);
156
+ results.push({
157
+ condition,
158
+ block,
159
+ start: idx,
160
+ end: pos
161
+ });
162
+ i = pos;
163
+ }
164
+ return results;
165
+ }
166
+ /**
167
+ * Парсить @if/@elseif/@else цепочки
168
+ */
169
+ static parseIfChain(input) {
170
+ const results = [];
171
+ // Find @if first
172
+ const ifMatches = this.parseBlockRule(input, '@if');
173
+ for (const ifMatch of ifMatches) {
174
+ results.push({
175
+ type: 'if',
176
+ condition: ifMatch.condition,
177
+ block: ifMatch.block,
178
+ start: ifMatch.start,
179
+ end: ifMatch.end
180
+ });
181
+ // Look for @elseif/@else after this @if
182
+ let searchPos = ifMatch.end;
183
+ while (searchPos < input.length) {
184
+ // Skip whitespace
185
+ while (searchPos < input.length && /\s/.test(input[searchPos])) {
186
+ searchPos++;
187
+ }
188
+ const remaining = input.slice(searchPos).toLowerCase();
189
+ if (remaining.startsWith('@elseif')) {
190
+ const elseifMatches = this.parseBlockRule(input.slice(searchPos), '@elseif');
191
+ if (elseifMatches.length > 0) {
192
+ const m = elseifMatches[0];
193
+ results.push({
194
+ type: 'elseif',
195
+ condition: m.condition,
196
+ block: m.block,
197
+ start: searchPos + m.start,
198
+ end: searchPos + m.end
199
+ });
200
+ searchPos = searchPos + m.end;
201
+ continue;
202
+ }
203
+ }
204
+ else if (remaining.startsWith('@else')) {
205
+ // @else without condition
206
+ let pos = searchPos + 5; // length of '@else'
207
+ while (pos < input.length && /\s/.test(input[pos])) {
208
+ pos++;
209
+ }
210
+ if (input[pos] === '{') {
211
+ let bracePos = pos + 1;
212
+ let depth = 1;
213
+ while (bracePos < input.length && depth > 0) {
214
+ const ch = input[bracePos];
215
+ if (ch === '"' || ch === "'" || ch === '`') {
216
+ bracePos = this.skipString(input, bracePos, ch);
217
+ continue;
218
+ }
219
+ if (ch === '{')
220
+ depth++;
221
+ else if (ch === '}')
222
+ depth--;
223
+ bracePos++;
224
+ }
225
+ if (depth === 0) {
226
+ results.push({
227
+ type: 'else',
228
+ block: input.slice(pos + 1, bracePos - 1),
229
+ start: searchPos,
230
+ end: bracePos
231
+ });
232
+ searchPos = bracePos;
233
+ continue;
234
+ }
235
+ }
236
+ }
237
+ break; // No more @elseif/@else found
238
+ }
239
+ }
240
+ return results;
241
+ }
242
+ /**
243
+ * Skip over a string literal (handles escape sequences)
244
+ */
245
+ static skipString(input, pos, quote) {
246
+ pos++; // skip opening quote
247
+ while (pos < input.length) {
248
+ if (input[pos] === '\\') {
249
+ pos += 2; // skip escape sequence
250
+ continue;
251
+ }
252
+ if (input[pos] === quote) {
253
+ return pos + 1;
254
+ }
255
+ // Handle template literal ${...}
256
+ if (quote === '`' && input[pos] === '$' && input[pos + 1] === '{') {
257
+ pos += 2;
258
+ let depth = 1;
259
+ while (pos < input.length && depth > 0) {
260
+ if (input[pos] === '{')
261
+ depth++;
262
+ else if (input[pos] === '}')
263
+ depth--;
264
+ pos++;
265
+ }
266
+ continue;
267
+ }
268
+ pos++;
269
+ }
270
+ return pos;
271
+ }
272
+ /**
273
+ * Skip single-line comment
274
+ */
275
+ static skipLineComment(input, pos) {
276
+ while (pos < input.length && input[pos] !== '\n') {
277
+ pos++;
278
+ }
279
+ return pos + 1;
280
+ }
281
+ /**
282
+ * Skip block comment
283
+ */
284
+ static skipBlockComment(input, pos) {
285
+ pos += 2; // skip /*
286
+ while (pos < input.length - 1) {
287
+ if (input[pos] === '*' && input[pos + 1] === '/') {
288
+ return pos + 2;
289
+ }
290
+ pos++;
291
+ }
292
+ return pos;
293
+ }
294
+ /**
295
+ * Извлечь простые @(expression) без блоков
296
+ */
297
+ static parseExpressions(input) {
298
+ return this.parseBalanced(input, '@(', ')');
299
+ }
300
+ }
301
+ //# sourceMappingURL=BalancedParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BalancedParser.js","sourceRoot":"","sources":["../../../src/foundation/engine/BalancedParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * EscapeHandler - обработка escape-последовательностей.
3
+ * @@ -> @
4
+ * @@@@ -> @@
5
+ */
6
+ export default class EscapeHandler {
7
+ /**
8
+ * Заменить @@ на специальный placeholder перед парсингом
9
+ */
10
+ static escapeDoubleAt(input: string): {
11
+ result: string;
12
+ placeholder: string;
13
+ };
14
+ /**
15
+ * Восстановить @ из placeholder после парсинга
16
+ */
17
+ static restoreEscapes(input: string, placeholder: string): string;
18
+ /**
19
+ * Полный цикл: escape -> process -> restore
20
+ */
21
+ static process(input: string, processor: (escaped: string) => string): string;
22
+ /**
23
+ * Проверить, является ли позиция escaped (предшествует @@)
24
+ */
25
+ static isEscaped(input: string, position: number): boolean;
26
+ }
27
+ //# sourceMappingURL=EscapeHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscapeHandler.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAOpF;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAIxE;;OAEG;WACW,OAAO,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACvC,MAAM;IAMT;;OAEG;WACW,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;CAcpE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * EscapeHandler - обработка escape-последовательностей.
3
+ * @@ -> @
4
+ * @@@@ -> @@
5
+ */
6
+ export default class EscapeHandler {
7
+ /**
8
+ * Заменить @@ на специальный placeholder перед парсингом
9
+ */
10
+ static escapeDoubleAt(input) {
11
+ // Use a unique placeholder that won't appear in normal code
12
+ const placeholder = '\x00AT_ESCAPE\x00';
13
+ const result = input.replace(/@@/g, placeholder);
14
+ return { result, placeholder };
15
+ }
16
+ /**
17
+ * Восстановить @ из placeholder после парсинга
18
+ */
19
+ static restoreEscapes(input, placeholder) {
20
+ return input.replace(new RegExp(placeholder.replace(/\x00/g, '\\x00'), 'g'), '@');
21
+ }
22
+ /**
23
+ * Полный цикл: escape -> process -> restore
24
+ */
25
+ static process(input, processor) {
26
+ const { result: escaped, placeholder } = this.escapeDoubleAt(input);
27
+ const processed = processor(escaped);
28
+ return this.restoreEscapes(processed, placeholder);
29
+ }
30
+ /**
31
+ * Проверить, является ли позиция escaped (предшествует @@)
32
+ */
33
+ static isEscaped(input, position) {
34
+ if (position === 0)
35
+ return false;
36
+ // Count consecutive @ before this position
37
+ let count = 0;
38
+ let i = position - 1;
39
+ while (i >= 0 && input[i] === '@') {
40
+ count++;
41
+ i--;
42
+ }
43
+ // If odd number of @ before, this @ is escaped
44
+ return count % 2 === 1;
45
+ }
46
+ }
47
+ //# sourceMappingURL=EscapeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscapeHandler.js","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa;QACtC,4DAA4D;QAC5D,MAAM,WAAW,GAAG,mBAAmB,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,WAAmB;QAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAO,CACjB,KAAa,EACb,SAAsC;QAEtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,QAAgB;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,2CAA2C;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChC,KAAK,EAAE,CAAC;YACR,CAAC,EAAE,CAAC;QACR,CAAC;QAED,+CAA+C;QAC/C,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACJ"}