@ibyar/expressions 0.4.1 → 0.5.2

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 (128) hide show
  1. package/README.md +96 -1
  2. package/api/abstract.d.ts +2 -1
  3. package/api/abstract.js +4 -0
  4. package/api/abstract.js.map +1 -1
  5. package/api/definition/array.d.ts +3 -1
  6. package/api/definition/array.js +6 -0
  7. package/api/definition/array.js.map +1 -1
  8. package/api/definition/bind.d.ts +2 -1
  9. package/api/definition/bind.js +4 -0
  10. package/api/definition/bind.js.map +1 -1
  11. package/api/definition/function.d.ts +6 -1
  12. package/api/definition/function.js +22 -2
  13. package/api/definition/function.js.map +1 -1
  14. package/api/definition/member.d.ts +2 -1
  15. package/api/definition/member.js +4 -0
  16. package/api/definition/member.js.map +1 -1
  17. package/api/definition/object.d.ts +4 -1
  18. package/api/definition/object.js +10 -0
  19. package/api/definition/object.js.map +1 -1
  20. package/api/definition/statement.d.ts +2 -1
  21. package/api/definition/statement.js +3 -0
  22. package/api/definition/statement.js.map +1 -1
  23. package/api/definition/values.d.ts +11 -4
  24. package/api/definition/values.js +16 -0
  25. package/api/definition/values.js.map +1 -1
  26. package/api/deserialize/deserialize.js +3 -3
  27. package/api/deserialize/deserialize.js.map +1 -1
  28. package/api/deserialize/type-store.d.ts +2 -0
  29. package/api/deserialize/type-store.js +2 -0
  30. package/api/deserialize/type-store.js.map +1 -0
  31. package/api/expression.d.ts +9 -3
  32. package/api/expression.js.map +1 -1
  33. package/api/module/export.d.ts +3 -1
  34. package/api/module/export.js +10 -0
  35. package/api/module/export.js.map +1 -1
  36. package/api/module/import.d.ts +3 -1
  37. package/api/module/import.js +10 -0
  38. package/api/module/import.js.map +1 -1
  39. package/api/module/module.d.ts +2 -1
  40. package/api/module/module.js +5 -0
  41. package/api/module/module.js.map +1 -1
  42. package/api/operators/assignment.d.ts +2 -1
  43. package/api/operators/assignment.js +4 -0
  44. package/api/operators/assignment.js.map +1 -1
  45. package/api/operators/await.d.ts +2 -1
  46. package/api/operators/await.js +3 -0
  47. package/api/operators/await.js.map +1 -1
  48. package/api/operators/binary.d.ts +2 -1
  49. package/api/operators/binary.js +4 -0
  50. package/api/operators/binary.js.map +1 -1
  51. package/api/operators/chaining.d.ts +2 -1
  52. package/api/operators/chaining.js +3 -0
  53. package/api/operators/chaining.js.map +1 -1
  54. package/api/operators/comma.d.ts +2 -1
  55. package/api/operators/comma.js +3 -0
  56. package/api/operators/comma.js.map +1 -1
  57. package/api/operators/grouping.d.ts +2 -1
  58. package/api/operators/grouping.js +3 -0
  59. package/api/operators/grouping.js.map +1 -1
  60. package/api/operators/logical.d.ts +2 -1
  61. package/api/operators/logical.js +4 -0
  62. package/api/operators/logical.js.map +1 -1
  63. package/api/operators/pipeline.d.ts +2 -1
  64. package/api/operators/pipeline.js +5 -0
  65. package/api/operators/pipeline.js.map +1 -1
  66. package/api/operators/ternary.d.ts +2 -1
  67. package/api/operators/ternary.js +5 -0
  68. package/api/operators/ternary.js.map +1 -1
  69. package/api/operators/unary.d.ts +2 -1
  70. package/api/operators/unary.js +3 -0
  71. package/api/operators/unary.js.map +1 -1
  72. package/api/operators/update.d.ts +2 -1
  73. package/api/operators/update.js +3 -0
  74. package/api/operators/update.js.map +1 -1
  75. package/api/statement/control/block.d.ts +2 -1
  76. package/api/statement/control/block.js +3 -0
  77. package/api/statement/control/block.js.map +1 -1
  78. package/api/statement/control/if.d.ts +2 -1
  79. package/api/statement/control/if.js +5 -0
  80. package/api/statement/control/if.js.map +1 -1
  81. package/api/statement/control/switch.d.ts +4 -1
  82. package/api/statement/control/switch.js +11 -0
  83. package/api/statement/control/switch.js.map +1 -1
  84. package/api/statement/control/terminate.d.ts +5 -3
  85. package/api/statement/control/terminate.js +6 -0
  86. package/api/statement/control/terminate.js.map +1 -1
  87. package/api/statement/declarations/declares.d.ts +4 -1
  88. package/api/statement/declarations/declares.js +11 -1
  89. package/api/statement/declarations/declares.js.map +1 -1
  90. package/api/statement/iterations/for.d.ts +5 -1
  91. package/api/statement/iterations/for.js +21 -0
  92. package/api/statement/iterations/for.js.map +1 -1
  93. package/api/statement/iterations/while.d.ts +3 -1
  94. package/api/statement/iterations/while.js +8 -0
  95. package/api/statement/iterations/while.js.map +1 -1
  96. package/index.d.ts +1 -0
  97. package/index.js +1 -0
  98. package/index.js.map +1 -1
  99. package/package.json +3 -3
  100. package/scope/event.d.ts +5 -0
  101. package/scope/event.js +35 -0
  102. package/scope/event.js.map +1 -0
  103. package/scope/index.d.ts +1 -0
  104. package/scope/index.js +1 -0
  105. package/scope/index.js.map +1 -1
  106. package/scope/proxy.d.ts +1 -1
  107. package/scope/proxy.js +3 -3
  108. package/scope/proxy.js.map +1 -1
  109. package/scope/scope.d.ts +84 -48
  110. package/scope/scope.js +168 -29
  111. package/scope/scope.js.map +1 -1
  112. package/scope/stack.d.ts +28 -28
  113. package/scope/stack.js.map +1 -1
  114. package/v8/app.js.map +1 -1
  115. package/v8/parser.d.ts +2 -2
  116. package/v8/parser.js +4 -2
  117. package/v8/parser.js.map +1 -1
  118. package/v8/stream.d.ts +4 -2
  119. package/v8/stream.js +34 -17
  120. package/v8/stream.js.map +1 -1
  121. package/v8/token.d.ts +1 -1
  122. package/v8/token.js.map +1 -1
  123. package/visit/index.d.ts +1 -0
  124. package/visit/index.js +2 -0
  125. package/visit/index.js.map +1 -0
  126. package/visit/visitor.d.ts +11 -0
  127. package/visit/visitor.js +42 -0
  128. package/visit/visitor.js.map +1 -0
package/scope/scope.js CHANGED
@@ -53,6 +53,20 @@ export class Scope {
53
53
  return this.context;
54
54
  }
55
55
  getScope(propertyKey) {
56
+ const scopeContext = this.get(propertyKey);
57
+ let scope = this.scopeMap.get(propertyKey);
58
+ if (scope) {
59
+ scope.context = scopeContext;
60
+ return scope;
61
+ }
62
+ if (typeof scopeContext !== 'object') {
63
+ return;
64
+ }
65
+ scope = new Scope(scopeContext, 'block');
66
+ this.scopeMap.set(propertyKey, scope);
67
+ return scope;
68
+ }
69
+ getScopeOrCreat(propertyKey) {
56
70
  const scopeContext = this.get(propertyKey);
57
71
  let scope = this.scopeMap.get(propertyKey);
58
72
  if (scope) {
@@ -106,41 +120,86 @@ export class ReadOnlyScope extends Scope {
106
120
  }
107
121
  }
108
122
  export class ScopeSubscription {
109
- constructor(observer) {
123
+ constructor(propertyKey, observer) {
124
+ this.propertyKey = propertyKey;
110
125
  this.observer = observer;
111
126
  }
127
+ pause() {
128
+ this.observer.pause(this.propertyKey, this);
129
+ }
130
+ resume() {
131
+ this.observer.resume(this.propertyKey, this);
132
+ }
112
133
  unsubscribe() {
113
- this.observer.unsubscribe(this);
134
+ this.observer.unsubscribe(this.propertyKey, this);
114
135
  }
115
136
  }
116
137
  export class ValueChangeObserver {
117
138
  constructor() {
118
139
  this.subscribers = new Map();
140
+ this.propertiesLock = [];
119
141
  }
120
- emit(propertyKey, oldValue, newValue) {
121
- this.subscribers.forEach((subscribe) => {
142
+ emit(propertyKey, newValue, oldValue) {
143
+ if (this.propertiesLock.includes(propertyKey)) {
144
+ return;
145
+ }
146
+ const subscribers = this.subscribers.get(propertyKey);
147
+ if (!subscribers) {
148
+ return;
149
+ }
150
+ this.propertiesLock.push(propertyKey);
151
+ subscribers?.forEach(subscriptionInfo => {
152
+ if (!subscriptionInfo.enable) {
153
+ return;
154
+ }
122
155
  try {
123
- subscribe(propertyKey, oldValue, newValue);
156
+ subscriptionInfo.callback(newValue, oldValue);
124
157
  }
125
158
  catch (e) {
126
159
  console.error(e);
127
160
  }
128
161
  });
129
- }
130
- subscribe(callback) {
131
- const subscription = new ScopeSubscription(this);
132
- this.subscribers.set(subscription, callback);
162
+ if (this.propertiesLock.pop() !== propertyKey) {
163
+ console.error('lock error');
164
+ }
165
+ ;
166
+ }
167
+ subscribe(propertyKey, callback) {
168
+ const subscription = new ScopeSubscription(propertyKey, this);
169
+ let propertySubscribers = this.subscribers.get(propertyKey);
170
+ if (!propertySubscribers) {
171
+ propertySubscribers = new Map();
172
+ this.subscribers.set(propertyKey, propertySubscribers);
173
+ }
174
+ propertySubscribers.set(subscription, { callback, enable: true });
133
175
  return subscription;
134
176
  }
135
- unsubscribe(subscription) {
136
- this.subscribers.delete(subscription);
177
+ unsubscribe(propertyKey, subscription) {
178
+ if (subscription) {
179
+ this.subscribers.get(propertyKey)?.delete(subscription);
180
+ }
181
+ else {
182
+ this.subscribers.delete(propertyKey);
183
+ }
184
+ }
185
+ pause(propertyKey, subscription) {
186
+ const subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);
187
+ subscriptionInfo && (subscriptionInfo.enable = false);
188
+ }
189
+ resume(propertyKey, subscription) {
190
+ const subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);
191
+ subscriptionInfo && (subscriptionInfo.enable = true);
192
+ }
193
+ destroy() {
194
+ this.subscribers.clear();
137
195
  }
138
196
  }
139
197
  export class ReactiveScope extends Scope {
140
- constructor(context, type, name, observer) {
198
+ constructor(context, type, name, parent) {
141
199
  super(context, type);
142
200
  this.name = name;
143
- this.observer = observer ?? new ValueChangeObserver();
201
+ this.parent = parent;
202
+ this.observer = new ValueChangeObserver();
144
203
  }
145
204
  static for(context, type) {
146
205
  return new ReactiveScope(context, type);
@@ -179,7 +238,7 @@ export class ReactiveScope extends Scope {
179
238
  const oldValue = Reflect.get(this.context, propertyKey);
180
239
  const result = Reflect.set(this.context, propertyKey, newValue);
181
240
  if (result) {
182
- this.observer.emit(this.getEventName(propertyKey), oldValue, newValue);
241
+ this.emit(propertyKey, newValue, oldValue);
183
242
  }
184
243
  return result;
185
244
  }
@@ -187,7 +246,7 @@ export class ReactiveScope extends Scope {
187
246
  const oldValue = Reflect.get(this.context, propertyKey);
188
247
  const isDelete = Reflect.deleteProperty(this.context, propertyKey);
189
248
  if (isDelete && oldValue !== undefined) {
190
- this.observer.emit(this.getEventName(propertyKey), oldValue, undefined);
249
+ this.emit(propertyKey, undefined, oldValue);
191
250
  }
192
251
  return isDelete;
193
252
  }
@@ -198,28 +257,108 @@ export class ReactiveScope extends Scope {
198
257
  scope.context = scopeContext;
199
258
  return scope;
200
259
  }
201
- if (typeof scopeContext === 'undefined') {
260
+ if (typeof scopeContext !== 'object') {
202
261
  return;
203
262
  }
204
- const childName = this.getEventName(propertyKey);
205
- scope = new ReactiveScope(scopeContext, 'block', childName, this.observer);
263
+ scope = new ReactiveScope(scopeContext, 'block', propertyKey, this);
206
264
  this.scopeMap.set(propertyKey, scope);
207
265
  return scope;
208
266
  }
209
- getEventName(child) {
210
- if (this.name) {
211
- if (typeof child === 'number' || typeof child === 'symbol') {
212
- return `${String(this.name)}['${String(child)}']`;
213
- }
214
- return `${String(this.name)}.${String(child)}`;
267
+ getScopeOrCreat(propertyKey) {
268
+ const scopeContext = this.get(propertyKey);
269
+ let scope = this.scopeMap.get(propertyKey);
270
+ if (scope) {
271
+ scope.context = scopeContext;
272
+ return scope;
215
273
  }
216
- return String(child);
274
+ scope = new ReactiveScope(scopeContext, 'block', propertyKey, this);
275
+ this.scopeMap.set(propertyKey, scope);
276
+ return scope;
217
277
  }
218
- subscribe(callback) {
219
- return this.observer.subscribe(callback);
278
+ emit(propertyKey, newValue, oldValue) {
279
+ this.observer.emit(propertyKey, newValue, oldValue);
280
+ this.parent?.emit(this.name, this.context);
220
281
  }
221
- unsubscribe(subscription) {
222
- this.observer.unsubscribe(subscription);
282
+ subscribe(propertyKey, callback) {
283
+ return this.observer.subscribe(propertyKey, callback);
284
+ }
285
+ unsubscribe(propertyKey, subscription) {
286
+ if (propertyKey && subscription) {
287
+ this.observer.unsubscribe(propertyKey, subscription);
288
+ }
289
+ else if (propertyKey) {
290
+ this.observer.unsubscribe(propertyKey);
291
+ }
292
+ else {
293
+ this.observer.destroy();
294
+ }
295
+ }
296
+ }
297
+ export class ReactiveScopeControl extends ReactiveScope {
298
+ constructor() {
299
+ super(...arguments);
300
+ this.attached = true;
301
+ this.marked = {};
302
+ }
303
+ static for(context, type) {
304
+ return new ReactiveScopeControl(context, type);
305
+ }
306
+ static blockScopeFor(context) {
307
+ return new ReactiveScopeControl(context, 'block');
308
+ }
309
+ static functionScopeFor(context) {
310
+ return new ReactiveScopeControl(context, 'function');
311
+ }
312
+ static classScopeFor(context) {
313
+ return new ReactiveScopeControl(context, 'class');
314
+ }
315
+ static moduleScopeFor(context) {
316
+ return new ReactiveScopeControl(context, 'module');
317
+ }
318
+ static globalScopeFor(context) {
319
+ return new ReactiveScopeControl(context, 'global');
320
+ }
321
+ static blockScope() {
322
+ return new ReactiveScopeControl({}, 'block');
323
+ }
324
+ static functionScope() {
325
+ return new ReactiveScopeControl({}, 'function');
326
+ }
327
+ static classScope() {
328
+ return new ReactiveScopeControl({}, 'class');
329
+ }
330
+ static moduleScope() {
331
+ return new ReactiveScopeControl({}, 'module');
332
+ }
333
+ static globalScope() {
334
+ return new ReactiveScopeControl({}, 'global');
335
+ }
336
+ emit(propertyKey, newValue, oldValue) {
337
+ if (this.attached) {
338
+ super.emit(propertyKey, newValue, oldValue);
339
+ }
340
+ else {
341
+ this.marked[propertyKey] = newValue;
342
+ }
343
+ }
344
+ detach() {
345
+ this.attached = false;
346
+ }
347
+ reattach() {
348
+ this.attached = true;
349
+ this.emitChanges();
350
+ }
351
+ emitChanges(propertyKey, propertyValue) {
352
+ if (propertyKey) {
353
+ super.emit(propertyKey, propertyValue);
354
+ Reflect.deleteProperty(this.marked, propertyKey);
355
+ return;
356
+ }
357
+ const latestChanges = this.marked;
358
+ this.marked = {};
359
+ Object.keys(latestChanges).forEach(propertyKey => {
360
+ super.emit(propertyKey, latestChanges[propertyKey]);
361
+ });
223
362
  }
224
363
  }
225
364
  //# sourceMappingURL=scope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/expressions/scope/scope.ts"],"names":[],"mappings":"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","sourcesContent":["\nexport type ScopeType = 'block' | 'function' | 'class' | 'module' | 'global';\n\nexport type ScopeContext = { [key: PropertyKey]: ScopeContext | any };\nexport interface Scope<T = ScopeContext> {\n\n\t/**\n\t * scope type\n\t */\n\ttype: ScopeType;\n\n\t/**\n\t * get value of `propertyKey` in current context\n\t * @param propertyKey \n\t */\n\tget(propertyKey: keyof T): any;\n\n\t/**\n\t * set the value of `propertyKey` in current context, could be instilled with `value`.\n\t * @param propertyKey \n\t * @param value \n\t * @param receiver \n\t */\n\tset(propertyKey: keyof T, value?: any, receiver?: any): boolean;\n\n\t/**\n\t * is current context has `propertyKey` in hash map keys\n\t * @param propertyKey \n\t */\n\thas(propertyKey: keyof T): boolean;\n\n\t/**\n\t * delete property from context\n\t * @param propertyKey \n\t */\n\tdelete(propertyKey: keyof T): boolean;\n\n\t/**\n\t * get current context object of this scope\n\t */\n\tgetContext(): T;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map\n\t * @param propertyKey the name of the property\n\t */\n\tgetScope<V extends object>(propertyKey: keyof T): Scope<V> | undefined;\n}\n\nexport class Scope<T extends object> implements Scope<T> {\n\tstatic for<T extends object>(context: T, type: ScopeType) {\n\t\treturn new Scope(context, type);\n\t}\n\tstatic blockScopeFor<T extends object>(context: T) {\n\t\treturn new Scope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends object>(context: T) {\n\t\treturn new Scope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends object>(context: T) {\n\t\treturn new Scope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends object>(context: T) {\n\t\treturn new Scope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends object>(context: T) {\n\t\treturn new Scope(context, 'global');\n\t}\n\tstatic blockScope<T extends object>() {\n\t\treturn new Scope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends object>() {\n\t\treturn new Scope({} as T, 'function');\n\t}\n\tstatic classScope<T extends object>() {\n\t\treturn new Scope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends object>() {\n\t\treturn new Scope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends object>() {\n\t\treturn new Scope({} as T, 'global');\n\t}\n\tprotected scopeMap = new Map<keyof T, Scope<any>>();\n\tconstructor(protected context: T, public type: ScopeType) { }\n\tget(propertyKey: keyof T): any {\n\t\treturn Reflect.get(this.context, propertyKey);\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this.context, propertyKey, value);\n\t}\n\thas(propertyKey: keyof T): boolean {\n\t\treturn propertyKey in this.context;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\treturn Reflect.deleteProperty(this.context, propertyKey);\n\t}\n\tgetContext(): T {\n\t\treturn this.context;\n\t}\n\tgetScope<V extends object>(propertyKey: keyof T): Scope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n}\n\nexport class ReadOnlyScope<T extends object> extends Scope<T> {\n\tstatic for<T extends object>(context: T, type: ScopeType) {\n\t\treturn new ReadOnlyScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends object>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends object>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends object>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends object>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends object>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'global');\n\t}\n\tstatic blockScope<T extends object>() {\n\t\treturn new ReadOnlyScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends object>() {\n\t\treturn new ReadOnlyScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends object>() {\n\t\treturn new ReadOnlyScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends object>() {\n\t\treturn new ReadOnlyScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends object>() {\n\t\treturn new ReadOnlyScope({} as T, 'global');\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n}\n\nexport class ScopeSubscription<T> {\n\tconstructor(private observer: ValueChangeObserver<T>) { }\n\tunsubscribe(): void {\n\t\tthis.observer.unsubscribe(this);\n\t}\n}\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<ScopeSubscription<T>, (propertyKey: keyof T, oldValue: any, newValue: any) => void> = new Map();\n\n\temit(propertyKey: keyof T, oldValue: any, newValue: any): void {\n\t\tthis.subscribers.forEach((subscribe) => {\n\t\t\ttry {\n\t\t\t\tsubscribe(propertyKey, oldValue, newValue);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t}\n\tsubscribe(callback: (propertyKey: keyof T, oldValue: any, newValue: any) => void): ScopeSubscription<T> {\n\t\tconst subscription: ScopeSubscription<T> = new ScopeSubscription(this);\n\t\tthis.subscribers.set(subscription, callback);\n\t\treturn subscription;\n\t}\n\n\tunsubscribe(subscription: ScopeSubscription<T>) {\n\t\tthis.subscribers.delete(subscription);\n\t}\n}\n\n\nexport class ReactiveScope<T extends object> extends Scope<T> {\n\tstatic for<T extends object>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends object>(context: T) {\n\t\treturn new ReactiveScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends object>(context: T) {\n\t\treturn new ReactiveScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends object>(context: T) {\n\t\treturn new ReactiveScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends object>(context: T) {\n\t\treturn new ReactiveScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends object>(context: T) {\n\t\treturn new ReactiveScope(context, 'global');\n\t}\n\tstatic blockScope<T extends object>() {\n\t\treturn new ReactiveScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends object>() {\n\t\treturn new ReactiveScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends object>() {\n\t\treturn new ReactiveScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends object>() {\n\t\treturn new ReactiveScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends object>() {\n\t\treturn new ReactiveScope({} as T, 'global');\n\t}\n\tprivate observer: ValueChangeObserver<T>;\n\tconstructor(context: T, type: ScopeType, protected name?: PropertyKey, observer?: ValueChangeObserver<any>) {\n\t\tsuper(context, type);\n\t\tthis.observer = observer ?? new ValueChangeObserver<any>();\n\t}\n\tset(propertyKey: keyof T, newValue: any, receiver?: any): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst result = Reflect.set(this.context, propertyKey, newValue);\n\t\tif (result) {\n\t\t\tthis.observer.emit(this.getEventName(propertyKey), oldValue, newValue);\n\t\t}\n\t\treturn result;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst isDelete = Reflect.deleteProperty(this.context, propertyKey);\n\t\tif (isDelete && oldValue !== undefined) {\n\t\t\tthis.observer.emit(this.getEventName(propertyKey), oldValue, undefined);\n\t\t}\n\t\treturn isDelete;\n\t}\n\tgetScope<V extends object>(propertyKey: keyof T): ReactiveScope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<V>;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext === 'undefined') {\n\t\t\treturn;\n\t\t}\n\t\tconst childName = this.getEventName(propertyKey);\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', childName, this.observer);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope as ReactiveScope<V>;\n\t}\n\n\tprivate getEventName(child: keyof T): keyof T {\n\t\tif (this.name) {\n\t\t\tif (typeof child === 'number' || typeof child === 'symbol') {\n\t\t\t\treturn `${String(this.name)}['${String(child)}']` as keyof T;\n\t\t\t}\n\t\t\treturn `${String(this.name)}.${String(child)}` as keyof T;\n\t\t}\n\t\treturn String(child) as keyof T;\n\t}\n\n\tsubscribe(callback: (propertyKey: keyof T, oldValue: any, newValue: any) => void): ScopeSubscription<T> {\n\t\treturn this.observer.subscribe(callback);\n\t}\n\n\tunsubscribe(subscription: ScopeSubscription<T>) {\n\t\tthis.observer.unsubscribe(subscription);\n\t}\n}\n"]}
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/expressions/scope/scope.ts"],"names":[],"mappings":"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","sourcesContent":["\nexport type ScopeType = 'block' | 'function' | 'class' | 'module' | 'global';\n\nexport type ScopeContext = { [key: PropertyKey]: ScopeContext | any };\nexport interface Scope<T = ScopeContext> {\n\n\t/**\n\t * scope type\n\t */\n\ttype: ScopeType;\n\n\t/**\n\t * get value of `propertyKey` in current context\n\t * @param propertyKey \n\t */\n\tget(propertyKey: keyof T): any;\n\n\t/**\n\t * set the value of `propertyKey` in current context, could be instilled with `value`.\n\t * @param propertyKey \n\t * @param value \n\t * @param receiver \n\t */\n\tset(propertyKey: keyof T, value?: any, receiver?: any): boolean;\n\n\t/**\n\t * is current context has `propertyKey` in hash map keys\n\t * @param propertyKey \n\t */\n\thas(propertyKey: keyof T): boolean;\n\n\t/**\n\t * delete property from context\n\t * @param propertyKey \n\t */\n\tdelete(propertyKey: keyof T): boolean;\n\n\t/**\n\t * get current context object of this scope\n\t */\n\tgetContext(): T;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map,\n\t * \n\t * if the current value is not type od `object`, will return `undefined`.\n\t * @param propertyKey the name of the property\n\t */\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): Scope<V> | undefined;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map,\n\t * \n\t * if no scope found in the cache, will create a new one, add this one to the map, return a reference.\n\t * @param propertyKey\n\t */\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): Scope<V>;\n}\n\nexport class Scope<T extends ScopeContext> implements Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new Scope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'global');\n\t}\n\tprotected scopeMap = new Map<keyof T, Scope<any>>();\n\tconstructor(protected context: T, public type: ScopeType) { }\n\tget(propertyKey: keyof T): any {\n\t\treturn Reflect.get(this.context, propertyKey);\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this.context, propertyKey, value);\n\t}\n\thas(propertyKey: keyof T): boolean {\n\t\treturn propertyKey in this.context;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\treturn Reflect.deleteProperty(this.context, propertyKey);\n\t}\n\tgetContext(): T {\n\t\treturn this.context;\n\t}\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): Scope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext !== 'object') {\n\t\t\treturn;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): Scope<V> {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n}\n\nexport class ReadOnlyScope<T extends ScopeContext> extends Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReadOnlyScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'global');\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n}\n\nexport class ScopeSubscription<T> {\n\tconstructor(private propertyKey: keyof T, private observer: ValueChangeObserver<T>) { }\n\tpause() {\n\t\tthis.observer.pause(this.propertyKey, this);\n\t}\n\tresume() {\n\t\tthis.observer.resume(this.propertyKey, this);\n\t}\n\tunsubscribe(): void {\n\t\tthis.observer.unsubscribe(this.propertyKey, this);\n\t}\n}\n\nexport type ValueChangedCallback = (newValue: any, oldValue?: any) => void;\n\ntype SubscriptionInfo = { callback: ValueChangedCallback, enable: boolean };\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<keyof T, Map<ScopeSubscription<T>, SubscriptionInfo>> = new Map();\n\tprivate propertiesLock: (keyof T)[] = [];\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this.propertiesLock.includes(propertyKey)) {\n\t\t\treturn;\n\t\t}\n\t\tconst subscribers = this.subscribers.get(propertyKey);\n\t\tif (!subscribers) {\n\t\t\treturn;\n\t\t}\n\t\tthis.propertiesLock.push(propertyKey);\n\t\tsubscribers?.forEach(subscriptionInfo => {\n\t\t\tif (!subscriptionInfo.enable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsubscriptionInfo.callback(newValue, oldValue);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t\tif (this.propertiesLock.pop() !== propertyKey) {\n\t\t\tconsole.error('lock error');\n\t\t};\n\t}\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\tconst subscription: ScopeSubscription<T> = new ScopeSubscription(propertyKey, this);\n\t\tlet propertySubscribers = this.subscribers.get(propertyKey);\n\t\tif (!propertySubscribers) {\n\t\t\tpropertySubscribers = new Map();\n\t\t\tthis.subscribers.set(propertyKey, propertySubscribers);\n\t\t}\n\t\tpropertySubscribers.set(subscription, { callback, enable: true });\n\t\treturn subscription;\n\t}\n\n\tunsubscribe(propertyKey: keyof T, subscription?: ScopeSubscription<T>) {\n\t\tif (subscription) {\n\t\t\tthis.subscribers.get(propertyKey)?.delete(subscription);\n\t\t} else {\n\t\t\tthis.subscribers.delete(propertyKey);\n\t\t}\n\t}\n\n\tpause(propertyKey: keyof T, subscription: ScopeSubscription<T>) {\n\t\tconst subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);\n\t\tsubscriptionInfo && (subscriptionInfo.enable = false);\n\t}\n\n\tresume(propertyKey: keyof T, subscription: ScopeSubscription<T>) {\n\t\tconst subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);\n\t\tsubscriptionInfo && (subscriptionInfo.enable = true);\n\t}\n\n\t/**\n\t * clear subscription maps\n\t */\n\tdestroy() {\n\t\tthis.subscribers.clear();\n\t}\n}\n\nexport class ReactiveScope<T extends ScopeContext> extends Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'global');\n\t}\n\n\tprotected observer: ValueChangeObserver<T> = new ValueChangeObserver<T>();\n\n\tconstructor(context: T, type: ScopeType);\n\tconstructor(context: T, type: ScopeType, name: string, parent: ReactiveScope<any>);\n\tconstructor(context: T, type: ScopeType, protected name?: string, protected parent?: ReactiveScope<any>) {\n\t\tsuper(context, type);\n\t}\n\n\tset(propertyKey: keyof T, newValue: any, receiver?: any): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst result = Reflect.set(this.context, propertyKey, newValue);\n\t\tif (result) {\n\t\t\tthis.emit(propertyKey, newValue, oldValue);\n\t\t}\n\t\treturn result;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst isDelete = Reflect.deleteProperty(this.context, propertyKey);\n\t\tif (isDelete && oldValue !== undefined) {\n\t\t\tthis.emit(propertyKey, undefined, oldValue);\n\t\t}\n\t\treturn isDelete;\n\t}\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): ReactiveScope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey) as V;\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<any> | undefined;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext !== 'object') {\n\t\t\treturn;\n\t\t}\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', propertyKey as string, this);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): ReactiveScope<V> {\n\t\tconst scopeContext = this.get(propertyKey) as V;\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<any> | undefined;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', propertyKey as string, this);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tthis.observer.emit(propertyKey, newValue, oldValue);\n\t\tthis.parent?.emit(this.name!, this.context);\n\t}\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\treturn this.observer.subscribe(propertyKey, callback);\n\t}\n\tunsubscribe(propertyKey?: keyof T, subscription?: ScopeSubscription<T>) {\n\t\tif (propertyKey && subscription) {\n\t\t\tthis.observer.unsubscribe(propertyKey, subscription);\n\t\t} else if (propertyKey) {\n\t\t\tthis.observer.unsubscribe(propertyKey);\n\t\t} else {\n\t\t\tthis.observer.destroy();\n\t\t}\n\t}\n}\n\n/**\n * used control/notify/pause scope about changes in current context\n */\nexport interface ScopeControl<T extends ScopeContext> {\n\n\t/**\n\t * used when want to update ui-view like, you want to replace an array with another \n\t * without reflect changes on view until reattached again.\n\t */\n\tdetach(): void;\n\n\t/**\n\t * apply all the not emitted changes, and continue emit in time.\n\t */\n\treattach(): void;\n\n\t/**\n\t * apply changes now,\n\t * will not effect the state of the detector wither if attached ot not.\n\t * \n\t * if a propertyKey is provided, will emit this property only \n\t * @param propertyKey \n\t */\n\temitChanges(propertyKey?: keyof T, propertyValue?: any): void;\n}\n\nexport class ReactiveScopeControl<T extends ScopeContext> extends ReactiveScope<T> implements ScopeControl<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScopeControl(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'global');\n\t}\n\n\tprotected attached: boolean = true;\n\tprotected marked: ScopeContext = {};\n\toverride emit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this.attached) {\n\t\t\tsuper.emit(propertyKey, newValue, oldValue);\n\t\t} else {\n\t\t\tthis.marked[propertyKey] = newValue;\n\t\t}\n\t}\n\tdetach(): void {\n\t\tthis.attached = false;\n\t}\n\treattach(): void {\n\t\tthis.attached = true;\n\t\tthis.emitChanges();\n\t}\n\temitChanges(propertyKey?: keyof T, propertyValue?: any): void {\n\t\tif (propertyKey) {\n\t\t\tsuper.emit(propertyKey, propertyValue);\n\t\t\tReflect.deleteProperty(this.marked, propertyKey);\n\t\t\treturn;\n\t\t}\n\t\tconst latestChanges = this.marked;\n\t\tthis.marked = {};\n\t\tObject.keys(latestChanges).forEach(propertyKey => {\n\t\t\tsuper.emit(propertyKey, latestChanges[propertyKey]);\n\t\t});\n\t}\n}\n"]}
package/scope/stack.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { CanDeclareExpression } from '../api/expression.js';
2
- import { ReactiveScope, Scope, ScopeType } from './scope.js';
2
+ import { ReactiveScope, Scope, ScopeContext, ScopeType } from './scope.js';
3
3
  export interface AwaitPromiseInfo {
4
4
  promise: Promise<any>;
5
5
  node: CanDeclareExpression;
@@ -17,22 +17,22 @@ export interface Stack {
17
17
  get(propertyKey: PropertyKey): any;
18
18
  set(propertyKey: PropertyKey, value: any, receiver?: any): boolean;
19
19
  declareVariable(scopeType: ScopeType, propertyKey: PropertyKey, propertyValue?: any): any;
20
- findScope<T extends object>(propertyKey: PropertyKey): Scope<T>;
20
+ findScope<T extends ScopeContext>(propertyKey: PropertyKey): Scope<T>;
21
21
  resolveAwait(value: AwaitPromiseInfo): void;
22
- lastScope<T extends object>(): Scope<T>;
23
- clearTo<T extends object>(scope: Scope<T>): boolean;
24
- clearTill<T extends object>(scope: Scope<T>): boolean;
25
- popScope<T extends object>(): Scope<T>;
26
- removeScope<T extends object>(scope: Scope<T>): void;
27
- pushScope<T extends object>(scope: Scope<T>): void;
28
- pushBlockScope<T extends object>(): Scope<T>;
29
- pushFunctionScope<T extends object>(): Scope<T>;
30
- pushBlockScopeFor<T extends object>(context: T): Scope<T>;
31
- pushFunctionScopeFor<T extends object>(context: T): Scope<T>;
32
- pushBlockReactiveScope<T extends object>(): ReactiveScope<T>;
33
- pushFunctionReactiveScope<T extends object>(): ReactiveScope<T>;
34
- pushBlockReactiveScopeFor<T extends object>(context: T): ReactiveScope<T>;
35
- pushFunctionReactiveScopeFor<T extends object>(context: T): ReactiveScope<T>;
22
+ lastScope<T extends ScopeContext>(): Scope<T>;
23
+ clearTo<T extends ScopeContext>(scope: Scope<T>): boolean;
24
+ clearTill<T extends ScopeContext>(scope: Scope<T>): boolean;
25
+ popScope<T extends ScopeContext>(): Scope<T>;
26
+ removeScope<T extends ScopeContext>(scope: Scope<T>): void;
27
+ pushScope<T extends ScopeContext>(scope: Scope<T>): void;
28
+ pushBlockScope<T extends ScopeContext>(): Scope<T>;
29
+ pushFunctionScope<T extends ScopeContext>(): Scope<T>;
30
+ pushBlockScopeFor<T extends ScopeContext>(context: T): Scope<T>;
31
+ pushFunctionScopeFor<T extends ScopeContext>(context: T): Scope<T>;
32
+ pushBlockReactiveScope<T extends ScopeContext>(): ReactiveScope<T>;
33
+ pushFunctionReactiveScope<T extends ScopeContext>(): ReactiveScope<T>;
34
+ pushBlockReactiveScopeFor<T extends ScopeContext>(context: T): ReactiveScope<T>;
35
+ pushFunctionReactiveScopeFor<T extends ScopeContext>(context: T): ReactiveScope<T>;
36
36
  copyStack(): Stack;
37
37
  }
38
38
  export declare class Stack implements Stack {
@@ -42,16 +42,16 @@ export declare class Stack implements Stack {
42
42
  forAwaitAsyncIterable?: AsyncIterableInfo | undefined;
43
43
  protected readonly stack: Array<Scope<any>>;
44
44
  constructor(stack?: Array<Scope<any>>);
45
- pushClassScope<T extends object>(): Scope<T>;
46
- pushModuleScope<T extends object>(): Scope<T>;
47
- pushGlobalScope<T extends object>(): Scope<T>;
48
- pushClassScopeFor<T extends object>(context: T): Scope<T>;
49
- pushModuleScopeFor<T extends object>(context: T): Scope<T>;
50
- pushGlobalScopeFor<T extends object>(context: T): Scope<T>;
51
- pushClassReactiveScope<T extends object>(): Scope<T>;
52
- pushModuleReactiveScope<T extends object>(): Scope<T>;
53
- pushGlobalReactiveScope<T extends object>(): Scope<T>;
54
- pushClassReactiveScopeFor<T extends object>(context: T): Scope<T>;
55
- pushModuleReactiveScopeFor<T extends object>(context: T): Scope<T>;
56
- pushGlobalReactiveScopeFor<T extends object>(context: T): Scope<T>;
45
+ pushClassScope<T extends ScopeContext>(): Scope<T>;
46
+ pushModuleScope<T extends ScopeContext>(): Scope<T>;
47
+ pushGlobalScope<T extends ScopeContext>(): Scope<T>;
48
+ pushClassScopeFor<T extends ScopeContext>(context: T): Scope<T>;
49
+ pushModuleScopeFor<T extends ScopeContext>(context: T): Scope<T>;
50
+ pushGlobalScopeFor<T extends ScopeContext>(context: T): Scope<T>;
51
+ pushClassReactiveScope<T extends ScopeContext>(): Scope<T>;
52
+ pushModuleReactiveScope<T extends ScopeContext>(): Scope<T>;
53
+ pushGlobalReactiveScope<T extends ScopeContext>(): Scope<T>;
54
+ pushClassReactiveScopeFor<T extends ScopeContext>(context: T): Scope<T>;
55
+ pushModuleReactiveScopeFor<T extends ScopeContext>(context: T): Scope<T>;
56
+ pushGlobalReactiveScopeFor<T extends ScopeContext>(context: T): Scope<T>;
57
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../src/expressions/scope/stack.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CanDeclareExpression } from '../api/expression.js';\nimport { ReactiveScope, Scope, ScopeContext, ScopeType } from './scope.js';\n\n\nexport interface AwaitPromiseInfo {\n\tpromise: Promise<any>;\n\tnode: CanDeclareExpression;\n\n\tdeclareVariable: boolean;\n\tscopeType: ScopeType;\n}\n\nexport interface AsyncIterableInfo {\n\titerable: AsyncIterable<any>;\n\tforAwaitBody: (iterator: any) => any;\n}\n\nexport interface Stack {\n\t/**\n\t * a list of promises to resolve in an 'async' scope as 'async function'\n\t */\n\tawaitPromise: Array<AwaitPromiseInfo>;\n\n\t/**\n\t * resolve await promise in 'await for in' scope\n\t */\n\tforAwaitAsyncIterable?: AsyncIterableInfo;\n\n\t/**\n\t * is this stack has a propertyKey\n\t * @param propertyKey \n\t */\n\thas(propertyKey: PropertyKey): boolean;\n\n\t/**\n\t * get the first value for provided property key,\n\t * \n\t * will search current stack in all scope till find the first key, else undefined\n\t * @param propertyKey \n\t */\n\tget(propertyKey: PropertyKey): any;\n\n\t/**\n\t * set the value of `propertyKey` in its context provider with `value`.\n\t * else define it in the first scope 'local scope'\n\t * @param propertyKey \n\t * @param value \n\t * @param receiver \n\t */\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean;\n\n\t/**\n\t * declare variable in stack by scope type,\n\t * \n\t * 'block' for the first scop ==> may be 'block' or 'function' scope\n\t * \n\t * 'function' will search for the first scope with scope type 'function'\n\t * then define a property key with 'initial' value in thus scope\n\t * @param scopeType \"function\" | \"block\"\n\t * @param propertyKey the name of property mey be string | number | symbol, \n\t * @param propertyValue if not exist will be initialize with 'undefined' value\n\t */\n\tdeclareVariable(scopeType: ScopeType, propertyKey: PropertyKey, propertyValue?: any): any;\n\n\n\t/**\n\t * get context object of this provider,\n\t * search for the first context object that has `propertyKey`.\n\t * \n\t * search for the first context that have property key,\n\t * if not found will return the stack local scop as a default value\n\t * @param propertyKey the property key\n\t */\n\tfindScope<T extends object>(propertyKey: PropertyKey): Scope<T>;\n\n\tresolveAwait(value: AwaitPromiseInfo): void;\n\n\t/**\n\t * get a reference to the last scope in this stack\n\t */\n\tlastScope<T extends object>(): Scope<T>;\n\n\t/**\n\t * clear every thing after this scope, and even this scope\n\t * @param scope \n\t */\n\tclearTo<T extends object>(scope: Scope<T>): boolean;\n\n\t/**\n\t * clear every thing after this scope, but not this scope\n\t * @param scope \n\t */\n\tclearTill<T extends object>(scope: Scope<T>): boolean;\n\n\tpopScope<T extends object>(): Scope<T>;\n\n\tremoveScope<T extends object>(scope: Scope<T>): void;\n\n\tpushScope<T extends object>(scope: Scope<T>): void;\n\n\tpushBlockScope<T extends object>(): Scope<T>;\n\n\tpushFunctionScope<T extends object>(): Scope<T>;\n\n\tpushBlockScopeFor<T extends object>(context: T): Scope<T>;\n\n\tpushFunctionScopeFor<T extends object>(context: T): Scope<T>;\n\n\n\tpushBlockReactiveScope<T extends object>(): ReactiveScope<T>;\n\n\tpushFunctionReactiveScope<T extends object>(): ReactiveScope<T>;\n\n\tpushBlockReactiveScopeFor<T extends object>(context: T): ReactiveScope<T>;\n\n\tpushFunctionReactiveScopeFor<T extends object>(context: T): ReactiveScope<T>;\n\n\tcopyStack(): Stack;\n}\n\nexport class Stack implements Stack {\n\tstatic for(...contexts: Scope<any>[]): Stack {\n\t\tif (contexts.length === 0) {\n\t\t\treturn new Stack();\n\t\t}\n\t\treturn new Stack(contexts.map(context => new Scope(context, 'global')));\n\t}\n\tstatic forScopes(...scopes: Scope<any>[]): Stack {\n\t\tif (scopes.length === 0) {\n\t\t\tscopes.push(Scope.functionScope());\n\t\t}\n\t\treturn new Stack(scopes);\n\t}\n\tawaitPromise: AwaitPromiseInfo[];\n\tforAwaitAsyncIterable?: AsyncIterableInfo | undefined;\n\n\tprotected readonly stack: Array<Scope<any>>;\n\n\tconstructor(stack?: Array<Scope<any>>) {\n\t\tthis.stack = stack ?? [Scope.functionScope()];\n\t}\n\thas(propertyKey: PropertyKey): boolean {\n\t\treturn this.stack.find(context => context.has(propertyKey)) ? true : false;\n\t}\n\tget(propertyKey: PropertyKey) {\n\t\treturn this.findScope<ScopeContext>(propertyKey).get(propertyKey);\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\treturn this.findScope<ScopeContext>(propertyKey).set(propertyKey, value, receiver);\n\t}\n\tdeclareVariable(scopeType: ScopeType, propertyKey: PropertyKey, propertyValue?: any) {\n\t\tif (scopeType === 'block') {\n\t\t\treturn this.lastScope<ScopeContext>().set(propertyKey, propertyValue);\n\t\t}\n\t\tlet lastIndex = this.stack.length;\n\t\twhile (lastIndex--) {\n\t\t\tconst scope = this.stack[lastIndex];\n\t\t\tif (scope.type === scopeType) {\n\t\t\t\tscope.set(propertyKey, propertyValue);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tfindScope<T extends object>(propertyKey: PropertyKey): Scope<T> {\n\t\tlet lastIndex = this.stack.length;\n\t\twhile (lastIndex--) {\n\t\t\tconst scope = this.stack[lastIndex];\n\t\t\tif (scope.has(propertyKey)) {\n\t\t\t\treturn scope;\n\t\t\t}\n\t\t}\n\t\treturn this.lastScope();\n\t}\n\tresolveAwait(value: AwaitPromiseInfo): void {\n\t\tthis.awaitPromise.push(value);\n\t}\n\tpopScope<T extends object>(): Scope<T> {\n\t\treturn this.stack.pop()!;\n\t}\n\tremoveScope<T extends object>(scope: Scope<T>): void {\n\t\tconst index = this.stack.lastIndexOf(scope);\n\t\tthis.stack.splice(index, 1);\n\t}\n\tpushScope<T extends object>(scope: Scope<T>): void {\n\t\tthis.stack.push(scope);\n\t}\n\tpushBlockScope<T extends object>(): Scope<T> {\n\t\tconst scope = Scope.blockScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionScope<T extends object>(): Scope<T> {\n\t\tconst scope = Scope.functionScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassScope<T extends object>(): Scope<T> {\n\t\tconst scope = Scope.classScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleScope<T extends object>(): Scope<T> {\n\t\tconst scope = Scope.moduleScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalScope<T extends object>(): Scope<T> {\n\t\tconst scope = Scope.globalScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushBlockScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = Scope.blockScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = Scope.functionScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = Scope.classScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = Scope.moduleScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = Scope.globalScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushBlockReactiveScope<T extends object>(): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.blockScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionReactiveScope<T extends object>(): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.functionScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassReactiveScope<T extends object>(): Scope<T> {\n\t\tconst scope = ReactiveScope.classScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleReactiveScope<T extends object>(): Scope<T> {\n\t\tconst scope = ReactiveScope.moduleScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalReactiveScope<T extends object>(): Scope<T> {\n\t\tconst scope = ReactiveScope.globalScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushBlockReactiveScopeFor<T extends object>(context: T): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.blockScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionReactiveScopeFor<T extends object>(context: T): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.functionScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassReactiveScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = ReactiveScope.classScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleReactiveScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = ReactiveScope.moduleScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalReactiveScopeFor<T extends object>(context: T): Scope<T> {\n\t\tconst scope = ReactiveScope.globalScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tlastScope<T extends object>(): Scope<T> {\n\t\treturn this.stack[this.stack.length - 1];\n\t}\n\tclearTo<T extends object>(scope: Scope<T>): boolean {\n\t\tconst index = this.stack.lastIndexOf(scope);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.stack.splice(index);\n\t\treturn true;\n\t}\n\tclearTill<T extends object>(scope: Scope<T>): boolean {\n\t\tconst index = this.stack.lastIndexOf(scope);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.stack.splice(index + 1);\n\t\treturn true;\n\t}\n\tcopyStack(): Stack {\n\t\treturn new Stack(this.stack.slice());\n\t}\n}\n"]}
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../src/expressions/scope/stack.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CanDeclareExpression } from '../api/expression.js';\nimport { ReactiveScope, Scope, ScopeContext, ScopeType } from './scope.js';\n\n\nexport interface AwaitPromiseInfo {\n\tpromise: Promise<any>;\n\tnode: CanDeclareExpression;\n\n\tdeclareVariable: boolean;\n\tscopeType: ScopeType;\n}\n\nexport interface AsyncIterableInfo {\n\titerable: AsyncIterable<any>;\n\tforAwaitBody: (iterator: any) => any;\n}\n\nexport interface Stack {\n\t/**\n\t * a list of promises to resolve in an 'async' scope as 'async function'\n\t */\n\tawaitPromise: Array<AwaitPromiseInfo>;\n\n\t/**\n\t * resolve await promise in 'await for in' scope\n\t */\n\tforAwaitAsyncIterable?: AsyncIterableInfo;\n\n\t/**\n\t * is this stack has a propertyKey\n\t * @param propertyKey \n\t */\n\thas(propertyKey: PropertyKey): boolean;\n\n\t/**\n\t * get the first value for provided property key,\n\t * \n\t * will search current stack in all scope till find the first key, else undefined\n\t * @param propertyKey \n\t */\n\tget(propertyKey: PropertyKey): any;\n\n\t/**\n\t * set the value of `propertyKey` in its context provider with `value`.\n\t * else define it in the first scope 'local scope'\n\t * @param propertyKey \n\t * @param value \n\t * @param receiver \n\t */\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean;\n\n\t/**\n\t * declare variable in stack by scope type,\n\t * \n\t * 'block' for the first scop ==> may be 'block' or 'function' scope\n\t * \n\t * 'function' will search for the first scope with scope type 'function'\n\t * then define a property key with 'initial' value in thus scope\n\t * @param scopeType \"function\" | \"block\"\n\t * @param propertyKey the name of property mey be string | number | symbol, \n\t * @param propertyValue if not exist will be initialize with 'undefined' value\n\t */\n\tdeclareVariable(scopeType: ScopeType, propertyKey: PropertyKey, propertyValue?: any): any;\n\n\n\t/**\n\t * get context object of this provider,\n\t * search for the first context object that has `propertyKey`.\n\t * \n\t * search for the first context that have property key,\n\t * if not found will return the stack local scop as a default value\n\t * @param propertyKey the property key\n\t */\n\tfindScope<T extends ScopeContext>(propertyKey: PropertyKey): Scope<T>;\n\n\tresolveAwait(value: AwaitPromiseInfo): void;\n\n\t/**\n\t * get a reference to the last scope in this stack\n\t */\n\tlastScope<T extends ScopeContext>(): Scope<T>;\n\n\t/**\n\t * clear every thing after this scope, and even this scope\n\t * @param scope \n\t */\n\tclearTo<T extends ScopeContext>(scope: Scope<T>): boolean;\n\n\t/**\n\t * clear every thing after this scope, but not this scope\n\t * @param scope \n\t */\n\tclearTill<T extends ScopeContext>(scope: Scope<T>): boolean;\n\n\tpopScope<T extends ScopeContext>(): Scope<T>;\n\n\tremoveScope<T extends ScopeContext>(scope: Scope<T>): void;\n\n\tpushScope<T extends ScopeContext>(scope: Scope<T>): void;\n\n\tpushBlockScope<T extends ScopeContext>(): Scope<T>;\n\n\tpushFunctionScope<T extends ScopeContext>(): Scope<T>;\n\n\tpushBlockScopeFor<T extends ScopeContext>(context: T): Scope<T>;\n\n\tpushFunctionScopeFor<T extends ScopeContext>(context: T): Scope<T>;\n\n\n\tpushBlockReactiveScope<T extends ScopeContext>(): ReactiveScope<T>;\n\n\tpushFunctionReactiveScope<T extends ScopeContext>(): ReactiveScope<T>;\n\n\tpushBlockReactiveScopeFor<T extends ScopeContext>(context: T): ReactiveScope<T>;\n\n\tpushFunctionReactiveScopeFor<T extends ScopeContext>(context: T): ReactiveScope<T>;\n\n\tcopyStack(): Stack;\n}\n\nexport class Stack implements Stack {\n\tstatic for(...contexts: Scope<any>[]): Stack {\n\t\tif (contexts.length === 0) {\n\t\t\treturn new Stack();\n\t\t}\n\t\treturn new Stack(contexts.map(context => new Scope(context, 'global')));\n\t}\n\tstatic forScopes(...scopes: Scope<any>[]): Stack {\n\t\tif (scopes.length === 0) {\n\t\t\tscopes.push(Scope.functionScope());\n\t\t}\n\t\treturn new Stack(scopes);\n\t}\n\tawaitPromise: AwaitPromiseInfo[];\n\tforAwaitAsyncIterable?: AsyncIterableInfo | undefined;\n\n\tprotected readonly stack: Array<Scope<any>>;\n\n\tconstructor(stack?: Array<Scope<any>>) {\n\t\tthis.stack = stack ?? [Scope.functionScope()];\n\t}\n\thas(propertyKey: PropertyKey): boolean {\n\t\treturn this.stack.find(context => context.has(propertyKey)) ? true : false;\n\t}\n\tget(propertyKey: PropertyKey) {\n\t\treturn this.findScope<ScopeContext>(propertyKey).get(propertyKey);\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\treturn this.findScope<ScopeContext>(propertyKey).set(propertyKey, value, receiver);\n\t}\n\tdeclareVariable(scopeType: ScopeType, propertyKey: PropertyKey, propertyValue?: any) {\n\t\tif (scopeType === 'block') {\n\t\t\treturn this.lastScope<ScopeContext>().set(propertyKey, propertyValue);\n\t\t}\n\t\tlet lastIndex = this.stack.length;\n\t\twhile (lastIndex--) {\n\t\t\tconst scope = this.stack[lastIndex];\n\t\t\tif (scope.type === scopeType) {\n\t\t\t\tscope.set(propertyKey, propertyValue);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tfindScope<T extends ScopeContext>(propertyKey: PropertyKey): Scope<T> {\n\t\tlet lastIndex = this.stack.length;\n\t\twhile (lastIndex--) {\n\t\t\tconst scope = this.stack[lastIndex];\n\t\t\tif (scope.has(propertyKey)) {\n\t\t\t\treturn scope;\n\t\t\t}\n\t\t}\n\t\treturn this.lastScope();\n\t}\n\tresolveAwait(value: AwaitPromiseInfo): void {\n\t\tthis.awaitPromise.push(value);\n\t}\n\tpopScope<T extends ScopeContext>(): Scope<T> {\n\t\treturn this.stack.pop()!;\n\t}\n\tremoveScope<T extends ScopeContext>(scope: Scope<T>): void {\n\t\tconst index = this.stack.lastIndexOf(scope);\n\t\tthis.stack.splice(index, 1);\n\t}\n\tpushScope<T extends ScopeContext>(scope: Scope<T>): void {\n\t\tthis.stack.push(scope);\n\t}\n\tpushBlockScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = Scope.blockScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = Scope.functionScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = Scope.classScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = Scope.moduleScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = Scope.globalScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushBlockScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = Scope.blockScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = Scope.functionScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = Scope.classScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = Scope.moduleScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = Scope.globalScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushBlockReactiveScope<T extends ScopeContext>(): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.blockScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionReactiveScope<T extends ScopeContext>(): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.functionScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassReactiveScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = ReactiveScope.classScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleReactiveScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = ReactiveScope.moduleScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalReactiveScope<T extends ScopeContext>(): Scope<T> {\n\t\tconst scope = ReactiveScope.globalScope<T>();\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushBlockReactiveScopeFor<T extends ScopeContext>(context: T): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.blockScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushFunctionReactiveScopeFor<T extends ScopeContext>(context: T): ReactiveScope<T> {\n\t\tconst scope = ReactiveScope.functionScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushClassReactiveScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = ReactiveScope.classScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushModuleReactiveScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = ReactiveScope.moduleScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tpushGlobalReactiveScopeFor<T extends ScopeContext>(context: T): Scope<T> {\n\t\tconst scope = ReactiveScope.globalScopeFor(context);\n\t\tthis.stack.push(scope);\n\t\treturn scope;\n\t}\n\tlastScope<T extends ScopeContext>(): Scope<T> {\n\t\treturn this.stack[this.stack.length - 1];\n\t}\n\tclearTo<T extends ScopeContext>(scope: Scope<T>): boolean {\n\t\tconst index = this.stack.lastIndexOf(scope);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.stack.splice(index);\n\t\treturn true;\n\t}\n\tclearTill<T extends ScopeContext>(scope: Scope<T>): boolean {\n\t\tconst index = this.stack.lastIndexOf(scope);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.stack.splice(index + 1);\n\t\treturn true;\n\t}\n\tcopyStack(): Stack {\n\t\treturn new Stack(this.stack.slice());\n\t}\n}\n"]}