hackmud-script-manager 0.20.4-c524114 → 0.20.4-cf7622f
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 +192 -235
- package/env.d.ts +94 -31
- package/generateTypeDeclaration.js +2 -1
- package/index.js +1 -0
- package/package.json +1 -1
- package/processScript/index.js +3 -3
- package/processScript/minify.js +14 -19
- package/processScript/postprocess.d.ts +1 -1
- package/processScript/postprocess.js +3 -3
- package/processScript/preprocess.js +5 -3
- package/processScript/transform.js +68 -91
- package/push.d.ts +9 -1
- package/push.js +33 -11
- package/watch.js +6 -4
@@ -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
|
@@ -631,7 +613,9 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
631
613
|
VariableDeclaration({ node: variableDeclaration }) {
|
632
614
|
"const" == variableDeclaration.kind && (variableDeclaration.kind = "let")
|
633
615
|
},
|
634
|
-
ThisExpression: path =>
|
616
|
+
ThisExpression: path => {
|
617
|
+
path.replaceWith(t.identifier("undefined"))
|
618
|
+
},
|
635
619
|
BigIntLiteral(path) {
|
636
620
|
const bigIntAsNumber = Number(path.node.value)
|
637
621
|
path.replaceWith(
|
@@ -645,50 +629,43 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
645
629
|
})
|
646
630
|
return { file, seclevel }
|
647
631
|
function createGetFunctionPrototypeNode() {
|
648
|
-
|
649
|
-
if (!program.scope.hasOwnBinding(globalFunction))
|
650
|
-
return t.memberExpression(
|
651
|
-
t.memberExpression(t.identifier(globalFunction), t.identifier("constructor")),
|
652
|
-
t.identifier("prototype")
|
653
|
-
)
|
632
|
+
const name = globalFunctionsUnder7Characters.find(name => !program.scope.hasOwnBinding(name))
|
654
633
|
return t.memberExpression(
|
655
|
-
t.
|
656
|
-
|
657
|
-
t.identifier("constructor")
|
658
|
-
),
|
659
|
-
t.identifier("prototype")
|
634
|
+
name ? t.identifier(name) : t.arrowFunctionExpression([t.identifier("_")], t.identifier("_")),
|
635
|
+
t.identifier("__proto__")
|
660
636
|
)
|
661
637
|
}
|
662
|
-
function processFakeSubscriptObject(fakeSubscriptObjectName) {
|
638
|
+
function processFakeSubscriptObject(fakeSubscriptObjectName, seclevel) {
|
663
639
|
for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
|
664
|
-
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:
|
640
|
+
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:764:60")
|
665
641
|
assert("Identifier" == referencePath.parent.property.type)
|
666
642
|
assert(
|
667
643
|
"MemberExpression" == referencePath.parentPath.parentPath?.node.type,
|
668
|
-
"src/processScript/transform.ts:
|
644
|
+
"src/processScript/transform.ts:766:81"
|
669
645
|
)
|
670
646
|
assert(
|
671
647
|
"Identifier" == referencePath.parentPath.parentPath.node.property.type,
|
672
|
-
"src/processScript/transform.ts:
|
648
|
+
"src/processScript/transform.ts:767:83"
|
673
649
|
)
|
674
650
|
assert(
|
675
651
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
|
676
|
-
`src/processScript/transform.ts:
|
652
|
+
`src/processScript/transform.ts:771:8 invalid user "${referencePath.parent.property.name}" in subscript`
|
677
653
|
)
|
678
654
|
assert(
|
679
655
|
/^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
|
680
|
-
`src/processScript/transform.ts:
|
656
|
+
`src/processScript/transform.ts:776:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
|
681
657
|
)
|
682
658
|
if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
|
683
659
|
referencePath.parentPath.parentPath.replaceWith(
|
684
660
|
t.identifier(
|
685
|
-
`$${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}$`
|
686
662
|
)
|
687
663
|
)
|
688
664
|
else {
|
689
665
|
const name = `${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}`
|
690
666
|
referencePath.parentPath.parentPath.replaceWith(t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`))
|
691
|
-
neededSubscriptLets.
|
667
|
+
const maxSecLevel = Math.max(neededSubscriptLets.get(name) || 0, seclevel)
|
668
|
+
neededSubscriptLets.set(name, maxSecLevel)
|
692
669
|
}
|
693
670
|
}
|
694
671
|
}
|
package/push.d.ts
CHANGED
@@ -18,6 +18,14 @@ export type PushOptions = LaxPartial<{
|
|
18
18
|
*/
|
19
19
|
forceQuineCheats: boolean;
|
20
20
|
}>;
|
21
|
+
export declare class MissingSourceFolderError extends Error {
|
22
|
+
}
|
23
|
+
export declare class MissingHackmudFolderError extends Error {
|
24
|
+
}
|
25
|
+
export declare class NoUsersError extends Error {
|
26
|
+
}
|
27
|
+
export declare class NoScriptsError extends Error {
|
28
|
+
}
|
21
29
|
/** Push scripts from a source directory to the hackmud directory.
|
22
30
|
*
|
23
31
|
* Pushes files directly in the source folder to all users
|
@@ -25,4 +33,4 @@ export type PushOptions = LaxPartial<{
|
|
25
33
|
* @param hackmudPath directory created by hackmud containing user data including scripts
|
26
34
|
* @param options {@link PushOptions details}
|
27
35
|
* @returns array of info on pushed scripts */
|
28
|
-
export declare function push(sourcePath: string, hackmudPath: string, { scripts, onPush, minify, mangleNames, forceQuineCheats }?: PushOptions): Promise<Info[]>;
|
36
|
+
export declare function push(sourcePath: string, hackmudPath: string, { scripts, onPush, minify, mangleNames, forceQuineCheats }?: PushOptions): Promise<MissingSourceFolderError | MissingHackmudFolderError | NoUsersError | NoScriptsError | Info[]>;
|
package/push.js
CHANGED
@@ -42,32 +42,54 @@ import "./processScript/preprocess.js"
|
|
42
42
|
import "import-meta-resolve"
|
43
43
|
import "./processScript/transform.js"
|
44
44
|
import "@samual/lib/clearObject"
|
45
|
+
class MissingSourceFolderError extends Error {}
|
46
|
+
Object.defineProperty(MissingSourceFolderError.prototype, "name", { value: "MissingSourceFolderError" })
|
47
|
+
class MissingHackmudFolderError extends Error {}
|
48
|
+
Object.defineProperty(MissingHackmudFolderError.prototype, "name", { value: "MissingHackmudFolderError" })
|
49
|
+
class NoUsersError extends Error {}
|
50
|
+
Object.defineProperty(NoUsersError.prototype, "name", { value: "NoUsersError" })
|
51
|
+
class NoScriptsError extends Error {}
|
52
|
+
Object.defineProperty(NoScriptsError.prototype, "name", { value: "NoScriptsError" })
|
45
53
|
async function push(
|
46
54
|
sourcePath,
|
47
55
|
hackmudPath,
|
48
56
|
{ scripts = ["*.*"], onPush = () => {}, minify = !0, mangleNames = !1, forceQuineCheats } = {}
|
49
57
|
) {
|
50
58
|
const [sourceFolder, hackmudFolder] = await Promise.all([
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
readDirectoryWithStats(sourcePath).catch(error => {
|
60
|
+
if (error && "ENOENT" == error.code)
|
61
|
+
return new MissingSourceFolderError("There is no folder at " + sourcePath)
|
62
|
+
throw error
|
63
|
+
}),
|
64
|
+
readDirectoryWithStats(hackmudPath).catch(error => {
|
65
|
+
if (error && "ENOENT" == error.code)
|
66
|
+
return new MissingHackmudFolderError("There is no folder at " + hackmudPath)
|
67
|
+
throw error
|
68
|
+
})
|
69
|
+
])
|
70
|
+
if (sourceFolder instanceof Error) return sourceFolder
|
71
|
+
if (hackmudFolder instanceof Error) return hackmudFolder
|
72
|
+
const sourceFolderFolders = sourceFolder.filter(({ stats }) => stats.isDirectory()),
|
55
73
|
allUsers = new Set([
|
56
74
|
...scripts
|
57
|
-
.map(scriptName => ensure(scriptName.split(".")[0], "src/push.ts:
|
75
|
+
.map(scriptName => ensure(scriptName.split(".")[0], "src/push.ts:82:65"))
|
58
76
|
.filter(name => "*" != name),
|
59
77
|
...sourceFolderFolders.map(({ name }) => name),
|
60
78
|
...hackmudFolder.filter(({ stats }) => stats.isDirectory()).map(({ name }) => name),
|
61
79
|
...hackmudFolder
|
62
80
|
.filter(({ stats, name }) => stats.isFile() && name.endsWith(".key"))
|
63
81
|
.map(({ name }) => name.slice(0, -4))
|
64
|
-
])
|
65
|
-
|
82
|
+
])
|
83
|
+
if (!allUsers.size)
|
84
|
+
return new NoUsersError(
|
85
|
+
"Could not find any users. Either provide the names of your users or log into a user in hackmud"
|
86
|
+
)
|
87
|
+
const usersToScriptsToPush = new Cache(_user => new Map()),
|
66
88
|
scriptNamesToUsers = new Cache(_scriptName => new Set())
|
67
89
|
for (const script of scripts) {
|
68
90
|
const [user, scriptName] = script.split(".")
|
69
|
-
assert(user, "src/push.ts:
|
70
|
-
assert(scriptName, "src/push.ts:
|
91
|
+
assert(user, "src/push.ts:105:16")
|
92
|
+
assert(scriptName, "src/push.ts:106:22")
|
71
93
|
"*" == user ? scriptNamesToUsers.set(scriptName, allUsers) : scriptNamesToUsers.get(scriptName).add(user)
|
72
94
|
}
|
73
95
|
const sourceFolderFiles = sourceFolder.filter(({ stats }) => stats.isFile()),
|
@@ -98,7 +120,7 @@ async function push(
|
|
98
120
|
for (const [scriptName, users] of scriptNamesToUsers)
|
99
121
|
for (const user of users)
|
100
122
|
if (!usersToScriptsToPush.get(user).has(scriptName))
|
101
|
-
|
123
|
+
return new NoScriptsError(`Could not find script ${user}.${scriptName} to push`)
|
102
124
|
const pathsToUsers = new Cache(_path => new Set())
|
103
125
|
for (const [user, scriptsToPush] of usersToScriptsToPush)
|
104
126
|
for (const path of scriptsToPush.values()) pathsToUsers.get(path).add(user)
|
@@ -135,4 +157,4 @@ async function push(
|
|
135
157
|
)
|
136
158
|
return allInfo
|
137
159
|
}
|
138
|
-
export { push }
|
160
|
+
export { MissingHackmudFolderError, MissingSourceFolderError, NoScriptsError, NoUsersError, push }
|
package/watch.js
CHANGED
@@ -4,11 +4,12 @@ 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,6 +59,7 @@ async function watch(
|
|
58
59
|
} = {}
|
59
60
|
) {
|
60
61
|
if (!scripts.length) throw Error("scripts option was an empty array")
|
62
|
+
if (!(await stat(sourceDirectory)).isDirectory()) throw Error("Target folder must be a folder")
|
61
63
|
const scriptNamesToUsers = new Cache(_scriptName => new Set()),
|
62
64
|
wildScriptUsers = new Set(),
|
63
65
|
wildUserScripts = new Set()
|
@@ -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)
|