@ibyar/expressions 0.4.2 → 0.5.0

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 (126) hide show
  1. package/api/abstract.d.ts +2 -1
  2. package/api/abstract.js +4 -0
  3. package/api/abstract.js.map +1 -1
  4. package/api/definition/array.d.ts +3 -1
  5. package/api/definition/array.js +6 -0
  6. package/api/definition/array.js.map +1 -1
  7. package/api/definition/bind.d.ts +2 -1
  8. package/api/definition/bind.js +4 -0
  9. package/api/definition/bind.js.map +1 -1
  10. package/api/definition/function.d.ts +6 -1
  11. package/api/definition/function.js +22 -2
  12. package/api/definition/function.js.map +1 -1
  13. package/api/definition/member.d.ts +2 -1
  14. package/api/definition/member.js +4 -0
  15. package/api/definition/member.js.map +1 -1
  16. package/api/definition/object.d.ts +4 -1
  17. package/api/definition/object.js +10 -0
  18. package/api/definition/object.js.map +1 -1
  19. package/api/definition/statement.d.ts +2 -1
  20. package/api/definition/statement.js +3 -0
  21. package/api/definition/statement.js.map +1 -1
  22. package/api/definition/values.d.ts +11 -4
  23. package/api/definition/values.js +16 -0
  24. package/api/definition/values.js.map +1 -1
  25. package/api/deserialize/deserialize.js +3 -3
  26. package/api/deserialize/deserialize.js.map +1 -1
  27. package/api/deserialize/type-store.d.ts +2 -0
  28. package/api/deserialize/type-store.js +2 -0
  29. package/api/deserialize/type-store.js.map +1 -0
  30. package/api/expression.d.ts +9 -3
  31. package/api/expression.js.map +1 -1
  32. package/api/module/export.d.ts +3 -1
  33. package/api/module/export.js +10 -0
  34. package/api/module/export.js.map +1 -1
  35. package/api/module/import.d.ts +3 -1
  36. package/api/module/import.js +10 -0
  37. package/api/module/import.js.map +1 -1
  38. package/api/module/module.d.ts +2 -1
  39. package/api/module/module.js +5 -0
  40. package/api/module/module.js.map +1 -1
  41. package/api/operators/assignment.d.ts +2 -1
  42. package/api/operators/assignment.js +4 -0
  43. package/api/operators/assignment.js.map +1 -1
  44. package/api/operators/await.d.ts +2 -1
  45. package/api/operators/await.js +3 -0
  46. package/api/operators/await.js.map +1 -1
  47. package/api/operators/binary.d.ts +2 -1
  48. package/api/operators/binary.js +4 -0
  49. package/api/operators/binary.js.map +1 -1
  50. package/api/operators/chaining.d.ts +2 -1
  51. package/api/operators/chaining.js +3 -0
  52. package/api/operators/chaining.js.map +1 -1
  53. package/api/operators/comma.d.ts +2 -1
  54. package/api/operators/comma.js +3 -0
  55. package/api/operators/comma.js.map +1 -1
  56. package/api/operators/grouping.d.ts +2 -1
  57. package/api/operators/grouping.js +3 -0
  58. package/api/operators/grouping.js.map +1 -1
  59. package/api/operators/logical.d.ts +2 -1
  60. package/api/operators/logical.js +4 -0
  61. package/api/operators/logical.js.map +1 -1
  62. package/api/operators/pipeline.d.ts +2 -1
  63. package/api/operators/pipeline.js +5 -0
  64. package/api/operators/pipeline.js.map +1 -1
  65. package/api/operators/ternary.d.ts +2 -1
  66. package/api/operators/ternary.js +5 -0
  67. package/api/operators/ternary.js.map +1 -1
  68. package/api/operators/unary.d.ts +2 -1
  69. package/api/operators/unary.js +3 -0
  70. package/api/operators/unary.js.map +1 -1
  71. package/api/operators/update.d.ts +2 -1
  72. package/api/operators/update.js +3 -0
  73. package/api/operators/update.js.map +1 -1
  74. package/api/statement/control/block.d.ts +2 -1
  75. package/api/statement/control/block.js +3 -0
  76. package/api/statement/control/block.js.map +1 -1
  77. package/api/statement/control/if.d.ts +2 -1
  78. package/api/statement/control/if.js +5 -0
  79. package/api/statement/control/if.js.map +1 -1
  80. package/api/statement/control/switch.d.ts +4 -1
  81. package/api/statement/control/switch.js +11 -0
  82. package/api/statement/control/switch.js.map +1 -1
  83. package/api/statement/control/terminate.d.ts +5 -3
  84. package/api/statement/control/terminate.js +6 -0
  85. package/api/statement/control/terminate.js.map +1 -1
  86. package/api/statement/declarations/declares.d.ts +3 -1
  87. package/api/statement/declarations/declares.js +8 -1
  88. package/api/statement/declarations/declares.js.map +1 -1
  89. package/api/statement/iterations/for.d.ts +5 -1
  90. package/api/statement/iterations/for.js +21 -0
  91. package/api/statement/iterations/for.js.map +1 -1
  92. package/api/statement/iterations/while.d.ts +3 -1
  93. package/api/statement/iterations/while.js +8 -0
  94. package/api/statement/iterations/while.js.map +1 -1
  95. package/index.d.ts +1 -0
  96. package/index.js +1 -0
  97. package/index.js.map +1 -1
  98. package/package.json +3 -3
  99. package/scope/event.d.ts +5 -0
  100. package/scope/event.js +41 -0
  101. package/scope/event.js.map +1 -0
  102. package/scope/index.d.ts +1 -0
  103. package/scope/index.js +1 -0
  104. package/scope/index.js.map +1 -1
  105. package/scope/proxy.d.ts +1 -1
  106. package/scope/proxy.js +3 -3
  107. package/scope/proxy.js.map +1 -1
  108. package/scope/scope.d.ts +56 -48
  109. package/scope/scope.js +84 -29
  110. package/scope/scope.js.map +1 -1
  111. package/scope/stack.d.ts +28 -28
  112. package/scope/stack.js.map +1 -1
  113. package/v8/parser.d.ts +1 -1
  114. package/v8/parser.js +4 -2
  115. package/v8/parser.js.map +1 -1
  116. package/v8/stream.d.ts +4 -2
  117. package/v8/stream.js +34 -17
  118. package/v8/stream.js.map +1 -1
  119. package/v8/token.d.ts +1 -1
  120. package/v8/token.js.map +1 -1
  121. package/visit/index.d.ts +1 -0
  122. package/visit/index.js +2 -0
  123. package/visit/index.js.map +1 -0
  124. package/visit/visitor.d.ts +11 -0
  125. package/visit/visitor.js +42 -0
  126. 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,69 @@ 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
  }
112
127
  unsubscribe() {
113
- this.observer.unsubscribe(this);
128
+ this.observer.unsubscribe(this.propertyKey, this);
114
129
  }
115
130
  }
116
131
  export class ValueChangeObserver {
117
132
  constructor() {
118
133
  this.subscribers = new Map();
134
+ this.propertiesLock = [];
119
135
  }
120
- emit(propertyKey, oldValue, newValue) {
121
- this.subscribers.forEach((subscribe) => {
136
+ emit(propertyKey, newValue, oldValue) {
137
+ if (this.propertiesLock.includes(propertyKey)) {
138
+ return;
139
+ }
140
+ const subscribers = this.subscribers.get(propertyKey);
141
+ if (!subscribers) {
142
+ return;
143
+ }
144
+ this.propertiesLock.push(propertyKey);
145
+ subscribers?.forEach((subscribe) => {
122
146
  try {
123
- subscribe(propertyKey, oldValue, newValue);
147
+ subscribe(newValue, oldValue);
124
148
  }
125
149
  catch (e) {
126
150
  console.error(e);
127
151
  }
128
152
  });
129
- }
130
- subscribe(callback) {
131
- const subscription = new ScopeSubscription(this);
132
- this.subscribers.set(subscription, callback);
153
+ if (this.propertiesLock.pop() !== propertyKey) {
154
+ console.error('lock error');
155
+ }
156
+ ;
157
+ }
158
+ subscribe(propertyKey, callback) {
159
+ const subscription = new ScopeSubscription(propertyKey, this);
160
+ let propertySubscribers = this.subscribers.get(propertyKey);
161
+ if (!propertySubscribers) {
162
+ propertySubscribers = new Map();
163
+ this.subscribers.set(propertyKey, propertySubscribers);
164
+ }
165
+ propertySubscribers.set(subscription, callback);
133
166
  return subscription;
134
167
  }
135
- unsubscribe(subscription) {
136
- this.subscribers.delete(subscription);
168
+ unsubscribe(propertyKey, subscription) {
169
+ if (subscription) {
170
+ this.subscribers.get(propertyKey)?.delete(subscription);
171
+ }
172
+ else {
173
+ this.subscribers.delete(propertyKey);
174
+ }
175
+ }
176
+ destroy() {
177
+ this.subscribers.clear();
137
178
  }
138
179
  }
139
180
  export class ReactiveScope extends Scope {
140
- constructor(context, type, name, observer) {
181
+ constructor(context, type, name, parent) {
141
182
  super(context, type);
142
183
  this.name = name;
143
- this.observer = observer ?? new ValueChangeObserver();
184
+ this.parent = parent;
185
+ this.observer = new ValueChangeObserver();
144
186
  }
145
187
  static for(context, type) {
146
188
  return new ReactiveScope(context, type);
@@ -179,7 +221,7 @@ export class ReactiveScope extends Scope {
179
221
  const oldValue = Reflect.get(this.context, propertyKey);
180
222
  const result = Reflect.set(this.context, propertyKey, newValue);
181
223
  if (result) {
182
- this.observer.emit(this.getEventName(propertyKey), oldValue, newValue);
224
+ this.emit(propertyKey, newValue, oldValue);
183
225
  }
184
226
  return result;
185
227
  }
@@ -187,7 +229,7 @@ export class ReactiveScope extends Scope {
187
229
  const oldValue = Reflect.get(this.context, propertyKey);
188
230
  const isDelete = Reflect.deleteProperty(this.context, propertyKey);
189
231
  if (isDelete && oldValue !== undefined) {
190
- this.observer.emit(this.getEventName(propertyKey), oldValue, undefined);
232
+ this.emit(propertyKey, undefined, oldValue);
191
233
  }
192
234
  return isDelete;
193
235
  }
@@ -198,28 +240,41 @@ export class ReactiveScope extends Scope {
198
240
  scope.context = scopeContext;
199
241
  return scope;
200
242
  }
201
- if (typeof scopeContext === 'undefined') {
243
+ if (typeof scopeContext !== 'object') {
202
244
  return;
203
245
  }
204
- const childName = this.getEventName(propertyKey);
205
- scope = new ReactiveScope(scopeContext, 'block', childName, this.observer);
246
+ scope = new ReactiveScope(scopeContext, 'block', propertyKey, this);
206
247
  this.scopeMap.set(propertyKey, scope);
207
248
  return scope;
208
249
  }
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)}`;
250
+ getScopeOrCreat(propertyKey) {
251
+ const scopeContext = this.get(propertyKey);
252
+ let scope = this.scopeMap.get(propertyKey);
253
+ if (scope) {
254
+ scope.context = scopeContext;
255
+ return scope;
215
256
  }
216
- return String(child);
257
+ scope = new ReactiveScope(scopeContext, 'block', propertyKey, this);
258
+ this.scopeMap.set(propertyKey, scope);
259
+ return scope;
217
260
  }
218
- subscribe(callback) {
219
- return this.observer.subscribe(callback);
261
+ emit(propertyKey, newValue, oldValue) {
262
+ this.observer.emit(propertyKey, newValue, oldValue);
263
+ this.parent?.emit(this.name, this.context);
220
264
  }
221
- unsubscribe(subscription) {
222
- this.observer.unsubscribe(subscription);
265
+ subscribe(propertyKey, callback) {
266
+ return this.observer.subscribe(propertyKey, callback);
267
+ }
268
+ unsubscribe(propertyKey, subscription) {
269
+ if (propertyKey && subscription) {
270
+ this.observer.unsubscribe(propertyKey, subscription);
271
+ }
272
+ else if (propertyKey) {
273
+ this.observer.unsubscribe(propertyKey);
274
+ }
275
+ else {
276
+ this.observer.destroy();
277
+ }
223
278
  }
224
279
  }
225
280
  //# 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\tunsubscribe(): void {\n\t\tthis.observer.unsubscribe(this.propertyKey, this);\n\t}\n}\n\nexport type ValueChangedCallback = (newValue: any, oldValue?: any) => void;\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<keyof T, Map<ScopeSubscription<T>, ValueChangedCallback>> = 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((subscribe) => {\n\t\t\ttry {\n\t\t\t\tsubscribe(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);\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\t/**\n\t * clear subscription map\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\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\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\treturn this.observer.subscribe(propertyKey, callback);\n\t}\n\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\n\t\t\tthis.observer.unsubscribe(propertyKey);\n\t\t} else {\n\t\t\tthis.observer.destroy();\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"]}
package/v8/parser.d.ts CHANGED
@@ -82,7 +82,7 @@ export declare abstract class AbstractParser {
82
82
  protected errorMessage(message: string): string;
83
83
  }
84
84
  export declare class JavaScriptParser extends AbstractParser {
85
- static parse(app: string): ExpressionNode;
85
+ static parse(source: string | TokenExpression[] | TokenStream): ExpressionNode;
86
86
  scan(): ExpressionNode;
87
87
  protected parseStatement(): ExpressionNode;
88
88
  protected parseTryStatement(): ExpressionNode;
package/v8/parser.js CHANGED
@@ -251,8 +251,10 @@ export class AbstractParser {
251
251
  }
252
252
  }
253
253
  export class JavaScriptParser extends AbstractParser {
254
- static parse(app) {
255
- const stream = TokenStream.getTokenStream(app);
254
+ static parse(source) {
255
+ const stream = (typeof source === 'string' || Array.isArray(source))
256
+ ? TokenStream.getTokenStream(source)
257
+ : source;
256
258
  const parser = new JavaScriptParser(stream);
257
259
  return parser.scan();
258
260
  }