@ibyar/expressions 0.3.0 → 0.3.8

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 (147) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +79 -6
  3. package/api/abstract.d.ts +5 -7
  4. package/api/abstract.js +2 -5
  5. package/api/abstract.js.map +1 -1
  6. package/api/app/class.d.ts +99 -8
  7. package/api/app/class.js +250 -29
  8. package/api/app/class.js.map +1 -1
  9. package/api/app/program.d.ts +1 -2
  10. package/api/app/program.js +1 -4
  11. package/api/app/program.js.map +1 -1
  12. package/api/computing/call.d.ts +4 -4
  13. package/api/computing/call.js +20 -22
  14. package/api/computing/call.js.map +1 -1
  15. package/api/computing/new.d.ts +1 -2
  16. package/api/computing/new.js +4 -7
  17. package/api/computing/new.js.map +1 -1
  18. package/api/computing/rest.d.ts +16 -0
  19. package/api/computing/rest.js +40 -0
  20. package/api/computing/rest.js.map +1 -0
  21. package/api/computing/return.d.ts +1 -2
  22. package/api/computing/return.js +2 -5
  23. package/api/computing/return.js.map +1 -1
  24. package/api/computing/spread.d.ts +1 -2
  25. package/api/computing/spread.js +3 -9
  26. package/api/computing/spread.js.map +1 -1
  27. package/api/computing/throw.d.ts +3 -6
  28. package/api/computing/throw.js +5 -14
  29. package/api/computing/throw.js.map +1 -1
  30. package/api/definition/array.d.ts +12 -10
  31. package/api/definition/array.js +44 -16
  32. package/api/definition/array.js.map +1 -1
  33. package/api/definition/bind.d.ts +21 -0
  34. package/api/definition/bind.js +81 -0
  35. package/api/definition/bind.js.map +1 -0
  36. package/api/definition/comment.d.ts +1 -2
  37. package/api/definition/comment.js +1 -4
  38. package/api/definition/comment.js.map +1 -1
  39. package/api/definition/function.d.ts +12 -15
  40. package/api/definition/function.js +49 -58
  41. package/api/definition/function.js.map +1 -1
  42. package/api/definition/member.d.ts +8 -5
  43. package/api/definition/member.js +40 -31
  44. package/api/definition/member.js.map +1 -1
  45. package/api/definition/object.d.ts +16 -17
  46. package/api/definition/object.js +24 -16
  47. package/api/definition/object.js.map +1 -1
  48. package/api/definition/statement.d.ts +1 -2
  49. package/api/definition/statement.js +2 -5
  50. package/api/definition/statement.js.map +1 -1
  51. package/api/definition/values.d.ts +12 -11
  52. package/api/definition/values.js +17 -12
  53. package/api/definition/values.js.map +1 -1
  54. package/api/expression.d.ts +8 -4
  55. package/api/expression.js.map +1 -1
  56. package/api/index.d.ts +7 -6
  57. package/api/index.js +7 -6
  58. package/api/index.js.map +1 -1
  59. package/api/module/export.d.ts +1 -2
  60. package/api/module/export.js +1 -4
  61. package/api/module/export.js.map +1 -1
  62. package/api/module/import.d.ts +1 -2
  63. package/api/module/import.js +1 -4
  64. package/api/module/import.js.map +1 -1
  65. package/api/module/module.d.ts +1 -2
  66. package/api/module/module.js +2 -5
  67. package/api/module/module.js.map +1 -1
  68. package/api/operators/assignment.js +2 -2
  69. package/api/operators/assignment.js.map +1 -1
  70. package/api/operators/await.d.ts +1 -2
  71. package/api/operators/await.js +2 -5
  72. package/api/operators/await.js.map +1 -1
  73. package/api/operators/binary.js +4 -4
  74. package/api/operators/binary.js.map +1 -1
  75. package/api/operators/chaining.d.ts +9 -13
  76. package/api/operators/chaining.js +14 -48
  77. package/api/operators/chaining.js.map +1 -1
  78. package/api/operators/comma.d.ts +1 -2
  79. package/api/operators/comma.js +2 -5
  80. package/api/operators/comma.js.map +1 -1
  81. package/api/operators/grouping.d.ts +1 -2
  82. package/api/operators/grouping.js +2 -5
  83. package/api/operators/grouping.js.map +1 -1
  84. package/api/operators/logical.js.map +1 -1
  85. package/api/operators/pipeline.d.ts +4 -5
  86. package/api/operators/pipeline.js +23 -25
  87. package/api/operators/pipeline.js.map +1 -1
  88. package/api/operators/ternary.d.ts +1 -2
  89. package/api/operators/ternary.js +1 -4
  90. package/api/operators/ternary.js.map +1 -1
  91. package/api/operators/unary.d.ts +1 -2
  92. package/api/operators/unary.js +2 -5
  93. package/api/operators/unary.js.map +1 -1
  94. package/api/operators/update.d.ts +1 -2
  95. package/api/operators/update.js +2 -5
  96. package/api/operators/update.js.map +1 -1
  97. package/api/statement/{controlflow → control}/block.d.ts +1 -2
  98. package/api/statement/{controlflow → control}/block.js +2 -5
  99. package/api/statement/control/block.js.map +1 -0
  100. package/api/statement/{controlflow → control}/empty.d.ts +1 -2
  101. package/api/statement/{controlflow → control}/empty.js +1 -4
  102. package/api/statement/control/empty.js.map +1 -0
  103. package/api/statement/{controlflow → control}/if.d.ts +1 -2
  104. package/api/statement/{controlflow → control}/if.js +2 -5
  105. package/api/statement/control/if.js.map +1 -0
  106. package/api/statement/{controlflow → control}/switch.d.ts +2 -4
  107. package/api/statement/{controlflow → control}/switch.js +5 -11
  108. package/api/statement/control/switch.js.map +1 -0
  109. package/api/statement/{controlflow → control}/terminate.d.ts +1 -2
  110. package/api/statement/{controlflow → control}/terminate.js +1 -4
  111. package/api/statement/control/terminate.js.map +1 -0
  112. package/api/statement/declarations/declares.d.ts +13 -14
  113. package/api/statement/declarations/declares.js +10 -9
  114. package/api/statement/declarations/declares.js.map +1 -1
  115. package/api/statement/iterations/for.d.ts +14 -14
  116. package/api/statement/iterations/for.js +12 -24
  117. package/api/statement/iterations/for.js.map +1 -1
  118. package/api/statement/iterations/while.d.ts +2 -4
  119. package/api/statement/iterations/while.js +4 -10
  120. package/api/statement/iterations/while.js.map +1 -1
  121. package/package.json +18 -4
  122. package/scope/scope.d.ts +23 -3
  123. package/scope/scope.js +67 -1
  124. package/scope/scope.js.map +1 -1
  125. package/scope/stack.d.ts +14 -3
  126. package/scope/stack.js +61 -1
  127. package/scope/stack.js.map +1 -1
  128. package/v8/app.js.map +1 -1
  129. package/v8/nodes.d.ts +1 -2
  130. package/v8/nodes.js +2 -11
  131. package/v8/nodes.js.map +1 -1
  132. package/v8/parser.d.ts +5 -4
  133. package/v8/parser.js +165 -69
  134. package/v8/parser.js.map +1 -1
  135. package/v8/stream.js +20 -6
  136. package/v8/stream.js.map +1 -1
  137. package/v8/token.d.ts +3 -0
  138. package/v8/token.js +9 -0
  139. package/v8/token.js.map +1 -1
  140. package/api/operators/destruct.d.ts +0 -19
  141. package/api/operators/destruct.js +0 -95
  142. package/api/operators/destruct.js.map +0 -1
  143. package/api/statement/controlflow/block.js.map +0 -1
  144. package/api/statement/controlflow/empty.js.map +0 -1
  145. package/api/statement/controlflow/if.js.map +0 -1
  146. package/api/statement/controlflow/switch.js.map +0 -1
  147. package/api/statement/controlflow/terminate.js.map +0 -1
@@ -10,8 +10,7 @@ export declare class WhileNode extends AbstractExpressionNode {
10
10
  getBody(): ExpressionNode;
11
11
  set(stack: Stack, value: any): void;
12
12
  get(stack: Stack): ReturnValue | undefined;
13
- entry(): string[];
14
- event(parent?: string): string[];
13
+ events(parent?: string): string[];
15
14
  toString(): string;
16
15
  toJson(): object;
17
16
  }
@@ -24,8 +23,7 @@ export declare class DoWhileNode extends AbstractExpressionNode {
24
23
  getBody(): ExpressionNode;
25
24
  set(stack: Stack, value: any): void;
26
25
  get(stack: Stack): ReturnValue | undefined;
27
- entry(): string[];
28
- event(parent?: string): string[];
26
+ events(parent?: string): string[];
29
27
  toString(): string;
30
28
  toJson(): object;
31
29
  }
@@ -2,7 +2,7 @@ var WhileNode_1, DoWhileNode_1;
2
2
  import { __decorate, __metadata } from "tslib";
3
3
  import { AbstractExpressionNode, ReturnValue } from '../../abstract.js';
4
4
  import { Deserializer } from '../../deserialize/deserialize.js';
5
- import { BreakStatement, ContinueStatement } from '../controlflow/terminate.js';
5
+ import { BreakStatement, ContinueStatement } from '../control/terminate.js';
6
6
  let WhileNode = WhileNode_1 = class WhileNode extends AbstractExpressionNode {
7
7
  constructor(test, body) {
8
8
  super();
@@ -40,11 +40,8 @@ let WhileNode = WhileNode_1 = class WhileNode extends AbstractExpressionNode {
40
40
  stack.clearTo(whileBlock);
41
41
  return void 0;
42
42
  }
43
- entry() {
44
- return [];
45
- }
46
- event(parent) {
47
- return this.test.event();
43
+ events(parent) {
44
+ return this.test.events();
48
45
  }
49
46
  toString() {
50
47
  return `while (${this.test.toString()}) ${this.body.toString()}`;
@@ -97,10 +94,7 @@ let DoWhileNode = DoWhileNode_1 = class DoWhileNode extends AbstractExpressionNo
97
94
  stack.clearTo(whileBlock);
98
95
  return void 0;
99
96
  }
100
- entry() {
101
- return [];
102
- }
103
- event(parent) {
97
+ events(parent) {
104
98
  return [];
105
99
  }
106
100
  toString() {
@@ -1 +1 @@
1
- {"version":3,"file":"while.js","sourceRoot":"","sources":["../../../../../src/expressions/api/statement/iterations/while.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodeDeserializer, ExpressionNode } from '../../expression.js';\nimport type { Stack } from '../../../scope/stack.js';\nimport { AbstractExpressionNode, ReturnValue } from '../../abstract.js';\nimport { Deserializer } from '../../deserialize/deserialize.js';\nimport { BreakStatement, ContinueStatement } from '../controlflow/terminate.js';\n\n/**\n * The while statement creates a loop that executes a specified\n * statement as long as the test condition evaluates to true.\n * The condition is evaluated before executing the statement.\n * \n */\n@Deserializer('WhileStatement')\nexport class WhileNode extends AbstractExpressionNode {\n\tstatic fromJSON(node: WhileNode, deserializer: NodeDeserializer): WhileNode {\n\t\treturn new WhileNode(\n\t\t\tdeserializer(node.test),\n\t\t\tdeserializer(node.body)\n\t\t);\n\t}\n\tconstructor(private test: ExpressionNode, private body: ExpressionNode) {\n\t\tsuper();\n\t}\n\tgetTest() {\n\t\treturn this.test;\n\t}\n\tgetBody() {\n\t\treturn this.body;\n\t}\n\tset(stack: Stack, value: any) {\n\t\tthrow new Error(`WhileNode#set() has no implementation.`);\n\t}\n\tget(stack: Stack) {\n\t\tconst condition = this.test.get(stack);\n\t\tconst whileBlock = stack.pushBlockScope();\n\t\twhile (condition) {\n\t\t\tconst result = this.body.get(stack);\n\t\t\t// useless case, as it at the end of for statement\n\t\t\t// an array/block statement, should return last signal\n\t\t\tif (ContinueStatement.ContinueSymbol === result) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (BreakStatement.BreakSymbol === result) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (result instanceof ReturnValue) {\n\t\t\t\tstack.clearTo(whileBlock);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tstack.clearTo(whileBlock);\n\t\treturn void 0;\n\t}\n\tentry(): string[] {\n\t\treturn [];\n\t}\n\tevent(parent?: string): string[] {\n\t\treturn this.test.event();\n\t}\n\ttoString(): string {\n\t\treturn `while (${this.test.toString()}) ${this.body.toString()}`;\n\t}\n\ttoJson(): object {\n\t\treturn {\n\t\t\ttest: this.test.toJSON(),\n\t\t\tbody: this.body.toJSON()\n\t\t};\n\t}\n}\n\n@Deserializer('DoWhileStatement')\nexport class DoWhileNode extends AbstractExpressionNode {\n\tstatic fromJSON(node: DoWhileNode, deserializer: NodeDeserializer): DoWhileNode {\n\t\treturn new DoWhileNode(\n\t\t\tdeserializer(node.test),\n\t\t\tdeserializer(node.body)\n\t\t);\n\t}\n\tconstructor(private test: ExpressionNode, private body: ExpressionNode) {\n\t\tsuper();\n\t}\n\tgetTest() {\n\t\treturn this.test;\n\t}\n\tgetBody() {\n\t\treturn this.body;\n\t}\n\tset(stack: Stack, value: any) {\n\t\tthrow new Error(`WhileNode#set() has no implementation.`);\n\t}\n\tget(stack: Stack) {\n\t\tconst whileBlock = stack.pushBlockScope();\n\t\tdo {\n\t\t\tconst result = this.body.get(stack);\n\t\t\t// useless case, as it at the end of for statement\n\t\t\t// an array/block statement, should return last signal\n\t\t\tif (ContinueStatement.ContinueSymbol === result) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (BreakStatement.BreakSymbol === result) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (result instanceof ReturnValue) {\n\t\t\t\tstack.clearTo(whileBlock);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t} while (this.test.get(stack));\n\t\tstack.clearTo(whileBlock);\n\t\treturn void 0;\n\t}\n\tentry(): string[] {\n\t\treturn [];\n\t}\n\tevent(parent?: string): string[] {\n\t\treturn [];\n\t}\n\ttoString(): string {\n\t\treturn `do {${this.body.toString()}} while (${this.test.toString()})`;\n\t}\n\ttoJson(): object {\n\t\treturn {\n\t\t\ttest: this.test.toJSON(),\n\t\t\tbody: this.body.toJSON()\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"while.js","sourceRoot":"","sources":["../../../../../src/expressions/api/statement/iterations/while.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodeDeserializer, ExpressionNode } from '../../expression.js';\nimport type { Stack } from '../../../scope/stack.js';\nimport { AbstractExpressionNode, ReturnValue } from '../../abstract.js';\nimport { Deserializer } from '../../deserialize/deserialize.js';\nimport { BreakStatement, ContinueStatement } from '../control/terminate.js';\n\n/**\n * The while statement creates a loop that executes a specified\n * statement as long as the test condition evaluates to true.\n * The condition is evaluated before executing the statement.\n * \n */\n@Deserializer('WhileStatement')\nexport class WhileNode extends AbstractExpressionNode {\n\tstatic fromJSON(node: WhileNode, deserializer: NodeDeserializer): WhileNode {\n\t\treturn new WhileNode(\n\t\t\tdeserializer(node.test),\n\t\t\tdeserializer(node.body)\n\t\t);\n\t}\n\tconstructor(private test: ExpressionNode, private body: ExpressionNode) {\n\t\tsuper();\n\t}\n\tgetTest() {\n\t\treturn this.test;\n\t}\n\tgetBody() {\n\t\treturn this.body;\n\t}\n\tset(stack: Stack, value: any) {\n\t\tthrow new Error(`WhileNode#set() has no implementation.`);\n\t}\n\tget(stack: Stack) {\n\t\tconst condition = this.test.get(stack);\n\t\tconst whileBlock = stack.pushBlockScope();\n\t\twhile (condition) {\n\t\t\tconst result = this.body.get(stack);\n\t\t\t// useless case, as it at the end of for statement\n\t\t\t// an array/block statement, should return last signal\n\t\t\tif (ContinueStatement.ContinueSymbol === result) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (BreakStatement.BreakSymbol === result) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (result instanceof ReturnValue) {\n\t\t\t\tstack.clearTo(whileBlock);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tstack.clearTo(whileBlock);\n\t\treturn void 0;\n\t}\n\tevents(parent?: string): string[] {\n\t\treturn this.test.events();\n\t}\n\ttoString(): string {\n\t\treturn `while (${this.test.toString()}) ${this.body.toString()}`;\n\t}\n\ttoJson(): object {\n\t\treturn {\n\t\t\ttest: this.test.toJSON(),\n\t\t\tbody: this.body.toJSON()\n\t\t};\n\t}\n}\n\n@Deserializer('DoWhileStatement')\nexport class DoWhileNode extends AbstractExpressionNode {\n\tstatic fromJSON(node: DoWhileNode, deserializer: NodeDeserializer): DoWhileNode {\n\t\treturn new DoWhileNode(\n\t\t\tdeserializer(node.test),\n\t\t\tdeserializer(node.body)\n\t\t);\n\t}\n\tconstructor(private test: ExpressionNode, private body: ExpressionNode) {\n\t\tsuper();\n\t}\n\tgetTest() {\n\t\treturn this.test;\n\t}\n\tgetBody() {\n\t\treturn this.body;\n\t}\n\tset(stack: Stack, value: any) {\n\t\tthrow new Error(`WhileNode#set() has no implementation.`);\n\t}\n\tget(stack: Stack) {\n\t\tconst whileBlock = stack.pushBlockScope();\n\t\tdo {\n\t\t\tconst result = this.body.get(stack);\n\t\t\t// useless case, as it at the end of for statement\n\t\t\t// an array/block statement, should return last signal\n\t\t\tif (ContinueStatement.ContinueSymbol === result) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (BreakStatement.BreakSymbol === result) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (result instanceof ReturnValue) {\n\t\t\t\tstack.clearTo(whileBlock);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t} while (this.test.get(stack));\n\t\tstack.clearTo(whileBlock);\n\t\treturn void 0;\n\t}\n\tevents(parent?: string): string[] {\n\t\treturn [];\n\t}\n\ttoString(): string {\n\t\treturn `do {${this.body.toString()}} while (${this.test.toString()})`;\n\t}\n\ttoJson(): object {\n\t\treturn {\n\t\t\ttest: this.test.toJSON(),\n\t\t\tbody: this.body.toJSON()\n\t\t};\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibyar/expressions",
3
- "version": "0.3.0",
3
+ "version": "0.3.8",
4
4
  "description": "Aurora expression, an template expression evaluation",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ibyar/aurora",
@@ -14,8 +14,12 @@
14
14
  "publishConfig": {
15
15
  "access": "public"
16
16
  },
17
+ "dependencies": {
18
+ "reflect-metadata": "^0.1.13",
19
+ "tslib": "^2.3.1"
20
+ },
17
21
  "devDependencies": {
18
- "typescript": "^4.3.5"
22
+ "typescript": "^4.4.3"
19
23
  },
20
24
  "scripts": {
21
25
  "build": "tsc --build --verbose"
@@ -23,9 +27,19 @@
23
27
  "keywords": [
24
28
  "aurora",
25
29
  "ibyar",
30
+ "expressions",
26
31
  "template-syntax",
27
32
  "template-expression",
28
- "typescript"
33
+ "typescript",
34
+ "estree",
35
+ "parser",
36
+ "v8",
37
+ "stack",
38
+ "scope",
39
+ "expression",
40
+ "js",
41
+ "eval",
42
+ "evaluation"
29
43
  ],
30
- "gitHead": "a34f2c8b6a44577ef676cb6445b779f6453ee921"
44
+ "gitHead": "6e8f85ae5e22ace13e9846f3960577fea9836190"
31
45
  }
package/scope/scope.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- export declare type ScopeType = 'block' | 'function';
1
+ export declare type ScopeType = 'block' | 'function' | 'class' | 'module' | 'global';
2
2
  export interface Scope<T> {
3
3
  type: ScopeType;
4
4
  get(propertyKey: PropertyKey): any;
5
5
  set(propertyKey: PropertyKey, value?: any, receiver?: any): boolean;
6
6
  has(propertyKey: PropertyKey): boolean;
7
7
  getContext(): T | undefined;
8
- getScope<V extends object>(propertyKey: PropertyKey): Scope<V>;
8
+ getScope<V extends object>(propertyKey: PropertyKey): Scope<V> | undefined;
9
9
  }
10
10
  export declare class Scope<T extends object> implements Scope<T> {
11
11
  protected context: T;
@@ -13,15 +13,29 @@ export declare class Scope<T extends object> implements Scope<T> {
13
13
  static for<T extends object>(context: T, type: ScopeType): Scope<T>;
14
14
  static blockScopeFor<T extends object>(context: T): Scope<T>;
15
15
  static functionScopeFor<T extends object>(context: T): Scope<T>;
16
+ static classScopeFor<T extends object>(context: T): Scope<T>;
17
+ static moduleScopeFor<T extends object>(context: T): Scope<T>;
18
+ static globalScopeFor<T extends object>(context: T): Scope<T>;
16
19
  static blockScope<T extends object>(): Scope<T>;
17
20
  static functionScope<T extends object>(): Scope<T>;
21
+ static classScope<T extends object>(): Scope<T>;
22
+ static moduleScope<T extends object>(): Scope<T>;
23
+ static globalScope<T extends object>(): Scope<T>;
18
24
  protected scopeMap: Map<PropertyKey, Scope<any>>;
19
25
  constructor(context: T, type: ScopeType);
20
26
  }
21
27
  export declare class ReadOnlyScope<T extends object> extends Scope<T> {
22
28
  static for<T extends object>(context: T, type: ScopeType): ReadOnlyScope<T>;
23
29
  static blockScopeFor<T extends object>(context: T): ReadOnlyScope<T>;
30
+ static functionScopeFor<T extends object>(context: T): ReadOnlyScope<T>;
31
+ static classScopeFor<T extends object>(context: T): ReadOnlyScope<T>;
32
+ static moduleScopeFor<T extends object>(context: T): ReadOnlyScope<T>;
33
+ static globalScopeFor<T extends object>(context: T): ReadOnlyScope<T>;
24
34
  static blockScope<T extends object>(): ReadOnlyScope<T>;
35
+ static functionScope<T extends object>(): ReadOnlyScope<T>;
36
+ static classScope<T extends object>(): ReadOnlyScope<T>;
37
+ static moduleScope<T extends object>(): ReadOnlyScope<T>;
38
+ static globalScope<T extends object>(): ReadOnlyScope<T>;
25
39
  set(propertyKey: PropertyKey, value: any, receiver?: any): boolean;
26
40
  }
27
41
  declare class Subscription<T> {
@@ -43,12 +57,18 @@ export declare class ReactiveScope<T extends object> extends Scope<T> {
43
57
  static for<T extends object>(context: T, type: ScopeType): ReactiveScope<T>;
44
58
  static blockScopeFor<T extends object>(context: T): ReactiveScope<T>;
45
59
  static functionScopeFor<T extends object>(context: T): ReactiveScope<T>;
60
+ static classScopeFor<T extends object>(context: T): ReactiveScope<T>;
61
+ static moduleScopeFor<T extends object>(context: T): ReactiveScope<T>;
62
+ static globalScopeFor<T extends object>(context: T): ReactiveScope<T>;
46
63
  static blockScope<T extends object>(): ReactiveScope<T>;
47
64
  static functionScope<T extends object>(): ReactiveScope<T>;
65
+ static classScope<T extends object>(): ReactiveScope<T>;
66
+ static moduleScope<T extends object>(): ReactiveScope<T>;
67
+ static globalScope<T extends object>(): ReactiveScope<T>;
48
68
  private observer;
49
69
  constructor(context: T, type: ScopeType, name?: PropertyKey | undefined, observer?: ValueChangeObserver<T>);
50
70
  set(propertyKey: PropertyKey, newValue: any, receiver?: any): boolean;
51
- getScope<V extends object>(propertyKey: PropertyKey): ReactiveScope<V>;
71
+ getScope<V extends object>(propertyKey: PropertyKey): ReactiveScope<V> | undefined;
52
72
  private getEventName;
53
73
  subscribe(callback: (propertyKey: PropertyKey, oldValue: any, newValue: any) => void): Subscription<T>;
54
74
  remove(subscription: Subscription<T>): void;
package/scope/scope.js CHANGED
@@ -13,12 +13,30 @@ export class Scope {
13
13
  static functionScopeFor(context) {
14
14
  return new Scope(context, 'function');
15
15
  }
16
+ static classScopeFor(context) {
17
+ return new Scope(context, 'class');
18
+ }
19
+ static moduleScopeFor(context) {
20
+ return new Scope(context, 'module');
21
+ }
22
+ static globalScopeFor(context) {
23
+ return new Scope(context, 'global');
24
+ }
16
25
  static blockScope() {
17
26
  return new Scope({}, 'block');
18
27
  }
19
28
  static functionScope() {
20
29
  return new Scope({}, 'function');
21
30
  }
31
+ static classScope() {
32
+ return new Scope({}, 'class');
33
+ }
34
+ static moduleScope() {
35
+ return new Scope({}, 'module');
36
+ }
37
+ static globalScope() {
38
+ return new this({}, 'global');
39
+ }
22
40
  get(propertyKey) {
23
41
  return Reflect.get(this.context, propertyKey);
24
42
  }
@@ -37,6 +55,9 @@ export class Scope {
37
55
  return scope;
38
56
  }
39
57
  const scopeContext = this.get(propertyKey);
58
+ if (typeof scopeContext === 'undefined') {
59
+ return;
60
+ }
40
61
  scope = new Scope(scopeContext, 'block');
41
62
  this.scopeMap.set(propertyKey, scope);
42
63
  return scope;
@@ -49,9 +70,33 @@ export class ReadOnlyScope extends Scope {
49
70
  static blockScopeFor(context) {
50
71
  return new ReadOnlyScope(context, 'block');
51
72
  }
73
+ static functionScopeFor(context) {
74
+ return new ReadOnlyScope(context, 'function');
75
+ }
76
+ static classScopeFor(context) {
77
+ return new ReadOnlyScope(context, 'class');
78
+ }
79
+ static moduleScopeFor(context) {
80
+ return new ReadOnlyScope(context, 'module');
81
+ }
82
+ static globalScopeFor(context) {
83
+ return new ReadOnlyScope(context, 'global');
84
+ }
52
85
  static blockScope() {
53
86
  return new ReadOnlyScope({}, 'block');
54
87
  }
88
+ static functionScope() {
89
+ return new ReadOnlyScope({}, 'function');
90
+ }
91
+ static classScope() {
92
+ return new ReadOnlyScope({}, 'class');
93
+ }
94
+ static moduleScope() {
95
+ return new ReadOnlyScope({}, 'module');
96
+ }
97
+ static globalScope() {
98
+ return new ReadOnlyScope({}, 'global');
99
+ }
55
100
  set(propertyKey, value, receiver) {
56
101
  return false;
57
102
  }
@@ -118,12 +163,30 @@ export class ReactiveScope extends Scope {
118
163
  static functionScopeFor(context) {
119
164
  return new ReactiveScope(context, 'function');
120
165
  }
166
+ static classScopeFor(context) {
167
+ return new ReactiveScope(context, 'class');
168
+ }
169
+ static moduleScopeFor(context) {
170
+ return new ReactiveScope(context, 'module');
171
+ }
172
+ static globalScopeFor(context) {
173
+ return new ReactiveScope(context, 'global');
174
+ }
121
175
  static blockScope() {
122
176
  return new ReactiveScope({}, 'block');
123
177
  }
124
178
  static functionScope() {
125
179
  return new ReactiveScope({}, 'function');
126
180
  }
181
+ static classScope() {
182
+ return new ReactiveScope({}, 'class');
183
+ }
184
+ static moduleScope() {
185
+ return new ReactiveScope({}, 'module');
186
+ }
187
+ static globalScope() {
188
+ return new ReactiveScope({}, 'global');
189
+ }
127
190
  set(propertyKey, newValue, receiver) {
128
191
  const oldValue = Reflect.get(this.context, propertyKey);
129
192
  const result = Reflect.set(this.context, propertyKey, newValue);
@@ -138,6 +201,9 @@ export class ReactiveScope extends Scope {
138
201
  return scope;
139
202
  }
140
203
  const scopeContext = this.get(propertyKey);
204
+ if (typeof scopeContext === 'undefined') {
205
+ return;
206
+ }
141
207
  const childName = this.getEventName(propertyKey);
142
208
  scope = new ReactiveScope(scopeContext, 'block', childName, this.observer);
143
209
  this.scopeMap.set(propertyKey, scope);
@@ -150,7 +216,7 @@ export class ReactiveScope extends Scope {
150
216
  }
151
217
  return `${String(this.name)}.${String(child)}`;
152
218
  }
153
- return `${String(child)}`;
219
+ return String(child);
154
220
  }
155
221
  subscribe(callback) {
156
222
  return this.observer.subscribe(callback);
@@ -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';\nexport interface Scope<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: PropertyKey): 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: PropertyKey, 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: PropertyKey): boolean;\n\n\t/**\n\t * get current context object of this scope\n\t */\n\tgetContext(): T | undefined;\n\n\t/**\n\t * get value of `propertyKey` in current context\n\t * @param propertyKey \n\t */\n\tgetScope<V extends object>(propertyKey: PropertyKey): Scope<V>;\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 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\tprotected scopeMap = new Map<PropertyKey, Scope<any>>();\n\tconstructor(protected context: T, public type: ScopeType) { }\n\tget(propertyKey: PropertyKey): any {\n\t\treturn Reflect.get(this.context, propertyKey);\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this.context, propertyKey, value);\n\t}\n\thas(propertyKey: PropertyKey): boolean {\n\t\treturn propertyKey in this.context;\n\t}\n\tgetContext(): T | undefined {\n\t\treturn this.context;\n\t}\n\tgetScope<V extends object>(propertyKey: PropertyKey): Scope<V> {\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\treturn scope;\n\t\t}\n\t\tconst scopeContext = this.get(propertyKey);\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 blockScope<T extends object>() {\n\t\treturn new ReadOnlyScope({} as T, 'block');\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n}\n\nclass Subscription<T> {\n\tprivate othersSubscription: Subscription<any>[];\n\tconstructor(private observer: ValueChangeObserver<T>) { }\n\tadd(subscription: Subscription<any>) {\n\t\tif (!this.othersSubscription) {\n\t\t\tthis.othersSubscription = [];\n\t\t}\n\t\tthis.othersSubscription.push(subscription);\n\t}\n\tunsubscribe(): void {\n\t\tthis.observer.remove(this);\n\t\tif (this.othersSubscription) {\n\t\t\tthis.othersSubscription.forEach((subscription) => {\n\t\t\t\tsubscription.unsubscribe();\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<Subscription<T>, (propertyKey: PropertyKey, oldValue: any, newValue: any) => void> = new Map();\n\tconstructor(name?: string) { }\n\temit(propertyKey: PropertyKey, 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 (error) {\n\t\t\t\tconsole.error('error: handling event', error);\n\t\t\t}\n\t\t});\n\t}\n\tsubscribe(callback: (propertyKey: PropertyKey, oldValue: any, newValue: any) => void): Subscription<T> {\n\t\tconst subscription: Subscription<T> = new Subscription(this);\n\t\tthis.subscribers.set(subscription, callback);\n\t\treturn subscription;\n\t}\n\n\tremove(subscription: Subscription<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 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\tprivate observer: ValueChangeObserver<T>;\n\tconstructor(context: T, type: ScopeType, protected name?: PropertyKey, observer?: ValueChangeObserver<T>) {\n\t\tsuper(context, type);\n\t\tif (observer) {\n\t\t\tthis.observer = observer;\n\t\t} else {\n\t\t\tthis.observer = new ValueChangeObserver(name as string);\n\t\t}\n\t}\n\tset(propertyKey: PropertyKey, 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(propertyKey, oldValue, newValue);\n\t\t}\n\t\treturn result;\n\t}\n\tgetScope<V extends object>(propertyKey: PropertyKey): ReactiveScope<V> {\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\treturn scope as ReactiveScope<V>;\n\t\t}\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tconst childName = this.getEventName(propertyKey);\n\t\tscope = new ReactiveScope(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: PropertyKey): string {\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)}']`;\n\t\t\t}\n\t\t\treturn `${String(this.name)}.${String(child)}`;\n\t\t}\n\t\treturn `${String(child)}`;\n\t}\n\n\tsubscribe(callback: (propertyKey: PropertyKey, oldValue: any, newValue: any) => void): Subscription<T> {\n\t\treturn this.observer.subscribe(callback);\n\t}\n\n\tremove(subscription: Subscription<T>) {\n\t\tthis.observer.remove(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 interface Scope<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: PropertyKey): 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: PropertyKey, 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: PropertyKey): boolean;\n\n\t/**\n\t * get current context object of this scope\n\t */\n\tgetContext(): T | undefined;\n\n\t/**\n\t * get value of `propertyKey` in current context\n\t * @param propertyKey \n\t */\n\tgetScope<V extends object>(propertyKey: PropertyKey): 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 this({} as T, 'global');\n\t}\n\tprotected scopeMap = new Map<PropertyKey, Scope<any>>();\n\tconstructor(protected context: T, public type: ScopeType) { }\n\tget(propertyKey: PropertyKey): any {\n\t\treturn Reflect.get(this.context, propertyKey);\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this.context, propertyKey, value);\n\t}\n\thas(propertyKey: PropertyKey): boolean {\n\t\treturn propertyKey in this.context;\n\t}\n\tgetContext(): T | undefined {\n\t\treturn this.context;\n\t}\n\tgetScope<V extends object>(propertyKey: PropertyKey): Scope<V> | undefined {\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\treturn scope;\n\t\t}\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tif (typeof scopeContext === 'undefined') {\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}\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: PropertyKey, value: any, receiver?: any): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n}\n\nclass Subscription<T> {\n\tprivate othersSubscription: Subscription<any>[];\n\tconstructor(private observer: ValueChangeObserver<T>) { }\n\tadd(subscription: Subscription<any>) {\n\t\tif (!this.othersSubscription) {\n\t\t\tthis.othersSubscription = [];\n\t\t}\n\t\tthis.othersSubscription.push(subscription);\n\t}\n\tunsubscribe(): void {\n\t\tthis.observer.remove(this);\n\t\tif (this.othersSubscription) {\n\t\t\tthis.othersSubscription.forEach((subscription) => {\n\t\t\t\tsubscription.unsubscribe();\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<Subscription<T>, (propertyKey: PropertyKey, oldValue: any, newValue: any) => void> = new Map();\n\tconstructor(name?: string) { }\n\temit(propertyKey: PropertyKey, 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 (error) {\n\t\t\t\tconsole.error('error: handling event', error);\n\t\t\t}\n\t\t});\n\t}\n\tsubscribe(callback: (propertyKey: PropertyKey, oldValue: any, newValue: any) => void): Subscription<T> {\n\t\tconst subscription: Subscription<T> = new Subscription(this);\n\t\tthis.subscribers.set(subscription, callback);\n\t\treturn subscription;\n\t}\n\n\tremove(subscription: Subscription<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<T>) {\n\t\tsuper(context, type);\n\t\tif (observer) {\n\t\t\tthis.observer = observer;\n\t\t} else {\n\t\t\tthis.observer = new ValueChangeObserver(name as string);\n\t\t}\n\t}\n\tset(propertyKey: PropertyKey, 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(propertyKey, oldValue, newValue);\n\t\t}\n\t\treturn result;\n\t}\n\tgetScope<V extends object>(propertyKey: PropertyKey): ReactiveScope<V> | undefined {\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\treturn scope as ReactiveScope<V>;\n\t\t}\n\t\tconst scopeContext = this.get(propertyKey);\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(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: PropertyKey): string {\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)}']`;\n\t\t\t}\n\t\t\treturn `${String(this.name)}.${String(child)}`;\n\t\t}\n\t\treturn String(child);\n\t}\n\n\tsubscribe(callback: (propertyKey: PropertyKey, oldValue: any, newValue: any) => void): Subscription<T> {\n\t\treturn this.observer.subscribe(callback);\n\t}\n\n\tremove(subscription: Subscription<T>) {\n\t\tthis.observer.remove(subscription);\n\t}\n}\n"]}
package/scope/stack.d.ts CHANGED
@@ -1,9 +1,8 @@
1
- import type { CanDeclareVariable, ExpressionNode } from '../api/expression.js';
1
+ import type { CanDeclareExpression } from '../api/expression.js';
2
2
  import { ReactiveScope, Scope, ScopeType } from './scope.js';
3
- export declare type AwaitPromiseInfoNode = ExpressionNode & CanDeclareVariable;
4
3
  export interface AwaitPromiseInfo {
5
4
  promise: Promise<any>;
6
- node: AwaitPromiseInfoNode;
5
+ node: CanDeclareExpression;
7
6
  declareVariable: boolean;
8
7
  scopeType: ScopeType;
9
8
  }
@@ -43,4 +42,16 @@ export declare class Stack implements Stack {
43
42
  forAwaitAsyncIterable?: AsyncIterableInfo | undefined;
44
43
  protected readonly stack: Array<Scope<any>>;
45
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>;
46
57
  }
package/scope/stack.js CHANGED
@@ -7,7 +7,7 @@ export class Stack {
7
7
  if (contexts.length === 0) {
8
8
  return new Stack();
9
9
  }
10
- return new Stack(contexts.map(context => new Scope(context, 'block')));
10
+ return new Stack(contexts.map(context => new Scope(context, 'global')));
11
11
  }
12
12
  static forScopes(...scopes) {
13
13
  if (scopes.length === 0) {
@@ -70,6 +70,21 @@ export class Stack {
70
70
  this.stack.push(scope);
71
71
  return scope;
72
72
  }
73
+ pushClassScope() {
74
+ const scope = Scope.classScope();
75
+ this.stack.push(scope);
76
+ return scope;
77
+ }
78
+ pushModuleScope() {
79
+ const scope = Scope.moduleScope();
80
+ this.stack.push(scope);
81
+ return scope;
82
+ }
83
+ pushGlobalScope() {
84
+ const scope = Scope.globalScope();
85
+ this.stack.push(scope);
86
+ return scope;
87
+ }
73
88
  pushBlockScopeFor(context) {
74
89
  const scope = Scope.blockScopeFor(context);
75
90
  this.stack.push(scope);
@@ -80,6 +95,21 @@ export class Stack {
80
95
  this.stack.push(scope);
81
96
  return scope;
82
97
  }
98
+ pushClassScopeFor(context) {
99
+ const scope = Scope.classScopeFor(context);
100
+ this.stack.push(scope);
101
+ return scope;
102
+ }
103
+ pushModuleScopeFor(context) {
104
+ const scope = Scope.moduleScopeFor(context);
105
+ this.stack.push(scope);
106
+ return scope;
107
+ }
108
+ pushGlobalScopeFor(context) {
109
+ const scope = Scope.globalScopeFor(context);
110
+ this.stack.push(scope);
111
+ return scope;
112
+ }
83
113
  pushBlockReactiveScope() {
84
114
  const scope = ReactiveScope.blockScope();
85
115
  this.stack.push(scope);
@@ -90,6 +120,21 @@ export class Stack {
90
120
  this.stack.push(scope);
91
121
  return scope;
92
122
  }
123
+ pushClassReactiveScope() {
124
+ const scope = ReactiveScope.classScope();
125
+ this.stack.push(scope);
126
+ return scope;
127
+ }
128
+ pushModuleReactiveScope() {
129
+ const scope = ReactiveScope.moduleScope();
130
+ this.stack.push(scope);
131
+ return scope;
132
+ }
133
+ pushGlobalReactiveScope() {
134
+ const scope = ReactiveScope.globalScope();
135
+ this.stack.push(scope);
136
+ return scope;
137
+ }
93
138
  pushBlockReactiveScopeFor(context) {
94
139
  const scope = ReactiveScope.blockScopeFor(context);
95
140
  this.stack.push(scope);
@@ -100,6 +145,21 @@ export class Stack {
100
145
  this.stack.push(scope);
101
146
  return scope;
102
147
  }
148
+ pushClassReactiveScopeFor(context) {
149
+ const scope = ReactiveScope.classScopeFor(context);
150
+ this.stack.push(scope);
151
+ return scope;
152
+ }
153
+ pushModuleReactiveScopeFor(context) {
154
+ const scope = ReactiveScope.moduleScopeFor(context);
155
+ this.stack.push(scope);
156
+ return scope;
157
+ }
158
+ pushGlobalReactiveScopeFor(context) {
159
+ const scope = ReactiveScope.globalScopeFor(context);
160
+ this.stack.push(scope);
161
+ return scope;
162
+ }
103
163
  lastScope() {
104
164
  return this.stack[this.stack.length - 1];
105
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../src/expressions/scope/stack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AAwH7D,MAAM,OAAO,KAAK;IAkBjB,YAAY,KAAyB;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/C,CAAC;IAnBD,MAAM,CAAC,GAAG,CAAC,GAAG,QAAsB;QACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,OAAO,IAAI,KAAK,EAAE,CAAC;SACnB;QACD,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAoB;QACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;SACnC;QACD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IASD,GAAG,CAAC,WAAwB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,CAAC;IACD,GAAG,CAAC,WAAwB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IACD,GAAG,CAAC,WAAwB,EAAE,KAAU,EAAE,QAAc;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IACD,eAAe,CAAC,SAAoB,EAAE,WAAwB,EAAE,aAAmB;QAClF,IAAI,SAAS,KAAK,OAAO,EAAE;YAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;SACxD;QACD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,OAAO,SAAS,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC7B,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBACtC,MAAM;aACN;SACD;IACF,CAAC;IACD,SAAS,CAAmB,WAAwB;QACnD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,OAAO,SAAS,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBAC3B,OAAO,KAAK,CAAC;aACb;SACD;QACD,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IACzB,CAAC;IACD,YAAY,CAAC,KAAuB;QACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAG,CAAC;IAC1B,CAAC;IACD,WAAW,CAAmB,KAAe;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,SAAS,CAAmB,KAAe;QAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,cAAc;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAK,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,iBAAiB;QAChB,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAK,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,iBAAiB,CAAmB,OAAU;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,oBAAoB,CAAmB,OAAU;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,sBAAsB;QACrB,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,EAAK,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,yBAAyB;QACxB,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,EAAK,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,yBAAyB,CAAmB,OAAU;QACrD,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,4BAA4B,CAAmB,OAAU;QACxD,MAAM,KAAK,GAAG,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,SAAS;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAmB,KAAe;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YACjB,OAAO,KAAK,CAAC;SACb;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,SAAS,CAAmB,KAAe;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YACjB,OAAO,KAAK,CAAC;SACb;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,SAAS;QACR,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;CACD","sourcesContent":["import type { CanDeclareVariable, ExpressionNode } from '../api/expression.js';\nimport { ReactiveScope, Scope, ScopeType } from './scope.js';\n\n\nexport type AwaitPromiseInfoNode = ExpressionNode & CanDeclareVariable;\nexport interface AwaitPromiseInfo {\n\tpromise: Promise<any>;\n\tnode: AwaitPromiseInfoNode;\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, 'block')));\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(propertyKey).get(propertyKey);\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\treturn this.findScope(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().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\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\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\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\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, 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(propertyKey).get(propertyKey);\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\treturn this.findScope(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().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"]}