hackmud-script-manager 0.20.4-8b61cf2 → 0.20.4-9181c22
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 +296 -271
- package/env.d.ts +325 -317
- package/generateTypeDeclaration.js +2 -1
- package/index.d.ts +3 -0
- package/index.js +3 -1
- package/package.json +39 -38
- package/processScript/index.d.ts +2 -2
- package/processScript/index.js +14 -10
- package/processScript/minify.js +5 -14
- package/processScript/preprocess.js +5 -3
- package/processScript/transform.d.ts +3 -0
- package/processScript/transform.js +98 -86
- package/push.js +12 -9
- package/watch.js +30 -28
@@ -22,9 +22,8 @@ const { default: traverse } = babelTraverse,
|
|
22
22
|
"BigInt"
|
23
23
|
]
|
24
24
|
function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scriptName, seclevel = 4 }) {
|
25
|
-
const
|
26
|
-
|
27
|
-
liveExports = new Map()
|
25
|
+
const warnings = [],
|
26
|
+
topFunctionName = `_${uniqueId}_SCRIPT_`
|
28
27
|
let program
|
29
28
|
traverse(file, {
|
30
29
|
Program(path) {
|
@@ -46,9 +45,17 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
46
45
|
referencePath.replaceWith(t.identifier(`_${uniqueId}_SCRIPT_USER_`))
|
47
46
|
} else
|
48
47
|
referencePath.replaceWith(t.stringLiteral(1 == scriptUser ? `$${uniqueId}$SCRIPT_USER$` : scriptUser))
|
49
|
-
if (program.scope.hasGlobal("_SCRIPT_NAME"))
|
48
|
+
if (program.scope.hasGlobal("_SCRIPT_NAME")) {
|
49
|
+
warnings.push({
|
50
|
+
message:
|
51
|
+
"Global _SCRIPT_NAME is deprecated and will be removed in the next minor release of HSM, use _SCRIPT_SUBNAME instead"
|
52
|
+
})
|
50
53
|
for (const referencePath of getReferencePathsToGlobal("_SCRIPT_NAME", program))
|
51
54
|
referencePath.replaceWith(t.stringLiteral(1 == scriptName ? `$${uniqueId}$SCRIPT_NAME$` : scriptName))
|
55
|
+
}
|
56
|
+
if (program.scope.hasGlobal("_SCRIPT_SUBNAME"))
|
57
|
+
for (const referencePath of getReferencePathsToGlobal("_SCRIPT_SUBNAME", program))
|
58
|
+
referencePath.replaceWith(t.stringLiteral(1 == scriptName ? `$${uniqueId}$SCRIPT_NAME$` : scriptName))
|
52
59
|
if (program.scope.hasGlobal("_FULL_SCRIPT_NAME"))
|
53
60
|
for (const referencePath of getReferencePathsToGlobal("_FULL_SCRIPT_NAME", program))
|
54
61
|
if (1 == scriptUser || 1 == scriptName)
|
@@ -70,30 +77,30 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
70
77
|
const referencePath = FunctionReferencePaths[0]
|
71
78
|
assert(
|
72
79
|
"MemberExpression" == referencePath.parent.type,
|
73
|
-
"src/processScript/transform.ts:
|
80
|
+
"src/processScript/transform.ts:111:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
74
81
|
)
|
75
82
|
assert(
|
76
83
|
"Identifier" == referencePath.parent.property.type,
|
77
|
-
"src/processScript/transform.ts:
|
84
|
+
"src/processScript/transform.ts:116:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
78
85
|
)
|
79
86
|
assert(
|
80
87
|
"prototype" == referencePath.parent.property.name,
|
81
|
-
"src/processScript/transform.ts:
|
88
|
+
"src/processScript/transform.ts:121:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
82
89
|
)
|
83
90
|
referencePath.parentPath.replaceWith(createGetFunctionPrototypeNode())
|
84
91
|
} else {
|
85
92
|
for (const referencePath of FunctionReferencePaths) {
|
86
93
|
assert(
|
87
94
|
"MemberExpression" == referencePath.parent.type,
|
88
|
-
"src/processScript/transform.ts:
|
95
|
+
"src/processScript/transform.ts:129:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
89
96
|
)
|
90
97
|
assert(
|
91
98
|
"Identifier" == referencePath.parent.property.type,
|
92
|
-
"src/processScript/transform.ts:
|
99
|
+
"src/processScript/transform.ts:134:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
93
100
|
)
|
94
101
|
assert(
|
95
102
|
"prototype" == referencePath.parent.property.name,
|
96
|
-
"src/processScript/transform.ts:
|
103
|
+
"src/processScript/transform.ts:139:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
|
97
104
|
)
|
98
105
|
functionDotPrototypeIsReferencedMultipleTimes = !0
|
99
106
|
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_FUNCTION_DOT_PROTOTYPE_`))
|
@@ -129,12 +136,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
129
136
|
const neededDbMethodLets = new Set()
|
130
137
|
if (program.scope.hasGlobal("$db"))
|
131
138
|
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:
|
139
|
+
assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:193:69")
|
140
|
+
assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:194:72")
|
134
141
|
const databaseOpMethodName = referencePath.parentPath.node.property.name
|
135
142
|
assert(
|
136
143
|
validDBMethods.includes(databaseOpMethodName),
|
137
|
-
`src/processScript/transform.ts:
|
144
|
+
`src/processScript/transform.ts:200:8 invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
|
138
145
|
)
|
139
146
|
if ("CallExpression" == referencePath.parentPath.parentPath?.type)
|
140
147
|
referencePath.parentPath.replaceWith(t.identifier(`$${uniqueId}$DB$${databaseOpMethodName}$`))
|
@@ -157,27 +164,32 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
157
164
|
if (program.scope.hasGlobal("$FMCL"))
|
158
165
|
for (const referencePath of getReferencePathsToGlobal("$FMCL", program))
|
159
166
|
referencePath.replaceWith(t.identifier(`$${uniqueId}$FMCL$`))
|
160
|
-
|
167
|
+
let needG = program.scope.hasGlobal("$G")
|
168
|
+
if (needG)
|
161
169
|
for (const referencePath of getReferencePathsToGlobal("$G", program))
|
162
|
-
referencePath.replaceWith(t.identifier(
|
170
|
+
referencePath.replaceWith(t.identifier(`_${uniqueId}_G_`))
|
163
171
|
if (program.scope.hasGlobal("_SECLEVEL"))
|
164
172
|
for (const referencePath of getReferencePathsToGlobal("_SECLEVEL", program))
|
165
173
|
referencePath.replaceWith(t.numericLiteral(seclevel))
|
166
|
-
let needGetPrototypeOf = !1
|
174
|
+
let needGetPrototypeOf = !1,
|
175
|
+
needHasOwn = !1
|
167
176
|
if (program.scope.hasGlobal("Object"))
|
168
177
|
for (const referencePath of getReferencePathsToGlobal("Object", program))
|
169
178
|
if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
|
170
|
-
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:
|
179
|
+
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:250:64")
|
171
180
|
if ("getPrototypeOf" == referencePath.parent.property.name) {
|
172
181
|
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_GET_PROTOTYPE_OF_`))
|
173
182
|
needGetPrototypeOf = !0
|
183
|
+
} else if ("hasOwn" == referencePath.parent.property.name) {
|
184
|
+
referencePath.parentPath.replaceWith(t.identifier(`_${uniqueId}_HAS_OWN_`))
|
185
|
+
needHasOwn = !0
|
174
186
|
}
|
175
187
|
}
|
176
188
|
const consoleMethodsReferenced = new Set()
|
177
189
|
if (program.scope.hasGlobal("console"))
|
178
190
|
for (const referencePath of getReferencePathsToGlobal("console", program))
|
179
191
|
if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
|
180
|
-
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:
|
192
|
+
assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:268:64")
|
181
193
|
referencePath.parentPath.replaceWith(
|
182
194
|
t.identifier(`_${uniqueId}_CONSOLE_METHOD_${referencePath.parent.property.name}_`)
|
183
195
|
)
|
@@ -185,19 +197,20 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
185
197
|
}
|
186
198
|
const lastStatement = program.node.body.at(-1)
|
187
199
|
let exportDefaultName
|
188
|
-
assert(lastStatement, "src/processScript/transform.ts:
|
200
|
+
assert(lastStatement, "src/processScript/transform.ts:282:27 program is empty")
|
189
201
|
if ("ExportNamedDeclaration" == lastStatement.type) {
|
190
202
|
program.node.body.pop()
|
191
203
|
for (const specifier of lastStatement.specifiers) {
|
192
204
|
assert(
|
193
205
|
"ExportSpecifier" == specifier.type,
|
194
|
-
`src/processScript/transform.ts:
|
206
|
+
`src/processScript/transform.ts:288:51 ${specifier.type} is currently unsupported`
|
207
|
+
)
|
208
|
+
if (
|
209
|
+
"default" !=
|
210
|
+
("Identifier" == specifier.exported.type ? specifier.exported.name : specifier.exported.value)
|
195
211
|
)
|
196
|
-
|
197
|
-
|
198
|
-
"default" == exportedName ?
|
199
|
-
(exportDefaultName = specifier.local.name)
|
200
|
-
: exports.set(specifier.local.name, exportedName)
|
212
|
+
throw Error("Only default exports are supported")
|
213
|
+
exportDefaultName = specifier.local.name
|
201
214
|
}
|
202
215
|
}
|
203
216
|
const globalBlock = t.blockStatement([])
|
@@ -223,10 +236,6 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
223
236
|
t.returnStatement(t.callExpression(t.identifier(exportDefaultName), []))
|
224
237
|
])
|
225
238
|
))
|
226
|
-
if ("const" != statement.kind && exports.has(identifierName)) {
|
227
|
-
liveExports.set(identifierName, exports.get(identifierName))
|
228
|
-
exports.delete(identifierName)
|
229
|
-
}
|
230
239
|
globalBlock.body.push(
|
231
240
|
t.variableDeclaration("let", [t.variableDeclarator(t.identifier(identifierName))])
|
232
241
|
)
|
@@ -291,34 +300,16 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
291
300
|
}
|
292
301
|
program.node.body = [mainFunction]
|
293
302
|
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
303
|
program.scope.crawl()
|
313
304
|
const globalBlockVariables = new Set()
|
314
305
|
let hoistedGlobalBlockFunctions = 0
|
315
306
|
for (const [globalBlockIndex, globalBlockStatement] of [...globalBlock.body.entries()].reverse())
|
316
307
|
if ("VariableDeclaration" == globalBlockStatement.type) {
|
317
|
-
assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:
|
308
|
+
assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:402:59")
|
318
309
|
const declarator = globalBlockStatement.declarations[0]
|
319
310
|
assert(
|
320
311
|
"Identifier" == declarator.id.type,
|
321
|
-
`src/processScript/transform.ts:
|
312
|
+
`src/processScript/transform.ts:406:51 declarator.id.type was "${declarator.id.type}"`
|
322
313
|
)
|
323
314
|
program.scope.crawl()
|
324
315
|
if (program.scope.hasGlobal(declarator.id.name)) {
|
@@ -333,15 +324,16 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
333
324
|
Object.keys(program.scope.globals).some(global => globalBlockVariables.has(global))
|
334
325
|
) {
|
335
326
|
const binding = program.scope.getBinding(declarator.id.name)
|
336
|
-
assert(binding, "src/processScript/transform.ts:
|
327
|
+
assert(binding, "src/processScript/transform.ts:425:23")
|
337
328
|
for (const referencePath of binding.referencePaths) {
|
338
|
-
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:
|
329
|
+
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:428:56")
|
339
330
|
referencePath.replaceWith(
|
340
331
|
t.memberExpression(
|
341
|
-
t.identifier(
|
332
|
+
t.identifier(`_${uniqueId}_G_`),
|
342
333
|
t.identifier(referencePath.node.name)
|
343
334
|
)
|
344
335
|
)
|
336
|
+
needG = !0
|
345
337
|
}
|
346
338
|
for (const referencePath of binding.constantViolations)
|
347
339
|
if ("AssignmentExpression" == referencePath.node.type)
|
@@ -350,12 +342,13 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
350
342
|
clearObject(node)
|
351
343
|
Object.assign(
|
352
344
|
node,
|
353
|
-
t.memberExpression(t.identifier(
|
345
|
+
t.memberExpression(t.identifier(`_${uniqueId}_G_`), t.identifier(name))
|
354
346
|
)
|
347
|
+
needG = !0
|
355
348
|
}
|
356
349
|
globalBlockPath.remove()
|
357
350
|
globalBlockStatementPath.remove()
|
358
|
-
declarator.init
|
351
|
+
if (declarator.init) {
|
359
352
|
globalBlock.body.splice(
|
360
353
|
globalBlockIndex,
|
361
354
|
0,
|
@@ -363,13 +356,15 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
363
356
|
t.assignmentExpression(
|
364
357
|
"=",
|
365
358
|
t.memberExpression(
|
366
|
-
t.identifier(
|
359
|
+
t.identifier(`_${uniqueId}_G_`),
|
367
360
|
t.identifier(declarator.id.name)
|
368
361
|
),
|
369
362
|
declarator.init
|
370
363
|
)
|
371
364
|
)
|
372
365
|
)
|
366
|
+
needG = !0
|
367
|
+
}
|
373
368
|
} else {
|
374
369
|
globalBlockPath.remove()
|
375
370
|
globalBlockStatementPath.remove()
|
@@ -379,22 +374,20 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
379
374
|
} else globalBlockVariables.add(declarator.id.name)
|
380
375
|
} else if ("ClassDeclaration" == globalBlockStatement.type) {
|
381
376
|
program.scope.crawl()
|
382
|
-
assert(globalBlockStatement.id, "src/processScript/transform.ts:
|
377
|
+
assert(globalBlockStatement.id, "src/processScript/transform.ts:485:37")
|
383
378
|
if (program.scope.hasGlobal(globalBlockStatement.id.name)) {
|
384
379
|
globalBlock.body.splice(globalBlockIndex, 1)
|
385
380
|
const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
|
386
381
|
[globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
|
387
382
|
program.scope.crawl()
|
388
383
|
const binding = program.scope.getBinding(globalBlockStatement.id.name)
|
389
|
-
assert(binding, "src/processScript/transform.ts:
|
384
|
+
assert(binding, "src/processScript/transform.ts:497:22")
|
390
385
|
for (const referencePath of binding.referencePaths) {
|
391
|
-
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:
|
386
|
+
assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:500:55")
|
392
387
|
referencePath.replaceWith(
|
393
|
-
t.memberExpression(
|
394
|
-
t.identifier(`$${uniqueId}$GLOBAL$`),
|
395
|
-
t.identifier(referencePath.node.name)
|
396
|
-
)
|
388
|
+
t.memberExpression(t.identifier(`_${uniqueId}_G_`), t.identifier(referencePath.node.name))
|
397
389
|
)
|
390
|
+
needG = !0
|
398
391
|
}
|
399
392
|
globalBlockPath.remove()
|
400
393
|
globalBlockStatementPath.remove()
|
@@ -405,7 +398,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
405
398
|
t.assignmentExpression(
|
406
399
|
"=",
|
407
400
|
t.memberExpression(
|
408
|
-
t.identifier(
|
401
|
+
t.identifier(`_${uniqueId}_G_`),
|
409
402
|
t.identifier(globalBlockStatement.id.name)
|
410
403
|
),
|
411
404
|
t.classExpression(
|
@@ -417,13 +410,9 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
417
410
|
)
|
418
411
|
)
|
419
412
|
)
|
413
|
+
needG = !0
|
420
414
|
}
|
421
415
|
}
|
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
416
|
globalBlock.body.length &&
|
428
417
|
mainFunction.body.body.splice(
|
429
418
|
hoistedGlobalBlockFunctions,
|
@@ -472,6 +461,31 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
472
461
|
)
|
473
462
|
])
|
474
463
|
)
|
464
|
+
needHasOwn &&
|
465
|
+
mainFunction.body.body.unshift(
|
466
|
+
t.variableDeclaration("let", [
|
467
|
+
t.variableDeclarator(
|
468
|
+
t.identifier(`_${uniqueId}_HAS_OWN_`),
|
469
|
+
t.callExpression(
|
470
|
+
t.memberExpression(
|
471
|
+
t.memberExpression(
|
472
|
+
t.identifier(
|
473
|
+
globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
|
474
|
+
),
|
475
|
+
t.identifier("call")
|
476
|
+
),
|
477
|
+
t.identifier("bind")
|
478
|
+
),
|
479
|
+
[
|
480
|
+
t.memberExpression(
|
481
|
+
t.memberExpression(t.identifier("Object"), t.identifier("prototype")),
|
482
|
+
t.identifier("hasOwnProperty")
|
483
|
+
)
|
484
|
+
]
|
485
|
+
)
|
486
|
+
)
|
487
|
+
])
|
488
|
+
)
|
475
489
|
consoleMethodsReferenced.size &&
|
476
490
|
mainFunction.body.body.unshift(
|
477
491
|
t.variableDeclaration(
|
@@ -535,6 +549,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
535
549
|
)
|
536
550
|
)
|
537
551
|
)
|
552
|
+
needG &&
|
553
|
+
mainFunction.body.body.unshift(
|
554
|
+
t.variableDeclaration("let", [
|
555
|
+
t.variableDeclarator(t.identifier(`_${uniqueId}_G_`), t.identifier(`$${uniqueId}$GLOBAL$`))
|
556
|
+
])
|
557
|
+
)
|
538
558
|
traverse(file, {
|
539
559
|
BlockStatement({ node: blockStatement }) {
|
540
560
|
for (const [index, functionDeclaration] of blockStatement.body.entries())
|
@@ -555,7 +575,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
555
575
|
}
|
556
576
|
},
|
557
577
|
ClassBody({ node: classBody, scope, parent }) {
|
558
|
-
assert(t.isClass(parent), "src/processScript/transform.ts:
|
578
|
+
assert(t.isClass(parent), "src/processScript/transform.ts:695:30")
|
559
579
|
let thisIsReferenced = !1
|
560
580
|
for (const classMethod of classBody.body) {
|
561
581
|
if ("ClassMethod" != classMethod.type) continue
|
@@ -645,41 +665,33 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
645
665
|
)
|
646
666
|
}
|
647
667
|
})
|
648
|
-
return { file, seclevel }
|
668
|
+
return { file, seclevel, warnings }
|
649
669
|
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
|
-
)
|
670
|
+
const name = globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
|
656
671
|
return t.memberExpression(
|
657
|
-
t.
|
658
|
-
|
659
|
-
t.identifier("constructor")
|
660
|
-
),
|
661
|
-
t.identifier("prototype")
|
672
|
+
name ? t.identifier(name) : t.arrowFunctionExpression([t.identifier("_")], t.identifier("_")),
|
673
|
+
t.identifier("__proto__")
|
662
674
|
)
|
663
675
|
}
|
664
676
|
function processFakeSubscriptObject(fakeSubscriptObjectName, seclevel) {
|
665
677
|
for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
|
666
|
-
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:
|
678
|
+
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:801:60")
|
667
679
|
assert("Identifier" == referencePath.parent.property.type)
|
668
680
|
assert(
|
669
681
|
"MemberExpression" == referencePath.parentPath.parentPath?.node.type,
|
670
|
-
"src/processScript/transform.ts:
|
682
|
+
"src/processScript/transform.ts:803:81"
|
671
683
|
)
|
672
684
|
assert(
|
673
685
|
"Identifier" == referencePath.parentPath.parentPath.node.property.type,
|
674
|
-
"src/processScript/transform.ts:
|
686
|
+
"src/processScript/transform.ts:804:83"
|
675
687
|
)
|
676
688
|
assert(
|
677
689
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
|
678
|
-
`src/processScript/transform.ts:
|
690
|
+
`src/processScript/transform.ts:808:8 invalid user "${referencePath.parent.property.name}" in subscript`
|
679
691
|
)
|
680
692
|
assert(
|
681
693
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
|
682
|
-
`src/processScript/transform.ts:
|
694
|
+
`src/processScript/transform.ts:813:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
|
683
695
|
)
|
684
696
|
if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
|
685
697
|
referencePath.parentPath.parentPath.replaceWith(
|
package/push.js
CHANGED
@@ -1,10 +1,10 @@
|
|
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"
|
5
5
|
import { writeFilePersistent } from "@samual/lib/writeFilePersistent"
|
6
6
|
import { readFile } from "fs/promises"
|
7
|
-
import {
|
7
|
+
import { resolve, basename } from "path"
|
8
8
|
import { processScript } from "./processScript/index.js"
|
9
9
|
import "@babel/generator"
|
10
10
|
import "@babel/parser"
|
@@ -25,6 +25,7 @@ import "@babel/plugin-transform-private-property-in-object"
|
|
25
25
|
import "@babel/plugin-transform-unicode-sets-regex"
|
26
26
|
import "@babel/traverse"
|
27
27
|
import "@babel/types"
|
28
|
+
import "@rollup/plugin-alias"
|
28
29
|
import "@rollup/plugin-babel"
|
29
30
|
import "@rollup/plugin-commonjs"
|
30
31
|
import "@rollup/plugin-json"
|
@@ -84,8 +85,8 @@ async function push(
|
|
84
85
|
return new NoUsersError(
|
85
86
|
"Could not find any users. Either provide the names of your users or log into a user in hackmud"
|
86
87
|
)
|
87
|
-
const usersToScriptsToPush = new
|
88
|
-
scriptNamesToUsers = new
|
88
|
+
const usersToScriptsToPush = new AutoMap(_user => new Map()),
|
89
|
+
scriptNamesToUsers = new AutoMap(_scriptName => new Set())
|
89
90
|
for (const script of scripts) {
|
90
91
|
const [user, scriptName] = script.split(".")
|
91
92
|
assert(user, "src/push.ts:105:16")
|
@@ -121,26 +122,28 @@ async function push(
|
|
121
122
|
for (const user of users)
|
122
123
|
if (!usersToScriptsToPush.get(user).has(scriptName))
|
123
124
|
return new NoScriptsError(`Could not find script ${user}.${scriptName} to push`)
|
124
|
-
const pathsToUsers = new
|
125
|
+
const pathsToUsers = new AutoMap(_path => new Set())
|
125
126
|
for (const [user, scriptsToPush] of usersToScriptsToPush)
|
126
127
|
for (const path of scriptsToPush.values()) pathsToUsers.get(path).add(user)
|
127
|
-
const allInfo = []
|
128
|
+
const allInfo = [],
|
129
|
+
sourcePathResolved = resolve(sourcePath)
|
128
130
|
await Promise.all(
|
129
131
|
[...pathsToUsers].map(async ([path, [...users]]) => {
|
130
132
|
const scriptName = basename(path.slice(0, -3)),
|
131
133
|
uniqueId = Math.floor(Math.random() * 2 ** 52)
|
132
134
|
.toString(36)
|
133
135
|
.padStart(11, "0"),
|
134
|
-
{ script: minifiedCode } = await processScript(await readFile(path, { encoding: "utf8" }), {
|
136
|
+
{ script: minifiedCode, warnings } = await processScript(await readFile(path, { encoding: "utf8" }), {
|
135
137
|
minify,
|
136
138
|
scriptUser: !0,
|
137
139
|
scriptName,
|
138
140
|
uniqueId,
|
139
141
|
filePath: path,
|
140
142
|
mangleNames,
|
141
|
-
forceQuineCheats
|
143
|
+
forceQuineCheats,
|
144
|
+
rootFolderPath: sourcePathResolved
|
142
145
|
}),
|
143
|
-
info = { path, users, characterCount: countHackmudCharacters(minifiedCode), error: void 0 }
|
146
|
+
info = { path, users, characterCount: countHackmudCharacters(minifiedCode), error: void 0, warnings }
|
144
147
|
await Promise.all(
|
145
148
|
users.map(user =>
|
146
149
|
writeFilePersistent(
|
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"
|
@@ -28,6 +29,7 @@ import "@babel/plugin-transform-private-property-in-object"
|
|
28
29
|
import "@babel/plugin-transform-unicode-sets-regex"
|
29
30
|
import "@babel/traverse"
|
30
31
|
import "@babel/types"
|
32
|
+
import "@rollup/plugin-alias"
|
31
33
|
import "@rollup/plugin-babel"
|
32
34
|
import "@rollup/plugin-commonjs"
|
33
35
|
import "@rollup/plugin-json"
|
@@ -58,7 +60,8 @@ async function watch(
|
|
58
60
|
} = {}
|
59
61
|
) {
|
60
62
|
if (!scripts.length) throw Error("scripts option was an empty array")
|
61
|
-
|
63
|
+
if (!(await stat(sourceDirectory)).isDirectory()) throw Error("Target folder must be a folder")
|
64
|
+
const scriptNamesToUsers = new AutoMap(_scriptName => new Set()),
|
62
65
|
wildScriptUsers = new Set(),
|
63
66
|
wildUserScripts = new Set()
|
64
67
|
let pushEverything = !1
|
@@ -71,10 +74,11 @@ async function watch(
|
|
71
74
|
: scriptName && "*" != scriptName ? wildUserScripts.add(scriptName)
|
72
75
|
: (pushEverything = !0)
|
73
76
|
}
|
74
|
-
const watcher = watch$1(
|
77
|
+
const watcher = watch$1(".", {
|
75
78
|
cwd: sourceDirectory,
|
76
79
|
awaitWriteFinish: { stabilityThreshold: 100 },
|
77
|
-
ignored:
|
80
|
+
ignored: (path, stats) =>
|
81
|
+
!!stats?.isFile() && !(path.endsWith(".js") || (path.endsWith(".ts") && !path.endsWith(".d.ts")))
|
78
82
|
}).on("change", async path => {
|
79
83
|
if (path.endsWith(".d.ts")) return
|
80
84
|
const extension = extname(path)
|
@@ -90,7 +94,7 @@ async function watch(
|
|
90
94
|
)
|
91
95
|
)
|
92
96
|
return
|
93
|
-
const scriptNamesToUsersToSkip = new
|
97
|
+
const scriptNamesToUsersToSkip = new AutoMap(_scriptName => [])
|
94
98
|
await Promise.all(
|
95
99
|
(await readDirectoryWithStats(sourceDirectory)).map(async ({ stats, name, path }) => {
|
96
100
|
if (stats.isDirectory())
|
@@ -116,27 +120,22 @@ async function watch(
|
|
116
120
|
for (const user of scriptNamesToUsers.get(scriptName)) usersToPushToSet.add(user)
|
117
121
|
const usersToPushTo = [...usersToPushToSet].filter(user => !scriptNamesToUsersToSkip.has(user))
|
118
122
|
if (!usersToPushTo.length) {
|
119
|
-
onPush?.({ path, users: [], characterCount: 0, error: Error("no users to push to") })
|
123
|
+
onPush?.({ path, users: [], characterCount: 0, error: Error("no users to push to"), warnings: [] })
|
120
124
|
return
|
121
125
|
}
|
122
126
|
const uniqueId = Math.floor(Math.random() * 2 ** 52)
|
123
127
|
.toString(36)
|
124
128
|
.padStart(11, "0"),
|
125
129
|
filePath = resolve(sourceDirectory, path)
|
126
|
-
let minifiedCode
|
130
|
+
let minifiedCode, warnings
|
127
131
|
try {
|
128
|
-
;({ script: minifiedCode } = await processScript(
|
129
|
-
|
130
|
-
scriptUser: !0,
|
131
|
-
|
132
|
-
uniqueId,
|
133
|
-
filePath,
|
134
|
-
mangleNames,
|
135
|
-
forceQuineCheats
|
136
|
-
}))
|
132
|
+
;({ script: minifiedCode, warnings } = await processScript(
|
133
|
+
await readFile(filePath, { encoding: "utf8" }),
|
134
|
+
{ minify, scriptUser: !0, scriptName, uniqueId, filePath, mangleNames, forceQuineCheats }
|
135
|
+
))
|
137
136
|
} catch (error) {
|
138
|
-
assert(error instanceof Error, "src/watch.ts:
|
139
|
-
onPush?.({ path, users: [], characterCount: 0, error })
|
137
|
+
assert(error instanceof Error, "src/watch.ts:149:36")
|
138
|
+
onPush?.({ path, users: [], characterCount: 0, error, warnings: [] })
|
140
139
|
return
|
141
140
|
}
|
142
141
|
await Promise.all(
|
@@ -153,7 +152,8 @@ async function watch(
|
|
153
152
|
path,
|
154
153
|
users: usersToPushTo,
|
155
154
|
characterCount: countHackmudCharacters(minifiedCode),
|
156
|
-
error: void 0
|
155
|
+
error: void 0,
|
156
|
+
warnings
|
157
157
|
})
|
158
158
|
return
|
159
159
|
}
|
@@ -167,25 +167,27 @@ async function watch(
|
|
167
167
|
)
|
168
168
|
)
|
169
169
|
return
|
170
|
-
const
|
170
|
+
const sourceDirectoryResolved = resolve(sourceDirectory),
|
171
|
+
filePath = resolve(sourceDirectoryResolved, path),
|
171
172
|
sourceCode = await readFile(filePath, { encoding: "utf8" })
|
172
|
-
let script
|
173
|
+
let script, warnings
|
173
174
|
try {
|
174
|
-
;({ script } = await processScript(sourceCode, {
|
175
|
+
;({ script, warnings } = await processScript(sourceCode, {
|
175
176
|
minify,
|
176
177
|
scriptUser: user,
|
177
178
|
scriptName,
|
178
179
|
filePath,
|
179
180
|
mangleNames,
|
180
|
-
forceQuineCheats
|
181
|
+
forceQuineCheats,
|
182
|
+
rootFolderPath: sourceDirectoryResolved
|
181
183
|
}))
|
182
184
|
} catch (error) {
|
183
|
-
assert(error instanceof Error, "src/watch.ts:
|
184
|
-
onPush?.({ path, users: [], characterCount: 0, error })
|
185
|
+
assert(error instanceof Error, "src/watch.ts:196:35")
|
186
|
+
onPush?.({ path, users: [], characterCount: 0, error, warnings: [] })
|
185
187
|
return
|
186
188
|
}
|
187
189
|
await writeFilePersistent(resolve(hackmudDirectory, user, "scripts", scriptName + ".js"), script)
|
188
|
-
onPush?.({ path, users: [user], characterCount: countHackmudCharacters(script), error: void 0 })
|
190
|
+
onPush?.({ path, users: [user], characterCount: countHackmudCharacters(script), error: void 0, warnings })
|
189
191
|
})
|
190
192
|
onReady && watcher.on("ready", onReady)
|
191
193
|
if (!typeDeclarationPath_) return
|
@@ -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:229:35")
|
199
201
|
if ("EISDIR" != error.code) throw error
|
200
202
|
typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
|
201
203
|
await writeFile(typeDeclarationPath, typeDeclaration)
|