@dronedeploy/rocos-js-sdk 3.0.10 → 3.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. package/cjs/api/StreamRegister.d.ts +3 -3
  2. package/cjs/api/StreamRegister.js +6 -6
  3. package/cjs/api/streams/telemetry/TelemetryStreamAbstract.js +8 -7
  4. package/cjs/helpers/kscript/Context.d.ts +14 -8
  5. package/cjs/helpers/kscript/Context.js +59 -22
  6. package/cjs/helpers/kscript/kscript.d.ts +7 -2
  7. package/cjs/helpers/kscript/kscript.js +24 -14
  8. package/cjs/helpers/kscript/nodes/Identifier.d.ts +1 -0
  9. package/cjs/helpers/kscript/nodes/Identifier.js +2 -1
  10. package/cjs/helpers/kscript/nodes/Literal.d.ts +1 -0
  11. package/cjs/helpers/kscript/nodes/Literal.js +4 -1
  12. package/cjs/helpers/kscript/nodes/Node.d.ts +6 -1
  13. package/cjs/helpers/kscript/nodes/Node.js +0 -1
  14. package/cjs/helpers/kscript/nodes/Program.d.ts +1 -0
  15. package/cjs/helpers/kscript/nodes/Program.js +13 -4
  16. package/cjs/helpers/kscript/nodes/TemplateLiteral.d.ts +1 -0
  17. package/cjs/helpers/kscript/nodes/TemplateLiteral.js +8 -0
  18. package/cjs/helpers/kscript/nodes/VariableDeclaration.d.ts +8 -0
  19. package/cjs/helpers/kscript/nodes/VariableDeclaration.js +43 -0
  20. package/cjs/helpers/kscript/nodes/expressions/ArrayExpression.d.ts +1 -0
  21. package/cjs/helpers/kscript/nodes/expressions/ArrayExpression.js +11 -0
  22. package/cjs/helpers/kscript/nodes/expressions/ArrowFunctionExpression.d.ts +1 -0
  23. package/cjs/helpers/kscript/nodes/expressions/ArrowFunctionExpression.js +19 -5
  24. package/cjs/helpers/kscript/nodes/expressions/AssignmentExpression.d.ts +8 -0
  25. package/cjs/helpers/kscript/nodes/expressions/AssignmentExpression.js +33 -0
  26. package/cjs/helpers/kscript/nodes/expressions/BinaryExpression.d.ts +8 -0
  27. package/cjs/helpers/kscript/nodes/expressions/BinaryExpression.js +55 -22
  28. package/cjs/helpers/kscript/nodes/expressions/CallExpression.d.ts +1 -0
  29. package/cjs/helpers/kscript/nodes/expressions/CallExpression.js +11 -1
  30. package/cjs/helpers/kscript/nodes/expressions/ChainExpression.d.ts +1 -0
  31. package/cjs/helpers/kscript/nodes/expressions/ChainExpression.js +1 -0
  32. package/cjs/helpers/kscript/nodes/expressions/ConditionalExpression.d.ts +1 -0
  33. package/cjs/helpers/kscript/nodes/expressions/ConditionalExpression.js +10 -0
  34. package/cjs/helpers/kscript/nodes/expressions/LogicalExpression.d.ts +2 -0
  35. package/cjs/helpers/kscript/nodes/expressions/LogicalExpression.js +11 -0
  36. package/cjs/helpers/kscript/nodes/expressions/MemberExpression.d.ts +1 -0
  37. package/cjs/helpers/kscript/nodes/expressions/MemberExpression.js +7 -0
  38. package/cjs/helpers/kscript/nodes/expressions/NewExpression.d.ts +9 -0
  39. package/cjs/helpers/kscript/nodes/expressions/NewExpression.js +44 -0
  40. package/cjs/helpers/kscript/nodes/expressions/ObjectExpression.d.ts +1 -0
  41. package/cjs/helpers/kscript/nodes/expressions/ObjectExpression.js +29 -0
  42. package/cjs/helpers/kscript/nodes/expressions/UnaryExpression.d.ts +2 -0
  43. package/cjs/helpers/kscript/nodes/expressions/UnaryExpression.js +9 -0
  44. package/cjs/helpers/kscript/nodes/expressions/index.d.ts +2 -1
  45. package/cjs/helpers/kscript/nodes/expressions/index.js +5 -3
  46. package/cjs/helpers/kscript/nodes/nodeTypes.d.ts +9 -1
  47. package/cjs/helpers/kscript/nodes/nodeTypes.js +9 -1
  48. package/cjs/helpers/kscript/nodes/statements/BlockStatement.d.ts +8 -0
  49. package/cjs/helpers/kscript/nodes/statements/BlockStatement.js +29 -0
  50. package/cjs/helpers/kscript/nodes/{expressions → statements}/ExpressionStatement.d.ts +1 -0
  51. package/cjs/helpers/kscript/nodes/{expressions → statements}/ExpressionStatement.js +8 -1
  52. package/cjs/helpers/kscript/nodes/statements/ReturnStatement.d.ts +12 -0
  53. package/cjs/helpers/kscript/nodes/statements/ReturnStatement.js +33 -0
  54. package/cjs/helpers/kscript/nodes/statements/SwitchStatement.d.ts +9 -0
  55. package/cjs/helpers/kscript/nodes/statements/SwitchStatement.js +52 -0
  56. package/cjs/helpers/kscript/nodes/statements/index.d.ts +4 -0
  57. package/cjs/helpers/kscript/nodes/statements/index.js +14 -0
  58. package/cjs/models/asset-storage/SyncIntegrations.d.ts +3 -3
  59. package/cjs/services/AssetStorageService.d.ts +3 -3
  60. package/cjs/services/BaseStreamService.js +1 -1
  61. package/cjs/services/WebRTCSignallingService.js +1 -2
  62. package/esm/api/StreamRegister.d.ts +3 -3
  63. package/esm/api/StreamRegister.js +6 -6
  64. package/esm/api/streams/telemetry/TelemetryStreamAbstract.js +8 -7
  65. package/esm/helpers/kscript/Context.d.ts +14 -8
  66. package/esm/helpers/kscript/Context.js +59 -22
  67. package/esm/helpers/kscript/kscript.d.ts +7 -2
  68. package/esm/helpers/kscript/kscript.js +22 -13
  69. package/esm/helpers/kscript/nodes/Identifier.d.ts +1 -0
  70. package/esm/helpers/kscript/nodes/Identifier.js +2 -1
  71. package/esm/helpers/kscript/nodes/Literal.d.ts +1 -0
  72. package/esm/helpers/kscript/nodes/Literal.js +4 -1
  73. package/esm/helpers/kscript/nodes/Node.d.ts +6 -1
  74. package/esm/helpers/kscript/nodes/Node.js +0 -1
  75. package/esm/helpers/kscript/nodes/Program.d.ts +1 -0
  76. package/esm/helpers/kscript/nodes/Program.js +13 -4
  77. package/esm/helpers/kscript/nodes/TemplateLiteral.d.ts +1 -0
  78. package/esm/helpers/kscript/nodes/TemplateLiteral.js +8 -0
  79. package/esm/helpers/kscript/nodes/VariableDeclaration.d.ts +8 -0
  80. package/esm/helpers/kscript/nodes/VariableDeclaration.js +37 -0
  81. package/esm/helpers/kscript/nodes/expressions/ArrayExpression.d.ts +1 -0
  82. package/esm/helpers/kscript/nodes/expressions/ArrayExpression.js +11 -0
  83. package/esm/helpers/kscript/nodes/expressions/ArrowFunctionExpression.d.ts +1 -0
  84. package/esm/helpers/kscript/nodes/expressions/ArrowFunctionExpression.js +19 -5
  85. package/esm/helpers/kscript/nodes/expressions/AssignmentExpression.d.ts +8 -0
  86. package/esm/helpers/kscript/nodes/expressions/AssignmentExpression.js +27 -0
  87. package/esm/helpers/kscript/nodes/expressions/BinaryExpression.d.ts +8 -0
  88. package/esm/helpers/kscript/nodes/expressions/BinaryExpression.js +57 -23
  89. package/esm/helpers/kscript/nodes/expressions/CallExpression.d.ts +1 -0
  90. package/esm/helpers/kscript/nodes/expressions/CallExpression.js +11 -1
  91. package/esm/helpers/kscript/nodes/expressions/ChainExpression.d.ts +1 -0
  92. package/esm/helpers/kscript/nodes/expressions/ChainExpression.js +1 -0
  93. package/esm/helpers/kscript/nodes/expressions/ConditionalExpression.d.ts +1 -0
  94. package/esm/helpers/kscript/nodes/expressions/ConditionalExpression.js +10 -0
  95. package/esm/helpers/kscript/nodes/expressions/LogicalExpression.d.ts +2 -0
  96. package/esm/helpers/kscript/nodes/expressions/LogicalExpression.js +13 -1
  97. package/esm/helpers/kscript/nodes/expressions/MemberExpression.d.ts +1 -0
  98. package/esm/helpers/kscript/nodes/expressions/MemberExpression.js +7 -0
  99. package/esm/helpers/kscript/nodes/expressions/NewExpression.d.ts +9 -0
  100. package/esm/helpers/kscript/nodes/expressions/NewExpression.js +38 -0
  101. package/esm/helpers/kscript/nodes/expressions/ObjectExpression.d.ts +1 -0
  102. package/esm/helpers/kscript/nodes/expressions/ObjectExpression.js +29 -0
  103. package/esm/helpers/kscript/nodes/expressions/UnaryExpression.d.ts +2 -0
  104. package/esm/helpers/kscript/nodes/expressions/UnaryExpression.js +11 -1
  105. package/esm/helpers/kscript/nodes/expressions/index.d.ts +2 -1
  106. package/esm/helpers/kscript/nodes/expressions/index.js +2 -1
  107. package/esm/helpers/kscript/nodes/nodeTypes.d.ts +9 -1
  108. package/esm/helpers/kscript/nodes/nodeTypes.js +9 -1
  109. package/esm/helpers/kscript/nodes/statements/BlockStatement.d.ts +8 -0
  110. package/esm/helpers/kscript/nodes/statements/BlockStatement.js +23 -0
  111. package/esm/helpers/kscript/nodes/{expressions → statements}/ExpressionStatement.d.ts +1 -0
  112. package/esm/helpers/kscript/nodes/{expressions → statements}/ExpressionStatement.js +8 -1
  113. package/esm/helpers/kscript/nodes/statements/ReturnStatement.d.ts +12 -0
  114. package/esm/helpers/kscript/nodes/statements/ReturnStatement.js +25 -0
  115. package/esm/helpers/kscript/nodes/statements/SwitchStatement.d.ts +9 -0
  116. package/esm/helpers/kscript/nodes/statements/SwitchStatement.js +46 -0
  117. package/esm/helpers/kscript/nodes/statements/index.d.ts +4 -0
  118. package/esm/helpers/kscript/nodes/statements/index.js +4 -0
  119. package/esm/models/asset-storage/SyncIntegrations.d.ts +3 -3
  120. package/esm/services/AssetStorageService.d.ts +3 -3
  121. package/esm/services/BaseStreamService.js +1 -1
  122. package/esm/services/WebRTCSignallingService.js +1 -2
  123. package/package.json +1 -1
@@ -13,34 +13,48 @@ class BinaryExpressionNode extends Node_1.default {
13
13
  constructor(node, context) {
14
14
  super(node, context, 'BinaryExpression');
15
15
  }
16
+ validate(validateChildren = false) {
17
+ if (!BinaryExpressionNode.SUPPORTED_OPERATORS.has(this.node.operator)) {
18
+ throw new Error(`Unsupported operator: ${this.node.operator}`);
19
+ }
20
+ if (!validateChildren) {
21
+ return;
22
+ }
23
+ (0, utils_1.construct)(this.node.left, this.context).validate(true);
24
+ (0, utils_1.construct)(this.node.right, this.context).validate(true);
25
+ }
16
26
  run() {
17
27
  const left = (0, utils_1.construct)(this.node.left, this.context).run();
18
28
  const right = (0, utils_1.construct)(this.node.right, this.context).run();
19
29
  return this.operate(left, right);
20
30
  }
21
31
  operate(left, right) {
22
- switch (this.node.operator) {
23
- case '==':
24
- case '!=':
25
- case '===':
26
- case '!==':
27
- return this.equality(this.node.operator, left, right);
28
- case '<':
29
- case '<=':
30
- case '>':
31
- case '>=':
32
- return this.comparison(this.node.operator, left, right);
33
- case 'in':
34
- return this.checkIn(left, right);
35
- case '**':
36
- case '+':
37
- case '-':
38
- case '*':
39
- case '/':
40
- case '%':
41
- return this.arithmetic(this.node.operator, left, right);
42
- default:
43
- throw new Error(`Unsupported operator: ${this.node.operator}`);
32
+ if (BinaryExpressionNode.EQUALITY_OPERATORS.has(this.node.operator)) {
33
+ return this.equality(this.node.operator, left, right);
34
+ }
35
+ if (BinaryExpressionNode.COMPARISON_OPERATORS.has(this.node.operator)) {
36
+ return this.comparison(this.node.operator, left, right);
37
+ }
38
+ if (BinaryExpressionNode.ARITHMETIC_OPERATORS.has(this.node.operator)) {
39
+ return this.arithmetic(this.node.operator, left, right);
40
+ }
41
+ if (BinaryExpressionNode.BITWISE_OPERATORS.has(this.node.operator)) {
42
+ return this.bitwise(this.node.operator, left, right);
43
+ }
44
+ if (this.node.operator === BinaryExpressionNode.IN_OPERATOR) {
45
+ return this.checkIn(left, right);
46
+ }
47
+ throw new Error(`Unsupported operator: ${this.node.operator}`);
48
+ }
49
+ bitwise(operator, left, right) {
50
+ if (typeof left !== 'number' || typeof right !== 'number') {
51
+ throw new Error('Bitwise operators are only supported for numbers');
52
+ }
53
+ switch (operator) {
54
+ case '<<':
55
+ return left << right;
56
+ case '>>':
57
+ return left >> right;
44
58
  }
45
59
  }
46
60
  arithmetic(operator, left, right) {
@@ -101,4 +115,23 @@ class BinaryExpressionNode extends Node_1.default {
101
115
  return right.includes(left);
102
116
  }
103
117
  }
118
+ BinaryExpressionNode.EQUALITY_OPERATORS = new Set(['==', '!=', '===', '!==']);
119
+ BinaryExpressionNode.COMPARISON_OPERATORS = new Set(['<', '<=', '>', '>=']);
120
+ BinaryExpressionNode.ARITHMETIC_OPERATORS = new Set([
121
+ '+',
122
+ '-',
123
+ '*',
124
+ '/',
125
+ '%',
126
+ '**',
127
+ ]);
128
+ BinaryExpressionNode.BITWISE_OPERATORS = new Set(['<<', '>>']);
129
+ BinaryExpressionNode.IN_OPERATOR = 'in';
130
+ BinaryExpressionNode.SUPPORTED_OPERATORS = new Set([
131
+ ...BinaryExpressionNode.EQUALITY_OPERATORS,
132
+ ...BinaryExpressionNode.COMPARISON_OPERATORS,
133
+ ...BinaryExpressionNode.ARITHMETIC_OPERATORS,
134
+ ...BinaryExpressionNode.BITWISE_OPERATORS,
135
+ BinaryExpressionNode.IN_OPERATOR,
136
+ ]);
104
137
  exports.default = BinaryExpressionNode;
@@ -3,6 +3,7 @@ import Context from '../../Context';
3
3
  import Node from '../Node';
4
4
  export default class CallExpressionNode extends Node<CallExpression> {
5
5
  constructor(node: AnyNode, context: Context);
6
+ validate(validateChildren?: boolean): void;
6
7
  run(): unknown;
7
8
  private spreadArgs;
8
9
  }
@@ -9,9 +9,19 @@ class CallExpressionNode extends Node_1.default {
9
9
  constructor(node, context) {
10
10
  super(node, context, 'CallExpression');
11
11
  }
12
- run() {
12
+ validate(validateChildren = false) {
13
13
  if (!this.context.isFunctionCallAllowed)
14
14
  throw new Error('Function calls are not allowed');
15
+ if (!validateChildren) {
16
+ return;
17
+ }
18
+ (0, utils_1.construct)(this.node.callee, this.context).validate(true);
19
+ for (const arg of this.node.arguments) {
20
+ (0, utils_1.construct)(arg, this.context).validate(true);
21
+ }
22
+ }
23
+ run() {
24
+ this.validate();
15
25
  const callee = (0, utils_1.construct)(this.node.callee, this.context).run();
16
26
  let thisArg = {};
17
27
  if (this.node.callee.type === 'MemberExpression') {
@@ -12,5 +12,6 @@ import Node from '../Node';
12
12
  */
13
13
  export default class ExpressionStatementNode extends Node<ChainExpression> {
14
14
  constructor(node: AnyNode, context: Context);
15
+ validate(): void;
15
16
  run(): unknown;
16
17
  }
@@ -18,6 +18,7 @@ class ExpressionStatementNode extends Node_1.default {
18
18
  constructor(node, context) {
19
19
  super(node, context, 'ChainExpression');
20
20
  }
21
+ validate() { }
21
22
  run() {
22
23
  return (0, utils_1.construct)(this.node.expression, this.context).run();
23
24
  }
@@ -10,5 +10,6 @@ import Node from '../Node';
10
10
  */
11
11
  export default class ConditionalExpressionNode extends Node<IfStatement | ConditionalExpression> {
12
12
  constructor(node: AnyNode, context: Context);
13
+ validate(validateChildren: boolean): void;
13
14
  run(): unknown;
14
15
  }
@@ -16,6 +16,16 @@ class ConditionalExpressionNode extends Node_1.default {
16
16
  constructor(node, context) {
17
17
  super(node, context, ['ConditionalExpression', 'IfStatement']);
18
18
  }
19
+ validate(validateChildren) {
20
+ if (!validateChildren) {
21
+ return;
22
+ }
23
+ (0, utils_1.construct)(this.node.test, this.context).validate(true);
24
+ (0, utils_1.construct)(this.node.consequent, this.context).validate(true);
25
+ if (this.node.alternate !== null && this.node.alternate !== undefined) {
26
+ (0, utils_1.construct)(this.node.alternate, this.context).validate(true);
27
+ }
28
+ }
19
29
  run() {
20
30
  const test = (0, utils_1.construct)(this.node.test, this.context).run();
21
31
  if (test) {
@@ -2,7 +2,9 @@ import { AnyNode, LogicalExpression } from 'acorn';
2
2
  import Context from '../../Context';
3
3
  import Node from '../Node';
4
4
  export default class BinaryExpressionNode extends Node<LogicalExpression> {
5
+ private static readonly SUPPORTED_OPERATORS;
5
6
  constructor(node: AnyNode, context: Context);
7
+ validate(validateChildren: boolean): void;
6
8
  run(): unknown;
7
9
  /** Try and skip evaluating the right operand */
8
10
  private shortCircuit;
@@ -9,6 +9,16 @@ class BinaryExpressionNode extends Node_1.default {
9
9
  constructor(node, context) {
10
10
  super(node, context, 'LogicalExpression');
11
11
  }
12
+ validate(validateChildren) {
13
+ if (!BinaryExpressionNode.SUPPORTED_OPERATORS.has(this.node.operator)) {
14
+ throw new Error(`Unsupported operator: ${this.node.operator}`);
15
+ }
16
+ if (!validateChildren) {
17
+ return;
18
+ }
19
+ (0, utils_1.construct)(this.node.left, this.context).validate(true);
20
+ (0, utils_1.construct)(this.node.right, this.context).validate(true);
21
+ }
12
22
  run() {
13
23
  const left = (0, utils_1.construct)(this.node.left, this.context).run();
14
24
  const shortCircuit = this.shortCircuit(left);
@@ -44,4 +54,5 @@ class BinaryExpressionNode extends Node_1.default {
44
54
  }
45
55
  }
46
56
  }
57
+ BinaryExpressionNode.SUPPORTED_OPERATORS = new Set(['||', '&&', '??']);
47
58
  exports.default = BinaryExpressionNode;
@@ -22,6 +22,7 @@ import Node from '../Node';
22
22
  */
23
23
  export default class MemberExpressionNode extends Node<MemberExpression> {
24
24
  constructor(node: AnyNode, context: Context);
25
+ validate(validateChildren?: boolean): void;
25
26
  run(): unknown;
26
27
  /** Returns the name of the property being accessed.
27
28
  *
@@ -28,6 +28,13 @@ class MemberExpressionNode extends Node_1.default {
28
28
  constructor(node, context) {
29
29
  super(node, context, 'MemberExpression');
30
30
  }
31
+ validate(validateChildren = false) {
32
+ if (!validateChildren) {
33
+ return;
34
+ }
35
+ (0, utils_1.construct)(this.node.object, this.context).validate(true);
36
+ (0, utils_1.construct)(this.node.property, this.context).validate(true);
37
+ }
31
38
  run() {
32
39
  const object = (0, utils_1.construct)(this.node.object, this.context).run();
33
40
  if (object === null || object === undefined) {
@@ -0,0 +1,9 @@
1
+ import { AnyNode, NewExpression } from 'acorn';
2
+ import Context from '../../Context';
3
+ import Node from '../Node';
4
+ export default class NewExpressionNode extends Node<NewExpression> {
5
+ constructor(node: AnyNode, context: Context);
6
+ validate(validateChildren?: boolean): void;
7
+ run(): unknown;
8
+ private spreadArgs;
9
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Node_1 = __importDefault(require("../Node"));
7
+ const utils_1 = require("../../utils");
8
+ class NewExpressionNode extends Node_1.default {
9
+ constructor(node, context) {
10
+ super(node, context, 'NewExpression');
11
+ }
12
+ validate(validateChildren = false) {
13
+ if (!this.context.isFunctionCallAllowed)
14
+ throw new Error('Constructors are not allowed');
15
+ if (!validateChildren) {
16
+ return;
17
+ }
18
+ (0, utils_1.construct)(this.node.callee, this.context).validate(true);
19
+ for (const arg of this.node.arguments) {
20
+ (0, utils_1.construct)(arg, this.context).validate(true);
21
+ }
22
+ }
23
+ run() {
24
+ this.validate();
25
+ const callee = (0, utils_1.construct)(this.node.callee, this.context).run();
26
+ if (typeof callee !== 'function') {
27
+ throw new Error('callee is not a function');
28
+ }
29
+ const args = this.spreadArgs(this.node.arguments);
30
+ return new (Function.prototype.bind.apply(callee, [null, ...args]))();
31
+ }
32
+ spreadArgs(args) {
33
+ return args.reduce((acc, arg) => {
34
+ if (arg.type === 'SpreadElement') {
35
+ acc.push(...(0, utils_1.construct)(arg.argument, this.context).run());
36
+ }
37
+ else {
38
+ acc.push((0, utils_1.construct)(arg, this.context).run());
39
+ }
40
+ return acc;
41
+ }, []);
42
+ }
43
+ }
44
+ exports.default = NewExpressionNode;
@@ -3,6 +3,7 @@ import type Context from '../../Context';
3
3
  import Node from '../Node';
4
4
  export default class ObjectExpressionNode extends Node<ObjectExpression> {
5
5
  constructor(node: AnyNode, context: Context);
6
+ validate(validateChildren: boolean): void;
6
7
  run(): unknown;
7
8
  private addProperty;
8
9
  private spreadProperty;
@@ -9,6 +9,35 @@ class ObjectExpressionNode extends Node_1.default {
9
9
  constructor(node, context) {
10
10
  super(node, context, 'ObjectExpression');
11
11
  }
12
+ validate(validateChildren) {
13
+ for (const property of this.node.properties) {
14
+ // SpreadElements do not need to be validated - they only have a single argument
15
+ if (property.type === 'SpreadElement') {
16
+ continue;
17
+ }
18
+ if (property.kind !== 'init') {
19
+ // do not support getters or setters
20
+ throw new Error('Only init properties are supported');
21
+ }
22
+ if (!property.computed) {
23
+ // ensure that the key is valid
24
+ this.getStaticKey(property.key);
25
+ }
26
+ }
27
+ if (!validateChildren) {
28
+ return;
29
+ }
30
+ for (const property of this.node.properties) {
31
+ if (property.type === 'SpreadElement') {
32
+ (0, utils_1.construct)(property.argument, this.context).validate(true);
33
+ continue;
34
+ }
35
+ if (property.computed) {
36
+ (0, utils_1.construct)(property.key, this.context).validate(true);
37
+ }
38
+ (0, utils_1.construct)(property.value, this.context).validate(true);
39
+ }
40
+ }
12
41
  run() {
13
42
  const object = {};
14
43
  for (const property of this.node.properties) {
@@ -6,7 +6,9 @@ import Node from '../Node';
6
6
  * e.g. `+1`, `-2`, `!true`, `typeof x`
7
7
  */
8
8
  export default class UnaryExpressionNode extends Node<UnaryExpression> {
9
+ private static readonly SUPPORTED_OPERATORS;
9
10
  constructor(node: AnyNode, context: Context);
11
+ validate(validateChildren: boolean): void;
10
12
  run(): unknown;
11
13
  private arithmetic;
12
14
  }
@@ -13,6 +13,14 @@ class UnaryExpressionNode extends Node_1.default {
13
13
  constructor(node, context) {
14
14
  super(node, context, 'UnaryExpression');
15
15
  }
16
+ validate(validateChildren) {
17
+ if (!UnaryExpressionNode.SUPPORTED_OPERATORS.has(this.node.operator)) {
18
+ throw new Error(`Unsupported operator: ${this.node.operator}`);
19
+ }
20
+ if (validateChildren) {
21
+ (0, utils_1.construct)(this.node.argument, this.context).validate(true);
22
+ }
23
+ }
16
24
  run() {
17
25
  const argument = (0, utils_1.construct)(this.node.argument, this.context).run();
18
26
  switch (this.node.operator) {
@@ -41,4 +49,5 @@ class UnaryExpressionNode extends Node_1.default {
41
49
  }
42
50
  }
43
51
  }
52
+ UnaryExpressionNode.SUPPORTED_OPERATORS = new Set(['+', '-', '!', 'typeof']);
44
53
  exports.default = UnaryExpressionNode;
@@ -1,4 +1,3 @@
1
- export { default as ExpressionStatement } from './ExpressionStatement';
2
1
  export { default as ArrayExpression } from './ArrayExpression';
3
2
  export { default as ObjectExpression } from './ObjectExpression';
4
3
  export { default as BinaryExpression } from './BinaryExpression';
@@ -9,3 +8,5 @@ export { default as CallExpression } from './CallExpression';
9
8
  export { default as ArrowFunctionExpression } from './ArrowFunctionExpression';
10
9
  export { default as MemberExpression } from './MemberExpression';
11
10
  export { default as ChainExpression } from './ChainExpression';
11
+ export { default as NewExpression } from './NewExpression';
12
+ export { default as AssignmentExpression } from './AssignmentExpression';
@@ -3,9 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ChainExpression = exports.MemberExpression = exports.ArrowFunctionExpression = exports.CallExpression = exports.ConditionalExpression = exports.LogicalExpression = exports.UnaryExpression = exports.BinaryExpression = exports.ObjectExpression = exports.ArrayExpression = exports.ExpressionStatement = void 0;
7
- var ExpressionStatement_1 = require("./ExpressionStatement");
8
- Object.defineProperty(exports, "ExpressionStatement", { enumerable: true, get: function () { return __importDefault(ExpressionStatement_1).default; } });
6
+ exports.AssignmentExpression = exports.NewExpression = exports.ChainExpression = exports.MemberExpression = exports.ArrowFunctionExpression = exports.CallExpression = exports.ConditionalExpression = exports.LogicalExpression = exports.UnaryExpression = exports.BinaryExpression = exports.ObjectExpression = exports.ArrayExpression = void 0;
9
7
  var ArrayExpression_1 = require("./ArrayExpression");
10
8
  Object.defineProperty(exports, "ArrayExpression", { enumerable: true, get: function () { return __importDefault(ArrayExpression_1).default; } });
11
9
  var ObjectExpression_1 = require("./ObjectExpression");
@@ -26,3 +24,7 @@ var MemberExpression_1 = require("./MemberExpression");
26
24
  Object.defineProperty(exports, "MemberExpression", { enumerable: true, get: function () { return __importDefault(MemberExpression_1).default; } });
27
25
  var ChainExpression_1 = require("./ChainExpression");
28
26
  Object.defineProperty(exports, "ChainExpression", { enumerable: true, get: function () { return __importDefault(ChainExpression_1).default; } });
27
+ var NewExpression_1 = require("./NewExpression");
28
+ Object.defineProperty(exports, "NewExpression", { enumerable: true, get: function () { return __importDefault(NewExpression_1).default; } });
29
+ var AssignmentExpression_1 = require("./AssignmentExpression");
30
+ Object.defineProperty(exports, "AssignmentExpression", { enumerable: true, get: function () { return __importDefault(AssignmentExpression_1).default; } });
@@ -1,4 +1,5 @@
1
- import { ArrayExpression, ArrowFunctionExpression, BinaryExpression, CallExpression, ChainExpression, ConditionalExpression, ExpressionStatement, LogicalExpression, MemberExpression, ObjectExpression, UnaryExpression } from './expressions';
1
+ import { ArrayExpression, ArrowFunctionExpression, AssignmentExpression, BinaryExpression, CallExpression, ChainExpression, ConditionalExpression, LogicalExpression, MemberExpression, NewExpression, ObjectExpression, UnaryExpression } from './expressions';
2
+ import { BlockStatement, ExpressionStatement, ReturnStatement, SwitchStatement } from './statements';
2
3
  import { AnyNode } from 'acorn';
3
4
  import type Context from '../Context';
4
5
  import Identifier from './Identifier';
@@ -6,6 +7,7 @@ import Literal from './Literal';
6
7
  import Node from './Node';
7
8
  import Program from './Program';
8
9
  import TemplateLiteral from './TemplateLiteral';
10
+ import VariableDeclaration from './VariableDeclaration';
9
11
  type NodeConstructor = {
10
12
  new (node: AnyNode, scope: Context): Node<AnyNode>;
11
13
  };
@@ -27,6 +29,12 @@ declare const nodes: {
27
29
  readonly CallExpression: typeof CallExpression;
28
30
  readonly MemberExpression: typeof MemberExpression;
29
31
  readonly ChainExpression: typeof ChainExpression;
32
+ readonly NewExpression: typeof NewExpression;
33
+ readonly BlockStatement: typeof BlockStatement;
34
+ readonly ReturnStatement: typeof ReturnStatement;
35
+ readonly VariableDeclaration: typeof VariableDeclaration;
36
+ readonly AssignmentExpression: typeof AssignmentExpression;
37
+ readonly SwitchStatement: typeof SwitchStatement;
30
38
  };
31
39
  export type NodeType = keyof typeof nodes;
32
40
  declare const _default: NodeMap;
@@ -4,14 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const expressions_1 = require("./expressions");
7
+ const statements_1 = require("./statements");
7
8
  const Identifier_1 = __importDefault(require("./Identifier"));
8
9
  const Literal_1 = __importDefault(require("./Literal"));
9
10
  const Program_1 = __importDefault(require("./Program"));
10
11
  const TemplateLiteral_1 = __importDefault(require("./TemplateLiteral"));
12
+ const VariableDeclaration_1 = __importDefault(require("./VariableDeclaration"));
11
13
  const nodes = {
12
14
  Program: Program_1.default,
13
15
  Literal: Literal_1.default,
14
- ExpressionStatement: expressions_1.ExpressionStatement,
16
+ ExpressionStatement: statements_1.ExpressionStatement,
15
17
  ArrayExpression: expressions_1.ArrayExpression,
16
18
  ObjectExpression: expressions_1.ObjectExpression,
17
19
  Identifier: Identifier_1.default,
@@ -25,5 +27,11 @@ const nodes = {
25
27
  CallExpression: expressions_1.CallExpression,
26
28
  MemberExpression: expressions_1.MemberExpression,
27
29
  ChainExpression: expressions_1.ChainExpression,
30
+ NewExpression: expressions_1.NewExpression,
31
+ BlockStatement: statements_1.BlockStatement,
32
+ ReturnStatement: statements_1.ReturnStatement,
33
+ VariableDeclaration: VariableDeclaration_1.default,
34
+ AssignmentExpression: expressions_1.AssignmentExpression,
35
+ SwitchStatement: statements_1.SwitchStatement,
28
36
  };
29
37
  exports.default = new Map(Object.entries(nodes));
@@ -0,0 +1,8 @@
1
+ import { AnyNode, BlockStatement } from 'acorn';
2
+ import Context from '../../Context';
3
+ import Node from '../Node';
4
+ export default class BlockStatementNode extends Node<BlockStatement> {
5
+ constructor(node: AnyNode, context: Context);
6
+ validate(validateChildren?: boolean): void;
7
+ run(): unknown;
8
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Node_1 = __importDefault(require("../Node"));
7
+ const utils_1 = require("../../utils");
8
+ class BlockStatementNode extends Node_1.default {
9
+ constructor(node, context) {
10
+ super(node, context.newChild(), 'BlockStatement');
11
+ }
12
+ validate(validateChildren = false) {
13
+ if (!validateChildren) {
14
+ return;
15
+ }
16
+ for (const statement of this.node.body) {
17
+ (0, utils_1.construct)(statement, this.context).validate(true);
18
+ }
19
+ }
20
+ run() {
21
+ this.validate();
22
+ let result;
23
+ for (const statement of this.node.body) {
24
+ result = (0, utils_1.construct)(statement, this.context).run();
25
+ }
26
+ return result;
27
+ }
28
+ }
29
+ exports.default = BlockStatementNode;
@@ -3,5 +3,6 @@ import Context from '../../Context';
3
3
  import Node from '../Node';
4
4
  export default class ExpressionStatementNode extends Node<ExpressionStatement> {
5
5
  constructor(node: AnyNode, context: Context);
6
+ validate(validateChildren?: boolean): void;
6
7
  run(): unknown;
7
8
  }
@@ -9,9 +9,16 @@ class ExpressionStatementNode extends Node_1.default {
9
9
  constructor(node, context) {
10
10
  super(node, context, 'ExpressionStatement');
11
11
  }
12
- run() {
12
+ validate(validateChildren = false) {
13
13
  if (this.node.directive)
14
14
  throw new Error('Directives are not supported');
15
+ if (!validateChildren) {
16
+ return;
17
+ }
18
+ (0, utils_1.construct)(this.node.expression, this.context).validate(true);
19
+ }
20
+ run() {
21
+ this.validate();
15
22
  return (0, utils_1.construct)(this.node.expression, this.context).run();
16
23
  }
17
24
  }
@@ -0,0 +1,12 @@
1
+ import { AnyNode, ReturnStatement } from 'acorn';
2
+ import type Context from '../../Context';
3
+ import Node from '../Node';
4
+ export declare class ReturnStatementError extends Error {
5
+ readonly value: unknown;
6
+ constructor(value: unknown);
7
+ }
8
+ export default class ReturnStatementNode extends Node<ReturnStatement> {
9
+ constructor(node: AnyNode, context: Context);
10
+ validate(validateChildren?: boolean): void;
11
+ run(): unknown;
12
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ReturnStatementError = void 0;
7
+ const Node_1 = __importDefault(require("../Node"));
8
+ const utils_1 = require("../../utils");
9
+ class ReturnStatementError extends Error {
10
+ constructor(value) {
11
+ super('Illegal return statement');
12
+ this.value = value;
13
+ }
14
+ }
15
+ exports.ReturnStatementError = ReturnStatementError;
16
+ class ReturnStatementNode extends Node_1.default {
17
+ constructor(node, context) {
18
+ super(node, context, 'ReturnStatement');
19
+ }
20
+ validate(validateChildren = false) {
21
+ const arg = this.node.argument;
22
+ if (!validateChildren || arg === undefined || arg === null) {
23
+ return;
24
+ }
25
+ (0, utils_1.construct)(arg, this.context).validate(true);
26
+ }
27
+ run() {
28
+ this.validate();
29
+ const result = this.node.argument ? (0, utils_1.construct)(this.node.argument, this.context).run() : undefined;
30
+ throw new ReturnStatementError(result);
31
+ }
32
+ }
33
+ exports.default = ReturnStatementNode;
@@ -0,0 +1,9 @@
1
+ import { AnyNode, SwitchStatement } from 'acorn';
2
+ import Context from '../../Context';
3
+ import Node from '../Node';
4
+ export default class SwitchStatementNode extends Node<SwitchStatement> {
5
+ constructor(node: AnyNode, context: Context);
6
+ private test_match;
7
+ validate(validateChildren?: boolean): void;
8
+ run(): unknown;
9
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Node_1 = __importDefault(require("../Node"));
7
+ const utils_1 = require("../../utils");
8
+ class SwitchStatementNode extends Node_1.default {
9
+ constructor(node, context) {
10
+ super(node, context, 'SwitchStatement');
11
+ }
12
+ test_match(test, discriminant) {
13
+ if (!test) {
14
+ return true;
15
+ }
16
+ const testValue = (0, utils_1.construct)(test, this.context).run();
17
+ return testValue === discriminant;
18
+ }
19
+ validate(validateChildren = false) {
20
+ if (!validateChildren) {
21
+ return;
22
+ }
23
+ (0, utils_1.construct)(this.node.discriminant, this.context).validate(true);
24
+ for (const c of this.node.cases) {
25
+ if (c.test) {
26
+ (0, utils_1.construct)(c.test, this.context).validate(true);
27
+ }
28
+ for (const s of c.consequent) {
29
+ (0, utils_1.construct)(s, this.context).validate(true);
30
+ }
31
+ }
32
+ }
33
+ run() {
34
+ this.validate();
35
+ const discriminant = (0, utils_1.construct)(this.node.discriminant, this.context).run();
36
+ let result;
37
+ let matched = false;
38
+ for (const c of this.node.cases) {
39
+ if (!matched && this.test_match(c.test, discriminant)) {
40
+ matched = true;
41
+ }
42
+ if (!matched) {
43
+ continue;
44
+ }
45
+ for (const s of c.consequent) {
46
+ result = (0, utils_1.construct)(s, this.context).run();
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ }
52
+ exports.default = SwitchStatementNode;
@@ -0,0 +1,4 @@
1
+ export { default as BlockStatement } from './BlockStatement';
2
+ export { default as ReturnStatement } from './ReturnStatement';
3
+ export { default as ExpressionStatement } from './ExpressionStatement';
4
+ export { default as SwitchStatement } from './SwitchStatement';