@ibyar/expressions 0.5.6 → 0.6.1

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 (97) hide show
  1. package/api/abstract.js +5 -0
  2. package/api/abstract.js.map +1 -1
  3. package/api/class/class.d.ts +28 -13
  4. package/api/class/class.js +46 -41
  5. package/api/class/class.js.map +1 -1
  6. package/api/computing/return.d.ts +4 -0
  7. package/api/computing/return.js +5 -0
  8. package/api/computing/return.js.map +1 -1
  9. package/api/computing/throw.d.ts +4 -0
  10. package/api/computing/throw.js +4 -0
  11. package/api/computing/throw.js.map +1 -1
  12. package/api/definition/bind.d.ts +6 -0
  13. package/api/definition/bind.js +6 -0
  14. package/api/definition/bind.js.map +1 -1
  15. package/api/definition/function.js +6 -5
  16. package/api/definition/function.js.map +1 -1
  17. package/api/definition/member.js.map +1 -1
  18. package/api/definition/object.js +1 -1
  19. package/api/definition/object.js.map +1 -1
  20. package/api/definition/values.d.ts +12 -3
  21. package/api/definition/values.js +25 -4
  22. package/api/definition/values.js.map +1 -1
  23. package/api/deserialize/deserialize.d.ts +5 -0
  24. package/api/deserialize/deserialize.js +5 -0
  25. package/api/deserialize/deserialize.js.map +1 -1
  26. package/api/expression.d.ts +151 -5
  27. package/api/expression.js.map +1 -1
  28. package/api/module/export.d.ts +63 -0
  29. package/api/module/export.js +64 -1
  30. package/api/module/export.js.map +1 -1
  31. package/api/module/import.d.ts +53 -0
  32. package/api/module/import.js +53 -0
  33. package/api/module/import.js.map +1 -1
  34. package/api/operators/grouping.d.ts +7 -0
  35. package/api/operators/grouping.js +7 -0
  36. package/api/operators/grouping.js.map +1 -1
  37. package/api/operators/pipeline.d.ts +12 -0
  38. package/api/operators/pipeline.js +12 -0
  39. package/api/operators/pipeline.js.map +1 -1
  40. package/api/operators/unary.js +3 -0
  41. package/api/operators/unary.js.map +1 -1
  42. package/api/program.d.ts +2 -2
  43. package/api/program.js.map +1 -1
  44. package/api/statement/control/block.d.ts +4 -0
  45. package/api/statement/control/block.js +4 -0
  46. package/api/statement/control/block.js.map +1 -1
  47. package/api/statement/control/empty.d.ts +7 -0
  48. package/api/statement/control/empty.js +7 -0
  49. package/api/statement/control/empty.js.map +1 -1
  50. package/api/statement/control/if.d.ts +5 -0
  51. package/api/statement/control/if.js +5 -0
  52. package/api/statement/control/if.js.map +1 -1
  53. package/api/statement/control/switch.d.ts +6 -0
  54. package/api/statement/control/switch.js +9 -0
  55. package/api/statement/control/switch.js.map +1 -1
  56. package/api/statement/control/terminate.d.ts +8 -0
  57. package/api/statement/control/terminate.js +8 -0
  58. package/api/statement/control/terminate.js.map +1 -1
  59. package/api/statement/iterations/for.d.ts +5 -0
  60. package/api/statement/iterations/for.js +13 -0
  61. package/api/statement/iterations/for.js.map +1 -1
  62. package/api/statement/iterations/while.d.ts +6 -0
  63. package/api/statement/iterations/while.js +10 -0
  64. package/api/statement/iterations/while.js.map +1 -1
  65. package/package.json +5 -3
  66. package/scope/event.d.ts +3 -3
  67. package/scope/event.js +2 -2
  68. package/scope/event.js.map +1 -1
  69. package/scope/pool.d.ts +7 -0
  70. package/scope/pool.js +29 -0
  71. package/scope/pool.js.map +1 -0
  72. package/scope/proxy.d.ts +6 -9
  73. package/scope/proxy.js +22 -31
  74. package/scope/proxy.js.map +1 -1
  75. package/scope/scope.d.ts +161 -38
  76. package/scope/scope.js +260 -106
  77. package/scope/scope.js.map +1 -1
  78. package/scope/stack.d.ts +95 -19
  79. package/scope/stack.js +13 -0
  80. package/scope/stack.js.map +1 -1
  81. package/v8/enums.js +31 -0
  82. package/v8/enums.js.map +1 -1
  83. package/v8/inline.d.ts +36 -0
  84. package/v8/inline.js +407 -5
  85. package/v8/inline.js.map +1 -1
  86. package/v8/nodes.js +2 -1
  87. package/v8/nodes.js.map +1 -1
  88. package/v8/parser.d.ts +8 -0
  89. package/v8/parser.js +304 -1
  90. package/v8/parser.js.map +1 -1
  91. package/v8/stream.d.ts +4 -0
  92. package/v8/stream.js +79 -17
  93. package/v8/stream.js.map +1 -1
  94. package/v8/token.d.ts +229 -0
  95. package/v8/token.js +236 -1
  96. package/v8/token.js.map +1 -1
  97. package/visit/visitor.d.ts +3 -0
package/scope/scope.js CHANGED
@@ -1,75 +1,129 @@
1
1
  export class Scope {
2
- constructor(context, propertyKeys) {
3
- this.context = context;
4
- this.scopeMap = new Map();
5
- this.propertyKeys = propertyKeys;
6
- if (Array.isArray(this.propertyKeys)) {
7
- this.has = (propertyKey) => {
8
- return this.propertyKeys.includes(propertyKey);
9
- };
10
- }
2
+ constructor(_ctx, _keys) {
3
+ this._ctx = _ctx;
4
+ this._keys = _keys;
5
+ this._inners = new Map();
11
6
  }
12
- static for(context, propertyKeys) {
13
- return new Scope(context, propertyKeys);
7
+ static for(ctx, propertyKeys) {
8
+ return new Scope(ctx, propertyKeys);
14
9
  }
15
10
  static blockScope(propertyKeys) {
16
11
  return new Scope({}, propertyKeys);
17
12
  }
18
- get(propertyKey) {
19
- return Reflect.get(this.context, propertyKey);
13
+ get(key) {
14
+ return Reflect.get(this._ctx, key);
20
15
  }
21
- set(propertyKey, value, receiver) {
22
- return Reflect.set(this.context, propertyKey, value);
16
+ set(key, value, receiver) {
17
+ return Reflect.set(this._ctx, key, value);
23
18
  }
24
- has(propertyKey) {
25
- return propertyKey in this.context;
19
+ has(key) {
20
+ return this._keys?.includes(key) ?? key in this._ctx;
26
21
  }
27
- delete(propertyKey) {
28
- return Reflect.deleteProperty(this.context, propertyKey);
22
+ delete(key) {
23
+ return Reflect.deleteProperty(this._ctx, key);
29
24
  }
30
25
  getContext() {
31
- return this.context;
26
+ return this._ctx;
32
27
  }
33
- getScope(propertyKey) {
34
- const scopeContext = this.get(propertyKey);
35
- let scope = this.scopeMap.get(propertyKey);
28
+ getInnerScope(key) {
29
+ const ctx = this.get(key);
30
+ let scope = this._inners.get(key);
36
31
  if (scope) {
37
- scope.context = scopeContext;
32
+ scope._ctx = ctx;
38
33
  return scope;
39
34
  }
40
- if (typeof scopeContext !== 'object') {
35
+ if (!(ctx && typeof ctx === 'object')) {
41
36
  return;
42
37
  }
43
- scope = new (this.getClass())(scopeContext);
44
- this.scopeMap.set(propertyKey, scope);
38
+ scope = new (this.getClass())(ctx, undefined, key, this);
39
+ this._inners.set(key, scope);
45
40
  return scope;
46
41
  }
47
- getScopeOrCreat(propertyKey) {
48
- const scopeContext = this.get(propertyKey);
49
- let scope = this.scopeMap.get(propertyKey);
42
+ setInnerScope(key, scope) {
50
43
  if (scope) {
51
- scope.context = scopeContext;
44
+ this._inners.set(key, scope);
52
45
  return scope;
53
46
  }
54
- scope = new (this.getClass())(scopeContext);
55
- this.scopeMap.set(propertyKey, scope);
47
+ const ctx = this.get(key);
48
+ scope = new (this.getClass())(ctx, undefined, key, this);
49
+ this._inners.set(key, scope);
56
50
  return scope;
57
51
  }
58
52
  getClass() {
59
53
  return Scope;
60
54
  }
61
55
  }
56
+ /**
57
+ * a class scope used for class instance and private static properties
58
+ */
59
+ export class ClassScope extends Scope {
60
+ constructor(context, propertyKeys, _pKeys) {
61
+ super(context, propertyKeys);
62
+ this._pKeys = _pKeys;
63
+ this._private = {};
64
+ }
65
+ static for(ctx, propertyKeys, privateKeys) {
66
+ return new ClassScope(ctx, propertyKeys, privateKeys);
67
+ }
68
+ static blockScope(propertyKeys, privateKeys) {
69
+ return new ClassScope({}, propertyKeys, privateKeys);
70
+ }
71
+ static readOnlyScopeForThis(ctx, propertyKeys, privateKeys) {
72
+ const thisScope = ClassScope.for(ctx, propertyKeys, privateKeys);
73
+ const thisCtx = {
74
+ 'this': ctx,
75
+ };
76
+ const rootScope = ReadOnlyScope.for(thisCtx, ['this']);
77
+ rootScope.setInnerScope('this', thisScope);
78
+ return rootScope;
79
+ }
80
+ getPrivateContext() {
81
+ return this._private;
82
+ }
83
+ get(key) {
84
+ if (this.isPrivateKey(key)) {
85
+ return Reflect.get(this._private, key);
86
+ }
87
+ return super.get(key);
88
+ }
89
+ set(key, value, receiver) {
90
+ if (this.isPrivateKey(key)) {
91
+ return Reflect.set(this._private, key, value);
92
+ }
93
+ return super.set(key, value, receiver);
94
+ }
95
+ has(key) {
96
+ if (this.isPrivateKey(key)) {
97
+ return this._pKeys?.includes(key) ?? key in this._private;
98
+ }
99
+ return super.has(key);
100
+ }
101
+ delete(key) {
102
+ if (this.isPrivateKey(key)) {
103
+ return Reflect.deleteProperty(this._private, key);
104
+ }
105
+ return super.delete(key);
106
+ }
107
+ isPrivateKey(key) {
108
+ return typeof key === 'string' && key.startsWith('#');
109
+ }
110
+ getClass() {
111
+ return Scope;
112
+ }
113
+ }
62
114
  export class ReadOnlyScope extends Scope {
63
- static for(context, propertyKeys) {
64
- return new ReadOnlyScope(context, propertyKeys);
115
+ static for(ctx, propertyKeys) {
116
+ return new ReadOnlyScope(ctx, propertyKeys);
65
117
  }
66
118
  static blockScope(propertyKeys) {
67
119
  return new ReadOnlyScope({}, propertyKeys);
68
120
  }
69
121
  set(propertyKey, value, receiver) {
122
+ // do nothing
70
123
  return false;
71
124
  }
72
125
  delete(propertyKey) {
126
+ // do nothing
73
127
  return false;
74
128
  }
75
129
  getClass() {
@@ -93,18 +147,18 @@ export class ScopeSubscription {
93
147
  }
94
148
  export class ValueChangeObserver {
95
149
  constructor() {
96
- this.subscribers = new Map();
97
- this.propertiesLock = [];
150
+ this._subscribers = new Map();
151
+ this._lock = [];
98
152
  }
99
153
  emit(propertyKey, newValue, oldValue) {
100
- if (this.propertiesLock.includes(propertyKey)) {
154
+ if (this._lock.includes(propertyKey)) {
101
155
  return;
102
156
  }
103
- const subscribers = this.subscribers.get(propertyKey);
157
+ const subscribers = this._subscribers.get(propertyKey);
104
158
  if (!subscribers || subscribers.size == 0) {
105
159
  return;
106
160
  }
107
- this.propertiesLock.push(propertyKey);
161
+ this._lock.push(propertyKey);
108
162
  subscribers?.forEach(subscriptionInfo => {
109
163
  if (!subscriptionInfo.enable) {
110
164
  return;
@@ -116,51 +170,59 @@ export class ValueChangeObserver {
116
170
  console.error(e);
117
171
  }
118
172
  });
119
- if (this.propertiesLock.pop() !== propertyKey) {
173
+ if (this._lock.pop() !== propertyKey) {
120
174
  console.error('lock error');
121
175
  }
122
176
  ;
123
177
  }
124
178
  subscribe(propertyKey, callback) {
125
179
  const subscription = new ScopeSubscription(propertyKey, this);
126
- let propertySubscribers = this.subscribers.get(propertyKey);
180
+ let propertySubscribers = this._subscribers.get(propertyKey);
127
181
  if (!propertySubscribers) {
128
182
  propertySubscribers = new Map();
129
- this.subscribers.set(propertyKey, propertySubscribers);
183
+ this._subscribers.set(propertyKey, propertySubscribers);
130
184
  }
131
185
  propertySubscribers.set(subscription, { callback, enable: true });
132
186
  return subscription;
133
187
  }
134
188
  unsubscribe(propertyKey, subscription) {
135
189
  if (subscription) {
136
- this.subscribers.get(propertyKey)?.delete(subscription);
190
+ this._subscribers.get(propertyKey)?.delete(subscription);
137
191
  }
138
192
  else {
139
- this.subscribers.delete(propertyKey);
193
+ this._subscribers.delete(propertyKey);
140
194
  }
141
195
  }
142
196
  pause(propertyKey, subscription) {
143
- const subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);
197
+ const subscriptionInfo = this._subscribers.get(propertyKey)?.get(subscription);
144
198
  subscriptionInfo && (subscriptionInfo.enable = false);
145
199
  }
146
200
  resume(propertyKey, subscription) {
147
- const subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);
201
+ const subscriptionInfo = this._subscribers.get(propertyKey)?.get(subscription);
148
202
  subscriptionInfo && (subscriptionInfo.enable = true);
149
203
  }
204
+ hasSubscribers(propertyKey) {
205
+ if (propertyKey) {
206
+ return (this._subscribers.get(propertyKey)?.size ?? 0) > 0;
207
+ }
208
+ return this._subscribers.size > 0;
209
+ }
210
+ /**
211
+ * clear subscription maps
212
+ */
150
213
  destroy() {
151
- this.subscribers.clear();
214
+ this._subscribers.clear();
152
215
  }
153
216
  }
154
217
  export class ReactiveScope extends Scope {
155
- constructor(context, name, parent, propertyKeys) {
156
- super(context, Array.isArray(name) ? name : propertyKeys);
157
- this.parent = parent;
158
- this.observer = new ValueChangeObserver();
159
- if (typeof name == 'string') {
160
- this.name = name;
161
- }
162
- if (Array.isArray(name)) {
163
- this.propertyKeys = name;
218
+ constructor(context, propertyKeys, _name, _parent) {
219
+ super(context, propertyKeys);
220
+ this._name = _name;
221
+ this._parent = _parent;
222
+ this._observer = new ValueChangeObserver();
223
+ this._clone = Object.assign({}, context);
224
+ if (HTMLElement && context instanceof HTMLElement) {
225
+ this._keys = [];
164
226
  }
165
227
  }
166
228
  static for(context, propertyKeys) {
@@ -169,65 +231,107 @@ export class ReactiveScope extends Scope {
169
231
  static blockScope(propertyKeys) {
170
232
  return new ReactiveScope({}, propertyKeys);
171
233
  }
234
+ static scopeForThis(ctx, propertyKeys) {
235
+ const thisScope = ReactiveScope.for(ctx, propertyKeys);
236
+ const thisCtx = {
237
+ 'this': ctx,
238
+ };
239
+ const rootScope = Scope.for(thisCtx, ['this']);
240
+ rootScope.setInnerScope('this', thisScope);
241
+ return rootScope;
242
+ }
243
+ static readOnlyScopeForThis(ctx, propertyKeys) {
244
+ const thisScope = ReactiveScope.for(ctx, propertyKeys);
245
+ const thisCtx = {
246
+ 'this': ctx,
247
+ };
248
+ const rootScope = ReadOnlyScope.for(thisCtx, ['this']);
249
+ rootScope.setInnerScope('this', thisScope);
250
+ return rootScope;
251
+ }
172
252
  set(propertyKey, newValue, receiver) {
173
- const oldValue = Reflect.get(this.context, propertyKey);
174
- const result = Reflect.set(this.context, propertyKey, newValue);
253
+ const oldValue = Reflect.get(this._ctx, propertyKey);
254
+ const result = Reflect.set(this._ctx, propertyKey, newValue);
175
255
  if (result) {
176
256
  this.emit(propertyKey, newValue, oldValue);
177
257
  }
178
258
  return result;
179
259
  }
180
260
  delete(propertyKey) {
181
- const oldValue = Reflect.get(this.context, propertyKey);
182
- const isDelete = Reflect.deleteProperty(this.context, propertyKey);
261
+ const oldValue = Reflect.get(this._ctx, propertyKey);
262
+ const isDelete = Reflect.deleteProperty(this._ctx, propertyKey);
183
263
  if (isDelete && oldValue !== undefined) {
184
264
  this.emit(propertyKey, undefined, oldValue);
185
265
  }
186
266
  return isDelete;
187
267
  }
188
- getScope(propertyKey) {
189
- const scopeContext = this.get(propertyKey);
190
- let scope = this.scopeMap.get(propertyKey);
191
- if (scope) {
192
- scope.context = scopeContext;
193
- return scope;
194
- }
195
- if (typeof scopeContext !== 'object') {
196
- return;
197
- }
198
- scope = new ReactiveScope(scopeContext, propertyKey, this);
199
- this.scopeMap.set(propertyKey, scope);
200
- return scope;
201
- }
202
- getScopeOrCreat(propertyKey) {
203
- const scopeContext = this.get(propertyKey);
204
- let scope = this.scopeMap.get(propertyKey);
205
- if (scope) {
206
- scope.context = scopeContext;
207
- return scope;
208
- }
209
- scope = new ReactiveScope(scopeContext, propertyKey, this);
210
- this.scopeMap.set(propertyKey, scope);
211
- return scope;
212
- }
213
268
  emit(propertyKey, newValue, oldValue) {
214
- this.observer.emit(propertyKey, newValue, oldValue);
215
- this.parent?.emit(this.name, this.context);
269
+ this._observer.emit(propertyKey, newValue, oldValue);
270
+ this._parent?.emit(this._name, this._ctx);
216
271
  }
217
272
  subscribe(propertyKey, callback) {
218
- return this.observer.subscribe(propertyKey, callback);
273
+ return this._observer.subscribe(propertyKey, callback);
219
274
  }
220
275
  unsubscribe(propertyKey, subscription) {
221
276
  if (propertyKey && subscription) {
222
- this.observer.unsubscribe(propertyKey, subscription);
277
+ this._observer.unsubscribe(propertyKey, subscription);
223
278
  }
224
279
  else if (propertyKey) {
225
- this.observer.unsubscribe(propertyKey);
280
+ this._observer.unsubscribe(propertyKey);
226
281
  }
227
282
  else {
228
- this.observer.destroy();
283
+ this._observer.destroy();
229
284
  }
230
285
  }
286
+ detectChanges() {
287
+ const previous = this._clone;
288
+ const current = this._ctx;
289
+ if ((!!!previous && !!current) || (!!previous && !!!current)) {
290
+ this._parent?.emit(this._name, current);
291
+ return;
292
+ }
293
+ const keys = this._keys ?? this.getPropertyKeys(previous, current);
294
+ keys.forEach(key => {
295
+ const pv = previous[key];
296
+ const cv = current[key];
297
+ const pt = typeof pv;
298
+ const ct = typeof cv;
299
+ if (pt === 'object') {
300
+ if (ct === 'object') {
301
+ this.getInnerScope(key)?.detectChanges();
302
+ }
303
+ else if (cv != pv) {
304
+ this.emit(key, cv, pv);
305
+ }
306
+ }
307
+ else if (ct === 'object') {
308
+ this.emit(key, cv, pv);
309
+ }
310
+ else if (pv != cv) {
311
+ this.emit(key, cv, pv);
312
+ }
313
+ });
314
+ this._clone = Object.assign({}, this._ctx);
315
+ }
316
+ getPropertyKeys(...objs) {
317
+ let keys = [];
318
+ objs.forEach(obj => {
319
+ keys.push(...Object.keys(obj));
320
+ keys.push(...Object.getOwnPropertySymbols(obj));
321
+ });
322
+ keys = Array.from(new Set(keys));
323
+ keys = keys.filter(key => {
324
+ switch (typeof key) {
325
+ case 'string':
326
+ return !key.startsWith('_');
327
+ case 'symbol':
328
+ return !key.toString().startsWith('Symbol(_');
329
+ default:
330
+ return false;
331
+ }
332
+ });
333
+ return keys;
334
+ }
231
335
  getClass() {
232
336
  return ReactiveScope;
233
337
  }
@@ -235,8 +339,8 @@ export class ReactiveScope extends Scope {
235
339
  export class ReactiveScopeControl extends ReactiveScope {
236
340
  constructor() {
237
341
  super(...arguments);
238
- this.attached = true;
239
- this.marked = {};
342
+ this._attached = true;
343
+ this._marked = {};
240
344
  }
241
345
  static for(context, propertyKeys) {
242
346
  return new ReactiveScopeControl(context, propertyKeys);
@@ -244,35 +348,85 @@ export class ReactiveScopeControl extends ReactiveScope {
244
348
  static blockScope(propertyKeys) {
245
349
  return new ReactiveScopeControl({}, propertyKeys);
246
350
  }
351
+ static scopeForThis(ctx, propertyKeys) {
352
+ const thisScope = ReactiveScopeControl.for(ctx, propertyKeys);
353
+ const thisCtx = {
354
+ 'this': ctx,
355
+ };
356
+ const rootScope = Scope.for(thisCtx, ['this']);
357
+ rootScope.setInnerScope('this', thisScope);
358
+ return rootScope;
359
+ }
360
+ static readOnlyScopeForThis(ctx, propertyKeys) {
361
+ const thisScope = ReactiveScopeControl.for(ctx, propertyKeys);
362
+ const thisCtx = {
363
+ 'this': ctx,
364
+ };
365
+ const rootScope = ReadOnlyScope.for(thisCtx, ['this']);
366
+ rootScope.setInnerScope('this', thisScope);
367
+ return rootScope;
368
+ }
369
+ static reactiveScopeForThis(ctx, propertyKeys) {
370
+ const thisScope = ReactiveScope.for(ctx, propertyKeys);
371
+ const thisCtx = {
372
+ 'this': ctx,
373
+ };
374
+ const rootScope = Scope.for(thisCtx, ['this']);
375
+ rootScope.setInnerScope('this', thisScope);
376
+ return rootScope;
377
+ }
247
378
  emit(propertyKey, newValue, oldValue) {
248
- if (this.attached) {
379
+ if (this._attached) {
249
380
  super.emit(propertyKey, newValue, oldValue);
250
381
  }
382
+ else if (this._marked[propertyKey]) {
383
+ if (newValue == this._marked[propertyKey][1]) {
384
+ delete this._marked[propertyKey];
385
+ }
386
+ else {
387
+ this._marked[propertyKey][0] = newValue;
388
+ }
389
+ }
251
390
  else {
252
- this.marked[propertyKey] = newValue;
391
+ this._marked[propertyKey] = [newValue, oldValue];
253
392
  }
254
393
  }
255
394
  isAttached() {
256
- return this.attached;
395
+ return this._attached;
257
396
  }
258
397
  detach() {
259
- this.attached = false;
398
+ this._attached = false;
260
399
  }
261
400
  reattach() {
262
- this.attached = true;
401
+ this._attached = true;
263
402
  this.emitChanges();
264
403
  }
265
404
  emitChanges(propertyKey, propertyValue) {
266
405
  if (propertyKey) {
267
406
  super.emit(propertyKey, propertyValue);
268
- Reflect.deleteProperty(this.marked, propertyKey);
407
+ Reflect.deleteProperty(this._marked, propertyKey);
269
408
  return;
270
409
  }
271
- const latestChanges = this.marked;
272
- this.marked = {};
273
- Object.keys(latestChanges).forEach(propertyKey => {
274
- super.emit(propertyKey, latestChanges[propertyKey]);
410
+ const latestChanges = this._marked;
411
+ this._marked = {};
412
+ const keys = this._keys ?? this.getPropertyKeys(latestChanges);
413
+ keys.forEach(propertyKey => {
414
+ this._observer.emit(propertyKey, latestChanges[propertyKey][0], latestChanges[propertyKey][1]);
275
415
  });
416
+ keys.length && this._parent?.emit(this._name, this._ctx);
417
+ }
418
+ detectChanges() {
419
+ this.detach();
420
+ super.detectChanges();
421
+ this.reattach();
422
+ }
423
+ checkNoChanges() {
424
+ this.detach();
425
+ super.detectChanges();
426
+ const keys = Object.keys(this._marked);
427
+ if (keys.length > 0) {
428
+ throw new Error(`Some Changes had been detected`);
429
+ }
276
430
  }
277
431
  getClass() {
278
432
  return ReactiveScopeControl;
@@ -283,7 +437,7 @@ export class ModuleScope extends ReactiveScope {
283
437
  super(context, propertyKeys);
284
438
  }
285
439
  importModule(propertyKey, scope) {
286
- this.scopeMap.set(propertyKey, scope);
440
+ this._inners.set(propertyKey, scope);
287
441
  }
288
442
  }
289
443
  export class WebModuleScope extends ModuleScope {
@@ -291,7 +445,7 @@ export class WebModuleScope extends ModuleScope {
291
445
  super({});
292
446
  }
293
447
  updateContext(context) {
294
- this.context = context;
448
+ this._ctx = context;
295
449
  }
296
450
  }
297
451
  //# 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":["import { TypeOf } from '../api/utils.js';\n\nexport type ScopeContext = { [key: PropertyKey]: ScopeContext | any };\nexport interface Scope<T = ScopeContext> {\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 proxy of the current context object if exists. \n\t */\n\tgetContextProxy?(): 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\tgetClass(): TypeOf<Scope<ScopeContext>>;\n}\n\nexport class Scope<T extends ScopeContext> implements Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, propertyKeys?: (keyof T)[]) {\n\t\treturn new Scope(context, propertyKeys);\n\t}\n\tstatic blockScope<T extends ScopeContext>(propertyKeys?: (keyof T)[]) {\n\t\treturn new Scope({} as T, propertyKeys);\n\t}\n\tprotected scopeMap = new Map<keyof T, Scope<any>>();\n\tprotected propertyKeys?: (keyof T)[];\n\tconstructor(protected context: T, propertyKeys?: (keyof T)[]) {\n\t\tthis.propertyKeys = propertyKeys;\n\t\tif (Array.isArray(this.propertyKeys)) {\n\t\t\tthis.has = (propertyKey: keyof T): boolean => {\n\t\t\t\treturn this.propertyKeys!.includes(propertyKey);\n\t\t\t};\n\t\t}\n\t}\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 (this.getClass())(scopeContext);\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 (this.getClass())(scopeContext);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetClass(): TypeOf<Scope<ScopeContext>> {\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, propertyKeys?: (keyof T)[]) {\n\t\treturn new ReadOnlyScope(context, propertyKeys);\n\t}\n\tstatic blockScope<T extends ScopeContext>(propertyKeys?: (keyof T)[]) {\n\t\treturn new ReadOnlyScope({} as T, propertyKeys);\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\tgetClass(): TypeOf<ReadOnlyScope<ScopeContext>> {\n\t\treturn ReadOnlyScope;\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 || subscribers.size == 0) {\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, propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScope(context, propertyKeys);\n\t}\n\tstatic blockScope<T extends ScopeContext>(propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScope({} as T, propertyKeys);\n\t}\n\tprotected observer: ValueChangeObserver<T> = new ValueChangeObserver<T>();\n\tprotected name?: string;\n\n\tconstructor(context: T, propertyKeys?: (keyof T)[]);\n\tconstructor(context: T, name: string, parent: ReactiveScope<any>, propertyKeys?: (keyof T)[]);\n\tconstructor(context: T, name?: string | (keyof T)[], protected parent?: ReactiveScope<any>, propertyKeys?: (keyof T)[]) {\n\t\tsuper(context, Array.isArray(name) ? name : propertyKeys);\n\t\tif (typeof name == 'string') {\n\t\t\tthis.name = name;\n\t\t}\n\t\tif (Array.isArray(name)) {\n\t\t\tthis.propertyKeys = name;\n\t\t}\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, 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, 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\tgetClass(): TypeOf<ReactiveScope<ScopeContext>> {\n\t\treturn ReactiveScope;\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 * get current stacte of applying change detection.\n\t */\n\tisAttached(): boolean;\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, propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScopeControl(context, propertyKeys);\n\t}\n\tstatic blockScope<T extends ScopeContext>(propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScopeControl({} as T, propertyKeys);\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\tisAttached(): boolean {\n\t\treturn this.attached;\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\tgetClass(): TypeOf<ReactiveScopeControl<ScopeContext>> {\n\t\treturn ReactiveScopeControl;\n\t}\n}\n\n\ninterface ImportMeta {\n\turl: URL;\n\t/**\n\t *\n\t * Provides a module-relative resolution function scoped to each module, returning\n\t * the URL string.\n\t *\n\t * @param specified The module specifier to resolve relative to `parent`.\n\t * @param parent The absolute parent module URL to resolve from. If none\n\t * is specified, the value of `import.meta.url` is used as the default.\n\t */\n\tresolve?(specified: string, parent?: string | URL): Promise<string>;\n}\n\nexport interface ModuleImport {\n\tmeta: ImportMeta\n}\n\nexport interface ModuleContext extends ScopeContext {\n\timport: ModuleImport & ((path: string) => Promise<any>);\n}\n\nexport class ModuleScope extends ReactiveScope<ModuleContext> {\n\tconstructor(context: ModuleContext, propertyKeys?: (keyof ModuleContext)[]) {\n\t\tsuper(context, propertyKeys);\n\t}\n\timportModule(propertyKey: keyof ModuleContext, scope: ModuleScope): void {\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t}\n}\nexport class WebModuleScope extends ModuleScope {\n\tconstructor() {\n\t\tsuper({} as ModuleContext);\n\t}\n\tupdateContext(context: any) {\n\t\tthis.context = context;\n\t}\n}\n"]}
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/expressions/scope/scope.ts"],"names":[],"mappings":"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","sourcesContent":["import { TypeOf } from '../api/utils.js';\n\nexport type Context = Record<PropertyKey, any>;\nexport interface Scope<T = Context> {\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 proxy of the current context object if exists. \n\t */\n\tgetContextProxy?(): 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\tgetInnerScope<S extends Scope<Context>>(propertyKey: keyof T): S | undefined;\n\n\t/**\n\t * create a scope with the same type of this scope\n\t */\n\tsetInnerScope<S extends Scope<Context>>(propertyKey: keyof T): S;\n\n\t/**\n\t * sc\n\t * @param propertyKey \n\t * @param scope \n\t */\n\tsetInnerScope<S extends Scope<Context>>(propertyKey: keyof T, scope?: S): S;\n\n\tgetClass(): TypeOf<Scope<Context>>;\n}\n\nexport class Scope<T extends Context> implements Scope<T> {\n\tstatic for<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\treturn new Scope(ctx, propertyKeys);\n\t}\n\tstatic blockScope<T extends Context>(propertyKeys?: (keyof T)[]) {\n\t\treturn new Scope({} as T, propertyKeys);\n\t}\n\n\tprotected _inners = new Map<keyof T, Scope<any>>();\n\n\tconstructor(context: T, propertyKeys?: (keyof T)[]);\n\tconstructor(protected _ctx: T, protected _keys?: (keyof T)[]) { }\n\tget(key: keyof T): any {\n\t\treturn Reflect.get(this._ctx, key);\n\t}\n\tset(key: keyof T, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this._ctx, key, value);\n\t}\n\thas(key: keyof T): boolean {\n\t\treturn this._keys?.includes(key) ?? key in this._ctx;\n\t}\n\tdelete(key: keyof T): boolean {\n\t\treturn Reflect.deleteProperty(this._ctx, key);\n\t}\n\tgetContext(): T {\n\t\treturn this._ctx;\n\t}\n\tgetInnerScope<S extends Scope<Context>>(key: keyof T): S | undefined {\n\t\tconst ctx = this.get(key);\n\t\tlet scope = this._inners.get(key);\n\t\tif (scope) {\n\t\t\tscope._ctx = ctx;\n\t\t\treturn scope as S;\n\t\t}\n\t\tif (!(ctx && typeof ctx === 'object')) {\n\t\t\treturn;\n\t\t}\n\t\tscope = new (this.getClass())(ctx, undefined, key, this);\n\t\tthis._inners.set(key, scope);\n\t\treturn scope as S;\n\t}\n\tsetInnerScope<S extends Scope<Context>>(key: keyof T, scope?: S): S {\n\t\tif (scope) {\n\t\t\tthis._inners.set(key, scope);\n\t\t\treturn scope;\n\t\t}\n\t\tconst ctx = this.get(key);\n\t\tscope = new (this.getClass())(ctx, undefined, key, this) as S;\n\t\tthis._inners.set(key, scope);\n\t\treturn scope;\n\t}\n\tgetClass(): TypeOf<Scope<Context>> {\n\t\treturn Scope;\n\t}\n}\n\n/**\n * a class scope used for class instance and private static properties \n */\n\nexport class ClassScope<T extends Context> extends Scope<T> {\n\tstatic for<T extends Context>(ctx: T, propertyKeys?: (keyof T)[], privateKeys?: (keyof T)[]) {\n\t\treturn new ClassScope(ctx, propertyKeys, privateKeys);\n\t}\n\tstatic blockScope<T extends Context>(propertyKeys?: (keyof T)[], privateKeys?: (keyof T)[]) {\n\t\treturn new ClassScope({} as T, propertyKeys, privateKeys);\n\t}\n\tstatic readOnlyScopeForThis<T extends Context>(ctx: T, propertyKeys?: (keyof T)[], privateKeys?: (keyof T)[]) {\n\t\tconst thisScope = ClassScope.for(ctx, propertyKeys, privateKeys);\n\t\tconst thisCtx = {\n\t\t\t'this': ctx,\n\t\t};\n\t\tconst rootScope = ReadOnlyScope.for(thisCtx, ['this']);\n\t\trootScope.setInnerScope('this', thisScope);\n\t\treturn rootScope;\n\t}\n\tprotected _private: Context = {};\n\tconstructor(context: T, propertyKeys?: (keyof T)[], privateKeys?: (keyof T)[]);\n\tconstructor(context: T, propertyKeys?: (keyof T)[], private _pKeys?: (keyof T)[]) {\n\t\tsuper(context, propertyKeys);\n\t}\n\tgetPrivateContext(): T {\n\t\treturn this._private;\n\t}\n\tget(key: keyof T): any {\n\t\tif (this.isPrivateKey(key)) {\n\t\t\treturn Reflect.get(this._private, key);\n\t\t}\n\t\treturn super.get(key);\n\t}\n\tset(key: keyof T, value: any, receiver?: any): boolean {\n\t\tif (this.isPrivateKey(key)) {\n\t\t\treturn Reflect.set(this._private, key, value);\n\t\t}\n\t\treturn super.set(key, value, receiver);\n\t}\n\thas(key: keyof T): boolean {\n\t\tif (this.isPrivateKey(key)) {\n\t\t\treturn this._pKeys?.includes(key) ?? key in this._private;\n\t\t}\n\t\treturn super.has(key);\n\t}\n\tdelete(key: keyof T): boolean {\n\t\tif (this.isPrivateKey(key)) {\n\t\t\treturn Reflect.deleteProperty(this._private, key);\n\t\t}\n\t\treturn super.delete(key);\n\t}\n\tprotected isPrivateKey(key: keyof T) {\n\t\treturn typeof key === 'string' && key.startsWith('#');\n\t}\n\tgetClass(): TypeOf<ReadOnlyScope<Context>> {\n\t\treturn Scope;\n\t}\n}\n\nexport class ReadOnlyScope<T extends Context> extends Scope<T> {\n\tstatic for<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\treturn new ReadOnlyScope(ctx, propertyKeys);\n\t}\n\tstatic blockScope<T extends Context>(propertyKeys?: (keyof T)[]) {\n\t\treturn new ReadOnlyScope({} as T, propertyKeys);\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\tgetClass(): TypeOf<ReadOnlyScope<Context>> {\n\t\treturn ReadOnlyScope;\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 _lock: (keyof T)[] = [];\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this._lock.includes(propertyKey)) {\n\t\t\treturn;\n\t\t}\n\t\tconst subscribers = this._subscribers.get(propertyKey);\n\t\tif (!subscribers || subscribers.size == 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis._lock.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._lock.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 * check if this Observer has any subscribers\n\t */\n\thasSubscribers(): boolean;\n\n\t/**\n\t * check if there is any subscribers registered by the propertyKey.\n\t * \n\t * @param propertyKey\n\t */\n\thasSubscribers(propertyKey: keyof T): boolean;\n\thasSubscribers(propertyKey?: keyof T): boolean {\n\t\tif (propertyKey) {\n\t\t\treturn (this._subscribers.get(propertyKey)?.size ?? 0) > 0;\n\t\t}\n\t\treturn this._subscribers.size > 0;\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 Context> extends Scope<T> {\n\tstatic for<T extends Context>(context: T, propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScope(context, propertyKeys);\n\t}\n\tstatic blockScope<T extends Context>(propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScope({} as T, propertyKeys);\n\t}\n\tstatic scopeForThis<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\tconst thisScope = ReactiveScope.for(ctx, propertyKeys);\n\t\tconst thisCtx = {\n\t\t\t'this': ctx,\n\t\t};\n\t\tconst rootScope = Scope.for(thisCtx, ['this']);\n\t\trootScope.setInnerScope('this', thisScope);\n\t\treturn rootScope;\n\t}\n\tstatic readOnlyScopeForThis<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\tconst thisScope = ReactiveScope.for(ctx, propertyKeys);\n\t\tconst thisCtx = {\n\t\t\t'this': ctx,\n\t\t};\n\t\tconst rootScope = ReadOnlyScope.for(thisCtx, ['this']);\n\t\trootScope.setInnerScope('this', thisScope);\n\t\treturn rootScope;\n\t}\n\tprotected _clone: T;\n\tdeclare protected _inners: Map<keyof T, ReactiveScope<any>>;\n\tprotected _observer: ValueChangeObserver<T> = new ValueChangeObserver<T>();\n\n\n\tconstructor(context: T, propertyKeys?: (keyof T)[], protected _name?: keyof T, protected _parent?: ReactiveScope<any>) {\n\t\tsuper(context, propertyKeys);\n\t\tthis._clone = Object.assign({}, context);\n\t\tif (HTMLElement && context instanceof HTMLElement) {\n\t\t\tthis._keys = [];\n\t\t}\n\t}\n\n\tset(propertyKey: keyof T, newValue: any, receiver?: any): boolean {\n\t\tconst oldValue = Reflect.get(this._ctx, propertyKey);\n\t\tconst result = Reflect.set(this._ctx, 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._ctx, propertyKey);\n\t\tconst isDelete = Reflect.deleteProperty(this._ctx, 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\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._ctx);\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\tdetectChanges() {\n\t\tconst previous = this._clone;\n\t\tconst current = this._ctx;\n\t\tif ((!!!previous && !!current) || (!!previous && !!!current)) {\n\t\t\tthis._parent?.emit(this._name!, current);\n\t\t\treturn;\n\t\t}\n\t\tconst keys = this._keys ?? this.getPropertyKeys(previous, current);\n\t\tkeys.forEach(key => {\n\t\t\tconst pv = previous[key];\n\t\t\tconst cv = current[key];\n\t\t\tconst pt = typeof pv;\n\t\t\tconst ct = typeof cv;\n\t\t\tif (pt === 'object') {\n\t\t\t\tif (ct === 'object') {\n\t\t\t\t\tthis.getInnerScope<ReactiveScope<Context>>(key)?.detectChanges();\n\t\t\t\t} else if (cv != pv) {\n\t\t\t\t\tthis.emit(key, cv, pv);\n\t\t\t\t}\n\t\t\t} else if (ct === 'object') {\n\t\t\t\tthis.emit(key, cv, pv);\n\t\t\t} else if (pv != cv) {\n\t\t\t\tthis.emit(key, cv, pv);\n\t\t\t}\n\t\t});\n\t\tthis._clone = Object.assign({}, this._ctx);\n\t}\n\tprotected getPropertyKeys<V extends Record<PropertyKey, any>>(...objs: V[]) {\n\t\tlet keys: (keyof V)[] = [];\n\t\tobjs.forEach(obj => {\n\t\t\tkeys.push(...Object.keys(obj));\n\t\t\tkeys.push(...Object.getOwnPropertySymbols(obj));\n\t\t});\n\t\tkeys = Array.from(new Set(keys));\n\t\tkeys = keys.filter(key => {\n\t\t\tswitch (typeof key) {\n\t\t\t\tcase 'string':\n\t\t\t\t\treturn !key.startsWith('_');\n\t\t\t\tcase 'symbol':\n\t\t\t\t\treturn !key.toString().startsWith('Symbol(_');\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn keys;\n\t}\n\tgetClass(): TypeOf<ReactiveScope<Context>> {\n\t\treturn ReactiveScope;\n\t}\n}\n\n/**\n * used control/notify/pause scope about changes in current context\n */\nexport interface ScopeControl<T extends Context> {\n\n\t/**\n\t * get current stacte of applying change detection.\n\t */\n\tisAttached(): boolean;\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\t/**\n\t * throw error if any changes has been made\n\t */\n\tcheckNoChanges(): void;\n}\n\nexport class ReactiveScopeControl<T extends Context> extends ReactiveScope<T> implements ScopeControl<T> {\n\tstatic for<T extends Context>(context: T, propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScopeControl(context, propertyKeys);\n\t}\n\tstatic blockScope<T extends Context>(propertyKeys?: (keyof T)[]) {\n\t\treturn new ReactiveScopeControl({} as T, propertyKeys);\n\t}\n\tstatic scopeForThis<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\tconst thisScope = ReactiveScopeControl.for(ctx, propertyKeys);\n\t\tconst thisCtx = {\n\t\t\t'this': ctx,\n\t\t};\n\t\tconst rootScope = Scope.for(thisCtx, ['this']);\n\t\trootScope.setInnerScope('this', thisScope);\n\t\treturn rootScope;\n\t}\n\tstatic readOnlyScopeForThis<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\tconst thisScope = ReactiveScopeControl.for(ctx, propertyKeys);\n\t\tconst thisCtx = {\n\t\t\t'this': ctx,\n\t\t};\n\t\tconst rootScope = ReadOnlyScope.for(thisCtx, ['this']);\n\t\trootScope.setInnerScope('this', thisScope);\n\t\treturn rootScope;\n\t}\n\tstatic reactiveScopeForThis<T extends Context>(ctx: T, propertyKeys?: (keyof T)[]) {\n\t\tconst thisScope = ReactiveScope.for(ctx, propertyKeys);\n\t\tconst thisCtx = {\n\t\t\t'this': ctx,\n\t\t};\n\t\tconst rootScope = Scope.for(thisCtx, ['this']);\n\t\trootScope.setInnerScope('this', thisScope);\n\t\treturn rootScope;\n\t}\n\n\tprotected _attached: boolean = true;\n\tprotected _marked: { [key: keyof Context]: [any, any] } = {};\n\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 if (this._marked[propertyKey as string]) {\n\t\t\tif (newValue == this._marked[propertyKey as string][1]) {\n\t\t\t\tdelete this._marked[propertyKey as string];\n\t\t\t} else {\n\t\t\t\tthis._marked[propertyKey as string][0] = newValue;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._marked[propertyKey as string] = [newValue, oldValue];\n\t\t}\n\t}\n\tisAttached(): boolean {\n\t\treturn this._attached;\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\tconst keys = this._keys ?? this.getPropertyKeys(latestChanges);\n\t\tkeys.forEach(propertyKey => {\n\t\t\tthis._observer.emit(propertyKey, latestChanges[propertyKey][0], latestChanges[propertyKey][1]);\n\t\t});\n\t\tkeys.length && this._parent?.emit(this._name!, this._ctx);\n\t}\n\tdetectChanges() {\n\t\tthis.detach();\n\t\tsuper.detectChanges();\n\t\tthis.reattach();\n\t}\n\tcheckNoChanges() {\n\t\tthis.detach();\n\t\tsuper.detectChanges();\n\t\tconst keys = Object.keys(this._marked);\n\t\tif (keys.length > 0) {\n\t\t\tthrow new Error(`Some Changes had been detected`);\n\t\t}\n\t}\n\tgetClass(): TypeOf<ReactiveScopeControl<Context>> {\n\t\treturn ReactiveScopeControl;\n\t}\n}\n\n\ninterface ImportMeta {\n\turl: URL;\n\t/**\n\t *\n\t * Provides a module-relative resolution function scoped to each module, returning\n\t * the URL string.\n\t *\n\t * @param specified The module specifier to resolve relative to `parent`.\n\t * @param parent The absolute parent module URL to resolve from. If none\n\t * is specified, the value of `import.meta.url` is used as the default.\n\t */\n\tresolve?(specified: string, parent?: string | URL): Promise<string>;\n}\n\nexport interface ModuleImport {\n\tmeta: ImportMeta\n}\n\nexport interface ModuleContext extends Context {\n\timport: ModuleImport & ((path: string) => Promise<any>);\n}\n\nexport class ModuleScope extends ReactiveScope<ModuleContext> {\n\tconstructor(context: ModuleContext, propertyKeys?: (keyof ModuleContext)[]) {\n\t\tsuper(context, propertyKeys);\n\t}\n\timportModule(propertyKey: keyof ModuleContext, scope: ModuleScope): void {\n\t\tthis._inners.set(propertyKey, scope);\n\t}\n}\nexport class WebModuleScope extends ModuleScope {\n\tconstructor() {\n\t\tsuper({} as ModuleContext);\n\t}\n\tupdateContext(context: any) {\n\t\tthis._ctx = context;\n\t}\n}\n"]}