hackmud-script-manager 0.19.1-bd545f5 → 0.19.1-cb8d65f

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