hackmud-script-manager 0.20.4-abe4703 → 0.20.4-b0ca7f9
Sign up to get free protection for your applications and to get access to all the features.
- package/bin/hsm.js +15 -6
- package/env.d.ts +102 -21
- package/package.json +1 -1
- package/processScript/index.js +1 -1
- package/processScript/minify.js +6 -3
- package/processScript/postprocess.d.ts +1 -1
- package/processScript/postprocess.js +3 -3
- package/processScript/transform.js +12 -11
- package/push.d.ts +9 -1
- package/push.js +30 -10
package/bin/hsm.js
CHANGED
@@ -12,7 +12,7 @@ import { pull } from "../pull.js"
|
|
12
12
|
import { syncMacros } from "../syncMacros.js"
|
13
13
|
import "@samual/lib/readDirectoryWithStats"
|
14
14
|
import "@samual/lib/copyFilePersistent"
|
15
|
-
const version = "0.20.4-
|
15
|
+
const version = "0.20.4-b0ca7f9",
|
16
16
|
options = new Map(),
|
17
17
|
commands = [],
|
18
18
|
userColours = new Cache(user => {
|
@@ -119,16 +119,25 @@ switch (commands[0]) {
|
|
119
119
|
logHelp()
|
120
120
|
break
|
121
121
|
}
|
122
|
-
const { push } = await pushModule
|
123
|
-
|
124
|
-
await push(sourcePath, hackmudPath, {
|
122
|
+
const { push, MissingSourceFolderError, MissingHackmudFolderError, NoUsersError } = await pushModule,
|
123
|
+
infos = await push(sourcePath, hackmudPath, {
|
125
124
|
scripts,
|
126
125
|
onPush: info => logInfo(info, hackmudPath),
|
127
126
|
minify: shouldMinify,
|
128
127
|
mangleNames: shouldMangleNames,
|
129
128
|
forceQuineCheats: shouldforceQuineCheats
|
130
129
|
})
|
131
|
-
|
130
|
+
if (infos instanceof Error) {
|
131
|
+
logError(infos.message)
|
132
|
+
if (infos instanceof MissingSourceFolderError || infos instanceof NoUsersError) {
|
133
|
+
console.log()
|
134
|
+
logHelp()
|
135
|
+
} else
|
136
|
+
infos instanceof MissingHackmudFolderError &&
|
137
|
+
log(
|
138
|
+
`If this is not where your hackmud folder is, you can specify it with the\n${colourN("--hackmud-path")}=${colourB("<path>")} option or ${colourN("HSM_HACKMUD_PATH")} environment variable`
|
139
|
+
)
|
140
|
+
} else infos.length || logError("Could not find any scripts to push")
|
132
141
|
}
|
133
142
|
break
|
134
143
|
case "dev":
|
@@ -245,7 +254,7 @@ switch (commands[0]) {
|
|
245
254
|
typeDeclaration = await generateTypeDeclaration(sourcePath, getHackmudPath())
|
246
255
|
let typeDeclarationPath = resolve(outputPath)
|
247
256
|
await writeFile(typeDeclarationPath, typeDeclaration).catch(error => {
|
248
|
-
assert(error instanceof Error, "src/bin/hsm.ts:
|
257
|
+
assert(error instanceof Error, "src/bin/hsm.ts:340:35")
|
249
258
|
if ("EISDIR" != error.code) throw error
|
250
259
|
typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
|
251
260
|
return writeFile(typeDeclarationPath, typeDeclaration)
|
package/env.d.ts
CHANGED
@@ -4,6 +4,13 @@ type ScriptFailure = { ok: false, msg?: string }
|
|
4
4
|
type ScriptResponse<T = object> = ScriptSuccess<T> | ScriptFailure
|
5
5
|
type ErrorScripts = Record<string, () => ScriptFailure>
|
6
6
|
|
7
|
+
type AllOptional<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? true : false }[keyof T]
|
8
|
+
|
9
|
+
type Scriptor<Args = unknown, Ret = unknown> = {
|
10
|
+
name: string
|
11
|
+
call: AllOptional<Args> extends true ? (args?: Args) => Ret : (args: Args) => Ret
|
12
|
+
}
|
13
|
+
|
7
14
|
type Subscripts = Record<string, Record<string, (...args: any) => any>> & {
|
8
15
|
accts: ErrorScripts
|
9
16
|
autos: ErrorScripts
|
@@ -26,23 +33,27 @@ interface PlayerMidsec {}
|
|
26
33
|
interface PlayerLowsec {}
|
27
34
|
interface PlayerNullsec {}
|
28
35
|
|
29
|
-
type
|
36
|
+
type UpgradeRarityString = "`0noob`" | "`1kiddie`" | "`2h4x0r`" | "`3h4rdc0r3`" | "`4|_|b3|2`" | "`531337`"
|
37
|
+
type UpgradeRarityNumber = 0 | 1 | 2 | 3 | 4 | 5;
|
38
|
+
type UpgradeRarity = UpgradeRarityString | UpgradeRarityNumber;
|
39
|
+
|
40
|
+
type UpgradeBase = {
|
30
41
|
name: string
|
31
42
|
type: "lock" | "script_space" | "chat" | "script" | "tool" | "bot_brain" | "glam"
|
32
43
|
up_class?: -1 | 0 | 1 | 2 | 3
|
33
44
|
tier: 1 | 2 | 3 | 4
|
34
|
-
rarity:
|
45
|
+
rarity: UpgradeRarityNumber
|
35
46
|
i: number
|
36
47
|
loaded: boolean
|
37
48
|
sn: string
|
38
49
|
description: string
|
39
50
|
}
|
40
51
|
|
41
|
-
type Upgrade =
|
52
|
+
type Upgrade = UpgradeBase & Record<string, null | boolean | number | string>
|
42
53
|
|
43
|
-
type
|
54
|
+
type CliUpgrade = Omit<UpgradeBase, `rarity`> & {
|
44
55
|
[x: string]: null | boolean | number | string
|
45
|
-
rarity:
|
56
|
+
rarity: UpgradeRarityString
|
46
57
|
}
|
47
58
|
|
48
59
|
type UsersTopItem<R> = { rank: R, name: string, last_activity: string, balance: string }
|
@@ -140,7 +151,16 @@ type Fullsec = Subscripts & PlayerFullsec & {
|
|
140
151
|
market: {
|
141
152
|
/** **FULLSEC** */ browse: {
|
142
153
|
(args:
|
143
|
-
Partial<{
|
154
|
+
Partial<{
|
155
|
+
seller: string | MongoQuerySelector<string>,
|
156
|
+
listed_before: number | MongoQuerySelector<number>,
|
157
|
+
listed_after: number,
|
158
|
+
cost: number | MongoQuerySelector<number> | string,
|
159
|
+
rarity: UpgradeRarityNumber | MongoQuerySelector<UpgradeRarityNumber>,
|
160
|
+
name: string | MongoQuerySelector<string>
|
161
|
+
} & Omit<{
|
162
|
+
[k in keyof CliUpgrade]: CliUpgrade[k] | MongoQuerySelector<CliUpgrade[k]>
|
163
|
+
}, "rarity">>
|
144
164
|
): { i: string, name: string, rarity: Upgrade["rarity"], cost: number }[] | ScriptFailure
|
145
165
|
|
146
166
|
<I extends string>(args: { i: I }): {
|
@@ -409,17 +429,17 @@ type Fullsec = Subscripts & PlayerFullsec & {
|
|
409
429
|
upgrades_of_owner: {
|
410
430
|
<F extends Partial<Upgrade & { loaded: boolean }> = object>(args?: { filter?: F, full?: false }): (
|
411
431
|
Omit<
|
412
|
-
Pick<
|
432
|
+
Pick<UpgradeBase, "tier" | "rarity" | "name" | "type" | "i" | "loaded">,
|
413
433
|
keyof F
|
414
434
|
> & Pick<F, "tier" | "rarity" | "name" | "type" | "i" | "loaded">
|
415
435
|
)[] | ScriptFailure
|
416
436
|
|
417
437
|
<F extends Partial<Upgrade & { loaded: boolean }> = object>(args: { filter?: F, full: true }): (
|
418
|
-
Omit<
|
438
|
+
Omit<UpgradeBase, keyof F> & F & Record<string, null | boolean | number | string>
|
419
439
|
)[] | ScriptFailure
|
420
440
|
|
421
441
|
<I extends number>(args: { i: I }): (
|
422
|
-
Omit<
|
442
|
+
Omit<UpgradeBase, "i"> & { [x: string]: null | boolean | number | string, i: I }
|
423
443
|
) | ScriptFailure
|
424
444
|
}
|
425
445
|
|
@@ -496,7 +516,7 @@ type Highsec = Fullsec & PlayerHighsec & {
|
|
496
516
|
/** **HIGHSEC** */
|
497
517
|
upgrades: {
|
498
518
|
<I extends number>(args: { i: I }): (
|
499
|
-
Omit<
|
519
|
+
Omit<UpgradeBase, "i"> & { [x: string]: null | boolean | number | string, i: I }
|
500
520
|
) | ScriptFailure
|
501
521
|
|
502
522
|
<F extends Partial<Upgrade & { loaded: boolean }> = object>(args?: {
|
@@ -504,22 +524,22 @@ type Highsec = Fullsec & PlayerHighsec & {
|
|
504
524
|
is_script?: true
|
505
525
|
full?: false
|
506
526
|
}): (
|
507
|
-
Omit<Pick<
|
527
|
+
Omit<Pick<UpgradeBase, "tier" | "rarity" | "name" | "type" | "i" | "loaded">, keyof F> & F &
|
508
528
|
Record<string, null | boolean | number | string>
|
509
529
|
)[] | ScriptFailure
|
510
530
|
|
511
531
|
<F extends Partial<Upgrade & { loaded: boolean }> = object>(args?:
|
512
532
|
{ filter?: F, is_script?: true, full: true }
|
513
|
-
): (Omit<
|
533
|
+
): (Omit<UpgradeBase, keyof F> & F & Record<string, null | boolean | number | string>)[] | ScriptFailure
|
514
534
|
|
515
535
|
(args?: { filter?: Partial<Upgrade & { loaded: boolean }>, is_script: false, full?: false }):
|
516
536
|
{ msg: string, upgrades: string[] } | ScriptFailure
|
517
537
|
|
518
538
|
<F extends Partial<Upgrade & { loaded: boolean }> = object>(
|
519
539
|
args?: { filter?: F, is_script: false, full: true }
|
520
|
-
): (Omit<
|
540
|
+
): (Omit<UpgradeBase, keyof F | `rarity`> & F & {
|
521
541
|
[x: string]: null | boolean | number | string
|
522
|
-
rarity:
|
542
|
+
rarity: UpgradeRarityString
|
523
543
|
})[] | ScriptFailure
|
524
544
|
}
|
525
545
|
}
|
@@ -699,10 +719,50 @@ type Nullsec = Lowsec & PlayerNullsec & {
|
|
699
719
|
}
|
700
720
|
}
|
701
721
|
|
722
|
+
type MongoTypeString = "minKey" | "double" | "string" | "object" | "array" | "binData" | "undefined" | "objectId" |
|
723
|
+
"bool" | "date" | "null" | "regex" | "dbPointer" | "javascript" | "symbol" | "int" | "timestamp" | "long" | "decimal" | "maxKey";
|
724
|
+
type MongoTypeNumber = -1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 127;
|
725
|
+
|
702
726
|
type MongoValue = string | number | boolean | Date | MongoValue[] | { [key: string]: MongoValue } | null
|
703
727
|
|
704
728
|
type MongoCommandValue = string | number | boolean | Date | MongoCommandValue[] | { [key: string]: MongoCommandValue } |
|
705
|
-
|
729
|
+
null | undefined
|
730
|
+
|
731
|
+
/**
|
732
|
+
* Currently unused
|
733
|
+
*/
|
734
|
+
type MongoLogicalSelectors<T extends MongoValue = MongoValue> = {
|
735
|
+
$not: T | MongoComparisonSelectors<T> | MongoLogicalSelectors<T>
|
736
|
+
$nor: T[]
|
737
|
+
$or: T[]
|
738
|
+
$and: T[]
|
739
|
+
}
|
740
|
+
|
741
|
+
type MongoArraySelectors<T extends Array<MongoValue> = Array<MongoValue>> = {
|
742
|
+
$all: T
|
743
|
+
$elemMatch: T
|
744
|
+
$size: number
|
745
|
+
}
|
746
|
+
|
747
|
+
type MongoComparisonSelectors<T extends MongoValue = MongoValue> = {
|
748
|
+
$eq: T
|
749
|
+
$gt: T
|
750
|
+
$gte: T
|
751
|
+
$in: T[]
|
752
|
+
$lt: T
|
753
|
+
$lte: T
|
754
|
+
$ne: T
|
755
|
+
$nin: T[]
|
756
|
+
}
|
757
|
+
|
758
|
+
type MongoElementSelectors = {
|
759
|
+
$exists: boolean
|
760
|
+
$type: MongoTypeNumber | MongoTypeString
|
761
|
+
}
|
762
|
+
|
763
|
+
type MongoQuerySelector<T extends MongoValue = MongoValue> = Partial<T extends MongoValue[] ?
|
764
|
+
(MongoArraySelectors<T> & MongoElementSelectors & MongoComparisonSelectors<T>) :
|
765
|
+
(MongoElementSelectors & MongoComparisonSelectors<T>)>
|
706
766
|
|
707
767
|
type Query = { [key: string]: MongoValue | Query } & { _id?: Id, $in?: MongoValue[] }
|
708
768
|
type Projection = Record<string, boolean | 0 | 1>
|
@@ -751,7 +811,7 @@ type Cursor = {
|
|
751
811
|
ObjectId: () => any
|
752
812
|
}
|
753
813
|
|
754
|
-
type
|
814
|
+
type CliContext = {
|
755
815
|
/** The name of the user who is calling the script. */ caller: string
|
756
816
|
/** The name of this script. */ this_script: string
|
757
817
|
/** The number of columns in the caller’s terminal. */ cols: number
|
@@ -759,17 +819,23 @@ type CLIContext = {
|
|
759
819
|
|
760
820
|
/** The name of the script that directly called this script, or null if called on the command line or as a
|
761
821
|
* scriptor. */ calling_script: null
|
822
|
+
is_scriptor?: undefined
|
823
|
+
is_brain?: undefined
|
762
824
|
}
|
763
825
|
|
764
|
-
type SubscriptContext = Replace<
|
826
|
+
type SubscriptContext = Replace<CliContext, {
|
765
827
|
/** The name of the script that directly called this script, or null if called on the command line or as a scriptor.
|
766
828
|
*/
|
767
829
|
calling_script: string
|
768
830
|
}>
|
769
831
|
|
770
|
-
type ScriptorContext =
|
771
|
-
|
772
|
-
|
832
|
+
type ScriptorContext =
|
833
|
+
Replace<CliContext, { /** Whether the script is being run as a scriptor. */ is_scriptor: true }>
|
834
|
+
|
835
|
+
type BrainContext =
|
836
|
+
Replace<CliContext, { /** Whether the script is being run via a bot brain. */ is_brain: true }>
|
837
|
+
|
838
|
+
type Context = CliContext | SubscriptContext | ScriptorContext | BrainContext
|
773
839
|
|
774
840
|
/** Subscript space that can call FULLSEC scripts. */ declare const $fs: Fullsec
|
775
841
|
|
@@ -812,6 +878,8 @@ declare const $0s: typeof $ns
|
|
812
878
|
* } */
|
813
879
|
declare const $s: Nullsec
|
814
880
|
|
881
|
+
type ObjectId = { $oid: string }
|
882
|
+
|
815
883
|
declare const $db: {
|
816
884
|
/** Insert a document or documents into a collection.
|
817
885
|
* @param documents A document or array of documents to insert into the collection. */
|
@@ -905,6 +973,8 @@ declare const $db: {
|
|
905
973
|
signature: { hash: "Undefined Conversion", keyId: "Undefined Conversion" }
|
906
974
|
}
|
907
975
|
}
|
976
|
+
|
977
|
+
ObjectId: () => ObjectId
|
908
978
|
}
|
909
979
|
|
910
980
|
/** Debug Log.
|
@@ -941,7 +1011,7 @@ declare const $FMCL: undefined | true
|
|
941
1011
|
* @example
|
942
1012
|
* if (!$G.dbCache)
|
943
1013
|
* $G.dbCache = $db.f({ whatever: true }).first() */
|
944
|
-
declare const $G: any
|
1014
|
+
declare const $G: Record<string | symbol, any>
|
945
1015
|
|
946
1016
|
/** This contains a JS timestamp (not Date) set immediately before your code begins running.
|
947
1017
|
* @example
|
@@ -990,3 +1060,14 @@ declare const _FULL_SCRIPT_NAME: string
|
|
990
1060
|
*
|
991
1061
|
* In rare cases where it's not known at build time, it's `-1`. */
|
992
1062
|
declare const _SECLEVEL: -1 | 0 | 1 | 2 | 3 | 4
|
1063
|
+
|
1064
|
+
type DeepFreeze<T> = { readonly [P in keyof T]: DeepFreeze<T[P]> }
|
1065
|
+
|
1066
|
+
/** Recursively
|
1067
|
+
* [`Object.freeze()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)
|
1068
|
+
* an object and its properties' objects and its properties' objects and so on.
|
1069
|
+
*
|
1070
|
+
* [Official Hackmud Wiki](https://wiki.hackmud.com/scripting/extensions/deep_freeze) */
|
1071
|
+
declare const DEEP_FREEZE: <T>(value: T) => DeepFreeze<T>
|
1072
|
+
|
1073
|
+
declare const _RUN_ID: string
|
package/package.json
CHANGED
package/processScript/index.js
CHANGED
@@ -323,7 +323,7 @@ async function processScript(
|
|
323
323
|
trailingComma: "none"
|
324
324
|
})
|
325
325
|
}
|
326
|
-
code = postprocess(code,
|
326
|
+
code = postprocess(code, uniqueId)
|
327
327
|
if (includesIllegalString(code))
|
328
328
|
throw Error(
|
329
329
|
'you found a weird edge case where I wasn\'t able to replace illegal strings like "SC$", please report thx'
|
package/processScript/minify.js
CHANGED
@@ -259,7 +259,10 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
259
259
|
t.memberExpression(
|
260
260
|
t.taggedTemplateExpression(
|
261
261
|
t.memberExpression(
|
262
|
-
t.callExpression(
|
262
|
+
t.callExpression(
|
263
|
+
t.identifier(`$${uniqueId}$4$SUBSCRIPT$scripts$quine$`),
|
264
|
+
[]
|
265
|
+
),
|
263
266
|
t.identifier("split")
|
264
267
|
),
|
265
268
|
t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
|
@@ -283,7 +286,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
283
286
|
t.memberExpression(
|
284
287
|
t.taggedTemplateExpression(
|
285
288
|
t.memberExpression(
|
286
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$scripts$quine$`), []),
|
289
|
+
t.callExpression(t.identifier(`$${uniqueId}$4$SUBSCRIPT$scripts$quine$`), []),
|
287
290
|
t.identifier("split")
|
288
291
|
),
|
289
292
|
t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
|
@@ -308,7 +311,7 @@ async function minify(file, { uniqueId = "00000000000", mangleNames = !1, forceQ
|
|
308
311
|
t.memberExpression(
|
309
312
|
t.taggedTemplateExpression(
|
310
313
|
t.memberExpression(
|
311
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$scripts$quine$`), []),
|
314
|
+
t.callExpression(t.identifier(`$${uniqueId}$4$SUBSCRIPT$scripts$quine$`), []),
|
312
315
|
t.identifier("split")
|
313
316
|
),
|
314
317
|
t.templateLiteral([t.templateElement({ raw: "\t", cooked: "\t" }, !0)], [])
|
@@ -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")
|
@@ -101,29 +101,29 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
101
101
|
functionDotPrototypeIsReferencedMultipleTimes = !0
|
102
102
|
}
|
103
103
|
}
|
104
|
-
const neededSubscriptLets = new
|
104
|
+
const neededSubscriptLets = new Map()
|
105
105
|
let detectedSeclevel = 4
|
106
106
|
for (const fakeSubscriptObjectName of ["$fs", "$4s", "$s"])
|
107
|
-
program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName)
|
107
|
+
program.scope.hasGlobal(fakeSubscriptObjectName) && processFakeSubscriptObject(fakeSubscriptObjectName, 4)
|
108
108
|
for (const fakeSubscriptObjectName of ["$hs", "$3s"])
|
109
109
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
110
110
|
detectedSeclevel = 3
|
111
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
111
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 3)
|
112
112
|
}
|
113
113
|
for (const fakeSubscriptObjectName of ["$ms", "$2s"])
|
114
114
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
115
115
|
detectedSeclevel = 2
|
116
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
116
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 2)
|
117
117
|
}
|
118
118
|
for (const fakeSubscriptObjectName of ["$ls", "$1s"])
|
119
119
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
120
120
|
detectedSeclevel = 1
|
121
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
121
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 1)
|
122
122
|
}
|
123
123
|
for (const fakeSubscriptObjectName of ["$ns", "$0s"])
|
124
124
|
if (program.scope.hasGlobal(fakeSubscriptObjectName)) {
|
125
125
|
detectedSeclevel = 0
|
126
|
-
processFakeSubscriptObject(fakeSubscriptObjectName)
|
126
|
+
processFakeSubscriptObject(fakeSubscriptObjectName, 0)
|
127
127
|
}
|
128
128
|
seclevel = Math.min(seclevel, detectedSeclevel)
|
129
129
|
const neededDbMethodLets = new Set()
|
@@ -522,12 +522,12 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
522
522
|
mainFunction.body.body.unshift(
|
523
523
|
t.variableDeclaration(
|
524
524
|
"let",
|
525
|
-
[...neededSubscriptLets].map(name =>
|
525
|
+
[...neededSubscriptLets].map(([name, seclevel]) =>
|
526
526
|
t.variableDeclarator(
|
527
527
|
t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`),
|
528
528
|
t.arrowFunctionExpression(
|
529
529
|
[t.restElement(t.identifier("args"))],
|
530
|
-
t.callExpression(t.identifier(`$${uniqueId}$SUBSCRIPT$${name}$`), [
|
530
|
+
t.callExpression(t.identifier(`$${uniqueId}$${seclevel}$SUBSCRIPT$${name}$`), [
|
531
531
|
t.spreadElement(t.identifier("args"))
|
532
532
|
])
|
533
533
|
)
|
@@ -661,7 +661,7 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
661
661
|
t.identifier("prototype")
|
662
662
|
)
|
663
663
|
}
|
664
|
-
function processFakeSubscriptObject(fakeSubscriptObjectName) {
|
664
|
+
function processFakeSubscriptObject(fakeSubscriptObjectName, seclevel) {
|
665
665
|
for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
|
666
666
|
assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:785:60")
|
667
667
|
assert("Identifier" == referencePath.parent.property.type)
|
@@ -684,13 +684,14 @@ function transform(file, sourceCode, { uniqueId = "00000000000", scriptUser, scr
|
|
684
684
|
if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
|
685
685
|
referencePath.parentPath.parentPath.replaceWith(
|
686
686
|
t.identifier(
|
687
|
-
`$${uniqueId}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
|
687
|
+
`$${uniqueId}$${seclevel}$SUBSCRIPT$${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}$`
|
688
688
|
)
|
689
689
|
)
|
690
690
|
else {
|
691
691
|
const name = `${referencePath.parent.property.name}$${referencePath.parentPath.parentPath.node.property.name}`
|
692
692
|
referencePath.parentPath.parentPath.replaceWith(t.identifier(`_${uniqueId}_SUBSCRIPT_${name}_`))
|
693
|
-
neededSubscriptLets.
|
693
|
+
const maxSecLevel = Math.max(neededSubscriptLets.get(name) || 0, seclevel)
|
694
|
+
neededSubscriptLets.set(name, maxSecLevel)
|
694
695
|
}
|
695
696
|
}
|
696
697
|
}
|
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,19 +42,37 @@ 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),
|
@@ -63,13 +81,15 @@ async function push(
|
|
63
81
|
.map(({ name }) => name.slice(0, -4))
|
64
82
|
])
|
65
83
|
if (!allUsers.size)
|
66
|
-
|
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
|
+
)
|
67
87
|
const usersToScriptsToPush = new Cache(_user => new Map()),
|
68
88
|
scriptNamesToUsers = new Cache(_scriptName => new Set())
|
69
89
|
for (const script of scripts) {
|
70
90
|
const [user, scriptName] = script.split(".")
|
71
|
-
assert(user, "src/push.ts:
|
72
|
-
assert(scriptName, "src/push.ts:
|
91
|
+
assert(user, "src/push.ts:105:16")
|
92
|
+
assert(scriptName, "src/push.ts:106:22")
|
73
93
|
"*" == user ? scriptNamesToUsers.set(scriptName, allUsers) : scriptNamesToUsers.get(scriptName).add(user)
|
74
94
|
}
|
75
95
|
const sourceFolderFiles = sourceFolder.filter(({ stats }) => stats.isFile()),
|
@@ -100,7 +120,7 @@ async function push(
|
|
100
120
|
for (const [scriptName, users] of scriptNamesToUsers)
|
101
121
|
for (const user of users)
|
102
122
|
if (!usersToScriptsToPush.get(user).has(scriptName))
|
103
|
-
|
123
|
+
return new NoScriptsError(`Could not find script ${user}.${scriptName} to push`)
|
104
124
|
const pathsToUsers = new Cache(_path => new Set())
|
105
125
|
for (const [user, scriptsToPush] of usersToScriptsToPush)
|
106
126
|
for (const path of scriptsToPush.values()) pathsToUsers.get(path).add(user)
|
@@ -137,4 +157,4 @@ async function push(
|
|
137
157
|
)
|
138
158
|
return allInfo
|
139
159
|
}
|
140
|
-
export { push }
|
160
|
+
export { MissingHackmudFolderError, MissingSourceFolderError, NoScriptsError, NoUsersError, push }
|