hackmud-script-manager 0.20.4-459d480 → 0.20.4-52a588b
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.
- package/README.md +4 -0
- package/bin/hsm.js +194 -247
- package/env.d.ts +159 -156
- package/generateTypeDeclaration.js +2 -1
- package/index.js +2 -1
- package/package.json +39 -39
- package/processScript/index.js +3 -3
- package/processScript/minify.js +11 -17
- package/processScript/postprocess.d.ts +1 -1
- package/processScript/postprocess.js +3 -3
- package/processScript/preprocess.js +5 -3
- package/processScript/transform.js +65 -90
- package/push.js +4 -4
- package/watch.js +9 -7
package/processScript/minify.js
CHANGED
@@ -43,15 +43,6 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
43
43
|
)
|
44
44
|
}
|
45
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
46
|
const jsonValues = []
|
56
47
|
let scriptBeforeJSONValueReplacement,
|
57
48
|
comment,
|
@@ -61,7 +52,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
61
52
|
traverse(fileBeforeJSONValueReplacement, {
|
62
53
|
MemberExpression({ node: memberExpression }) {
|
63
54
|
if (!memberExpression.computed) {
|
64
|
-
assert("Identifier" == memberExpression.property.type, "src/processScript/minify.ts:
|
55
|
+
assert("Identifier" == memberExpression.property.type, "src/processScript/minify.ts:115:60")
|
65
56
|
if ("prototype" == memberExpression.property.name) {
|
66
57
|
memberExpression.computed = !0
|
67
58
|
memberExpression.property = t.identifier(`_${uniqueId}_PROTOTYPE_PROPERTY_`)
|
@@ -173,7 +164,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
173
164
|
},
|
174
165
|
MemberExpression({ node: memberExpression }) {
|
175
166
|
if (!memberExpression.computed) {
|
176
|
-
assert("Identifier" == memberExpression.property.type, "src/processScript/minify.ts:
|
167
|
+
assert("Identifier" == memberExpression.property.type, "src/processScript/minify.ts:249:62")
|
177
168
|
if (!(memberExpression.property.name.length < 3)) {
|
178
169
|
memberExpression.computed = !0
|
179
170
|
memberExpression.property = t.stringLiteral(memberExpression.property.name)
|
@@ -247,7 +238,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
247
238
|
})
|
248
239
|
await Promise.all(promises)
|
249
240
|
const functionDeclaration = file.program.body[0]
|
250
|
-
assert("FunctionDeclaration" == functionDeclaration.type, "src/processScript/minify.ts:
|
241
|
+
assert("FunctionDeclaration" == functionDeclaration.type, "src/processScript/minify.ts:354:61")
|
251
242
|
if (jsonValues.length) {
|
252
243
|
hasComment = !0
|
253
244
|
if (1 == jsonValues.length)
|
@@ -259,7 +250,10 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
259
250
|
t.memberExpression(
|
260
251
|
t.taggedTemplateExpression(
|
261
252
|
t.memberExpression(
|
262
|
-
t.callExpression(
|
253
|
+
t.callExpression(
|
254
|
+
t.identifier(`$${uniqueId}$4$SUBSCRIPT$scripts$quine$`),
|
255
|
+
[]
|
256
|
+
),
|
263
257
|
t.identifier("split")
|
264
258
|
),
|
265
259
|
t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
|
@@ -283,7 +277,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
283
277
|
t.memberExpression(
|
284
278
|
t.taggedTemplateExpression(
|
285
279
|
t.memberExpression(
|
286
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$scripts$quine$`), []),
|
280
|
+
t.callExpression(t.identifier(`$${uniqueId}$4$SUBSCRIPT$scripts$quine$`), []),
|
287
281
|
t.identifier("split")
|
288
282
|
),
|
289
283
|
t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
|
@@ -308,7 +302,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
308
302
|
t.memberExpression(
|
309
303
|
t.taggedTemplateExpression(
|
310
304
|
t.memberExpression(
|
311
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$scripts$quine$`), []),
|
305
|
+
t.callExpression(t.identifier(`$${uniqueId}$4$SUBSCRIPT$scripts$quine$`), []),
|
312
306
|
t.identifier("split")
|
313
307
|
),
|
314
308
|
t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
|
@@ -364,7 +358,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
364
358
|
)
|
365
359
|
}
|
366
360
|
if (1 == forceQuineCheats) return code
|
367
|
-
assert(scriptBeforeJSONValueReplacement, "src/processScript/minify.ts:
|
361
|
+
assert(scriptBeforeJSONValueReplacement, "src/processScript/minify.ts:485:43")
|
368
362
|
return (
|
369
363
|
countHackmudCharacters(scriptBeforeJSONValueReplacement) <=
|
370
364
|
countHackmudCharacters(code) + Number(hasComment)
|
@@ -380,7 +374,7 @@ function parseObjectExpression(node, o) {
|
|
380
374
|
"Identifier" == property.key.type ||
|
381
375
|
"NumericLiteral" == property.key.type ||
|
382
376
|
"StringLiteral" == property.key.type,
|
383
|
-
"src/processScript/minify.ts:
|
377
|
+
"src/processScript/minify.ts:507:4"
|
384
378
|
)
|
385
379
|
if ("ArrayExpression" == property.value.type) {
|
386
380
|
const childArray = []
|
@@ -1 +1 @@
|
|
1
|
-
export declare const postprocess: (code: string,
|
1
|
+
export declare const postprocess: (code: string, uniqueId: string) => string;
|
@@ -1,12 +1,12 @@
|
|
1
|
-
const postprocess = (code,
|
1
|
+
const postprocess = (code, uniqueId) =>
|
2
2
|
code
|
3
|
-
.replace(/^function\s
|
3
|
+
.replace(/^function\s*[\w$]+\(/, "function(")
|
4
4
|
.replace(RegExp(`\\$${uniqueId}\\$\\\\(?:\\\\)?\\$SC_DOLLAR\\$`, "g"), "S\\C$")
|
5
5
|
.replace(RegExp(`\\$${uniqueId}\\$\\\\(?:\\\\)?\\$DB_DOLLAR\\$`, "g"), "D\\B$")
|
6
6
|
.replace(RegExp(`\\$${uniqueId}\\$\\\\(?:\\\\)?\\$D\\$`, "g"), "_\\_D_S")
|
7
7
|
.replace(RegExp(`\\$${uniqueId}\\$\\\\(?:\\\\)?\\$FMCL\\$`, "g"), "_\\_FMCL_")
|
8
8
|
.replace(RegExp(`\\$${uniqueId}\\$\\\\(?:\\\\)?\\$G\\$`, "g"), "_\\_G_")
|
9
|
-
.replace(RegExp(`\\$${uniqueId}\\$SUBSCRIPT\\$(\\w+)\\$(\\w+)\\$`, "g"),
|
9
|
+
.replace(RegExp(`\\$${uniqueId}\\$(\\d)\\$SUBSCRIPT\\$(\\w+)\\$(\\w+)\\$`, "g"), "#$1s.$2.$3")
|
10
10
|
.replace(RegExp(`\\$${uniqueId}\\$DEBUG\\$`, "g"), "#D")
|
11
11
|
.replace(RegExp(`\\$${uniqueId}\\$FMCL\\$`, "g"), "#FMCL")
|
12
12
|
.replace(RegExp(`\\$${uniqueId}\\$GLOBAL\\$`, "g"), "#G")
|
@@ -98,8 +98,10 @@ async function preprocess(code, { uniqueId = "00000000000" } = {}) {
|
|
98
98
|
t.stringLiteral(resolve("proxy-polyfill/src/proxy.js", import.meta.url).slice(7))
|
99
99
|
)
|
100
100
|
)
|
101
|
-
|
102
|
-
|
103
|
-
|
101
|
+
if (1 == program.node.body.length && "FunctionDeclaration" == program.node.body[0].type)
|
102
|
+
throw Error(
|
103
|
+
"Scripts that only contain a single function declaration are no longer supported.\nPrefix the function declaration with `export default`."
|
104
|
+
)
|
105
|
+
return { code: generate(file).code }
|
104
106
|
}
|
105
107
|
export { preprocess }
|
@@ -22,9 +22,7 @@ const { default: traverse } = babelTraverse,
|
|
22
22
|
"BigInt"
|
23
23
|
]
|
24
24
|
function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scriptName, seclevel = 4 }) {
|
25
|
-
const topFunctionName = `_${uniqueId}_SCRIPT_
|
26
|
-
exports = new Map(),
|
27
|
-
liveExports = new Map()
|
25
|
+
const topFunctionName = `_${uniqueId}_SCRIPT_`
|
28
26
|
let program
|
29
27
|
traverse(file, {
|
30
28
|
Program(path) {
|
@@ -70,30 +68,30 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
70
68
|
const referencePath = FunctionReferencePaths[0]
|
71
69
|
assert(
|
72
70
|
"MemberExpression" == referencePath.parent.type,
|
73
|
-
"src/processScript/transform.ts:
|
71
|
+
"src/processScript/transform.ts:103:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
74
72
|
)
|
75
73
|
assert(
|
76
74
|
"Identifier" == referencePath.parent.property.type,
|
77
|
-
"src/processScript/transform.ts:
|
75
|
+
"src/processScript/transform.ts:108:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
78
76
|
)
|
79
77
|
assert(
|
80
78
|
"prototype" == referencePath.parent.property.name,
|
81
|
-
"src/processScript/transform.ts:
|
79
|
+
"src/processScript/transform.ts:113:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
82
80
|
)
|
83
81
|
referencePath.parentPath.replaceWith(createGetFunctionPrototypeNode())
|
84
82
|
} else {
|
85
83
|
for (const referencePath of FunctionReferencePaths) {
|
86
84
|
assert(
|
87
85
|
"MemberExpression" == referencePath.parent.type,
|
88
|
-
"src/processScript/transform.ts:
|
86
|
+
"src/processScript/transform.ts:121:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
89
87
|
)
|
90
88
|
assert(
|
91
89
|
"Identifier" == referencePath.parent.property.type,
|
92
|
-
"src/processScript/transform.ts:
|
90
|
+
"src/processScript/transform.ts:126:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
93
91
|
)
|
94
92
|
assert(
|
95
93
|
"prototype" == referencePath.parent.property.name,
|
96
|
-
"src/processScript/transform.ts:
|
94
|
+
"src/processScript/transform.ts:131:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
97
95
|
)
|
98
96
|
functionDotPrototypeIsReferencedMultipleTimes = !0
|
99
97
|
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_FUNCTION_DOT_PROTOTYPE_`))
|
@@ -101,40 +99,40 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
101
99
|
functionDotPrototypeIsReferencedMultipleTimes = !0
|
102
100
|
}
|
103
101
|
}
|
104
|
-
const neededSubscriptLets = new
|
102
|
+
const neededSubscriptLets = new Map()
|
105
103
|
let detectedSeclevel = 4
|
106
104
|
for (const fakeSubscriptObjectName of ["$fs", "$4s", "$s"])
|
107
|
-
program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName)
|
105
|
+
program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName, 4)
|
108
106
|
for (const fakeSubscriptObjectName of ["$hs", "$3s"])
|
109
107
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
110
108
|
detectedSeclevel = 3
|
111
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
109
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 3)
|
112
110
|
}
|
113
111
|
for (const fakeSubscriptObjectName of ["$ms", "$2s"])
|
114
112
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
115
113
|
detectedSeclevel = 2
|
116
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
114
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 2)
|
117
115
|
}
|
118
116
|
for (const fakeSubscriptObjectName of ["$ls", "$1s"])
|
119
117
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
120
118
|
detectedSeclevel = 1
|
121
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
119
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 1)
|
122
120
|
}
|
123
121
|
for (const fakeSubscriptObjectName of ["$ns", "$0s"])
|
124
122
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
125
123
|
detectedSeclevel = 0
|
126
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
124
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 0)
|
127
125
|
}
|
128
126
|
seclevel = Math.min(seclevel, detectedSeclevel)
|
129
127
|
const neededDbMethodLets = new Set()
|
130
128
|
if (program.scope.hasGlobal("$db"))
|
131
129
|
for (const referencePath of getReferencePathsToGlobal("$db", program)) {
|
132
|
-
assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:
|
133
|
-
assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:
|
130
|
+
assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:185:69")
|
131
|
+
assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:186:72")
|
134
132
|
const databaseOpMethodName = referencePath.parentPath.node.property.name
|
135
133
|
assert(
|
136
134
|
validDBMethods.includes(databaseOpMethodName),
|
137
|
-
`src/processScript/transform.ts:
|
135
|
+
`src/processScript/transform.ts:192:8 invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
|
138
136
|
)
|
139
137
|
if ("CallExpression" == referencePath.parentPath.parentPath?.type)
|
140
138
|
referencePath.parentPath.replaceWith(t.identifier(`$${uniqueId}$DB$${databaseOpMethodName}$`))
|
@@ -157,9 +155,10 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
157
155
|
if (program.scope.hasGlobal("$FMCL"))
|
158
156
|
for (const referencePath of getReferencePathsToGlobal("$FMCL", program))
|
159
157
|
referencePath.replaceWith(t.identifier(`$${uniqueId}$FMCL$`))
|
160
|
-
|
158
|
+
let needG = program.scope.hasGlobal("$G")
|
159
|
+
if (needG)
|
161
160
|
for (const referencePath of getReferencePathsToGlobal("$G", program))
|
162
|
-
referencePath.replaceWith(t.identifier(
|
161
|
+
referencePath.replaceWith(t.identifier(`_${uniqueId}_G_`))
|
163
162
|
if (program.scope.hasGlobal("_SECLEVEL"))
|
164
163
|
for (const referencePath of getReferencePathsToGlobal("_SECLEVEL", program))
|
165
164
|
referencePath.replaceWith(t.numericLiteral(seclevel))
|
@@ -193,11 +192,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
193
192
|
"ExportSpecifier" == specifier.type,
|
194
193
|
`src/processScript/transform.ts:276:51 ${specifier.type} is currently unsupported`
|
195
194
|
)
|
196
|
-
|
197
|
-
"
|
198
|
-
|
199
|
-
|
200
|
-
|
195
|
+
if (
|
196
|
+
"default" !=
|
197
|
+
("Identifier" == specifier.exported.type ? specifier.exported.name : specifier.exported.value)
|
198
|
+
)
|
199
|
+
throw Error("Only default exports are supported")
|
200
|
+
exportDefaultName = specifier.local.name
|
201
201
|
}
|
202
202
|
}
|
203
203
|
const globalBlock = t.blockStatement([])
|
@@ -223,10 +223,6 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
223
223
|
t.returnStatement(t.callExpression(t.identifier(exportDefaultName), []))
|
224
224
|
])
|
225
225
|
))
|
226
|
-
if ("const" != statement.kind && exports.has(identifierName)) {
|
227
|
-
liveExports.set(identifierName, exports.get(identifierName))
|
228
|
-
exports.delete(identifierName)
|
229
|
-
}
|
230
226
|
globalBlock.body.push(
|
231
227
|
t.variableDeclaration("let", [t.variableDeclarator(t.identifier(identifierName))])
|
232
228
|
)
|
@@ -291,34 +287,16 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
291
287
|
}
|
292
288
|
program.node.body = [mainFunction]
|
293
289
|
if (globalBlock.body.length) {
|
294
|
-
;(exports.size || liveExports.size) &&
|
295
|
-
mainFunction.body.body.push(
|
296
|
-
t.returnStatement(
|
297
|
-
t.objectExpression([
|
298
|
-
...[...exports].map(([local, exported]) =>
|
299
|
-
t.objectProperty(t.identifier(exported), t.identifier(local))
|
300
|
-
),
|
301
|
-
...[...liveExports].map(([local, exported]) =>
|
302
|
-
t.objectMethod(
|
303
|
-
"get",
|
304
|
-
t.identifier(exported),
|
305
|
-
[],
|
306
|
-
t.blockStatement([t.returnStatement(t.identifier(local))])
|
307
|
-
)
|
308
|
-
)
|
309
|
-
])
|
310
|
-
)
|
311
|
-
)
|
312
290
|
program.scope.crawl()
|
313
291
|
const globalBlockVariables = new Set()
|
314
292
|
let hoistedGlobalBlockFunctions = 0
|
315
293
|
for (const [globalBlockIndex, globalBlockStatement] of [...globalBlock.body.entries()].reverse())
|
316
294
|
if ("VariableDeclaration" == globalBlockStatement.type) {
|
317
|
-
assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:
|
295
|
+
assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:390:59")
|
318
296
|
const declarator = globalBlockStatement.declarations[0]
|
319
297
|
assert(
|
320
298
|
"Identifier" == declarator.id.type,
|
321
|
-
`src/processScript/transform.ts:
|
299
|
+
`src/processScript/transform.ts:394:51 declarator.id.type was "${declarator.id.type}"`
|
322
300
|
)
|
323
301
|
program.scope.crawl()
|
324
302
|
if (program.scope.hasGlobal(declarator.id.name)) {
|
@@ -333,15 +311,16 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
333
311
|
Object.keys(program.scope.globals).some(global => globalBlockVariables.has(global))
|
334
312
|
) {
|
335
313
|
const binding = program.scope.getBinding(declarator.id.name)
|
336
|
-
assert(binding, "src/processScript/transform.ts:
|
314
|
+
assert(binding, "src/processScript/transform.ts:413:23")
|
337
315
|
for (const referencePath of binding.referencePaths) {
|
338
|
-
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:
|
316
|
+
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:416:56")
|
339
317
|
referencePath.replaceWith(
|
340
318
|
t.memberExpression(
|
341
|
-
t.identifier(
|
319
|
+
t.identifier(`_${uniqueId}_G_`),
|
342
320
|
t.identifier(referencePath.node.name)
|
343
321
|
)
|
344
322
|
)
|
323
|
+
needG = !0
|
345
324
|
}
|
346
325
|
for (const referencePath of binding.constantViolations)
|
347
326
|
if ("AssignmentExpression" == referencePath.node.type)
|
@@ -350,12 +329,13 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
350
329
|
clearObject(node)
|
351
330
|
Object.assign(
|
352
331
|
node,
|
353
|
-
t.memberExpression(t.identifier(
|
332
|
+
t.memberExpression(t.identifier(`_${uniqueId}_G_`), t.identifier(name))
|
354
333
|
)
|
334
|
+
needG = !0
|
355
335
|
}
|
356
336
|
globalBlockPath.remove()
|
357
337
|
globalBlockStatementPath.remove()
|
358
|
-
declarator.init
|
338
|
+
if (declarator.init) {
|
359
339
|
globalBlock.body.splice(
|
360
340
|
globalBlockIndex,
|
361
341
|
0,
|
@@ -363,13 +343,15 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
363
343
|
t.assignmentExpression(
|
364
344
|
"=",
|
365
345
|
t.memberExpression(
|
366
|
-
t.identifier(
|
346
|
+
t.identifier(`_${uniqueId}_G_`),
|
367
347
|
t.identifier(declarator.id.name)
|
368
348
|
),
|
369
349
|
declarator.init
|
370
350
|
)
|
371
351
|
)
|
372
352
|
)
|
353
|
+
needG = !0
|
354
|
+
}
|
373
355
|
} else {
|
374
356
|
globalBlockPath.remove()
|
375
357
|
globalBlockStatementPath.remove()
|
@@ -379,22 +361,20 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
379
361
|
} else globalBlockVariables.add(declarator.id.name)
|
380
362
|
} else if ("ClassDeclaration" == globalBlockStatement.type) {
|
381
363
|
program.scope.crawl()
|
382
|
-
assert(globalBlockStatement.id, "src/processScript/transform.ts:
|
364
|
+
assert(globalBlockStatement.id, "src/processScript/transform.ts:473:37")
|
383
365
|
if (program.scope.hasGlobal(globalBlockStatement.id.name)) {
|
384
366
|
globalBlock.body.splice(globalBlockIndex, 1)
|
385
367
|
const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
|
386
368
|
[globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
|
387
369
|
program.scope.crawl()
|
388
370
|
const binding = program.scope.getBinding(globalBlockStatement.id.name)
|
389
|
-
assert(binding, "src/processScript/transform.ts:
|
371
|
+
assert(binding, "src/processScript/transform.ts:485:22")
|
390
372
|
for (const referencePath of binding.referencePaths) {
|
391
|
-
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:
|
373
|
+
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:488:55")
|
392
374
|
referencePath.replaceWith(
|
393
|
-
t.memberExpression(
|
394
|
-
t.identifier(`$${uniqueId}$GLOBAL$`),
|
395
|
-
t.identifier(referencePath.node.name)
|
396
|
-
)
|
375
|
+
t.memberExpression(t.identifier(`_${uniqueId}_G_`), t.identifier(referencePath.node.name))
|
397
376
|
)
|
377
|
+
needG = !0
|
398
378
|
}
|
399
379
|
globalBlockPath.remove()
|
400
380
|
globalBlockStatementPath.remove()
|
@@ -405,7 +385,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
405
385
|
t.assignmentExpression(
|
406
386
|
"=",
|
407
387
|
t.memberExpression(
|
408
|
-
t.identifier(
|
388
|
+
t.identifier(`_${uniqueId}_G_`),
|
409
389
|
t.identifier(globalBlockStatement.id.name)
|
410
390
|
),
|
411
391
|
t.classExpression(
|
@@ -417,13 +397,9 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
417
397
|
)
|
418
398
|
)
|
419
399
|
)
|
400
|
+
needG = !0
|
420
401
|
}
|
421
402
|
}
|
422
|
-
if (program.scope.hasGlobal("_EXPORTS"))
|
423
|
-
for (const referencePath of getReferencePathsToGlobal("_EXPORTS", program))
|
424
|
-
referencePath.replaceWith(
|
425
|
-
t.arrayExpression([...exports.keys(), ...liveExports.keys()].map(name => t.stringLiteral(name)))
|
426
|
-
)
|
427
403
|
globalBlock.body.length &&
|
428
404
|
mainFunction.body.body.splice(
|
429
405
|
hoistedGlobalBlockFunctions,
|
@@ -522,12 +498,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
522
498
|
mainFunction.body.body.unshift(
|
523
499
|
t.variableDeclaration(
|
524
500
|
"let",
|
525
|
-
[...neededSubscriptLets].map(name =>
|
501
|
+
[...neededSubscriptLets].map(([name, seclevel]) =>
|
526
502
|
t.variableDeclarator(
|
527
503
|
t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`),
|
528
504
|
t.arrowFunctionExpression(
|
529
505
|
[t.restElement(t.identifier("args"))],
|
530
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$${name}$`), [
|
506
|
+
t.callExpression(t.identifier(`$${uniqueId}$${seclevel}$SUBSCRIPT$${name}$`), [
|
531
507
|
t.spreadElement(t.identifier("args"))
|
532
508
|
])
|
533
509
|
)
|
@@ -535,6 +511,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
535
511
|
)
|
536
512
|
)
|
537
513
|
)
|
514
|
+
needG &&
|
515
|
+
mainFunction.body.body.unshift(
|
516
|
+
t.variableDeclaration("let", [
|
517
|
+
t.variableDeclarator(t.identifier(`_${uniqueId}_G_`), t.identifier(`$${uniqueId}$GLOBAL$`))
|
518
|
+
])
|
519
|
+
)
|
538
520
|
traverse(file, {
|
539
521
|
BlockStatement({ node: blockStatement }) {
|
540
522
|
for (const [index, functionDeclaration] of blockStatement.body.entries())
|
@@ -555,7 +537,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
555
537
|
}
|
556
538
|
},
|
557
539
|
ClassBody({ node: classBody, scope, parent }) {
|
558
|
-
assert(t.isClass(parent), "src/processScript/transform.ts:
|
540
|
+
assert(t.isClass(parent), "src/processScript/transform.ts:658:30")
|
559
541
|
let thisIsReferenced = !1
|
560
542
|
for (const classMethod of classBody.body) {
|
561
543
|
if ("ClassMethod" != classMethod.type) continue
|
@@ -647,50 +629,43 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
647
629
|
})
|
648
630
|
return { file, seclevel }
|
649
631
|
function createGetFunctionPrototypeNode() {
|
650
|
-
|
651
|
-
if (!program.scope.hasOwnBinding(globalFunction))
|
652
|
-
return t.memberExpression(
|
653
|
-
t.memberExpression(t.identifier(globalFunction), t.identifier("constructor")),
|
654
|
-
t.identifier("prototype")
|
655
|
-
)
|
632
|
+
const name = globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
|
656
633
|
return t.memberExpression(
|
657
|
-
t.
|
658
|
-
|
659
|
-
t.identifier("constructor")
|
660
|
-
),
|
661
|
-
t.identifier("prototype")
|
634
|
+
name ? t.identifier(name) : t.arrowFunctionExpression([t.identifier("_")], t.identifier("_")),
|
635
|
+
t.identifier("__proto__")
|
662
636
|
)
|
663
637
|
}
|
664
|
-
function processFakeSubscriptObject(fakeSubscriptObjectName) {
|
638
|
+
function processFakeSubscriptObject(fakeSubscriptObjectName, seclevel) {
|
665
639
|
for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
|
666
|
-
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:
|
640
|
+
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:764:60")
|
667
641
|
assert("Identifier" == referencePath.parent.property.type)
|
668
642
|
assert(
|
669
643
|
"MemberExpression" == referencePath.parentPath.parentPath?.node.type,
|
670
|
-
"src/processScript/transform.ts:
|
644
|
+
"src/processScript/transform.ts:766:81"
|
671
645
|
)
|
672
646
|
assert(
|
673
647
|
"Identifier" == referencePath.parentPath.parentPath.node.property.type,
|
674
|
-
"src/processScript/transform.ts:
|
648
|
+
"src/processScript/transform.ts:767:83"
|
675
649
|
)
|
676
650
|
assert(
|
677
651
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
|
678
|
-
`src/processScript/transform.ts:
|
652
|
+
`src/processScript/transform.ts:771:8 invalid user "${referencePath.parent.property.name}" in subscript`
|
679
653
|
)
|
680
654
|
assert(
|
681
655
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
|
682
|
-
`src/processScript/transform.ts:
|
656
|
+
`src/processScript/transform.ts:776:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
|
683
657
|
)
|
684
658
|
if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
|
685
659
|
referencePath.parentPath.parentPath.replaceWith(
|
686
660
|
t.identifier(
|
687
|
-
`$${uniqueId}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
|
661
|
+
`$${uniqueId}$${seclevel}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
|
688
662
|
)
|
689
663
|
)
|
690
664
|
else {
|
691
665
|
const name = `${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}`
|
692
666
|
referencePath.parentPath.parentPath.replaceWith(t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`))
|
693
|
-
neededSubscriptLets.
|
667
|
+
const maxSecLevel = Math.max(neededSubscriptLets.get(name) || 0, seclevel)
|
668
|
+
neededSubscriptLets.set(name, maxSecLevel)
|
694
669
|
}
|
695
670
|
}
|
696
671
|
}
|
package/push.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { AutoMap } from "@samual/lib/AutoMap"
|
2
2
|
import { ensure, assert } from "@samual/lib/assert"
|
3
3
|
import { countHackmudCharacters } from "@samual/lib/countHackmudCharacters"
|
4
4
|
import { readDirectoryWithStats } from "@samual/lib/readDirectoryWithStats"
|
@@ -84,8 +84,8 @@ async function push(
|
|
84
84
|
return new NoUsersError(
|
85
85
|
"Could not find any users. Either provide the names of your users or log into a user in hackmud"
|
86
86
|
)
|
87
|
-
const usersToScriptsToPush = new
|
88
|
-
scriptNamesToUsers = new
|
87
|
+
const usersToScriptsToPush = new AutoMap(_user => new Map()),
|
88
|
+
scriptNamesToUsers = new AutoMap(_scriptName => new Set())
|
89
89
|
for (const script of scripts) {
|
90
90
|
const [user, scriptName] = script.split(".")
|
91
91
|
assert(user, "src/push.ts:105:16")
|
@@ -121,7 +121,7 @@ async function push(
|
|
121
121
|
for (const user of users)
|
122
122
|
if (!usersToScriptsToPush.get(user).has(scriptName))
|
123
123
|
return new NoScriptsError(`Could not find script ${user}.${scriptName} to push`)
|
124
|
-
const pathsToUsers = new
|
124
|
+
const pathsToUsers = new AutoMap(_path => new Set())
|
125
125
|
for (const [user, scriptsToPush] of usersToScriptsToPush)
|
126
126
|
for (const path of scriptsToPush.values()) pathsToUsers.get(path).add(user)
|
127
127
|
const allInfo = []
|
package/watch.js
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
import {
|
1
|
+
import { AutoMap } from "@samual/lib/AutoMap"
|
2
2
|
import { assert } from "@samual/lib/assert"
|
3
3
|
import { countHackmudCharacters } from "@samual/lib/countHackmudCharacters"
|
4
4
|
import { readDirectoryWithStats } from "@samual/lib/readDirectoryWithStats"
|
5
5
|
import { writeFilePersistent } from "@samual/lib/writeFilePersistent"
|
6
6
|
import { watch as watch$1 } from "chokidar"
|
7
|
-
import { readFile, writeFile } from "fs/promises"
|
7
|
+
import { stat, readFile, writeFile } from "fs/promises"
|
8
8
|
import { extname, basename, resolve } from "path"
|
9
9
|
import { supportedExtensions } from "./constants.js"
|
10
10
|
import { generateTypeDeclaration } from "./generateTypeDeclaration.js"
|
11
11
|
import { processScript } from "./processScript/index.js"
|
12
|
+
import "path/posix"
|
12
13
|
import "@babel/generator"
|
13
14
|
import "@babel/parser"
|
14
15
|
import "@babel/plugin-proposal-decorators"
|
@@ -58,7 +59,8 @@ async function watch(
|
|
58
59
|
} = {}
|
59
60
|
) {
|
60
61
|
if (!scripts.length) throw Error("scripts option was an empty array")
|
61
|
-
|
62
|
+
if (!(await stat(sourceDirectory)).isDirectory()) throw Error("Target folder must be a folder")
|
63
|
+
const scriptNamesToUsers = new AutoMap(_scriptName => new Set()),
|
62
64
|
wildScriptUsers = new Set(),
|
63
65
|
wildUserScripts = new Set()
|
64
66
|
let pushEverything = !1
|
@@ -90,7 +92,7 @@ async function watch(
|
|
90
92
|
)
|
91
93
|
)
|
92
94
|
return
|
93
|
-
const scriptNamesToUsersToSkip = new
|
95
|
+
const scriptNamesToUsersToSkip = new AutoMap(_scriptName => [])
|
94
96
|
await Promise.all(
|
95
97
|
(await readDirectoryWithStats(sourceDirectory)).map(async ({ stats, name, path }) => {
|
96
98
|
if (stats.isDirectory())
|
@@ -135,7 +137,7 @@ async function watch(
|
|
135
137
|
forceQuineCheats
|
136
138
|
}))
|
137
139
|
} catch (error) {
|
138
|
-
assert(error instanceof Error, "src/watch.ts:
|
140
|
+
assert(error instanceof Error, "src/watch.ts:146:36")
|
139
141
|
onPush?.({ path, users: [], characterCount: 0, error })
|
140
142
|
return
|
141
143
|
}
|
@@ -180,7 +182,7 @@ async function watch(
|
|
180
182
|
forceQuineCheats
|
181
183
|
}))
|
182
184
|
} catch (error) {
|
183
|
-
assert(error instanceof Error, "src/watch.ts:
|
185
|
+
assert(error instanceof Error, "src/watch.ts:182:35")
|
184
186
|
onPush?.({ path, users: [], characterCount: 0, error })
|
185
187
|
return
|
186
188
|
}
|
@@ -195,7 +197,7 @@ async function watch(
|
|
195
197
|
try {
|
196
198
|
await writeFile(typeDeclarationPath, typeDeclaration)
|
197
199
|
} catch (error) {
|
198
|
-
assert(error instanceof Error, "src/watch.ts:
|
200
|
+
assert(error instanceof Error, "src/watch.ts:215:35")
|
199
201
|
if ("EISDIR" != error.code) throw error
|
200
202
|
typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
|
201
203
|
await writeFile(typeDeclarationPath, typeDeclaration)
|