@dacely/toildefender 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,177 +1,177 @@
1
- "use strict";
2
-
3
- var assert = require("assert");
4
-
5
- var _ = require("lodash");
6
-
7
- var estest = require("../estest");
8
- var ESUtils = require("../esutils");
9
- var traverser = require("../traverser");
10
- var utils = require("../utils");
11
-
12
- module.exports = class Scopes {
13
-
14
- constructor (logger) {
15
- this.logger = logger;
16
- this.esutils = new ESUtils(logger);
17
- }
18
-
19
- /**
20
- * Moves all variables to scope arrays like
21
- * var a = 1, b = 2;
22
- * to
23
- * var $$scope$abc = [];
24
- * $$scope$abc[0] = 1;
25
- * $$scope$abc[1] = 2;
26
- * @param {Node} ast Root node
27
- * @param {ScopeManager} scopeManager Scope manager
28
- */
29
- createScopeObjects (ast, scopeManager) {
30
- assert.ok(estest.isNode(ast));
31
-
32
- this.esutils.setParentsRecursive(ast);
33
- var scopes = scopeManager.acquireAll(ast);
34
- var rngAlpha = new utils.UniqueRandomAlpha(3);
35
- scopeManager.scopes.forEach(scope => {
36
- var scopeVarName = `$$scope$${rngAlpha.get()}`;
37
-
38
- var counter = 0;
39
- var scopeDecl = {
40
- type: "VariableDeclaration",
41
- kind: "var",
42
- declarations: [
43
- {
44
- type: "VariableDeclarator",
45
- id: { type: "Identifier", name: scopeVarName },
46
- init: { type: "ArrayExpression", elements: [] }
47
- }
48
- ],
49
- veilmark$scopeObject: true
50
- };
51
-
52
- this.esutils.insertIntoScope(scope, scopeDecl);
53
-
54
- scope.variables.forEach(variable => {
55
- var index = counter++;
56
-
57
- variable.defs.forEach(def => {
58
- if (def.type == "Variable") {
59
- assert(def.parent.type == "VariableDeclaration");
60
- def.parent.declarations = def.parent.declarations.filter(x => x != def.node);
61
- var replacement = [];
62
- if (def.node.init) {
63
- replacement.push({
64
- type: "ExpressionStatement",
65
- expression: {
66
- type: "AssignmentExpression",
67
- operator: "=",
68
- left: {
69
- type: "MemberExpression",
70
- object: { type: "Identifier", name: scopeVarName },
71
- property: { type: "Literal", value: index },
72
- computed: true,
73
- veilmark$scopeObjectReference: true
74
- },
75
- right: def.node.init
76
- }
77
- });
78
- }
79
- if (def.parent.declarations.length > 0) {
80
- replacement.push(def.parent);
81
- }
82
- if (replacement.length == 0) {
83
- this.esutils.replaceNode(scope.block, def.parent, { type: "EmptyStatement" });
84
- } else if (replacement.length == 1) {
85
- this.esutils.replaceNode(scope.block, def.parent, replacement[0] );
86
- } else {
87
- this.esutils.replaceNode(scope.block, def.parent, { type: "BlockStatement", body: replacement });
88
- }
89
- variable.references.forEach(reference => {
90
- // References can not be replaced via replaceNodeEx for whatever reason
91
- this.esutils.replaceNode(scope.block, reference.identifier, {
92
- type: "MemberExpression",
93
- object: { type: "Identifier", name: scopeVarName },
94
- property: { type: "Literal", value: index },
95
- computed: true,
96
- veilmark$scopeObjectReference: true
97
- });
98
- });
99
- } else if (def.type == "CatchClause") {
100
- Object.defineProperty(scope.block, "veilmark$exception", {
101
- value: {
102
- type: "MemberExpression",
103
- object: { type: "Identifier", name: scopeVarName },
104
- property: { type: "Literal", value: index },
105
- computed: true,
106
- veilmark$scopeObjectReference: true
107
- },
108
- configurable: true
109
- });
110
- this.esutils.insertIntoScope(scope, {
111
- type: "ExpressionStatement",
112
- expression: {
113
- type: "AssignmentExpression",
114
- operator: "=",
115
- left: {
116
- type: "MemberExpression",
117
- object: { type: "Identifier", name: scopeVarName },
118
- property: { type: "Literal", value: index },
119
- computed: true,
120
- veilmark$scopeObjectReference: true
121
- },
122
- right: def.name
123
- }
124
- }, 1);
125
- variable.references.forEach(reference => {
126
- this.esutils.replaceNode(scope.block, reference.identifier, {
127
- type: "MemberExpression",
128
- object: { type: "Identifier", name: scopeVarName },
129
- property: { type: "Literal", value: index },
130
- computed: true,
131
- veilmark$scopeObjectReference: true
132
- });
133
- });
134
- } else if (def.type == "FunctionName") {
135
- variable.references.forEach(reference => {
136
- this.esutils.replaceNode(scope.block, reference.identifier, {
137
- type: "CallExpression",
138
- callee: { type: "Identifier", name: "veilmark$bind" },
139
- arguments: [
140
- reference.identifier,
141
- { type: "Identifier", name: scopeVarName }
142
- ]
143
- });
144
- });
145
- }
146
- });
147
- });
148
-
149
- traverser.traverse(scope.block, [], (node, stack) => {
150
- if (scope.block == node) {
151
- return node;
152
- }
153
-
154
- if (node.type.indexOf("Function") == 0) {
155
- node.params.unshift({
156
- type: "Identifier",
157
- name: scopeVarName
158
- });
159
- }
160
-
161
- if (node.type == "FunctionExpression") {
162
- return {
163
- type: "CallExpression",
164
- callee: { type: "Identifier", name: "veilmark$bind" },
165
- arguments: [
166
- node,
167
- { type: "Identifier", name: scopeVarName }
168
- ]
169
- };
170
- }
171
-
172
- return node;
173
- });
174
- });
175
- }
176
-
177
- };
1
+ "use strict";
2
+
3
+ var assert = require("assert");
4
+
5
+ var _ = require("lodash");
6
+
7
+ var estest = require("../estest");
8
+ var ESUtils = require("../esutils");
9
+ var traverser = require("../traverser");
10
+ var utils = require("../utils");
11
+
12
+ module.exports = class Scopes {
13
+
14
+ constructor (logger) {
15
+ this.logger = logger;
16
+ this.esutils = new ESUtils(logger);
17
+ }
18
+
19
+ /**
20
+ * Moves all variables to scope arrays like
21
+ * var a = 1, b = 2;
22
+ * to
23
+ * var $$scope$abc = [];
24
+ * $$scope$abc[0] = 1;
25
+ * $$scope$abc[1] = 2;
26
+ * @param {Node} ast Root node
27
+ * @param {ScopeManager} scopeManager Scope manager
28
+ */
29
+ createScopeObjects (ast, scopeManager) {
30
+ assert.ok(estest.isNode(ast));
31
+
32
+ this.esutils.setParentsRecursive(ast);
33
+ var scopes = scopeManager.acquireAll(ast);
34
+ var rngAlpha = new utils.UniqueRandomAlpha(3);
35
+ scopeManager.scopes.forEach(scope => {
36
+ var scopeVarName = `$$scope$${rngAlpha.get()}`;
37
+
38
+ var counter = 0;
39
+ var scopeDecl = {
40
+ type: "VariableDeclaration",
41
+ kind: "var",
42
+ declarations: [
43
+ {
44
+ type: "VariableDeclarator",
45
+ id: { type: "Identifier", name: scopeVarName },
46
+ init: { type: "ArrayExpression", elements: [] }
47
+ }
48
+ ],
49
+ veilmark$scopeObject: true
50
+ };
51
+
52
+ this.esutils.insertIntoScope(scope, scopeDecl);
53
+
54
+ scope.variables.forEach(variable => {
55
+ var index = counter++;
56
+
57
+ variable.defs.forEach(def => {
58
+ if (def.type == "Variable") {
59
+ assert(def.parent.type == "VariableDeclaration");
60
+ def.parent.declarations = def.parent.declarations.filter(x => x != def.node);
61
+ var replacement = [];
62
+ if (def.node.init) {
63
+ replacement.push({
64
+ type: "ExpressionStatement",
65
+ expression: {
66
+ type: "AssignmentExpression",
67
+ operator: "=",
68
+ left: {
69
+ type: "MemberExpression",
70
+ object: { type: "Identifier", name: scopeVarName },
71
+ property: { type: "Literal", value: index },
72
+ computed: true,
73
+ veilmark$scopeObjectReference: true
74
+ },
75
+ right: def.node.init
76
+ }
77
+ });
78
+ }
79
+ if (def.parent.declarations.length > 0) {
80
+ replacement.push(def.parent);
81
+ }
82
+ if (replacement.length == 0) {
83
+ this.esutils.replaceNode(scope.block, def.parent, { type: "EmptyStatement" });
84
+ } else if (replacement.length == 1) {
85
+ this.esutils.replaceNode(scope.block, def.parent, replacement[0] );
86
+ } else {
87
+ this.esutils.replaceNode(scope.block, def.parent, { type: "BlockStatement", body: replacement });
88
+ }
89
+ variable.references.forEach(reference => {
90
+ // References can not be replaced via replaceNodeEx for whatever reason
91
+ this.esutils.replaceNode(scope.block, reference.identifier, {
92
+ type: "MemberExpression",
93
+ object: { type: "Identifier", name: scopeVarName },
94
+ property: { type: "Literal", value: index },
95
+ computed: true,
96
+ veilmark$scopeObjectReference: true
97
+ });
98
+ });
99
+ } else if (def.type == "CatchClause") {
100
+ Object.defineProperty(scope.block, "veilmark$exception", {
101
+ value: {
102
+ type: "MemberExpression",
103
+ object: { type: "Identifier", name: scopeVarName },
104
+ property: { type: "Literal", value: index },
105
+ computed: true,
106
+ veilmark$scopeObjectReference: true
107
+ },
108
+ configurable: true
109
+ });
110
+ this.esutils.insertIntoScope(scope, {
111
+ type: "ExpressionStatement",
112
+ expression: {
113
+ type: "AssignmentExpression",
114
+ operator: "=",
115
+ left: {
116
+ type: "MemberExpression",
117
+ object: { type: "Identifier", name: scopeVarName },
118
+ property: { type: "Literal", value: index },
119
+ computed: true,
120
+ veilmark$scopeObjectReference: true
121
+ },
122
+ right: def.name
123
+ }
124
+ }, 1);
125
+ variable.references.forEach(reference => {
126
+ this.esutils.replaceNode(scope.block, reference.identifier, {
127
+ type: "MemberExpression",
128
+ object: { type: "Identifier", name: scopeVarName },
129
+ property: { type: "Literal", value: index },
130
+ computed: true,
131
+ veilmark$scopeObjectReference: true
132
+ });
133
+ });
134
+ } else if (def.type == "FunctionName") {
135
+ variable.references.forEach(reference => {
136
+ this.esutils.replaceNode(scope.block, reference.identifier, {
137
+ type: "CallExpression",
138
+ callee: { type: "Identifier", name: "veilmark$bind" },
139
+ arguments: [
140
+ reference.identifier,
141
+ { type: "Identifier", name: scopeVarName }
142
+ ]
143
+ });
144
+ });
145
+ }
146
+ });
147
+ });
148
+
149
+ traverser.traverse(scope.block, [], (node, stack) => {
150
+ if (scope.block == node) {
151
+ return node;
152
+ }
153
+
154
+ if (node.type.indexOf("Function") == 0) {
155
+ node.params.unshift({
156
+ type: "Identifier",
157
+ name: scopeVarName
158
+ });
159
+ }
160
+
161
+ if (node.type == "FunctionExpression") {
162
+ return {
163
+ type: "CallExpression",
164
+ callee: { type: "Identifier", name: "veilmark$bind" },
165
+ arguments: [
166
+ node,
167
+ { type: "Identifier", name: scopeVarName }
168
+ ]
169
+ };
170
+ }
171
+
172
+ return node;
173
+ });
174
+ });
175
+ }
176
+
177
+ };
@@ -1,26 +1,26 @@
1
- "use strict";
2
-
3
- var assert = require("assert");
4
-
5
- var esshorten = require("esshorten");
6
-
7
- var estest = require("../estest");
8
-
9
- module.exports = class Uglifier {
10
-
11
- constructor (logger) {
12
- this.logger = logger;
13
- }
14
-
15
- /**
16
- * Uglifies tree.
17
- * @param {Node} ast Root node
18
- * @returns {Node} Root node
19
- */
20
- uglify (ast) {
21
- assert.ok(estest.isNode(ast));
22
-
23
- return esshorten.mangle(ast);
24
- }
25
-
1
+ "use strict";
2
+
3
+ var assert = require("assert");
4
+
5
+ var esshorten = require("esshorten");
6
+
7
+ var estest = require("../estest");
8
+
9
+ module.exports = class Uglifier {
10
+
11
+ constructor (logger) {
12
+ this.logger = logger;
13
+ }
14
+
15
+ /**
16
+ * Uglifies tree.
17
+ * @param {Node} ast Root node
18
+ * @returns {Node} Root node
19
+ */
20
+ uglify (ast) {
21
+ assert.ok(estest.isNode(ast));
22
+
23
+ return esshorten.mangle(ast);
24
+ }
25
+
26
26
  };