hackmud-script-manager 0.20.4-4605f71 → 0.20.4-484afbe
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 +291 -267
- package/env.d.ts +333 -276
- package/generateTypeDeclaration.js +2 -1
- package/index.js +2 -1
- package/package.json +38 -38
- 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 +102 -95
- package/push.js +4 -4
- package/watch.js +12 -9
@@ -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) {
|
@@ -49,6 +47,9 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
49
47
|
if (program.scope.hasGlobal("_SCRIPT_NAME"))
|
50
48
|
for (const referencePath of getReferencePathsToGlobal("_SCRIPT_NAME", program))
|
51
49
|
referencePath.replaceWith(t.stringLiteral(1 == scriptName ? `$${uniqueId}$SCRIPT_NAME$` : scriptName))
|
50
|
+
if (program.scope.hasGlobal("_SCRIPT_SUBNAME"))
|
51
|
+
for (const referencePath of getReferencePathsToGlobal("_SCRIPT_SUBNAME", program))
|
52
|
+
referencePath.replaceWith(t.stringLiteral(1 == scriptName ? `$${uniqueId}$SCRIPT_NAME$` : scriptName))
|
52
53
|
if (program.scope.hasGlobal("_FULL_SCRIPT_NAME"))
|
53
54
|
for (const referencePath of getReferencePathsToGlobal("_FULL_SCRIPT_NAME", program))
|
54
55
|
if (1 == scriptUser || 1 == scriptName)
|
@@ -70,30 +71,30 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
70
71
|
const referencePath = FunctionReferencePaths[0]
|
71
72
|
assert(
|
72
73
|
"MemberExpression" == referencePath.parent.type,
|
73
|
-
"src/processScript/transform.ts:
|
74
|
+
"src/processScript/transform.ts:108:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
74
75
|
)
|
75
76
|
assert(
|
76
77
|
"Identifier" == referencePath.parent.property.type,
|
77
|
-
"src/processScript/transform.ts:
|
78
|
+
"src/processScript/transform.ts:113:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
78
79
|
)
|
79
80
|
assert(
|
80
81
|
"prototype" == referencePath.parent.property.name,
|
81
|
-
"src/processScript/transform.ts:
|
82
|
+
"src/processScript/transform.ts:118:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
82
83
|
)
|
83
84
|
referencePath.parentPath.replaceWith(createGetFunctionPrototypeNode())
|
84
85
|
} else {
|
85
86
|
for (const referencePath of FunctionReferencePaths) {
|
86
87
|
assert(
|
87
88
|
"MemberExpression" == referencePath.parent.type,
|
88
|
-
"src/processScript/transform.ts:
|
89
|
+
"src/processScript/transform.ts:126:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
89
90
|
)
|
90
91
|
assert(
|
91
92
|
"Identifier" == referencePath.parent.property.type,
|
92
|
-
"src/processScript/transform.ts:
|
93
|
+
"src/processScript/transform.ts:131:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
93
94
|
)
|
94
95
|
assert(
|
95
96
|
"prototype" == referencePath.parent.property.name,
|
96
|
-
"src/processScript/transform.ts:
|
97
|
+
"src/processScript/transform.ts:136:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
97
98
|
)
|
98
99
|
functionDotPrototypeIsReferencedMultipleTimes = !0
|
99
100
|
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_FUNCTION_DOT_PROTOTYPE_`))
|
@@ -101,40 +102,40 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
101
102
|
functionDotPrototypeIsReferencedMultipleTimes = !0
|
102
103
|
}
|
103
104
|
}
|
104
|
-
const neededSubscriptLets = new
|
105
|
+
const neededSubscriptLets = new Map()
|
105
106
|
let detectedSeclevel = 4
|
106
107
|
for (const fakeSubscriptObjectName of ["$fs", "$4s", "$s"])
|
107
|
-
program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName)
|
108
|
+
program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName, 4)
|
108
109
|
for (const fakeSubscriptObjectName of ["$hs", "$3s"])
|
109
110
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
110
111
|
detectedSeclevel = 3
|
111
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
112
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 3)
|
112
113
|
}
|
113
114
|
for (const fakeSubscriptObjectName of ["$ms", "$2s"])
|
114
115
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
115
116
|
detectedSeclevel = 2
|
116
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
117
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 2)
|
117
118
|
}
|
118
119
|
for (const fakeSubscriptObjectName of ["$ls", "$1s"])
|
119
120
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
120
121
|
detectedSeclevel = 1
|
121
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
122
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 1)
|
122
123
|
}
|
123
124
|
for (const fakeSubscriptObjectName of ["$ns", "$0s"])
|
124
125
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
125
126
|
detectedSeclevel = 0
|
126
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
127
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 0)
|
127
128
|
}
|
128
129
|
seclevel = Math.min(seclevel, detectedSeclevel)
|
129
130
|
const neededDbMethodLets = new Set()
|
130
131
|
if (program.scope.hasGlobal("$db"))
|
131
132
|
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:
|
133
|
+
assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:190:69")
|
134
|
+
assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:191:72")
|
134
135
|
const databaseOpMethodName = referencePath.parentPath.node.property.name
|
135
136
|
assert(
|
136
137
|
validDBMethods.includes(databaseOpMethodName),
|
137
|
-
`src/processScript/transform.ts:
|
138
|
+
`src/processScript/transform.ts:197:8 invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
|
138
139
|
)
|
139
140
|
if ("CallExpression" == referencePath.parentPath.parentPath?.type)
|
140
141
|
referencePath.parentPath.replaceWith(t.identifier(`$${uniqueId}$DB$${databaseOpMethodName}$`))
|
@@ -157,27 +158,32 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
157
158
|
if (program.scope.hasGlobal("$FMCL"))
|
158
159
|
for (const referencePath of getReferencePathsToGlobal("$FMCL", program))
|
159
160
|
referencePath.replaceWith(t.identifier(`$${uniqueId}$FMCL$`))
|
160
|
-
|
161
|
+
let needG = program.scope.hasGlobal("$G")
|
162
|
+
if (needG)
|
161
163
|
for (const referencePath of getReferencePathsToGlobal("$G", program))
|
162
|
-
referencePath.replaceWith(t.identifier(
|
164
|
+
referencePath.replaceWith(t.identifier(`_${uniqueId}_G_`))
|
163
165
|
if (program.scope.hasGlobal("_SECLEVEL"))
|
164
166
|
for (const referencePath of getReferencePathsToGlobal("_SECLEVEL", program))
|
165
167
|
referencePath.replaceWith(t.numericLiteral(seclevel))
|
166
|
-
let needGetPrototypeOf = !1
|
168
|
+
let needGetPrototypeOf = !1,
|
169
|
+
needHasOwn = !1
|
167
170
|
if (program.scope.hasGlobal("Object"))
|
168
171
|
for (const referencePath of getReferencePathsToGlobal("Object", program))
|
169
172
|
if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
|
170
|
-
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:
|
173
|
+
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:247:64")
|
171
174
|
if ("getPrototypeOf" == referencePath.parent.property.name) {
|
172
175
|
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_GET_PROTOTYPE_OF_`))
|
173
176
|
needGetPrototypeOf = !0
|
177
|
+
} else if ("hasOwn" == referencePath.parent.property.name) {
|
178
|
+
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_HAS_OWN_`))
|
179
|
+
needHasOwn = !0
|
174
180
|
}
|
175
181
|
}
|
176
182
|
const consoleMethodsReferenced = new Set()
|
177
183
|
if (program.scope.hasGlobal("console"))
|
178
184
|
for (const referencePath of getReferencePathsToGlobal("console", program))
|
179
185
|
if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
|
180
|
-
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:
|
186
|
+
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:265:64")
|
181
187
|
referencePath.parentPath.replaceWith(
|
182
188
|
t.identifier(`_${uniqueId}_CONSOLE_METHOD_${referencePath.parent.property.name}_`)
|
183
189
|
)
|
@@ -185,19 +191,20 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
185
191
|
}
|
186
192
|
const lastStatement = program.node.body.at(-1)
|
187
193
|
let exportDefaultName
|
188
|
-
assert(lastStatement, "src/processScript/transform.ts:
|
194
|
+
assert(lastStatement, "src/processScript/transform.ts:279:27 program is empty")
|
189
195
|
if ("ExportNamedDeclaration" == lastStatement.type) {
|
190
196
|
program.node.body.pop()
|
191
197
|
for (const specifier of lastStatement.specifiers) {
|
192
198
|
assert(
|
193
199
|
"ExportSpecifier" == specifier.type,
|
194
|
-
`src/processScript/transform.ts:
|
200
|
+
`src/processScript/transform.ts:285:51 ${specifier.type} is currently unsupported`
|
201
|
+
)
|
202
|
+
if (
|
203
|
+
"default" !=
|
204
|
+
("Identifier" == specifier.exported.type ? specifier.exported.name : specifier.exported.value)
|
195
205
|
)
|
196
|
-
|
197
|
-
|
198
|
-
"default" == exportedName ?
|
199
|
-
(exportDefaultName = specifier.local.name)
|
200
|
-
: exports.set(specifier.local.name, exportedName)
|
206
|
+
throw Error("Only default exports are supported")
|
207
|
+
exportDefaultName = specifier.local.name
|
201
208
|
}
|
202
209
|
}
|
203
210
|
const globalBlock = t.blockStatement([])
|
@@ -223,10 +230,6 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
223
230
|
t.returnStatement(t.callExpression(t.identifier(exportDefaultName), []))
|
224
231
|
])
|
225
232
|
))
|
226
|
-
if ("const" != statement.kind && exports.has(identifierName)) {
|
227
|
-
liveExports.set(identifierName, exports.get(identifierName))
|
228
|
-
exports.delete(identifierName)
|
229
|
-
}
|
230
233
|
globalBlock.body.push(
|
231
234
|
t.variableDeclaration("let", [t.variableDeclarator(t.identifier(identifierName))])
|
232
235
|
)
|
@@ -291,34 +294,16 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
291
294
|
}
|
292
295
|
program.node.body = [mainFunction]
|
293
296
|
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
297
|
program.scope.crawl()
|
313
298
|
const globalBlockVariables = new Set()
|
314
299
|
let hoistedGlobalBlockFunctions = 0
|
315
300
|
for (const [globalBlockIndex, globalBlockStatement] of [...globalBlock.body.entries()].reverse())
|
316
301
|
if ("VariableDeclaration" == globalBlockStatement.type) {
|
317
|
-
assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:
|
302
|
+
assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:399:59")
|
318
303
|
const declarator = globalBlockStatement.declarations[0]
|
319
304
|
assert(
|
320
305
|
"Identifier" == declarator.id.type,
|
321
|
-
`src/processScript/transform.ts:
|
306
|
+
`src/processScript/transform.ts:403:51 declarator.id.type was "${declarator.id.type}"`
|
322
307
|
)
|
323
308
|
program.scope.crawl()
|
324
309
|
if (program.scope.hasGlobal(declarator.id.name)) {
|
@@ -333,15 +318,16 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
333
318
|
Object.keys(program.scope.globals).some(global => globalBlockVariables.has(global))
|
334
319
|
) {
|
335
320
|
const binding = program.scope.getBinding(declarator.id.name)
|
336
|
-
assert(binding, "src/processScript/transform.ts:
|
321
|
+
assert(binding, "src/processScript/transform.ts:422:23")
|
337
322
|
for (const referencePath of binding.referencePaths) {
|
338
|
-
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:
|
323
|
+
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:425:56")
|
339
324
|
referencePath.replaceWith(
|
340
325
|
t.memberExpression(
|
341
|
-
t.identifier(
|
326
|
+
t.identifier(`_${uniqueId}_G_`),
|
342
327
|
t.identifier(referencePath.node.name)
|
343
328
|
)
|
344
329
|
)
|
330
|
+
needG = !0
|
345
331
|
}
|
346
332
|
for (const referencePath of binding.constantViolations)
|
347
333
|
if ("AssignmentExpression" == referencePath.node.type)
|
@@ -350,12 +336,13 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
350
336
|
clearObject(node)
|
351
337
|
Object.assign(
|
352
338
|
node,
|
353
|
-
t.memberExpression(t.identifier(
|
339
|
+
t.memberExpression(t.identifier(`_${uniqueId}_G_`), t.identifier(name))
|
354
340
|
)
|
341
|
+
needG = !0
|
355
342
|
}
|
356
343
|
globalBlockPath.remove()
|
357
344
|
globalBlockStatementPath.remove()
|
358
|
-
declarator.init
|
345
|
+
if (declarator.init) {
|
359
346
|
globalBlock.body.splice(
|
360
347
|
globalBlockIndex,
|
361
348
|
0,
|
@@ -363,13 +350,15 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
363
350
|
t.assignmentExpression(
|
364
351
|
"=",
|
365
352
|
t.memberExpression(
|
366
|
-
t.identifier(
|
353
|
+
t.identifier(`_${uniqueId}_G_`),
|
367
354
|
t.identifier(declarator.id.name)
|
368
355
|
),
|
369
356
|
declarator.init
|
370
357
|
)
|
371
358
|
)
|
372
359
|
)
|
360
|
+
needG = !0
|
361
|
+
}
|
373
362
|
} else {
|
374
363
|
globalBlockPath.remove()
|
375
364
|
globalBlockStatementPath.remove()
|
@@ -379,22 +368,20 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
379
368
|
} else globalBlockVariables.add(declarator.id.name)
|
380
369
|
} else if ("ClassDeclaration" == globalBlockStatement.type) {
|
381
370
|
program.scope.crawl()
|
382
|
-
assert(globalBlockStatement.id, "src/processScript/transform.ts:
|
371
|
+
assert(globalBlockStatement.id, "src/processScript/transform.ts:482:37")
|
383
372
|
if (program.scope.hasGlobal(globalBlockStatement.id.name)) {
|
384
373
|
globalBlock.body.splice(globalBlockIndex, 1)
|
385
374
|
const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
|
386
375
|
[globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
|
387
376
|
program.scope.crawl()
|
388
377
|
const binding = program.scope.getBinding(globalBlockStatement.id.name)
|
389
|
-
assert(binding, "src/processScript/transform.ts:
|
378
|
+
assert(binding, "src/processScript/transform.ts:494:22")
|
390
379
|
for (const referencePath of binding.referencePaths) {
|
391
|
-
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:
|
380
|
+
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:497:55")
|
392
381
|
referencePath.replaceWith(
|
393
|
-
t.memberExpression(
|
394
|
-
t.identifier(`$${uniqueId}$GLOBAL$`),
|
395
|
-
t.identifier(referencePath.node.name)
|
396
|
-
)
|
382
|
+
t.memberExpression(t.identifier(`_${uniqueId}_G_`), t.identifier(referencePath.node.name))
|
397
383
|
)
|
384
|
+
needG = !0
|
398
385
|
}
|
399
386
|
globalBlockPath.remove()
|
400
387
|
globalBlockStatementPath.remove()
|
@@ -405,7 +392,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
405
392
|
t.assignmentExpression(
|
406
393
|
"=",
|
407
394
|
t.memberExpression(
|
408
|
-
t.identifier(
|
395
|
+
t.identifier(`_${uniqueId}_G_`),
|
409
396
|
t.identifier(globalBlockStatement.id.name)
|
410
397
|
),
|
411
398
|
t.classExpression(
|
@@ -417,13 +404,9 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
417
404
|
)
|
418
405
|
)
|
419
406
|
)
|
407
|
+
needG = !0
|
420
408
|
}
|
421
409
|
}
|
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
410
|
globalBlock.body.length &&
|
428
411
|
mainFunction.body.body.splice(
|
429
412
|
hoistedGlobalBlockFunctions,
|
@@ -472,6 +455,31 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
472
455
|
)
|
473
456
|
])
|
474
457
|
)
|
458
|
+
needHasOwn &&
|
459
|
+
mainFunction.body.body.unshift(
|
460
|
+
t.variableDeclaration("let", [
|
461
|
+
t.variableDeclarator(
|
462
|
+
t.identifier(`_${uniqueId}_HAS_OWN_`),
|
463
|
+
t.callExpression(
|
464
|
+
t.memberExpression(
|
465
|
+
t.memberExpression(
|
466
|
+
t.identifier(
|
467
|
+
globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
|
468
|
+
),
|
469
|
+
t.identifier("call")
|
470
|
+
),
|
471
|
+
t.identifier("bind")
|
472
|
+
),
|
473
|
+
[
|
474
|
+
t.memberExpression(
|
475
|
+
t.memberExpression(t.identifier("Object"), t.identifier("prototype")),
|
476
|
+
t.identifier("hasOwnProperty")
|
477
|
+
)
|
478
|
+
]
|
479
|
+
)
|
480
|
+
)
|
481
|
+
])
|
482
|
+
)
|
475
483
|
consoleMethodsReferenced.size &&
|
476
484
|
mainFunction.body.body.unshift(
|
477
485
|
t.variableDeclaration(
|
@@ -522,12 +530,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
522
530
|
mainFunction.body.body.unshift(
|
523
531
|
t.variableDeclaration(
|
524
532
|
"let",
|
525
|
-
[...neededSubscriptLets].map(name =>
|
533
|
+
[...neededSubscriptLets].map(([name, seclevel]) =>
|
526
534
|
t.variableDeclarator(
|
527
535
|
t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`),
|
528
536
|
t.arrowFunctionExpression(
|
529
537
|
[t.restElement(t.identifier("args"))],
|
530
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$${name}$`), [
|
538
|
+
t.callExpression(t.identifier(`$${uniqueId}$${seclevel}$SUBSCRIPT$${name}$`), [
|
531
539
|
t.spreadElement(t.identifier("args"))
|
532
540
|
])
|
533
541
|
)
|
@@ -535,6 +543,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
535
543
|
)
|
536
544
|
)
|
537
545
|
)
|
546
|
+
needG &&
|
547
|
+
mainFunction.body.body.unshift(
|
548
|
+
t.variableDeclaration("let", [
|
549
|
+
t.variableDeclarator(t.identifier(`_${uniqueId}_G_`), t.identifier(`$${uniqueId}$GLOBAL$`))
|
550
|
+
])
|
551
|
+
)
|
538
552
|
traverse(file, {
|
539
553
|
BlockStatement({ node: blockStatement }) {
|
540
554
|
for (const [index, functionDeclaration] of blockStatement.body.entries())
|
@@ -555,7 +569,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
555
569
|
}
|
556
570
|
},
|
557
571
|
ClassBody({ node: classBody, scope, parent }) {
|
558
|
-
assert(t.isClass(parent), "src/processScript/transform.ts:
|
572
|
+
assert(t.isClass(parent), "src/processScript/transform.ts:692:30")
|
559
573
|
let thisIsReferenced = !1
|
560
574
|
for (const classMethod of classBody.body) {
|
561
575
|
if ("ClassMethod" != classMethod.type) continue
|
@@ -647,50 +661,43 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
647
661
|
})
|
648
662
|
return { file, seclevel }
|
649
663
|
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
|
-
)
|
664
|
+
const name = globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
|
656
665
|
return t.memberExpression(
|
657
|
-
t.
|
658
|
-
|
659
|
-
t.identifier("constructor")
|
660
|
-
),
|
661
|
-
t.identifier("prototype")
|
666
|
+
name ? t.identifier(name) : t.arrowFunctionExpression([t.identifier("_")], t.identifier("_")),
|
667
|
+
t.identifier("__proto__")
|
662
668
|
)
|
663
669
|
}
|
664
|
-
function processFakeSubscriptObject(fakeSubscriptObjectName) {
|
670
|
+
function processFakeSubscriptObject(fakeSubscriptObjectName, seclevel) {
|
665
671
|
for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
|
666
|
-
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:
|
672
|
+
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:798:60")
|
667
673
|
assert("Identifier" == referencePath.parent.property.type)
|
668
674
|
assert(
|
669
675
|
"MemberExpression" == referencePath.parentPath.parentPath?.node.type,
|
670
|
-
"src/processScript/transform.ts:
|
676
|
+
"src/processScript/transform.ts:800:81"
|
671
677
|
)
|
672
678
|
assert(
|
673
679
|
"Identifier" == referencePath.parentPath.parentPath.node.property.type,
|
674
|
-
"src/processScript/transform.ts:
|
680
|
+
"src/processScript/transform.ts:801:83"
|
675
681
|
)
|
676
682
|
assert(
|
677
683
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
|
678
|
-
`src/processScript/transform.ts:
|
684
|
+
`src/processScript/transform.ts:805:8 invalid user "${referencePath.parent.property.name}" in subscript`
|
679
685
|
)
|
680
686
|
assert(
|
681
687
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
|
682
|
-
`src/processScript/transform.ts:
|
688
|
+
`src/processScript/transform.ts:810:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
|
683
689
|
)
|
684
690
|
if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
|
685
691
|
referencePath.parentPath.parentPath.replaceWith(
|
686
692
|
t.identifier(
|
687
|
-
`$${uniqueId}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
|
693
|
+
`$${uniqueId}$${seclevel}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
|
688
694
|
)
|
689
695
|
)
|
690
696
|
else {
|
691
697
|
const name = `${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}`
|
692
698
|
referencePath.parentPath.parentPath.replaceWith(t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`))
|
693
|
-
neededSubscriptLets.
|
699
|
+
const maxSecLevel = Math.max(neededSubscriptLets.get(name) || 0, seclevel)
|
700
|
+
neededSubscriptLets.set(name, maxSecLevel)
|
694
701
|
}
|
695
702
|
}
|
696
703
|
}
|
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
|
@@ -71,10 +73,11 @@ async function watch(
|
|
71
73
|
: scriptName && "*" != scriptName ? wildUserScripts.add(scriptName)
|
72
74
|
: (pushEverything = !0)
|
73
75
|
}
|
74
|
-
const watcher = watch$1(
|
76
|
+
const watcher = watch$1(".", {
|
75
77
|
cwd: sourceDirectory,
|
76
78
|
awaitWriteFinish: { stabilityThreshold: 100 },
|
77
|
-
ignored:
|
79
|
+
ignored: (path, stats) =>
|
80
|
+
!!stats?.isFile() && !(path.endsWith(".js") || (path.endsWith(".ts") && !path.endsWith(".d.ts")))
|
78
81
|
}).on("change", async path => {
|
79
82
|
if (path.endsWith(".d.ts")) return
|
80
83
|
const extension = extname(path)
|
@@ -90,7 +93,7 @@ async function watch(
|
|
90
93
|
)
|
91
94
|
)
|
92
95
|
return
|
93
|
-
const scriptNamesToUsersToSkip = new
|
96
|
+
const scriptNamesToUsersToSkip = new AutoMap(_scriptName => [])
|
94
97
|
await Promise.all(
|
95
98
|
(await readDirectoryWithStats(sourceDirectory)).map(async ({ stats, name, path }) => {
|
96
99
|
if (stats.isDirectory())
|
@@ -135,7 +138,7 @@ async function watch(
|
|
135
138
|
forceQuineCheats
|
136
139
|
}))
|
137
140
|
} catch (error) {
|
138
|
-
assert(error instanceof Error, "src/watch.ts:
|
141
|
+
assert(error instanceof Error, "src/watch.ts:148:36")
|
139
142
|
onPush?.({ path, users: [], characterCount: 0, error })
|
140
143
|
return
|
141
144
|
}
|
@@ -180,7 +183,7 @@ async function watch(
|
|
180
183
|
forceQuineCheats
|
181
184
|
}))
|
182
185
|
} catch (error) {
|
183
|
-
assert(error instanceof Error, "src/watch.ts:
|
186
|
+
assert(error instanceof Error, "src/watch.ts:184:35")
|
184
187
|
onPush?.({ path, users: [], characterCount: 0, error })
|
185
188
|
return
|
186
189
|
}
|
@@ -195,7 +198,7 @@ async function watch(
|
|
195
198
|
try {
|
196
199
|
await writeFile(typeDeclarationPath, typeDeclaration)
|
197
200
|
} catch (error) {
|
198
|
-
assert(error instanceof Error, "src/watch.ts:
|
201
|
+
assert(error instanceof Error, "src/watch.ts:217:35")
|
199
202
|
if ("EISDIR" != error.code) throw error
|
200
203
|
typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
|
201
204
|
await writeFile(typeDeclarationPath, typeDeclaration)
|