hackmud-script-manager 0.19.1-98e81f8 → 0.19.1-b040eb5

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.
@@ -9,309 +9,249 @@ import * as terser from "terser"
9
9
  import { getReferencePathsToGlobal, includesIllegalString, replaceUnsafeStrings } from "./shared.js"
10
10
  const { default: generate } = babelGenerator,
11
11
  { default: traverse } = babelTraverse,
12
- minify = async (file, { uniqueID = "00000000000", mangleNames = !1, forceQuineCheats, autocomplete } = {}) => {
13
- assert(/^\w{11}$/.exec(uniqueID))
14
- let program
15
- traverse(file, {
16
- Program(path) {
17
- program = path
18
- path.skip()
19
- }
20
- })
21
- if (program.scope.hasGlobal("_START"))
22
- for (const referencePath of getReferencePathsToGlobal("_START", program))
23
- referencePath.replaceWith(t.identifier("_ST"))
24
- if (program.scope.hasGlobal("_TIMEOUT"))
25
- for (const referencePath of getReferencePathsToGlobal("_TIMEOUT", program))
26
- referencePath.replaceWith(t.identifier("_TO"))
27
- const mainFunctionPath = program.get("body.0")
28
- for (const parameter of [...mainFunctionPath.node.params].reverse()) {
29
- if ("Identifier" != parameter.type || mainFunctionPath.scope.getBinding(parameter.name).referenced) break
30
- mainFunctionPath.node.params.pop()
31
- }
32
- for (const global in program.scope.globals) {
33
- if ("arguments" == global || global.startsWith(`$${uniqueID}$`)) continue
34
- const referencePaths = getReferencePathsToGlobal(global, program)
35
- if (!(5 + global.length + referencePaths.length >= global.length * referencePaths.length)) {
36
- for (const path of referencePaths) path.replaceWith(t.identifier(`_${uniqueID}_GLOBAL_${global}_`))
37
- mainFunctionPath.node.body.body.unshift(
38
- t.variableDeclaration("let", [
39
- t.variableDeclarator(t.identifier(`_${uniqueID}_GLOBAL_${global}_`), t.identifier(global))
40
- ])
41
- )
42
- }
12
+ minifyNumber = async number =>
13
+ /\$\((?<number>.+)\)/.exec((await terser.minify(`$(${number})`, { ecma: 2015 })).code).groups.number
14
+ async function minify(file, { uniqueID = "00000000000", mangleNames = !1, forceQuineCheats, autocomplete } = {}) {
15
+ assert(/^\w{11}$/.exec(uniqueID), "src/processScript/minify.ts:46:36")
16
+ let program
17
+ traverse(file, {
18
+ Program(path) {
19
+ program = path
20
+ path.skip()
43
21
  }
44
- const hashGReferencePaths = getReferencePathsToGlobal(`$${uniqueID}$GLOBAL$`, program)
45
- if (hashGReferencePaths.length > 3) {
46
- for (const path of hashGReferencePaths) path.replaceWith(t.identifier(`_${uniqueID}_G_`))
22
+ })
23
+ if (program.scope.hasGlobal("_START"))
24
+ for (const referencePath of getReferencePathsToGlobal("_START", program))
25
+ referencePath.replaceWith(t.identifier("_ST"))
26
+ if (program.scope.hasGlobal("_TIMEOUT"))
27
+ for (const referencePath of getReferencePathsToGlobal("_TIMEOUT", program))
28
+ referencePath.replaceWith(t.identifier("_TO"))
29
+ const mainFunctionPath = program.get("body.0")
30
+ for (const parameter of [...mainFunctionPath.node.params].reverse()) {
31
+ if ("Identifier" != parameter.type || mainFunctionPath.scope.getBinding(parameter.name).referenced) break
32
+ mainFunctionPath.node.params.pop()
33
+ }
34
+ for (const global in program.scope.globals) {
35
+ if ("arguments" == global || global.startsWith(`$${uniqueID}$`)) continue
36
+ const referencePaths = getReferencePathsToGlobal(global, program)
37
+ if (!(5 + global.length + referencePaths.length >= global.length * referencePaths.length)) {
38
+ for (const path of referencePaths) path.replaceWith(t.identifier(`_${uniqueID}_GLOBAL_${global}_`))
47
39
  mainFunctionPath.node.body.body.unshift(
48
40
  t.variableDeclaration("let", [
49
- t.variableDeclarator(t.identifier(`_${uniqueID}_G_`), t.identifier(`$${uniqueID}$GLOBAL$`))
41
+ t.variableDeclarator(t.identifier(`_${uniqueID}_GLOBAL_${global}_`), t.identifier(global))
50
42
  ])
51
43
  )
52
44
  }
53
- const jsonValues = []
54
- let scriptBeforeJSONValueReplacement,
55
- comment,
56
- undefinedIsReferenced = !1
57
- if (1 != forceQuineCheats) {
58
- const fileBeforeJSONValueReplacement = t.cloneNode(file)
59
- traverse(fileBeforeJSONValueReplacement, {
60
- MemberExpression({ node: memberExpression }) {
61
- if (!memberExpression.computed) {
62
- assert("Identifier" == memberExpression.property.type)
63
- if ("prototype" == memberExpression.property.name) {
64
- memberExpression.computed = !0
65
- memberExpression.property = t.identifier(`_${uniqueID}_PROTOTYPE_PROPERTY_`)
66
- } else if ("__proto__" == memberExpression.property.name) {
67
- memberExpression.computed = !0
68
- memberExpression.property = t.identifier(`_${uniqueID}_PROTO_PROPERTY_`)
69
- } else if (includesIllegalString(memberExpression.property.name)) {
70
- memberExpression.computed = !0
71
- memberExpression.property = t.stringLiteral(
72
- replaceUnsafeStrings(uniqueID, memberExpression.property.name)
73
- )
74
- }
75
- }
76
- },
77
- ObjectProperty({ node: objectProperty }) {
78
- if ("Identifier" == objectProperty.key.type && includesIllegalString(objectProperty.key.name)) {
79
- objectProperty.key = t.stringLiteral(replaceUnsafeStrings(uniqueID, objectProperty.key.name))
80
- objectProperty.shorthand = !1
45
+ }
46
+ const hashGReferencePaths = getReferencePathsToGlobal(`$${uniqueID}$GLOBAL$`, program)
47
+ if (hashGReferencePaths.length > 3) {
48
+ for (const path of hashGReferencePaths) path.replaceWith(t.identifier(`_${uniqueID}_G_`))
49
+ mainFunctionPath.node.body.body.unshift(
50
+ t.variableDeclaration("let", [
51
+ t.variableDeclarator(t.identifier(`_${uniqueID}_G_`), t.identifier(`$${uniqueID}$GLOBAL$`))
52
+ ])
53
+ )
54
+ }
55
+ const jsonValues = []
56
+ let scriptBeforeJSONValueReplacement,
57
+ comment,
58
+ undefinedIsReferenced = !1
59
+ if (1 != forceQuineCheats) {
60
+ const fileBeforeJSONValueReplacement = t.cloneNode(file)
61
+ traverse(fileBeforeJSONValueReplacement, {
62
+ MemberExpression({ node: memberExpression }) {
63
+ if (!memberExpression.computed) {
64
+ assert("Identifier" == memberExpression.property.type, "src/processScript/minify.ts:127:60")
65
+ if ("prototype" == memberExpression.property.name) {
66
+ memberExpression.computed = !0
67
+ memberExpression.property = t.identifier(`_${uniqueID}_PROTOTYPE_PROPERTY_`)
68
+ } else if ("__proto__" == memberExpression.property.name) {
69
+ memberExpression.computed = !0
70
+ memberExpression.property = t.identifier(`_${uniqueID}_PROTO_PROPERTY_`)
71
+ } else if (includesIllegalString(memberExpression.property.name)) {
72
+ memberExpression.computed = !0
73
+ memberExpression.property = t.stringLiteral(
74
+ replaceUnsafeStrings(uniqueID, memberExpression.property.name)
75
+ )
81
76
  }
82
- },
83
- StringLiteral({ node }) {
84
- node.value = replaceUnsafeStrings(uniqueID, node.value)
85
- },
86
- TemplateLiteral({ node }) {
87
- for (const templateElement of node.quasis)
88
- if (templateElement.value.cooked) {
89
- templateElement.value.cooked = replaceUnsafeStrings(uniqueID, templateElement.value.cooked)
90
- templateElement.value.raw = templateElement.value.cooked
91
- .replaceAll("\\", "\\\\")
92
- .replaceAll("`", "\\`")
93
- .replaceAll("${", "$\\{")
94
- } else templateElement.value.raw = replaceUnsafeStrings(uniqueID, templateElement.value.raw)
95
- },
96
- RegExpLiteral(path) {
97
- path.node.pattern = replaceUnsafeStrings(uniqueID, path.node.pattern)
98
- delete path.node.extra
99
77
  }
78
+ },
79
+ ObjectProperty({ node: objectProperty }) {
80
+ if ("Identifier" == objectProperty.key.type && includesIllegalString(objectProperty.key.name)) {
81
+ objectProperty.key = t.stringLiteral(replaceUnsafeStrings(uniqueID, objectProperty.key.name))
82
+ objectProperty.shorthand = !1
83
+ }
84
+ },
85
+ StringLiteral({ node }) {
86
+ node.value = replaceUnsafeStrings(uniqueID, node.value)
87
+ },
88
+ TemplateLiteral({ node }) {
89
+ for (const templateElement of node.quasis)
90
+ if (templateElement.value.cooked) {
91
+ templateElement.value.cooked = replaceUnsafeStrings(uniqueID, templateElement.value.cooked)
92
+ templateElement.value.raw = templateElement.value.cooked
93
+ .replaceAll("\\", "\\\\")
94
+ .replaceAll("`", "\\`")
95
+ .replaceAll("${", "$\\{")
96
+ } else templateElement.value.raw = replaceUnsafeStrings(uniqueID, templateElement.value.raw)
97
+ },
98
+ RegExpLiteral(path) {
99
+ path.node.pattern = replaceUnsafeStrings(uniqueID, path.node.pattern)
100
+ delete path.node.extra
101
+ }
102
+ })
103
+ scriptBeforeJSONValueReplacement = (
104
+ await terser.minify(generate(fileBeforeJSONValueReplacement).code, {
105
+ ecma: 2015,
106
+ compress: {
107
+ passes: 1 / 0,
108
+ unsafe: !0,
109
+ unsafe_arrows: !0,
110
+ unsafe_comps: !0,
111
+ unsafe_symbols: !0,
112
+ unsafe_methods: !0,
113
+ unsafe_proto: !0,
114
+ unsafe_regexp: !0,
115
+ unsafe_undefined: !0,
116
+ sequences: !1
117
+ },
118
+ format: { semicolons: !1 },
119
+ keep_classnames: !mangleNames,
120
+ keep_fnames: !mangleNames
100
121
  })
101
- scriptBeforeJSONValueReplacement = (
102
- await terser.minify(generate(fileBeforeJSONValueReplacement).code, {
103
- ecma: 2015,
104
- compress: {
105
- passes: 1 / 0,
106
- unsafe: !0,
107
- unsafe_arrows: !0,
108
- unsafe_comps: !0,
109
- unsafe_symbols: !0,
110
- unsafe_methods: !0,
111
- unsafe_proto: !0,
112
- unsafe_regexp: !0,
113
- unsafe_undefined: !0,
114
- sequences: !1
122
+ ).code
123
+ .replace(RegExp(`_${uniqueID}_PROTOTYPE_PROPERTY_`, "g"), '"prototype"')
124
+ .replace(RegExp(`_${uniqueID}_PROTO_PROPERTY_`, "g"), '"__proto__"')
125
+ autocomplete &&
126
+ (scriptBeforeJSONValueReplacement = spliceString(
127
+ scriptBeforeJSONValueReplacement,
128
+ `//${autocomplete}\n`,
129
+ getFunctionBodyStart(scriptBeforeJSONValueReplacement) + 1
130
+ ))
131
+ if (0 == forceQuineCheats) return scriptBeforeJSONValueReplacement
132
+ }
133
+ let code,
134
+ hasComment = !1
135
+ {
136
+ const promises = []
137
+ traverse(file, {
138
+ FunctionDeclaration(path) {
139
+ path.traverse({
140
+ Function(path) {
141
+ "CallExpression" != path.parent.type && "callee" != path.parentKey && path.skip()
142
+ },
143
+ Loop: path => path.skip(),
144
+ ObjectExpression(path) {
145
+ const o = {}
146
+ parseObjectExpression(path.node, o) &&
147
+ path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValues.push(o) - 1}_`))
115
148
  },
116
- format: { semicolons: !1 },
117
- keep_classnames: !mangleNames,
118
- keep_fnames: !mangleNames
149
+ ArrayExpression(path) {
150
+ const o = []
151
+ parseArrayExpression(path.node, o) &&
152
+ path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValues.push(o) - 1}_`))
153
+ }
119
154
  })
120
- ).code
121
- .replace(RegExp(`_${uniqueID}_PROTOTYPE_PROPERTY_`, "g"), '"prototype"')
122
- .replace(RegExp(`_${uniqueID}_PROTO_PROPERTY_`, "g"), '"__proto__"')
123
- autocomplete &&
124
- (scriptBeforeJSONValueReplacement = spliceString(
125
- scriptBeforeJSONValueReplacement,
126
- `//${autocomplete}\n`,
127
- getFunctionBodyStart(scriptBeforeJSONValueReplacement) + 1
128
- ))
129
- if (0 == forceQuineCheats) return scriptBeforeJSONValueReplacement
130
- }
131
- let code,
132
- hasComment = !1
133
- {
134
- const promises = []
135
- traverse(file, {
136
- FunctionDeclaration(path) {
137
- path.traverse({
138
- Function(path) {
139
- "CallExpression" != path.parent.type && "callee" != path.parentKey && path.skip()
140
- },
141
- Loop(path) {
142
- path.skip()
143
- },
144
- ObjectExpression(path) {
145
- const o = {}
146
- parseObjectExpression(path.node, o) &&
147
- path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValues.push(o) - 1}_`))
148
- },
149
- ArrayExpression(path) {
150
- const o = []
151
- parseArrayExpression(path.node, o) &&
152
- path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValues.push(o) - 1}_`))
155
+ path.traverse({
156
+ TemplateLiteral(path) {
157
+ if ("TaggedTemplateExpression" == path.parent.type) return
158
+ const templateLiteral = path.node
159
+ let replacement = t.stringLiteral(templateLiteral.quasis[0].value.cooked)
160
+ for (let index = 0; index < templateLiteral.expressions.length; index++) {
161
+ const expression = templateLiteral.expressions[index],
162
+ templateElement = templateLiteral.quasis[index + 1]
163
+ replacement = t.binaryExpression("+", replacement, expression)
164
+ templateElement.value.cooked &&
165
+ (replacement = t.binaryExpression(
166
+ "+",
167
+ replacement,
168
+ t.stringLiteral(templateElement.value.cooked)
169
+ ))
153
170
  }
154
- })
155
- path.traverse({
156
- TemplateLiteral(path) {
157
- if ("TaggedTemplateExpression" == path.parent.type) return
158
- const templateLiteral = path.node
159
- let replacement = t.stringLiteral(templateLiteral.quasis[0].value.cooked)
160
- for (let index = 0; index < templateLiteral.expressions.length; index++) {
161
- const expression = templateLiteral.expressions[index],
162
- templateElement = templateLiteral.quasis[index + 1]
163
- replacement = t.binaryExpression("+", replacement, expression)
164
- templateElement.value.cooked &&
165
- (replacement = t.binaryExpression(
166
- "+",
167
- replacement,
168
- t.stringLiteral(templateElement.value.cooked)
169
- ))
170
- }
171
- path.replaceWith(replacement)
172
- },
173
- MemberExpression({ node: memberExpression }) {
174
- if (!memberExpression.computed) {
175
- assert("Identifier" == memberExpression.property.type)
176
- if (!(memberExpression.property.name.length < 3)) {
177
- memberExpression.computed = !0
178
- memberExpression.property = t.stringLiteral(memberExpression.property.name)
179
- }
171
+ path.replaceWith(replacement)
172
+ },
173
+ MemberExpression({ node: memberExpression }) {
174
+ if (!memberExpression.computed) {
175
+ assert("Identifier" == memberExpression.property.type, "src/processScript/minify.ts:259:62")
176
+ if (!(memberExpression.property.name.length < 3)) {
177
+ memberExpression.computed = !0
178
+ memberExpression.property = t.stringLiteral(memberExpression.property.name)
180
179
  }
181
- },
182
- UnaryExpression(path) {
183
- if ("void" == path.node.operator) {
184
- if ("NumericLiteral" == path.node.argument.type && !path.node.argument.value) {
185
- path.replaceWith(t.identifier(`_${uniqueID}_UNDEFINED_`))
186
- undefinedIsReferenced = !0
187
- }
188
- } else if ("-" == path.node.operator && "NumericLiteral" == path.node.argument.type) {
189
- const value = -path.node.argument.value
190
- promises.push(
191
- (async () => {
192
- if ((await minifyNumber(value)).length <= 3) return
193
- "key" == path.parentKey &&
194
- "ObjectProperty" == path.parent.type &&
195
- (path.parent.computed = !0)
196
- let jsonValueIndex = jsonValues.indexOf(value)
197
- ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(value))
198
- path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
199
- })()
200
- )
201
- path.skip()
180
+ }
181
+ },
182
+ UnaryExpression(path) {
183
+ if ("void" == path.node.operator) {
184
+ if ("NumericLiteral" == path.node.argument.type && !path.node.argument.value) {
185
+ path.replaceWith(t.identifier(`_${uniqueID}_UNDEFINED_`))
186
+ undefinedIsReferenced = !0
202
187
  }
203
- },
204
- NullLiteral(path) {
205
- let jsonValueIndex = jsonValues.indexOf(null)
206
- ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(null))
207
- path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
208
- },
209
- NumericLiteral(path) {
188
+ } else if ("-" == path.node.operator && "NumericLiteral" == path.node.argument.type) {
189
+ const value = -path.node.argument.value
210
190
  promises.push(
211
191
  (async () => {
212
- if ((await minifyNumber(path.node.value)).length <= 3) return
192
+ if ((await minifyNumber(value)).length <= 3) return
213
193
  "key" == path.parentKey &&
214
194
  "ObjectProperty" == path.parent.type &&
215
195
  (path.parent.computed = !0)
216
- let jsonValueIndex = jsonValues.indexOf(path.node.value)
217
- ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(path.node.value))
196
+ let jsonValueIndex = jsonValues.indexOf(value)
197
+ ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(value))
218
198
  path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
219
199
  })()
220
200
  )
221
- },
222
- StringLiteral(path) {
223
- path.node.value = replaceUnsafeStrings(uniqueID, path.node.value)
224
- if (JSON.stringify(path.node.value).includes("\\u00") || path.toString().length < 4) return
225
- "key" == path.parentKey &&
226
- "ObjectProperty" == path.parent.type &&
227
- (path.parent.computed = !0)
228
- let jsonValueIndex = jsonValues.indexOf(path.node.value)
229
- ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(path.node.value))
230
- path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
231
- },
232
- ObjectProperty({ node }) {
233
- if (node.computed || "Identifier" != node.key.type || node.key.name.length < 4) return
234
- let jsonValueIndex = jsonValues.indexOf(node.key.name)
235
- ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(node.key.name))
236
- node.computed = !0
237
- node.key = t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`)
238
- },
239
- RegExpLiteral(path) {
240
- path.node.pattern = replaceUnsafeStrings(uniqueID, path.node.pattern)
241
- delete path.node.extra
201
+ path.skip()
242
202
  }
243
- })
244
- path.skip()
245
- }
246
- })
247
- await Promise.all(promises)
248
- const functionDeclaration = file.program.body[0]
249
- assert("FunctionDeclaration" == functionDeclaration.type)
250
- if (jsonValues.length) {
251
- hasComment = !0
252
- if (1 == jsonValues.length)
253
- if (
254
- "string" != typeof jsonValues[0] ||
255
- jsonValues[0].includes("\n") ||
256
- jsonValues[0].includes("\t")
257
- ) {
258
- const variableDeclaration = t.variableDeclaration("let", [
259
- t.variableDeclarator(
260
- t.identifier(`_${uniqueID}_JSON_VALUE_0_`),
261
- t.callExpression(t.memberExpression(t.identifier("JSON"), t.identifier("parse")), [
262
- t.memberExpression(
263
- t.taggedTemplateExpression(
264
- t.memberExpression(
265
- t.callExpression(
266
- t.identifier(`$${uniqueID}$SUBSCRIPT$scripts$quine$`),
267
- []
268
- ),
269
- t.identifier("split")
270
- ),
271
- t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
272
- ),
273
- t.identifier(`$${uniqueID}$SPLIT_INDEX$`),
274
- !0
275
- )
276
- ])
277
- )
278
- ])
279
- undefinedIsReferenced &&
280
- variableDeclaration.declarations.push(
281
- t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`))
282
- )
283
- functionDeclaration.body.body.unshift(variableDeclaration)
284
- comment = JSON.stringify(jsonValues[0])
285
- } else {
286
- const variableDeclaration = t.variableDeclaration("let", [
287
- t.variableDeclarator(
288
- t.identifier(`_${uniqueID}_JSON_VALUE_0_`),
289
- t.memberExpression(
290
- t.taggedTemplateExpression(
291
- t.memberExpression(
292
- t.callExpression(t.identifier(`$${uniqueID}$SUBSCRIPT$scripts$quine$`), []),
293
- t.identifier("split")
294
- ),
295
- t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
296
- ),
297
- t.identifier(`$${uniqueID}$SPLIT_INDEX$`),
298
- !0
299
- )
300
- )
301
- ])
302
- undefinedIsReferenced &&
303
- variableDeclaration.declarations.push(
304
- t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`))
305
- )
306
- functionDeclaration.body.body.unshift(variableDeclaration)
307
- comment = jsonValues[0]
203
+ },
204
+ NullLiteral(path) {
205
+ let jsonValueIndex = jsonValues.indexOf(null)
206
+ ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(null))
207
+ path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
208
+ },
209
+ NumericLiteral(path) {
210
+ promises.push(
211
+ (async () => {
212
+ if ((await minifyNumber(path.node.value)).length <= 3) return
213
+ "key" == path.parentKey &&
214
+ "ObjectProperty" == path.parent.type &&
215
+ (path.parent.computed = !0)
216
+ let jsonValueIndex = jsonValues.indexOf(path.node.value)
217
+ ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(path.node.value))
218
+ path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
219
+ })()
220
+ )
221
+ },
222
+ StringLiteral(path) {
223
+ path.node.value = replaceUnsafeStrings(uniqueID, path.node.value)
224
+ if (JSON.stringify(path.node.value).includes("\\u00") || path.toString().length < 4) return
225
+ "key" == path.parentKey && "ObjectProperty" == path.parent.type && (path.parent.computed = !0)
226
+ let jsonValueIndex = jsonValues.indexOf(path.node.value)
227
+ ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(path.node.value))
228
+ path.replaceWith(t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`))
229
+ },
230
+ ObjectProperty({ node }) {
231
+ if (node.computed || "Identifier" != node.key.type || node.key.name.length < 4) return
232
+ let jsonValueIndex = jsonValues.indexOf(node.key.name)
233
+ ;-1 == jsonValueIndex && (jsonValueIndex += jsonValues.push(node.key.name))
234
+ node.computed = !0
235
+ node.key = t.identifier(`_${uniqueID}_JSON_VALUE_${jsonValueIndex}_`)
236
+ },
237
+ RegExpLiteral(path) {
238
+ path.node.pattern = replaceUnsafeStrings(uniqueID, path.node.pattern)
239
+ delete path.node.extra
308
240
  }
309
- else {
241
+ })
242
+ path.skip()
243
+ }
244
+ })
245
+ await Promise.all(promises)
246
+ const functionDeclaration = file.program.body[0]
247
+ assert("FunctionDeclaration" == functionDeclaration.type, "src/processScript/minify.ts:363:61")
248
+ if (jsonValues.length) {
249
+ hasComment = !0
250
+ if (1 == jsonValues.length)
251
+ if ("string" != typeof jsonValues[0] || jsonValues[0].includes("\n") || jsonValues[0].includes("\t")) {
310
252
  const variableDeclaration = t.variableDeclaration("let", [
311
253
  t.variableDeclarator(
312
- t.arrayPattern(
313
- jsonValues.map((_, index) => t.identifier(`_${uniqueID}_JSON_VALUE_${index}_`))
314
- ),
254
+ t.identifier(`_${uniqueID}_JSON_VALUE_0_`),
315
255
  t.callExpression(t.memberExpression(t.identifier("JSON"), t.identifier("parse")), [
316
256
  t.memberExpression(
317
257
  t.taggedTemplateExpression(
@@ -332,127 +272,173 @@ const { default: generate } = babelGenerator,
332
272
  t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`))
333
273
  )
334
274
  functionDeclaration.body.body.unshift(variableDeclaration)
335
- comment = JSON.stringify(jsonValues)
275
+ comment = JSON.stringify(jsonValues[0])
276
+ } else {
277
+ const variableDeclaration = t.variableDeclaration("let", [
278
+ t.variableDeclarator(
279
+ t.identifier(`_${uniqueID}_JSON_VALUE_0_`),
280
+ t.memberExpression(
281
+ t.taggedTemplateExpression(
282
+ t.memberExpression(
283
+ t.callExpression(t.identifier(`$${uniqueID}$SUBSCRIPT$scripts$quine$`), []),
284
+ t.identifier("split")
285
+ ),
286
+ t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
287
+ ),
288
+ t.identifier(`$${uniqueID}$SPLIT_INDEX$`),
289
+ !0
290
+ )
291
+ )
292
+ ])
293
+ undefinedIsReferenced &&
294
+ variableDeclaration.declarations.push(
295
+ t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`))
296
+ )
297
+ functionDeclaration.body.body.unshift(variableDeclaration)
298
+ comment = jsonValues[0]
336
299
  }
337
- } else
338
- undefinedIsReferenced &&
339
- functionDeclaration.body.body.unshift(
340
- t.variableDeclaration("let", [t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`))])
341
- )
342
- code = generate(file).code
343
- }
344
- code =
345
- (
346
- await terser.minify(code, {
347
- ecma: 2015,
348
- compress: {
349
- passes: 1 / 0,
350
- unsafe: !0,
351
- unsafe_arrows: !0,
352
- unsafe_comps: !0,
353
- unsafe_symbols: !0,
354
- unsafe_methods: !0,
355
- unsafe_proto: !0,
356
- unsafe_regexp: !0,
357
- unsafe_undefined: !0,
358
- sequences: !1
359
- },
360
- format: { semicolons: !1 },
361
- keep_classnames: !mangleNames,
362
- keep_fnames: !mangleNames
363
- })
364
- ).code || ""
365
- if (null != comment) {
366
- code = spliceString(
367
- code,
368
- `${autocomplete ? `//${autocomplete}\n` : ""}\n//\t${comment}\t\n`,
369
- getFunctionBodyStart(code) + 1
370
- )
371
- code = code.replace(
372
- `$${uniqueID}$SPLIT_INDEX$`,
373
- await minifyNumber(code.split("\t").findIndex(part => part == comment))
374
- )
375
- }
376
- if (1 == forceQuineCheats) return code
377
- assert(scriptBeforeJSONValueReplacement)
378
- return (
379
- countHackmudCharacters(scriptBeforeJSONValueReplacement) <=
380
- countHackmudCharacters(code) + Number(hasComment)
381
- ) ?
382
- scriptBeforeJSONValueReplacement
383
- : code
384
- },
385
- parseObjectExpression = (node, o) => {
386
- if (!node.properties.length) return !1
387
- for (const property of node.properties) {
388
- if ("ObjectProperty" != property.type || property.computed) return !1
389
- assert(
390
- "Identifier" == property.key.type ||
391
- "NumericLiteral" == property.key.type ||
392
- "StringLiteral" == property.key.type
393
- )
394
- if ("ArrayExpression" == property.value.type) {
395
- const childArray = []
396
- if (!parseArrayExpression(property.value, childArray)) return !1
397
- o["Identifier" == property.key.type ? property.key.name : property.key.value] = childArray
398
- } else if ("ObjectExpression" == property.value.type) {
399
- const childObject = {}
400
- if (!parseObjectExpression(property.value, childObject)) return !1
401
- o["Identifier" == property.key.type ? property.key.name : property.key.value] = childObject
402
- } else if ("NullLiteral" == property.value.type)
403
- o["Identifier" == property.key.type ? property.key.name : property.key.value] = null
404
- else if (
405
- "BooleanLiteral" == property.value.type ||
406
- "NumericLiteral" == property.value.type ||
407
- "StringLiteral" == property.value.type
408
- )
409
- o["Identifier" == property.key.type ? property.key.name : property.key.value] = property.value.value
410
300
  else {
411
- if ("TemplateLiteral" != property.value.type || property.value.expressions.length) return !1
412
- o["Identifier" == property.key.type ? property.key.name : property.key.value] =
413
- property.value.quasis[0].value.cooked
414
- }
415
- }
416
- return !0
417
- },
418
- parseArrayExpression = (node, o) => {
419
- if (!node.elements.length) return !1
420
- for (const element of node.elements) {
421
- if (!element) return !1
422
- if ("ArrayExpression" == element.type) {
423
- const childArray = []
424
- if (!parseArrayExpression(element, childArray)) return !1
425
- childArray.push(childArray)
426
- } else if ("ObjectExpression" == element.type) {
427
- const childObject = {}
428
- if (!parseObjectExpression(element, childObject)) return !1
429
- o.push(childObject)
430
- } else if ("NullLiteral" == element.type) o.push(null)
431
- else if (
432
- "BooleanLiteral" == element.type ||
433
- "NumericLiteral" == element.type ||
434
- "StringLiteral" == element.type
435
- )
436
- o.push(element.value)
437
- else {
438
- if ("TemplateLiteral" != element.type || element.expressions.length) return !1
439
- o.push(element.quasis[0].value.cooked)
301
+ const variableDeclaration = t.variableDeclaration("let", [
302
+ t.variableDeclarator(
303
+ t.arrayPattern(jsonValues.map((_, index) => t.identifier(`_${uniqueID}_JSON_VALUE_${index}_`))),
304
+ t.callExpression(t.memberExpression(t.identifier("JSON"), t.identifier("parse")), [
305
+ t.memberExpression(
306
+ t.taggedTemplateExpression(
307
+ t.memberExpression(
308
+ t.callExpression(t.identifier(`$${uniqueID}$SUBSCRIPT$scripts$quine$`), []),
309
+ t.identifier("split")
310
+ ),
311
+ t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
312
+ ),
313
+ t.identifier(`$${uniqueID}$SPLIT_INDEX$`),
314
+ !0
315
+ )
316
+ ])
317
+ )
318
+ ])
319
+ undefinedIsReferenced &&
320
+ variableDeclaration.declarations.push(t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`)))
321
+ functionDeclaration.body.body.unshift(variableDeclaration)
322
+ comment = JSON.stringify(jsonValues)
440
323
  }
324
+ } else
325
+ undefinedIsReferenced &&
326
+ functionDeclaration.body.body.unshift(
327
+ t.variableDeclaration("let", [t.variableDeclarator(t.identifier(`_${uniqueID}_UNDEFINED_`))])
328
+ )
329
+ code = generate(file).code
330
+ }
331
+ code =
332
+ (
333
+ await terser.minify(code, {
334
+ ecma: 2015,
335
+ compress: {
336
+ passes: 1 / 0,
337
+ unsafe: !0,
338
+ unsafe_arrows: !0,
339
+ unsafe_comps: !0,
340
+ unsafe_symbols: !0,
341
+ unsafe_methods: !0,
342
+ unsafe_proto: !0,
343
+ unsafe_regexp: !0,
344
+ unsafe_undefined: !0,
345
+ sequences: !1
346
+ },
347
+ format: { semicolons: !1, wrap_func_args: !1 },
348
+ keep_classnames: !mangleNames,
349
+ keep_fnames: !mangleNames
350
+ })
351
+ ).code || ""
352
+ if (null != comment) {
353
+ code = spliceString(
354
+ code,
355
+ `${autocomplete ? `//${autocomplete}\n` : ""}\n//\t${comment}\t\n`,
356
+ getFunctionBodyStart(code) + 1
357
+ )
358
+ code = code.replace(
359
+ `$${uniqueID}$SPLIT_INDEX$`,
360
+ await minifyNumber(code.split("\t").findIndex(part => part == comment))
361
+ )
362
+ }
363
+ if (1 == forceQuineCheats) return code
364
+ assert(scriptBeforeJSONValueReplacement, "src/processScript/minify.ts:494:43")
365
+ return (
366
+ countHackmudCharacters(scriptBeforeJSONValueReplacement) <=
367
+ countHackmudCharacters(code) + Number(hasComment)
368
+ ) ?
369
+ scriptBeforeJSONValueReplacement
370
+ : code
371
+ }
372
+ function parseObjectExpression(node, o) {
373
+ if (!node.properties.length) return !1
374
+ for (const property of node.properties) {
375
+ if ("ObjectProperty" != property.type || property.computed) return !1
376
+ assert(
377
+ "Identifier" == property.key.type ||
378
+ "NumericLiteral" == property.key.type ||
379
+ "StringLiteral" == property.key.type,
380
+ "src/processScript/minify.ts:516:4"
381
+ )
382
+ if ("ArrayExpression" == property.value.type) {
383
+ const childArray = []
384
+ if (property.value.elements.length && !parseArrayExpression(property.value, childArray)) return !1
385
+ o["Identifier" == property.key.type ? property.key.name : property.key.value] = childArray
386
+ } else if ("ObjectExpression" == property.value.type) {
387
+ const childObject = {}
388
+ if (property.value.properties.length && !parseObjectExpression(property.value, childObject)) return !1
389
+ o["Identifier" == property.key.type ? property.key.name : property.key.value] = childObject
390
+ } else if ("NullLiteral" == property.value.type)
391
+ o["Identifier" == property.key.type ? property.key.name : property.key.value] = null
392
+ else if (
393
+ "BooleanLiteral" == property.value.type ||
394
+ "NumericLiteral" == property.value.type ||
395
+ "StringLiteral" == property.value.type
396
+ )
397
+ o["Identifier" == property.key.type ? property.key.name : property.key.value] = property.value.value
398
+ else {
399
+ if ("TemplateLiteral" != property.value.type || property.value.expressions.length) return !1
400
+ o["Identifier" == property.key.type ? property.key.name : property.key.value] =
401
+ property.value.quasis[0].value.cooked
441
402
  }
442
- return !0
443
- },
444
- minifyNumber = async number =>
445
- /\$\((?<number>.+)\)/.exec((await terser.minify(`$(${number})`, { ecma: 2015 })).code).groups.number,
446
- getFunctionBodyStart = code => {
447
- const tokens = tokenizer(code, { ecmaVersion: 2015 })
448
- tokens.getToken()
449
- tokens.getToken()
450
- tokens.getToken()
451
- let nests = 1
452
- for (; nests; ) {
453
- const token = tokens.getToken()
454
- token.type == tokTypes.parenL ? nests++ : token.type == tokTypes.parenR && nests--
403
+ }
404
+ return !0
405
+ }
406
+ function parseArrayExpression(node, o) {
407
+ if (!node.elements.length) return !1
408
+ for (const element of node.elements) {
409
+ if (!element) return !1
410
+ if ("ArrayExpression" == element.type) {
411
+ const childArray = []
412
+ if (!element.elements.length && parseArrayExpression(element, childArray)) return !1
413
+ o.push(childArray)
414
+ } else if ("ObjectExpression" == element.type) {
415
+ const childObject = {}
416
+ if (element.properties.length && !parseObjectExpression(element, childObject)) return !1
417
+ o.push(childObject)
418
+ } else if ("NullLiteral" == element.type) o.push(null)
419
+ else if (
420
+ "BooleanLiteral" == element.type ||
421
+ "NumericLiteral" == element.type ||
422
+ "StringLiteral" == element.type
423
+ )
424
+ o.push(element.value)
425
+ else {
426
+ if ("TemplateLiteral" != element.type || element.expressions.length) return !1
427
+ o.push(element.quasis[0].value.cooked)
455
428
  }
456
- return tokens.getToken().start
457
429
  }
458
- export { minify as default, minify }
430
+ return !0
431
+ }
432
+ function getFunctionBodyStart(code) {
433
+ const tokens = tokenizer(code, { ecmaVersion: 2015 })
434
+ tokens.getToken()
435
+ tokens.getToken()
436
+ tokens.getToken()
437
+ let nests = 1
438
+ for (; nests; ) {
439
+ const token = tokens.getToken()
440
+ token.type == tokTypes.parenL ? nests++ : token.type == tokTypes.parenR && nests--
441
+ }
442
+ return tokens.getToken().start
443
+ }
444
+ export { minify }