hackmud-script-manager 0.19.1-27bbd7d → 0.19.1-3712be4

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.
@@ -20,406 +20,294 @@ const { default: traverse } = babelTraverse,
20
20
  "String",
21
21
  "Symbol",
22
22
  "BigInt"
23
- ],
24
- transform = (
25
- file,
26
- sourceCode,
27
- { uniqueID = "00000000000", scriptUser = "UNKNOWN", scriptName = "UNKNOWN", seclevel = 4 } = {}
28
- ) => {
29
- const topFunctionName = `_${uniqueID}_SCRIPT_`,
30
- exports = new Map(),
31
- liveExports = new Map()
32
- let program
33
- traverse(file, {
34
- Program(path) {
35
- program = path
36
- path.skip()
37
- }
38
- })
39
- if (program.scope.hasGlobal("_SOURCE"))
40
- for (const referencePath of getReferencePathsToGlobal("_SOURCE", program))
41
- referencePath.replaceWith(t.stringLiteral(sourceCode))
42
- if (program.scope.hasGlobal("_BUILD_DATE"))
43
- for (const referencePath of getReferencePathsToGlobal("_BUILD_DATE", program))
44
- referencePath.replaceWith(t.numericLiteral(Date.now()))
45
- if (program.scope.hasGlobal("_SCRIPT_USER"))
46
- for (const referencePath of getReferencePathsToGlobal("_SCRIPT_USER", program))
47
- 1 == scriptUser ?
48
- referencePath.replaceWith(t.stringLiteral(`$${uniqueID}$SCRIPT_USER$`))
49
- : referencePath.replaceWith(t.stringLiteral(scriptUser))
50
- if (program.scope.hasGlobal("_SCRIPT_NAME"))
51
- for (const referencePath of getReferencePathsToGlobal("_SCRIPT_NAME", program))
52
- 1 == scriptName ?
53
- referencePath.replaceWith(t.stringLiteral(`$${uniqueID}$SCRIPT_NAME$`))
54
- : referencePath.replaceWith(t.stringLiteral(scriptName))
55
- if (program.scope.hasGlobal("_FULL_SCRIPT_NAME"))
56
- for (const referencePath of getReferencePathsToGlobal("_FULL_SCRIPT_NAME", program))
57
- 1 == scriptUser || 1 == scriptName ?
58
- referencePath.replaceWith(t.stringLiteral(`$${uniqueID}$FULL_SCRIPT_NAME$`))
59
- : referencePath.replaceWith(t.stringLiteral(`${scriptUser}.${scriptName}`))
60
- let functionDotPrototypeIsReferencedMultipleTimes = !1
61
- const createGetFunctionPrototypeNode = () => {
62
- for (const globalFunction of globalFunctionsUnder7Characters)
63
- if (!program.scope.hasOwnBinding(globalFunction))
64
- return t.memberExpression(
65
- t.memberExpression(t.identifier(globalFunction), t.identifier("constructor")),
66
- t.identifier("prototype")
67
- )
68
- return t.memberExpression(
69
- t.memberExpression(
70
- t.arrowFunctionExpression([t.identifier("_")], t.identifier("_")),
71
- t.identifier("constructor")
72
- ),
73
- t.identifier("prototype")
74
- )
23
+ ]
24
+ function transform(
25
+ file,
26
+ sourceCode,
27
+ { uniqueID = "00000000000", scriptUser = "UNKNOWN", scriptName = "UNKNOWN", seclevel = 4 } = {}
28
+ ) {
29
+ const topFunctionName = `_${uniqueID}_SCRIPT_`,
30
+ exports = new Map(),
31
+ liveExports = new Map()
32
+ let program
33
+ traverse(file, {
34
+ Program(path) {
35
+ program = path
36
+ path.skip()
75
37
  }
76
- if (program.scope.hasGlobal("Function")) {
77
- const FunctionReferencePaths = getReferencePathsToGlobal("Function", program)
78
- if (1 == FunctionReferencePaths.length) {
79
- const referencePath = FunctionReferencePaths[0]
38
+ })
39
+ if (program.scope.hasGlobal("_SOURCE"))
40
+ for (const referencePath of getReferencePathsToGlobal("_SOURCE", program))
41
+ referencePath.replaceWith(t.stringLiteral(sourceCode))
42
+ if (program.scope.hasGlobal("_BUILD_DATE"))
43
+ for (const referencePath of getReferencePathsToGlobal("_BUILD_DATE", program))
44
+ referencePath.replaceWith(t.numericLiteral(Date.now()))
45
+ if (program.scope.hasGlobal("_SCRIPT_USER"))
46
+ for (const referencePath of getReferencePathsToGlobal("_SCRIPT_USER", program))
47
+ referencePath.replaceWith(t.stringLiteral(1 == scriptUser ? `$${uniqueID}$SCRIPT_USER$` : scriptUser))
48
+ if (program.scope.hasGlobal("_SCRIPT_NAME"))
49
+ for (const referencePath of getReferencePathsToGlobal("_SCRIPT_NAME", program))
50
+ referencePath.replaceWith(t.stringLiteral(1 == scriptName ? `$${uniqueID}$SCRIPT_NAME$` : scriptName))
51
+ if (program.scope.hasGlobal("_FULL_SCRIPT_NAME"))
52
+ for (const referencePath of getReferencePathsToGlobal("_FULL_SCRIPT_NAME", program))
53
+ referencePath.replaceWith(
54
+ t.stringLiteral(
55
+ 1 == scriptUser || 1 == scriptName ?
56
+ `$${uniqueID}$FULL_SCRIPT_NAME$`
57
+ : `${scriptUser}.${scriptName}`
58
+ )
59
+ )
60
+ let functionDotPrototypeIsReferencedMultipleTimes = !1
61
+ if (program.scope.hasGlobal("Function")) {
62
+ const FunctionReferencePaths = getReferencePathsToGlobal("Function", program)
63
+ if (1 == FunctionReferencePaths.length) {
64
+ const referencePath = FunctionReferencePaths[0]
65
+ assert(
66
+ "MemberExpression" == referencePath.parent.type,
67
+ "src/processScript/transform.ts:89:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
68
+ )
69
+ assert(
70
+ "Identifier" == referencePath.parent.property.type,
71
+ "src/processScript/transform.ts:94:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
72
+ )
73
+ assert(
74
+ "prototype" == referencePath.parent.property.name,
75
+ "src/processScript/transform.ts:99:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
76
+ )
77
+ referencePath.parentPath.replaceWith(createGetFunctionPrototypeNode())
78
+ } else {
79
+ for (const referencePath of FunctionReferencePaths) {
80
80
  assert(
81
81
  "MemberExpression" == referencePath.parent.type,
82
- "`Function` isn't available in hackmud, only `Function.prototype` is accessible"
82
+ "src/processScript/transform.ts:107:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
83
83
  )
84
84
  assert(
85
85
  "Identifier" == referencePath.parent.property.type,
86
- "`Function` isn't available in hackmud, only `Function.prototype` is accessible"
86
+ "src/processScript/transform.ts:112:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
87
87
  )
88
88
  assert(
89
89
  "prototype" == referencePath.parent.property.name,
90
- "`Function` isn't available in hackmud, only `Function.prototype` is accessible"
90
+ "src/processScript/transform.ts:117:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
91
91
  )
92
- referencePath.parentPath.replaceWith(createGetFunctionPrototypeNode())
93
- } else {
94
- for (const referencePath of FunctionReferencePaths) {
95
- assert(
96
- "MemberExpression" == referencePath.parent.type,
97
- "`Function` isn't available in hackmud, only `Function.prototype` is accessible"
98
- )
99
- assert(
100
- "Identifier" == referencePath.parent.property.type,
101
- "`Function` isn't available in hackmud, only `Function.prototype` is accessible"
102
- )
103
- assert(
104
- "prototype" == referencePath.parent.property.name,
105
- "`Function` isn't available in hackmud, only `Function.prototype` is accessible"
106
- )
107
- functionDotPrototypeIsReferencedMultipleTimes = !0
108
- referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_FUNCTION_DOT_PROTOTYPE_`))
109
- }
110
92
  functionDotPrototypeIsReferencedMultipleTimes = !0
93
+ referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_FUNCTION_DOT_PROTOTYPE_`))
111
94
  }
95
+ functionDotPrototypeIsReferencedMultipleTimes = !0
112
96
  }
113
- let detectedSeclevel = 4
114
- const processFakeSubscriptObject = fakeSubscriptObjectName => {
115
- for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
116
- assert("MemberExpression" == referencePath.parent.type)
117
- assert("Identifier" == referencePath.parent.property.type)
118
- assert("MemberExpression" == referencePath.parentPath.parentPath?.node.type)
119
- assert("Identifier" == referencePath.parentPath.parentPath.node.property.type)
120
- assert(
121
- /^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
122
- `invalid user "${referencePath.parent.property.name}" in subscript`
123
- )
124
- assert(
125
- /^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
126
- `invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
97
+ }
98
+ const neededSubscriptLets = new Set()
99
+ let detectedSeclevel = 4
100
+ for (const fakeSubscriptObjectName of ["$fs", "$4s", "$s"])
101
+ program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName)
102
+ for (const fakeSubscriptObjectName of ["$hs", "$3s"])
103
+ if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
104
+ detectedSeclevel = 3
105
+ processFakeSubscriptObject(fakeSubscriptObjectName)
106
+ }
107
+ for (const fakeSubscriptObjectName of ["$ms", "$2s"])
108
+ if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
109
+ detectedSeclevel = 2
110
+ processFakeSubscriptObject(fakeSubscriptObjectName)
111
+ }
112
+ for (const fakeSubscriptObjectName of ["$ls", "$1s"])
113
+ if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
114
+ detectedSeclevel = 1
115
+ processFakeSubscriptObject(fakeSubscriptObjectName)
116
+ }
117
+ for (const fakeSubscriptObjectName of ["$ns", "$0s"])
118
+ if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
119
+ detectedSeclevel = 0
120
+ processFakeSubscriptObject(fakeSubscriptObjectName)
121
+ }
122
+ seclevel = Math.min(seclevel, detectedSeclevel)
123
+ const neededDbMethodLets = new Set()
124
+ if (program.scope.hasGlobal("$db"))
125
+ for (const referencePath of getReferencePathsToGlobal("$db", program)) {
126
+ assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:171:69")
127
+ assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:172:72")
128
+ const databaseOpMethodName = referencePath.parentPath.node.property.name
129
+ assert(
130
+ validDBMethods.includes(databaseOpMethodName),
131
+ `src/processScript/transform.ts:178:8 invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
132
+ )
133
+ if ("CallExpression" == referencePath.parentPath.parentPath?.type)
134
+ referencePath.parentPath.replaceWith(t.identifier(`$${uniqueID}$DB$${databaseOpMethodName}$`))
135
+ else {
136
+ referencePath.parentPath.replaceWith(
137
+ t.identifier(`_${uniqueID}_CONSOLE_METHOD_${databaseOpMethodName}_`)
127
138
  )
128
- "CallExpression" == referencePath.parentPath.parentPath.parentPath?.type ?
129
- referencePath.parentPath.parentPath.replaceWith(
130
- t.identifier(
131
- `$${uniqueID}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
132
- )
133
- )
134
- : referencePath.parentPath.parentPath.replaceWith(
135
- t.arrowFunctionExpression(
136
- [t.restElement(t.identifier("args"))],
137
- t.callExpression(
138
- t.identifier(
139
- `$${uniqueID}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
140
- ),
141
- [t.spreadElement(t.identifier("args"))]
142
- )
143
- )
144
- )
139
+ neededDbMethodLets.add(databaseOpMethodName)
145
140
  }
146
141
  }
147
- for (const fakeSubscriptObjectName of ["$fs", "$4s", "$s"])
148
- program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName)
149
- for (const fakeSubscriptObjectName of ["$hs", "$3s"])
150
- if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
151
- detectedSeclevel = 3
152
- processFakeSubscriptObject(fakeSubscriptObjectName)
153
- }
154
- for (const fakeSubscriptObjectName of ["$ms", "$2s"])
155
- if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
156
- detectedSeclevel = 2
157
- processFakeSubscriptObject(fakeSubscriptObjectName)
158
- }
159
- for (const fakeSubscriptObjectName of ["$ls", "$1s"])
160
- if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
161
- detectedSeclevel = 1
162
- processFakeSubscriptObject(fakeSubscriptObjectName)
142
+ let needDebugLet = !1
143
+ if (program.scope.hasGlobal("$D"))
144
+ for (const referencePath of getReferencePathsToGlobal("$D", program))
145
+ if ("CallExpression" == referencePath.parentPath.type)
146
+ referencePath.replaceWith(t.identifier(`$${uniqueID}$DEBUG$`))
147
+ else {
148
+ referencePath.replaceWith(t.identifier(`_${uniqueID}_DEBUG_`))
149
+ needDebugLet = !0
163
150
  }
164
- for (const fakeSubscriptObjectName of ["$ns", "$0s"])
165
- if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
166
- detectedSeclevel = 0
167
- processFakeSubscriptObject(fakeSubscriptObjectName)
151
+ if (program.scope.hasGlobal("$FMCL"))
152
+ for (const referencePath of getReferencePathsToGlobal("$FMCL", program))
153
+ referencePath.replaceWith(t.identifier(`$${uniqueID}$FMCL$`))
154
+ if (program.scope.hasGlobal("$G"))
155
+ for (const referencePath of getReferencePathsToGlobal("$G", program))
156
+ referencePath.replaceWith(t.identifier(`$${uniqueID}$GLOBAL$`))
157
+ if (program.scope.hasGlobal("_SECLEVEL"))
158
+ for (const referencePath of getReferencePathsToGlobal("_SECLEVEL", program))
159
+ referencePath.replaceWith(t.numericLiteral(seclevel))
160
+ let needGetPrototypeOf = !1
161
+ if (program.scope.hasGlobal("Object"))
162
+ for (const referencePath of getReferencePathsToGlobal("Object", program))
163
+ if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
164
+ assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:225:64")
165
+ if ("getPrototypeOf" == referencePath.parent.property.name) {
166
+ referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_GET_PROTOTYPE_OF_`))
167
+ needGetPrototypeOf = !0
168
+ }
168
169
  }
169
- seclevel = Math.min(seclevel, detectedSeclevel)
170
- if (program.scope.hasGlobal("$db"))
171
- for (const referencePath of getReferencePathsToGlobal("$db", program)) {
172
- assert("MemberExpression" == referencePath.parentPath.node.type)
173
- assert("Identifier" == referencePath.parentPath.node.property.type)
174
- const databaseOpMethodName = referencePath.parentPath.node.property.name
175
- assert(
176
- validDBMethods.includes(databaseOpMethodName),
177
- `invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
170
+ const consoleMethodsReferenced = new Set()
171
+ if (program.scope.hasGlobal("console"))
172
+ for (const referencePath of getReferencePathsToGlobal("console", program))
173
+ if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
174
+ assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:240:64")
175
+ referencePath.parentPath.replaceWith(
176
+ t.identifier(`_${uniqueID}_CONSOLE_METHOD_${referencePath.parent.property.name}_`)
178
177
  )
179
- "CallExpression" == referencePath.parentPath.parentPath?.type ?
180
- referencePath.parentPath.replaceWith(t.identifier(`$${uniqueID}$DB$${databaseOpMethodName}$`))
181
- : "ObjectId" == databaseOpMethodName ?
182
- referencePath.parentPath.replaceWith(
183
- t.arrowFunctionExpression(
184
- [],
185
- t.callExpression(t.identifier(`$${uniqueID}$DB$${databaseOpMethodName}$`), [])
186
- )
187
- )
188
- : "i" == databaseOpMethodName || "r" == databaseOpMethodName ?
189
- referencePath.parentPath.replaceWith(
190
- t.arrowFunctionExpression(
191
- [t.identifier("a")],
192
- t.callExpression(t.identifier(`$${uniqueID}$DB$${databaseOpMethodName}$`), [
193
- t.identifier("a")
194
- ])
195
- )
196
- )
197
- : referencePath.parentPath.replaceWith(
198
- t.arrowFunctionExpression(
199
- [t.identifier("a"), t.identifier("b")],
200
- t.callExpression(t.identifier(`$${uniqueID}$DB$${databaseOpMethodName}$`), [
201
- t.identifier("a"),
202
- t.identifier("b")
203
- ])
204
- )
205
- )
206
- }
207
- if (program.scope.hasGlobal("$D"))
208
- for (const referencePath of getReferencePathsToGlobal("$D", program))
209
- "CallExpression" == referencePath.parentPath.type ?
210
- referencePath.replaceWith(t.identifier(`$${uniqueID}$DEBUG$`))
211
- : referencePath.replaceWith(
212
- t.arrowFunctionExpression(
213
- [t.identifier("a")],
214
- t.callExpression(t.identifier(`$${uniqueID}$DEBUG$`), [t.identifier("a")])
215
- )
216
- )
217
- if (program.scope.hasGlobal("$FMCL"))
218
- for (const referencePath of getReferencePathsToGlobal("$FMCL", program))
219
- referencePath.replaceWith(t.identifier(`$${uniqueID}$FMCL$`))
220
- if (program.scope.hasGlobal("$G"))
221
- for (const referencePath of getReferencePathsToGlobal("$G", program))
222
- referencePath.replaceWith(t.identifier(`$${uniqueID}$GLOBAL$`))
223
- if (program.scope.hasGlobal("_SECLEVEL"))
224
- for (const referencePath of getReferencePathsToGlobal("_SECLEVEL", program))
225
- referencePath.replaceWith(t.numericLiteral(seclevel))
226
- let needGetPrototypeOf = !1,
227
- needSetPrototypeOf = !1
228
- if (program.scope.hasGlobal("Object"))
229
- for (const referencePath of getReferencePathsToGlobal("Object", program))
230
- if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
231
- assert("Identifier" == referencePath.parent.property.type)
232
- if ("getPrototypeOf" == referencePath.parent.property.name) {
233
- referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_GET_PROTOTYPE_OF_`))
234
- needGetPrototypeOf = !0
235
- } else if ("setPrototypeOf" == referencePath.parent.property.name) {
236
- referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_SET_PROTOTYPE_OF_`))
237
- needSetPrototypeOf = !0
238
- }
239
- }
240
- const lastStatement = program.node.body.at(-1)
241
- let exportDefaultName
242
- assert(lastStatement, "program is empty")
243
- if ("ExportNamedDeclaration" == lastStatement.type) {
244
- program.node.body.pop()
245
- for (const specifier of lastStatement.specifiers) {
246
- assert("ExportSpecifier" == specifier.type, specifier.type + " is currently unsupported")
247
- const exportedName =
248
- "Identifier" == specifier.exported.type ? specifier.exported.name : specifier.exported.value
249
- "default" == exportedName ?
250
- (exportDefaultName = specifier.local.name)
251
- : exports.set(specifier.local.name, exportedName)
178
+ consoleMethodsReferenced.add(referencePath.parent.property.name)
252
179
  }
180
+ const lastStatement = program.node.body.at(-1)
181
+ let exportDefaultName
182
+ assert(lastStatement, "src/processScript/transform.ts:254:27 program is empty")
183
+ if ("ExportNamedDeclaration" == lastStatement.type) {
184
+ program.node.body.pop()
185
+ for (const specifier of lastStatement.specifiers) {
186
+ assert(
187
+ "ExportSpecifier" == specifier.type,
188
+ `src/processScript/transform.ts:260:51 ${specifier.type} is currently unsupported`
189
+ )
190
+ const exportedName =
191
+ "Identifier" == specifier.exported.type ? specifier.exported.name : specifier.exported.value
192
+ "default" == exportedName ?
193
+ (exportDefaultName = specifier.local.name)
194
+ : exports.set(specifier.local.name, exportedName)
253
195
  }
254
- const globalBlock = t.blockStatement([])
255
- let mainFunction
256
- for (const statement of program.node.body)
257
- if ("VariableDeclaration" == statement.type)
258
- for (const declarator of statement.declarations)
259
- if (
260
- "Identifier" != declarator.id.type ||
261
- declarator.id.name != exportDefaultName ||
262
- !declarator.init ||
263
- ("FunctionExpression" != declarator.init.type &&
264
- "ArrowFunctionExpression" != declarator.init.type) ||
265
- declarator.init.async ||
266
- declarator.init.generator
267
- ) {
268
- for (const identifierName in t.getBindingIdentifiers(declarator.id)) {
269
- identifierName == exportDefaultName &&
270
- (mainFunction = t.functionDeclaration(
271
- t.identifier(topFunctionName),
272
- [t.identifier("context"), t.identifier("args")],
273
- t.blockStatement([
274
- t.returnStatement(t.callExpression(t.identifier(exportDefaultName), []))
275
- ])
276
- ))
277
- if ("const" != statement.kind && exports.has(identifierName)) {
278
- liveExports.set(identifierName, exports.get(identifierName))
279
- exports.delete(identifierName)
280
- }
281
- globalBlock.body.push(
282
- t.variableDeclaration("let", [t.variableDeclarator(t.identifier(identifierName))])
283
- )
196
+ }
197
+ const globalBlock = t.blockStatement([])
198
+ let mainFunction
199
+ for (const statement of program.node.body)
200
+ if ("VariableDeclaration" == statement.type)
201
+ for (const declarator of statement.declarations)
202
+ if (
203
+ "Identifier" != declarator.id.type ||
204
+ declarator.id.name != exportDefaultName ||
205
+ !declarator.init ||
206
+ ("FunctionExpression" != declarator.init.type &&
207
+ "ArrowFunctionExpression" != declarator.init.type) ||
208
+ declarator.init.async ||
209
+ declarator.init.generator
210
+ ) {
211
+ for (const identifierName in t.getBindingIdentifiers(declarator.id)) {
212
+ identifierName == exportDefaultName &&
213
+ (mainFunction = t.functionDeclaration(
214
+ t.identifier(topFunctionName),
215
+ [t.identifier("context"), t.identifier("args")],
216
+ t.blockStatement([
217
+ t.returnStatement(t.callExpression(t.identifier(exportDefaultName), []))
218
+ ])
219
+ ))
220
+ if ("const" != statement.kind && exports.has(identifierName)) {
221
+ liveExports.set(identifierName, exports.get(identifierName))
222
+ exports.delete(identifierName)
284
223
  }
285
- declarator.init &&
286
- globalBlock.body.push(
287
- t.expressionStatement(t.assignmentExpression("=", declarator.id, declarator.init))
288
- )
289
- } else
290
- mainFunction = t.functionDeclaration(
291
- t.identifier(topFunctionName),
292
- declarator.init.params,
293
- "BlockStatement" == declarator.init.body.type ?
294
- declarator.init.body
295
- : t.blockStatement([t.returnStatement(declarator.init.body)])
224
+ globalBlock.body.push(
225
+ t.variableDeclaration("let", [t.variableDeclarator(t.identifier(identifierName))])
296
226
  )
297
- else
298
- "FunctionDeclaration" == statement.type ?
299
- statement.id.name == exportDefaultName ?
300
- (mainFunction = statement)
301
- : globalBlock.body.push(
302
- t.variableDeclaration("let", [
303
- t.variableDeclarator(
304
- statement.id,
305
- t.functionExpression(
306
- void 0,
307
- statement.params,
308
- statement.body,
309
- statement.generator,
310
- statement.async
311
- )
312
- )
313
- ])
227
+ }
228
+ declarator.init &&
229
+ globalBlock.body.push(
230
+ t.expressionStatement(t.assignmentExpression("=", declarator.id, declarator.init))
314
231
  )
315
- : globalBlock.body.push(statement)
316
- mainFunction ||= t.functionDeclaration(
317
- t.identifier(topFunctionName),
318
- [t.identifier("context"), t.identifier("args")],
319
- t.blockStatement([])
320
- )
321
- program.node.body = [mainFunction]
322
- if (globalBlock.body.length) {
323
- ;(exports.size || liveExports.size) &&
324
- mainFunction.body.body.push(
325
- t.returnStatement(
326
- t.objectExpression([
327
- ...[...exports].map(([local, exported]) =>
328
- t.objectProperty(t.identifier(exported), t.identifier(local))
329
- ),
330
- ...[...liveExports].map(([local, exported]) =>
331
- t.objectMethod(
332
- "get",
333
- t.identifier(exported),
334
- [],
335
- t.blockStatement([t.returnStatement(t.identifier(local))])
232
+ } else
233
+ mainFunction = t.functionDeclaration(
234
+ t.identifier(topFunctionName),
235
+ declarator.init.params,
236
+ "BlockStatement" == declarator.init.body.type ?
237
+ declarator.init.body
238
+ : t.blockStatement([t.returnStatement(declarator.init.body)])
239
+ )
240
+ else
241
+ "FunctionDeclaration" == statement.type ?
242
+ statement.id.name == exportDefaultName ?
243
+ (mainFunction = statement)
244
+ : globalBlock.body.push(
245
+ t.variableDeclaration("let", [
246
+ t.variableDeclarator(
247
+ statement.id,
248
+ t.functionExpression(
249
+ void 0,
250
+ statement.params,
251
+ statement.body,
252
+ statement.generator,
253
+ statement.async
336
254
  )
337
255
  )
338
256
  ])
339
257
  )
258
+ : globalBlock.body.push(statement)
259
+ mainFunction ||= t.functionDeclaration(
260
+ t.identifier(topFunctionName),
261
+ [t.identifier("context"), t.identifier("args")],
262
+ t.blockStatement([])
263
+ )
264
+ program.node.body = [mainFunction]
265
+ if (globalBlock.body.length) {
266
+ ;(exports.size || liveExports.size) &&
267
+ mainFunction.body.body.push(
268
+ t.returnStatement(
269
+ t.objectExpression([
270
+ ...[...exports].map(([local, exported]) =>
271
+ t.objectProperty(t.identifier(exported), t.identifier(local))
272
+ ),
273
+ ...[...liveExports].map(([local, exported]) =>
274
+ t.objectMethod(
275
+ "get",
276
+ t.identifier(exported),
277
+ [],
278
+ t.blockStatement([t.returnStatement(t.identifier(local))])
279
+ )
280
+ )
281
+ ])
340
282
  )
341
- program.scope.crawl()
342
- const globalBlockVariables = new Set()
343
- let hoistedGlobalBlockFunctions = 0
344
- for (const [globalBlockIndex, globalBlockStatement] of [...globalBlock.body.entries()].reverse())
345
- if ("VariableDeclaration" == globalBlockStatement.type) {
346
- assert(1 == globalBlockStatement.declarations.length)
347
- const declarator = globalBlockStatement.declarations[0]
348
- assert("Identifier" == declarator.id.type, `declarator.id.type was "${declarator.id.type}"`)
349
- program.scope.crawl()
350
- if (program.scope.hasGlobal(declarator.id.name)) {
351
- globalBlock.body.splice(globalBlockIndex, 1)
352
- const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
353
- [globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
354
- program.scope.crawl()
355
- if (
356
- !declarator.init ||
357
- ("FunctionExpression" != declarator.init.type &&
358
- "ArrowFunctionExpression" != declarator.init.type) ||
359
- Object.keys(program.scope.globals).some(global => globalBlockVariables.has(global))
360
- ) {
361
- const binding = program.scope.getBinding(declarator.id.name)
362
- assert(binding)
363
- for (const referencePath of binding.referencePaths) {
364
- assert("Identifier" == referencePath.node.type)
365
- referencePath.replaceWith(
366
- t.memberExpression(
367
- t.identifier(`$${uniqueID}$GLOBAL$`),
368
- t.identifier(referencePath.node.name)
369
- )
370
- )
371
- }
372
- for (const referencePath of binding.constantViolations)
373
- if ("AssignmentExpression" == referencePath.node.type)
374
- for (const [name, node] of Object.entries(
375
- t.getBindingIdentifiers(referencePath.node)
376
- ))
377
- if (name == declarator.id.name) {
378
- clearObject(node)
379
- Object.assign(
380
- node,
381
- t.memberExpression(
382
- t.identifier(`$${uniqueID}$GLOBAL$`),
383
- t.identifier(name)
384
- )
385
- )
386
- }
387
- globalBlockPath.remove()
388
- globalBlockStatementPath.remove()
389
- declarator.init &&
390
- globalBlock.body.splice(
391
- globalBlockIndex,
392
- 0,
393
- t.expressionStatement(
394
- t.assignmentExpression(
395
- "=",
396
- t.memberExpression(
397
- t.identifier(`$${uniqueID}$GLOBAL$`),
398
- t.identifier(declarator.id.name)
399
- ),
400
- declarator.init
401
- )
402
- )
403
- )
404
- } else {
405
- globalBlockPath.remove()
406
- globalBlockStatementPath.remove()
407
- mainFunction.body.body.unshift(globalBlockStatement)
408
- hoistedGlobalBlockFunctions++
409
- }
410
- } else globalBlockVariables.add(declarator.id.name)
411
- } else if ("ClassDeclaration" == globalBlockStatement.type) {
283
+ )
284
+ program.scope.crawl()
285
+ const globalBlockVariables = new Set()
286
+ let hoistedGlobalBlockFunctions = 0
287
+ for (const [globalBlockIndex, globalBlockStatement] of [...globalBlock.body.entries()].reverse())
288
+ if ("VariableDeclaration" == globalBlockStatement.type) {
289
+ assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:370:59")
290
+ const declarator = globalBlockStatement.declarations[0]
291
+ assert(
292
+ "Identifier" == declarator.id.type,
293
+ `src/processScript/transform.ts:374:51 declarator.id.type was "${declarator.id.type}"`
294
+ )
295
+ program.scope.crawl()
296
+ if (program.scope.hasGlobal(declarator.id.name)) {
297
+ globalBlock.body.splice(globalBlockIndex, 1)
298
+ const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
299
+ [globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
412
300
  program.scope.crawl()
413
- assert(globalBlockStatement.id, "src/processScript/transform.ts:564:37")
414
- if (program.scope.hasGlobal(globalBlockStatement.id.name)) {
415
- globalBlock.body.splice(globalBlockIndex, 1)
416
- const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
417
- [globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
418
- program.scope.crawl()
419
- const binding = program.scope.getBinding(globalBlockStatement.id.name)
420
- assert(binding)
301
+ if (
302
+ !declarator.init ||
303
+ ("FunctionExpression" != declarator.init.type &&
304
+ "ArrowFunctionExpression" != declarator.init.type) ||
305
+ Object.keys(program.scope.globals).some(global => globalBlockVariables.has(global))
306
+ ) {
307
+ const binding = program.scope.getBinding(declarator.id.name)
308
+ assert(binding, "src/processScript/transform.ts:393:23")
421
309
  for (const referencePath of binding.referencePaths) {
422
- assert("Identifier" == referencePath.node.type)
310
+ assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:396:56")
423
311
  referencePath.replaceWith(
424
312
  t.memberExpression(
425
313
  t.identifier(`$${uniqueID}$GLOBAL$`),
@@ -427,223 +315,354 @@ const { default: traverse } = babelTraverse,
427
315
  )
428
316
  )
429
317
  }
318
+ for (const referencePath of binding.constantViolations)
319
+ if ("AssignmentExpression" == referencePath.node.type)
320
+ for (const [name, node] of Object.entries(t.getBindingIdentifiers(referencePath.node)))
321
+ if (name == declarator.id.name) {
322
+ clearObject(node)
323
+ Object.assign(
324
+ node,
325
+ t.memberExpression(t.identifier(`$${uniqueID}$GLOBAL$`), t.identifier(name))
326
+ )
327
+ }
430
328
  globalBlockPath.remove()
431
329
  globalBlockStatementPath.remove()
432
- globalBlock.body.splice(
433
- globalBlockIndex,
434
- 0,
435
- t.expressionStatement(
436
- t.assignmentExpression(
437
- "=",
438
- t.memberExpression(
439
- t.identifier(`$${uniqueID}$GLOBAL$`),
440
- t.identifier(globalBlockStatement.id.name)
441
- ),
442
- t.classExpression(
443
- void 0,
444
- globalBlockStatement.superClass,
445
- globalBlockStatement.body,
446
- globalBlockStatement.decorators
330
+ declarator.init &&
331
+ globalBlock.body.splice(
332
+ globalBlockIndex,
333
+ 0,
334
+ t.expressionStatement(
335
+ t.assignmentExpression(
336
+ "=",
337
+ t.memberExpression(
338
+ t.identifier(`$${uniqueID}$GLOBAL$`),
339
+ t.identifier(declarator.id.name)
340
+ ),
341
+ declarator.init
447
342
  )
448
343
  )
449
344
  )
345
+ } else {
346
+ globalBlockPath.remove()
347
+ globalBlockStatementPath.remove()
348
+ mainFunction.body.body.unshift(globalBlockStatement)
349
+ hoistedGlobalBlockFunctions++
350
+ }
351
+ } else globalBlockVariables.add(declarator.id.name)
352
+ } else if ("ClassDeclaration" == globalBlockStatement.type) {
353
+ program.scope.crawl()
354
+ assert(globalBlockStatement.id, "src/processScript/transform.ts:447:37")
355
+ if (program.scope.hasGlobal(globalBlockStatement.id.name)) {
356
+ globalBlock.body.splice(globalBlockIndex, 1)
357
+ const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
358
+ [globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
359
+ program.scope.crawl()
360
+ const binding = program.scope.getBinding(globalBlockStatement.id.name)
361
+ assert(binding, "src/processScript/transform.ts:459:22")
362
+ for (const referencePath of binding.referencePaths) {
363
+ assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:462:55")
364
+ referencePath.replaceWith(
365
+ t.memberExpression(
366
+ t.identifier(`$${uniqueID}$GLOBAL$`),
367
+ t.identifier(referencePath.node.name)
368
+ )
450
369
  )
451
370
  }
452
- }
453
- if (program.scope.hasGlobal("_EXPORTS"))
454
- for (const referencePath of getReferencePathsToGlobal("_EXPORTS", program))
455
- referencePath.replaceWith(
456
- t.arrayExpression([...exports.keys(), ...liveExports.keys()].map(name => t.stringLiteral(name)))
371
+ globalBlockPath.remove()
372
+ globalBlockStatementPath.remove()
373
+ globalBlock.body.splice(
374
+ globalBlockIndex,
375
+ 0,
376
+ t.expressionStatement(
377
+ t.assignmentExpression(
378
+ "=",
379
+ t.memberExpression(
380
+ t.identifier(`$${uniqueID}$GLOBAL$`),
381
+ t.identifier(globalBlockStatement.id.name)
382
+ ),
383
+ t.classExpression(
384
+ void 0,
385
+ globalBlockStatement.superClass,
386
+ globalBlockStatement.body,
387
+ globalBlockStatement.decorators
388
+ )
389
+ )
390
+ )
457
391
  )
458
- globalBlock.body.length &&
459
- mainFunction.body.body.splice(
460
- hoistedGlobalBlockFunctions,
461
- 0,
462
- t.ifStatement(t.unaryExpression("!", t.identifier(`$${uniqueID}$FMCL$`)), globalBlock)
392
+ }
393
+ }
394
+ if (program.scope.hasGlobal("_EXPORTS"))
395
+ for (const referencePath of getReferencePathsToGlobal("_EXPORTS", program))
396
+ referencePath.replaceWith(
397
+ t.arrayExpression([...exports.keys(), ...liveExports.keys()].map(name => t.stringLiteral(name)))
463
398
  )
464
- }
465
- functionDotPrototypeIsReferencedMultipleTimes &&
466
- mainFunction.body.body.unshift(
467
- t.variableDeclaration("let", [
468
- t.variableDeclarator(
469
- t.identifier(`_${uniqueID}_FUNCTION_DOT_PROTOTYPE_`),
470
- createGetFunctionPrototypeNode()
471
- )
472
- ])
399
+ globalBlock.body.length &&
400
+ mainFunction.body.body.splice(
401
+ hoistedGlobalBlockFunctions,
402
+ 0,
403
+ t.ifStatement(t.unaryExpression("!", t.identifier(`$${uniqueID}$FMCL$`)), globalBlock)
473
404
  )
474
- needSetPrototypeOf &&
475
- mainFunction.body.body.unshift(
476
- t.variableDeclaration("let", [
477
- t.variableDeclarator(
478
- t.identifier(`_${uniqueID}_SET_PROTOTYPE_OF_`),
479
- t.callExpression(
405
+ }
406
+ functionDotPrototypeIsReferencedMultipleTimes &&
407
+ mainFunction.body.body.unshift(
408
+ t.variableDeclaration("let", [
409
+ t.variableDeclarator(
410
+ t.identifier(`_${uniqueID}_FUNCTION_DOT_PROTOTYPE_`),
411
+ createGetFunctionPrototypeNode()
412
+ )
413
+ ])
414
+ )
415
+ needGetPrototypeOf &&
416
+ mainFunction.body.body.unshift(
417
+ t.variableDeclaration("let", [
418
+ t.variableDeclarator(
419
+ t.objectPattern([
420
+ t.objectProperty(t.identifier("get"), t.identifier(`_${uniqueID}_DUNDER_PROTO_GETTER_`))
421
+ ]),
422
+ t.callExpression(
423
+ t.memberExpression(t.identifier("Object"), t.identifier("getOwnPropertyDescriptor")),
424
+ [
425
+ t.memberExpression(t.identifier("Object"), t.identifier("prototype")),
426
+ t.stringLiteral("__proto__")
427
+ ]
428
+ )
429
+ ),
430
+ t.variableDeclarator(
431
+ t.identifier(`_${uniqueID}_GET_PROTOTYPE_OF_`),
432
+ t.callExpression(
433
+ t.memberExpression(
480
434
  t.memberExpression(
481
- t.memberExpression(t.identifier("Object"), t.identifier("call")),
482
- t.identifier("bind")
435
+ t.identifier(
436
+ globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
437
+ ),
438
+ t.identifier("call")
483
439
  ),
484
- [t.identifier(`_${uniqueID}_DUNDER_PROTO_SETTER_`)]
440
+ t.identifier("bind")
441
+ ),
442
+ [t.identifier(`_${uniqueID}_DUNDER_PROTO_GETTER_`)]
443
+ )
444
+ )
445
+ ])
446
+ )
447
+ consoleMethodsReferenced.size &&
448
+ mainFunction.body.body.unshift(
449
+ t.variableDeclaration(
450
+ "let",
451
+ [...consoleMethodsReferenced].map(name =>
452
+ t.variableDeclarator(
453
+ t.identifier(`_${uniqueID}_CONSOLE_METHOD_${name}_`),
454
+ t.arrowFunctionExpression(
455
+ [t.restElement(t.identifier("args"))],
456
+ t.unaryExpression(
457
+ "void",
458
+ t.callExpression(t.identifier(`$${uniqueID}$DEBUG$`), [t.identifier("args")])
459
+ )
485
460
  )
486
461
  )
487
- ])
462
+ )
488
463
  )
489
- needGetPrototypeOf &&
490
- mainFunction.body.body.unshift(
491
- t.variableDeclaration("let", [
492
- t.variableDeclarator(
493
- t.identifier(`_${uniqueID}_GET_PROTOTYPE_OF_`),
494
- t.callExpression(
495
- t.memberExpression(
496
- t.memberExpression(t.identifier("Object"), t.identifier("call")),
497
- t.identifier("bind")
498
- ),
499
- [t.identifier(`_${uniqueID}_DUNDER_PROTO_GETTER_`)]
464
+ )
465
+ neededDbMethodLets.size &&
466
+ mainFunction.body.body.unshift(
467
+ t.variableDeclaration(
468
+ "let",
469
+ [...neededDbMethodLets].map(name => {
470
+ const getArgs = () =>
471
+ "ObjectId" == name ? []
472
+ : "i" == name || "r" == name ? [t.identifier("a")]
473
+ : [t.identifier("a"), t.identifier("b")]
474
+ return t.variableDeclarator(
475
+ t.identifier(`_${uniqueID}_CONSOLE_METHOD_${name}_`),
476
+ t.arrowFunctionExpression(
477
+ getArgs(),
478
+ t.callExpression(t.identifier(`$${uniqueID}$DB$${name}$`), getArgs())
500
479
  )
501
480
  )
502
- ])
481
+ })
503
482
  )
504
- ;(needGetPrototypeOf || needSetPrototypeOf) &&
505
- mainFunction.body.body.unshift(
506
- t.variableDeclaration("let", [
483
+ )
484
+ needDebugLet &&
485
+ mainFunction.body.body.unshift(
486
+ t.variableDeclaration("let", [
487
+ t.variableDeclarator(
488
+ t.identifier(`_${uniqueID}_DEBUG_`),
489
+ t.callExpression(t.identifier(`$${uniqueID}$DEBUG$`), [t.identifier("a")])
490
+ )
491
+ ])
492
+ )
493
+ neededSubscriptLets.size &&
494
+ mainFunction.body.body.unshift(
495
+ t.variableDeclaration(
496
+ "let",
497
+ [...neededSubscriptLets].map(name =>
507
498
  t.variableDeclarator(
508
- t.objectPattern(
509
- needGetPrototypeOf ?
510
- needSetPrototypeOf ?
511
- [
512
- t.objectProperty(
513
- t.identifier("get"),
514
- t.identifier(`_${uniqueID}_DUNDER_PROTO_GETTER_`)
515
- ),
516
- t.objectProperty(
517
- t.identifier("set"),
518
- t.identifier(`_${uniqueID}_DUNDER_PROTO_SETTER_`)
519
- )
520
- ]
521
- : [
522
- t.objectProperty(
523
- t.identifier("get"),
524
- t.identifier(`_${uniqueID}_DUNDER_PROTO_GETTER_`)
525
- )
526
- ]
527
- : [t.objectProperty(t.identifier("set"), t.identifier(`_${uniqueID}_DUNDER_PROTO_SETTER_`))]
528
- ),
529
- t.callExpression(
530
- t.memberExpression(t.identifier("Object"), t.identifier("getOwnPropertyDescriptor")),
531
- [
532
- t.memberExpression(t.identifier("Object"), t.identifier("prototype")),
533
- t.stringLiteral("__proto__")
534
- ]
499
+ t.identifier(`_${uniqueID}_SUBSCRIPT_${name}_`),
500
+ t.arrowFunctionExpression(
501
+ [t.restElement(t.identifier("args"))],
502
+ t.callExpression(t.identifier(`$${uniqueID}$SUBSCRIPT$${name}$`), [
503
+ t.spreadElement(t.identifier("args"))
504
+ ])
535
505
  )
536
506
  )
537
- ])
507
+ )
538
508
  )
539
- traverse(file, {
540
- BlockStatement({ node: blockStatement }) {
541
- for (const [index, functionDeclaration] of blockStatement.body.entries())
542
- if ("FunctionDeclaration" == functionDeclaration.type && !functionDeclaration.generator) {
543
- blockStatement.body.splice(index, 1)
544
- blockStatement.body.unshift(
509
+ )
510
+ traverse(file, {
511
+ BlockStatement({ node: blockStatement }) {
512
+ for (const [index, functionDeclaration] of blockStatement.body.entries())
513
+ if ("FunctionDeclaration" == functionDeclaration.type && !functionDeclaration.generator) {
514
+ blockStatement.body.splice(index, 1)
515
+ blockStatement.body.unshift(
516
+ t.variableDeclaration("let", [
517
+ t.variableDeclarator(
518
+ functionDeclaration.id,
519
+ t.arrowFunctionExpression(
520
+ functionDeclaration.params,
521
+ functionDeclaration.body,
522
+ functionDeclaration.async
523
+ )
524
+ )
525
+ ])
526
+ )
527
+ }
528
+ },
529
+ ClassBody({ node: classBody, scope, parent }) {
530
+ assert(t.isClass(parent), "src/processScript/transform.ts:629:30")
531
+ let thisIsReferenced = !1
532
+ for (const classMethod of classBody.body) {
533
+ if ("ClassMethod" != classMethod.type) continue
534
+ let methodReferencesThis = !1
535
+ traverse(
536
+ classMethod.body,
537
+ {
538
+ ThisExpression(path) {
539
+ methodReferencesThis = !0
540
+ thisIsReferenced = !0
541
+ path.replaceWith(t.identifier(`_${uniqueID}_THIS_`))
542
+ },
543
+ Function: path => path.skip()
544
+ },
545
+ scope
546
+ )
547
+ if (methodReferencesThis)
548
+ if ("constructor" != classMethod.kind)
549
+ classMethod.body.body.unshift(
545
550
  t.variableDeclaration("let", [
546
551
  t.variableDeclarator(
547
- functionDeclaration.id,
548
- t.arrowFunctionExpression(
549
- functionDeclaration.params,
550
- functionDeclaration.body,
551
- functionDeclaration.async
552
- )
552
+ t.identifier(`_${uniqueID}_THIS_`),
553
+ t.callExpression(t.memberExpression(t.super(), t.identifier("valueOf")), [])
553
554
  )
554
555
  ])
555
556
  )
556
- }
557
- },
558
- ClassBody({ node: classBody, scope, parent }) {
559
- assert(t.isClass(parent))
560
- let thisIsReferenced = !1
561
- for (const classMethod of classBody.body) {
562
- if ("ClassMethod" != classMethod.type) continue
563
- let methodReferencesThis = !1
564
- traverse(
565
- classMethod.body,
566
- {
567
- ThisExpression(path) {
568
- methodReferencesThis = !0
569
- thisIsReferenced = !0
570
- path.replaceWith(t.identifier(`_${uniqueID}_THIS_`))
557
+ else {
558
+ const superCalls = []
559
+ traverse(
560
+ classMethod.body,
561
+ {
562
+ CallExpression(path) {
563
+ "Super" == path.node.callee.type && superCalls.push(path)
564
+ }
571
565
  },
572
- Function(path) {
573
- path.skip()
566
+ scope
567
+ )
568
+ if (superCalls.length)
569
+ if (
570
+ 1 == superCalls.length &&
571
+ "ExpressionStatement" == superCalls[0].parent.type &&
572
+ superCalls[0].parentPath.parentPath.parent == classMethod
573
+ )
574
+ superCalls[0].parentPath.replaceWith(
575
+ t.variableDeclaration("let", [
576
+ t.variableDeclarator(t.identifier(`_${uniqueID}_THIS_`), superCalls[0].node)
577
+ ])
578
+ )
579
+ else {
580
+ for (const path of superCalls)
581
+ path.replaceWith(
582
+ t.assignmentExpression("=", t.identifier(`_${uniqueID}_THIS_`), path.node)
583
+ )
584
+ classMethod.body.body.unshift(
585
+ t.variableDeclaration("let", [
586
+ t.variableDeclarator(t.identifier(`_${uniqueID}_THIS_`))
587
+ ])
588
+ )
574
589
  }
575
- },
576
- scope
577
- )
578
- if (methodReferencesThis)
579
- if ("constructor" != classMethod.kind)
590
+ else
580
591
  classMethod.body.body.unshift(
581
592
  t.variableDeclaration("let", [
582
593
  t.variableDeclarator(
583
594
  t.identifier(`_${uniqueID}_THIS_`),
584
- t.callExpression(t.memberExpression(t.super(), t.identifier("valueOf")), [])
595
+ t.callExpression(t.super(), [])
585
596
  )
586
597
  ])
587
598
  )
588
- else {
589
- const superCalls = []
590
- traverse(
591
- classMethod.body,
592
- {
593
- CallExpression(path) {
594
- "Super" == path.node.callee.type && superCalls.push(path)
595
- }
596
- },
597
- scope
598
- )
599
- if (superCalls.length)
600
- if (
601
- 1 == superCalls.length &&
602
- "ExpressionStatement" == superCalls[0].parent.type &&
603
- superCalls[0].parentPath.parentPath.parent == classMethod
604
- )
605
- superCalls[0].parentPath.replaceWith(
606
- t.variableDeclaration("let", [
607
- t.variableDeclarator(t.identifier(`_${uniqueID}_THIS_`), superCalls[0].node)
608
- ])
609
- )
610
- else {
611
- for (const path of superCalls)
612
- path.replaceWith(
613
- t.assignmentExpression("=", t.identifier(`_${uniqueID}_THIS_`), path.node)
614
- )
615
- classMethod.body.body.unshift(
616
- t.variableDeclaration("let", [
617
- t.variableDeclarator(t.identifier(`_${uniqueID}_THIS_`))
618
- ])
619
- )
620
- }
621
- else
622
- classMethod.body.body.unshift(
623
- t.variableDeclaration("let", [
624
- t.variableDeclarator(
625
- t.identifier(`_${uniqueID}_THIS_`),
626
- t.callExpression(t.super(), [])
627
- )
628
- ])
629
- )
630
- }
631
- }
632
- !parent.superClass && thisIsReferenced && (parent.superClass = t.identifier("Object"))
633
- },
634
- VariableDeclaration({ node: variableDeclaration }) {
635
- "const" == variableDeclaration.kind && (variableDeclaration.kind = "let")
636
- },
637
- ThisExpression(path) {
638
- path.replaceWith(t.identifier("undefined"))
639
- },
640
- BigIntLiteral(path) {
641
- const bigIntAsNumber = Number(path.node.value)
642
- BigInt(bigIntAsNumber) == BigInt(path.node.value) ?
643
- path.replaceWith(t.callExpression(t.identifier("BigInt"), [t.numericLiteral(bigIntAsNumber)]))
644
- : path.replaceWith(t.callExpression(t.identifier("BigInt"), [t.stringLiteral(path.node.value)]))
599
+ }
645
600
  }
646
- })
647
- return { file, seclevel }
601
+ !parent.superClass && thisIsReferenced && (parent.superClass = t.identifier("Object"))
602
+ },
603
+ VariableDeclaration({ node: variableDeclaration }) {
604
+ "const" == variableDeclaration.kind && (variableDeclaration.kind = "let")
605
+ },
606
+ ThisExpression: path => path.replaceWith(t.identifier("undefined")),
607
+ BigIntLiteral(path) {
608
+ const bigIntAsNumber = Number(path.node.value)
609
+ path.replaceWith(
610
+ t.callExpression(t.identifier("BigInt"), [
611
+ BigInt(bigIntAsNumber) == BigInt(path.node.value) ?
612
+ t.numericLiteral(bigIntAsNumber)
613
+ : t.stringLiteral(path.node.value)
614
+ ])
615
+ )
616
+ }
617
+ })
618
+ return { file, seclevel }
619
+ function createGetFunctionPrototypeNode() {
620
+ for (const globalFunction of globalFunctionsUnder7Characters)
621
+ if (!program.scope.hasOwnBinding(globalFunction))
622
+ return t.memberExpression(
623
+ t.memberExpression(t.identifier(globalFunction), t.identifier("constructor")),
624
+ t.identifier("prototype")
625
+ )
626
+ return t.memberExpression(
627
+ t.memberExpression(
628
+ t.arrowFunctionExpression([t.identifier("_")], t.identifier("_")),
629
+ t.identifier("constructor")
630
+ ),
631
+ t.identifier("prototype")
632
+ )
633
+ }
634
+ function processFakeSubscriptObject(fakeSubscriptObjectName) {
635
+ for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
636
+ assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:743:60")
637
+ assert("Identifier" == referencePath.parent.property.type)
638
+ assert(
639
+ "MemberExpression" == referencePath.parentPath.parentPath?.node.type,
640
+ "src/processScript/transform.ts:745:81"
641
+ )
642
+ assert(
643
+ "Identifier" == referencePath.parentPath.parentPath.node.property.type,
644
+ "src/processScript/transform.ts:746:83"
645
+ )
646
+ assert(
647
+ /^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
648
+ `src/processScript/transform.ts:750:8 invalid user "${referencePath.parent.property.name}" in subscript`
649
+ )
650
+ assert(
651
+ /^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
652
+ `src/processScript/transform.ts:755:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
653
+ )
654
+ if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
655
+ referencePath.parentPath.parentPath.replaceWith(
656
+ t.identifier(
657
+ `$${uniqueID}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
658
+ )
659
+ )
660
+ else {
661
+ const name = `${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}`
662
+ referencePath.parentPath.parentPath.replaceWith(t.identifier(`_${uniqueID}_SUBSCRIPT_${name}_`))
663
+ neededSubscriptLets.add(name)
664
+ }
665
+ }
648
666
  }
649
- export { transform as default, transform }
667
+ }
668
+ export { transform }