hackmud-script-manager 0.19.0 → 0.19.1-4bde221
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +0 -2
- package/bin/hsm.js +589 -1
- package/constants.js +3 -1
- package/generateTypeDeclaration.js +68 -1
- package/index.js +50 -1
- package/package.json +35 -34
- package/processScript/index.js +316 -1
- package/processScript/minify.js +458 -1
- package/processScript/postprocess.js +20 -1
- package/processScript/preprocess.js +105 -1
- package/processScript/shared.js +32 -1
- package/processScript/transform.js +649 -1
- package/pull.js +11 -1
- package/push.js +263 -1
- package/syncMacros.js +42 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/watch.js +209 -1
@@ -1 +1,68 @@
|
|
1
|
-
import{readdir
|
1
|
+
import { readdir } from "fs/promises"
|
2
|
+
import { basename, resolve } from "path"
|
3
|
+
const generateTypeDeclaration = async (sourceDirectory, hackmudPath) => {
|
4
|
+
const users = new Set()
|
5
|
+
if (hackmudPath)
|
6
|
+
for (const dirent of await readdir(hackmudPath, { withFileTypes: !0 }))
|
7
|
+
dirent.isFile() && dirent.name.endsWith(".key") && users.add(basename(dirent.name, ".key"))
|
8
|
+
const wildScripts = [],
|
9
|
+
wildAnyScripts = [],
|
10
|
+
allScripts = {},
|
11
|
+
allAnyScripts = {}
|
12
|
+
await Promise.all(
|
13
|
+
(await readdir(sourceDirectory, { withFileTypes: !0 })).map(async dirent => {
|
14
|
+
if (dirent.isFile())
|
15
|
+
dirent.name.endsWith(".ts") ?
|
16
|
+
dirent.name.endsWith(".d.ts") || wildScripts.push(basename(dirent.name, ".ts"))
|
17
|
+
: dirent.name.endsWith(".js") && wildAnyScripts.push(basename(dirent.name, ".js"))
|
18
|
+
else if (dirent.isDirectory()) {
|
19
|
+
const scripts = [],
|
20
|
+
anyScripts = []
|
21
|
+
allScripts[dirent.name] = scripts
|
22
|
+
allAnyScripts[dirent.name] = anyScripts
|
23
|
+
users.add(dirent.name)
|
24
|
+
for (const file of await readdir(resolve(sourceDirectory, dirent.name), { withFileTypes: !0 }))
|
25
|
+
file.isFile() &&
|
26
|
+
(file.name.endsWith(".ts") ?
|
27
|
+
dirent.name.endsWith(".d.ts") || scripts.push(basename(file.name, ".ts"))
|
28
|
+
: file.name.endsWith(".js") && anyScripts.push(basename(file.name, ".js")))
|
29
|
+
}
|
30
|
+
})
|
31
|
+
)
|
32
|
+
sourceDirectory = resolve(sourceDirectory)
|
33
|
+
let o = ""
|
34
|
+
for (const script of wildScripts) o += `type $${script}$ = typeof import("${sourceDirectory}/${script}").default\n`
|
35
|
+
o += "\n"
|
36
|
+
for (const user in allScripts) {
|
37
|
+
const scripts = allScripts[user]
|
38
|
+
for (const script of scripts)
|
39
|
+
o += `type $${user}$${script}$ = typeof import("${sourceDirectory}/${user}/${script}").default\n`
|
40
|
+
}
|
41
|
+
o +=
|
42
|
+
"\ntype ArrayRemoveFirst<A> = A extends [ infer FirstItem, ...infer Rest ] ? Rest : never\n\ntype Subscript<T extends (...args: any) => any> =\n\t(...args: ArrayRemoveFirst<Parameters<T>>) => ReturnType<T> | ScriptFailure\n\ntype WildFullsec = Record<string, () => ScriptFailure> & {\n"
|
43
|
+
for (const script of wildScripts) o += `\t${script}: Subscript<$${script}$>\n`
|
44
|
+
for (const script of wildAnyScripts) o += `\t${script}: (...args: any) => any\n`
|
45
|
+
o += "}\n\ninterface PlayerFullsec {"
|
46
|
+
let lastWasMultiLine = !0
|
47
|
+
for (const user of users) {
|
48
|
+
const scripts = allScripts[user],
|
49
|
+
anyScripts = allAnyScripts[user]
|
50
|
+
if ((scripts && scripts.length) || (anyScripts && anyScripts.length)) {
|
51
|
+
lastWasMultiLine = !0
|
52
|
+
o += `\n\t${user}: WildFullsec & {\n`
|
53
|
+
if (scripts) for (const script of scripts) o += `\t\t${script}: Subscript<$${user}$${script}$>\n`
|
54
|
+
if (anyScripts) for (const script of anyScripts) o += `\t\t${script}: (...args: any) => any\n`
|
55
|
+
o += "\t}"
|
56
|
+
} else {
|
57
|
+
if (lastWasMultiLine) {
|
58
|
+
o += "\n"
|
59
|
+
lastWasMultiLine = !1
|
60
|
+
}
|
61
|
+
o += `\t${user}: WildFullsec`
|
62
|
+
}
|
63
|
+
o += "\n"
|
64
|
+
}
|
65
|
+
o += "}\n"
|
66
|
+
return o
|
67
|
+
}
|
68
|
+
export { generateTypeDeclaration as default, generateTypeDeclaration }
|
package/index.js
CHANGED
@@ -1 +1,50 @@
|
|
1
|
-
export{supportedExtensions}from"./constants.js"
|
1
|
+
export { supportedExtensions } from "./constants.js"
|
2
|
+
export { generateTypeDeclaration } from "./generateTypeDeclaration.js"
|
3
|
+
export { processScript } from "./processScript/index.js"
|
4
|
+
export { pull } from "./pull.js"
|
5
|
+
export { push } from "./push.js"
|
6
|
+
export { syncMacros } from "./syncMacros.js"
|
7
|
+
export { watch } from "./watch.js"
|
8
|
+
import "fs/promises"
|
9
|
+
import "path"
|
10
|
+
import "@babel/generator"
|
11
|
+
import "@babel/parser"
|
12
|
+
import "@babel/plugin-proposal-decorators"
|
13
|
+
import "@babel/plugin-proposal-destructuring-private"
|
14
|
+
import "@babel/plugin-proposal-explicit-resource-management"
|
15
|
+
import "@babel/plugin-transform-class-properties"
|
16
|
+
import "@babel/plugin-transform-class-static-block"
|
17
|
+
import "@babel/plugin-transform-exponentiation-operator"
|
18
|
+
import "@babel/plugin-transform-json-strings"
|
19
|
+
import "@babel/plugin-transform-logical-assignment-operators"
|
20
|
+
import "@babel/plugin-transform-nullish-coalescing-operator"
|
21
|
+
import "@babel/plugin-transform-numeric-separator"
|
22
|
+
import "@babel/plugin-transform-object-rest-spread"
|
23
|
+
import "@babel/plugin-transform-optional-catch-binding"
|
24
|
+
import "@babel/plugin-transform-optional-chaining"
|
25
|
+
import "@babel/plugin-transform-private-property-in-object"
|
26
|
+
import "@babel/plugin-transform-unicode-sets-regex"
|
27
|
+
import "@babel/traverse"
|
28
|
+
import "@babel/types"
|
29
|
+
import "@rollup/plugin-babel"
|
30
|
+
import "@rollup/plugin-commonjs"
|
31
|
+
import "@rollup/plugin-json"
|
32
|
+
import "@rollup/plugin-node-resolve"
|
33
|
+
import "@samual/lib/assert"
|
34
|
+
import "prettier"
|
35
|
+
import "rollup"
|
36
|
+
import "./processScript/minify.js"
|
37
|
+
import "@samual/lib/countHackmudCharacters"
|
38
|
+
import "@samual/lib/spliceString"
|
39
|
+
import "acorn"
|
40
|
+
import "terser"
|
41
|
+
import "./processScript/shared.js"
|
42
|
+
import "./processScript/postprocess.js"
|
43
|
+
import "./processScript/preprocess.js"
|
44
|
+
import "import-meta-resolve"
|
45
|
+
import "./processScript/transform.js"
|
46
|
+
import "@samual/lib/clearObject"
|
47
|
+
import "@samual/lib/copyFilePersistent"
|
48
|
+
import "@samual/lib/Cache"
|
49
|
+
import "@samual/lib/writeFilePersistent"
|
50
|
+
import "chokidar"
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "hackmud-script-manager",
|
3
|
-
"version": "0.19.
|
3
|
+
"version": "0.19.1-4bde221",
|
4
4
|
"description": "Script manager for game hackmud, with minification, TypeScript support, and player script type definition generation.",
|
5
5
|
"keywords": [
|
6
6
|
"api",
|
@@ -27,50 +27,51 @@
|
|
27
27
|
"url": "https://github.com/samualtnorman/hackmud-script-manager.git"
|
28
28
|
},
|
29
29
|
"dependencies": {
|
30
|
-
"@babel/generator": "^7.
|
31
|
-
"@babel/parser": "^7.
|
32
|
-
"@babel/plugin-proposal-decorators": "^7.
|
33
|
-
"@babel/plugin-proposal-destructuring-private": "^7.
|
34
|
-
"@babel/plugin-proposal-do-expressions": "^7.
|
35
|
-
"@babel/plugin-proposal-explicit-resource-management": "^7.
|
36
|
-
"@babel/plugin-proposal-function-bind": "^7.
|
37
|
-
"@babel/plugin-proposal-function-sent": "^7.
|
38
|
-
"@babel/plugin-proposal-partial-application": "^7.
|
39
|
-
"@babel/plugin-proposal-pipeline-operator": "^7.
|
40
|
-
"@babel/plugin-proposal-record-and-tuple": "^7.
|
41
|
-
"@babel/plugin-proposal-throw-expressions": "^7.
|
42
|
-
"@babel/plugin-transform-class-properties": "^7.
|
43
|
-
"@babel/plugin-transform-class-static-block": "^7.
|
44
|
-
"@babel/plugin-transform-exponentiation-operator": "^7.
|
45
|
-
"@babel/plugin-transform-json-strings": "^7.
|
46
|
-
"@babel/plugin-transform-logical-assignment-operators": "^7.
|
47
|
-
"@babel/plugin-transform-nullish-coalescing-operator": "^7.
|
48
|
-
"@babel/plugin-transform-numeric-separator": "^7.
|
49
|
-
"@babel/plugin-transform-object-rest-spread": "^7.
|
50
|
-
"@babel/plugin-transform-optional-catch-binding": "^7.
|
51
|
-
"@babel/plugin-transform-optional-chaining": "^7.
|
52
|
-
"@babel/plugin-transform-private-property-in-object": "^7.
|
53
|
-
"@babel/plugin-transform-typescript": "^7.
|
54
|
-
"@babel/plugin-transform-unicode-sets-regex": "^7.
|
55
|
-
"@babel/traverse": "^7.
|
56
|
-
"@babel/types": "^7.
|
30
|
+
"@babel/generator": "^7.24.4",
|
31
|
+
"@babel/parser": "^7.24.4",
|
32
|
+
"@babel/plugin-proposal-decorators": "^7.24.1",
|
33
|
+
"@babel/plugin-proposal-destructuring-private": "^7.24.1",
|
34
|
+
"@babel/plugin-proposal-do-expressions": "^7.24.1",
|
35
|
+
"@babel/plugin-proposal-explicit-resource-management": "^7.24.1",
|
36
|
+
"@babel/plugin-proposal-function-bind": "^7.24.1",
|
37
|
+
"@babel/plugin-proposal-function-sent": "^7.24.1",
|
38
|
+
"@babel/plugin-proposal-partial-application": "^7.24.1",
|
39
|
+
"@babel/plugin-proposal-pipeline-operator": "^7.24.1",
|
40
|
+
"@babel/plugin-proposal-record-and-tuple": "^7.24.1",
|
41
|
+
"@babel/plugin-proposal-throw-expressions": "^7.24.1",
|
42
|
+
"@babel/plugin-transform-class-properties": "^7.24.1",
|
43
|
+
"@babel/plugin-transform-class-static-block": "^7.24.4",
|
44
|
+
"@babel/plugin-transform-exponentiation-operator": "^7.24.1",
|
45
|
+
"@babel/plugin-transform-json-strings": "^7.24.1",
|
46
|
+
"@babel/plugin-transform-logical-assignment-operators": "^7.24.1",
|
47
|
+
"@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
|
48
|
+
"@babel/plugin-transform-numeric-separator": "^7.24.1",
|
49
|
+
"@babel/plugin-transform-object-rest-spread": "^7.24.1",
|
50
|
+
"@babel/plugin-transform-optional-catch-binding": "^7.24.1",
|
51
|
+
"@babel/plugin-transform-optional-chaining": "^7.24.1",
|
52
|
+
"@babel/plugin-transform-private-property-in-object": "^7.24.1",
|
53
|
+
"@babel/plugin-transform-typescript": "^7.24.4",
|
54
|
+
"@babel/plugin-transform-unicode-sets-regex": "^7.24.1",
|
55
|
+
"@babel/traverse": "^7.24.1",
|
56
|
+
"@babel/types": "^7.24.0",
|
57
57
|
"@bloomberg/record-tuple-polyfill": "^0.0.4",
|
58
58
|
"@rollup/plugin-babel": "^6.0.4",
|
59
59
|
"@rollup/plugin-commonjs": "^25.0.7",
|
60
60
|
"@rollup/plugin-json": "^6.1.0",
|
61
61
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
62
|
-
"@samual/lib": "^0.
|
62
|
+
"@samual/lib": "^0.10.1",
|
63
63
|
"acorn": "^8.11.3",
|
64
64
|
"chalk": "^5.3.0",
|
65
|
-
"chokidar": "^3.
|
65
|
+
"chokidar": "^3.6.0",
|
66
66
|
"import-meta-resolve": "^4.0.0",
|
67
|
-
"prettier": "^3.2.
|
67
|
+
"prettier": "^3.2.5",
|
68
68
|
"proxy-polyfill": "^0.3.2",
|
69
|
-
"rollup": "^4.
|
70
|
-
"terser": "^5.
|
69
|
+
"rollup": "^4.14.2",
|
70
|
+
"terser": "^5.30.3"
|
71
71
|
},
|
72
72
|
"engines": {
|
73
|
-
"node": ">=20"
|
73
|
+
"node": "^18 || >=20",
|
74
|
+
"pnpm": "^8.15.7"
|
74
75
|
},
|
75
76
|
"type": "module",
|
76
77
|
"exports": {
|
package/processScript/index.js
CHANGED
@@ -1 +1,316 @@
|
|
1
|
-
import
|
1
|
+
import babelGenerator from "@babel/generator"
|
2
|
+
import { parse } from "@babel/parser"
|
3
|
+
import babelPluginProposalDecorators from "@babel/plugin-proposal-decorators"
|
4
|
+
import babelPluginProposalDestructuringPrivate from "@babel/plugin-proposal-destructuring-private"
|
5
|
+
import babelPluginProposalExplicitResourceManagement from "@babel/plugin-proposal-explicit-resource-management"
|
6
|
+
import babelPluginTransformClassProperties from "@babel/plugin-transform-class-properties"
|
7
|
+
import babelPluginTransformClassStaticBlock from "@babel/plugin-transform-class-static-block"
|
8
|
+
import babelPluginTransformExponentiationOperator from "@babel/plugin-transform-exponentiation-operator"
|
9
|
+
import babelPluginTransformJsonStrings from "@babel/plugin-transform-json-strings"
|
10
|
+
import babelPluginTransformLogicalAssignmentOperators from "@babel/plugin-transform-logical-assignment-operators"
|
11
|
+
import babelPluginTransformNullishCoalescingOperator from "@babel/plugin-transform-nullish-coalescing-operator"
|
12
|
+
import babelPluginTransformNumericSeparator from "@babel/plugin-transform-numeric-separator"
|
13
|
+
import babelPluginTransformObjectRestSpread from "@babel/plugin-transform-object-rest-spread"
|
14
|
+
import babelPluginTransformOptionalCatchBinding from "@babel/plugin-transform-optional-catch-binding"
|
15
|
+
import babelPluginTransformOptionalChaining from "@babel/plugin-transform-optional-chaining"
|
16
|
+
import babelPluginTransformPrivatePropertyInObject from "@babel/plugin-transform-private-property-in-object"
|
17
|
+
import babelPluginTransformUnicodeSetsRegex from "@babel/plugin-transform-unicode-sets-regex"
|
18
|
+
import babelTraverse from "@babel/traverse"
|
19
|
+
import t from "@babel/types"
|
20
|
+
import { babel } from "@rollup/plugin-babel"
|
21
|
+
import rollupPluginCommonJS from "@rollup/plugin-commonjs"
|
22
|
+
import rollupPluginJSON from "@rollup/plugin-json"
|
23
|
+
import rollupPluginNodeResolve from "@rollup/plugin-node-resolve"
|
24
|
+
import { assert } from "@samual/lib/assert"
|
25
|
+
import { resolve } from "path"
|
26
|
+
import prettier from "prettier"
|
27
|
+
import { rollup } from "rollup"
|
28
|
+
import { supportedExtensions } from "../constants.js"
|
29
|
+
import { minify } from "./minify.js"
|
30
|
+
import { postprocess } from "./postprocess.js"
|
31
|
+
import { preprocess } from "./preprocess.js"
|
32
|
+
import { includesIllegalString, replaceUnsafeStrings } from "./shared.js"
|
33
|
+
import { transform } from "./transform.js"
|
34
|
+
import "@samual/lib/countHackmudCharacters"
|
35
|
+
import "@samual/lib/spliceString"
|
36
|
+
import "acorn"
|
37
|
+
import "terser"
|
38
|
+
import "import-meta-resolve"
|
39
|
+
import "@samual/lib/clearObject"
|
40
|
+
const { format } = prettier,
|
41
|
+
{ default: generate } = babelGenerator,
|
42
|
+
{ default: traverse } = babelTraverse,
|
43
|
+
processScript = async (
|
44
|
+
code,
|
45
|
+
{
|
46
|
+
minify: shouldMinify = !0,
|
47
|
+
uniqueID = Math.floor(Math.random() * 2 ** 52)
|
48
|
+
.toString(36)
|
49
|
+
.padStart(11, "0"),
|
50
|
+
scriptUser = "UNKNOWN",
|
51
|
+
scriptName = "UNKNOWN",
|
52
|
+
filePath,
|
53
|
+
mangleNames = !1,
|
54
|
+
forceQuineCheats
|
55
|
+
} = {}
|
56
|
+
) => {
|
57
|
+
assert(/^\w{11}$/.exec(uniqueID))
|
58
|
+
const sourceCode = code
|
59
|
+
let autocomplete, statedSeclevel
|
60
|
+
const autocompleteMatch = /^function\s*\(.+\/\/(?<autocomplete>.+)/.exec(code)
|
61
|
+
if (autocompleteMatch) {
|
62
|
+
code = "export default " + code
|
63
|
+
;({ autocomplete } = autocompleteMatch.groups)
|
64
|
+
} else
|
65
|
+
for (const line of code.split("\n")) {
|
66
|
+
const comment = /^\s*\/\/(?<commentContent>.+)/.exec(line)
|
67
|
+
if (!comment) break
|
68
|
+
const commentContent = comment.groups.commentContent.trim()
|
69
|
+
if (commentContent.startsWith("@autocomplete ")) autocomplete = commentContent.slice(14).trimStart()
|
70
|
+
else if (commentContent.startsWith("@seclevel ")) {
|
71
|
+
const seclevelString = commentContent.slice(10).trimStart().toLowerCase()
|
72
|
+
switch (seclevelString) {
|
73
|
+
case "fullsec":
|
74
|
+
case "full":
|
75
|
+
case "fs":
|
76
|
+
case "4s":
|
77
|
+
case "f":
|
78
|
+
case "4":
|
79
|
+
statedSeclevel = 4
|
80
|
+
break
|
81
|
+
case "highsec":
|
82
|
+
case "high":
|
83
|
+
case "hs":
|
84
|
+
case "3s":
|
85
|
+
case "h":
|
86
|
+
case "3":
|
87
|
+
statedSeclevel = 3
|
88
|
+
break
|
89
|
+
case "midsec":
|
90
|
+
case "mid":
|
91
|
+
case "ms":
|
92
|
+
case "2s":
|
93
|
+
case "m":
|
94
|
+
case "2":
|
95
|
+
statedSeclevel = 2
|
96
|
+
break
|
97
|
+
case "lowsec":
|
98
|
+
case "low":
|
99
|
+
case "ls":
|
100
|
+
case "1s":
|
101
|
+
case "l":
|
102
|
+
case "1":
|
103
|
+
statedSeclevel = 1
|
104
|
+
break
|
105
|
+
case "nullsec":
|
106
|
+
case "null":
|
107
|
+
case "ns":
|
108
|
+
case "0s":
|
109
|
+
case "n":
|
110
|
+
case "0":
|
111
|
+
statedSeclevel = 0
|
112
|
+
break
|
113
|
+
default:
|
114
|
+
throw Error(`unrecognised seclevel "${seclevelString}"`)
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
118
|
+
assert(/^\w{11}$/.exec(uniqueID))
|
119
|
+
const plugins = [
|
120
|
+
[babelPluginProposalDecorators.default, { decoratorsBeforeExport: !0 }],
|
121
|
+
[babelPluginTransformClassProperties.default],
|
122
|
+
[babelPluginTransformClassStaticBlock.default],
|
123
|
+
[babelPluginTransformPrivatePropertyInObject.default],
|
124
|
+
[babelPluginTransformLogicalAssignmentOperators.default],
|
125
|
+
[babelPluginTransformNumericSeparator.default],
|
126
|
+
[babelPluginTransformNullishCoalescingOperator.default],
|
127
|
+
[babelPluginTransformOptionalChaining.default],
|
128
|
+
[babelPluginTransformOptionalCatchBinding.default],
|
129
|
+
[babelPluginTransformJsonStrings.default],
|
130
|
+
[babelPluginTransformObjectRestSpread.default],
|
131
|
+
[babelPluginTransformExponentiationOperator.default],
|
132
|
+
[babelPluginTransformUnicodeSetsRegex.default],
|
133
|
+
[babelPluginProposalDestructuringPrivate.default],
|
134
|
+
[babelPluginProposalExplicitResourceManagement.default]
|
135
|
+
]
|
136
|
+
let filePathResolved
|
137
|
+
if (filePath) {
|
138
|
+
filePathResolved = resolve(filePath)
|
139
|
+
if (filePath.endsWith(".ts"))
|
140
|
+
plugins.push([
|
141
|
+
(await import("@babel/plugin-transform-typescript")).default,
|
142
|
+
{ allowDeclareFields: !0, optimizeConstEnums: !0 }
|
143
|
+
])
|
144
|
+
else {
|
145
|
+
const [
|
146
|
+
babelPluginProposalDoExpressions,
|
147
|
+
babelPluginProposalFunctionBind,
|
148
|
+
babelPluginProposalFunctionSent,
|
149
|
+
babelPluginProposalPartialApplication,
|
150
|
+
babelPluginProposalPipelineOperator,
|
151
|
+
babelPluginProposalThrowExpressions,
|
152
|
+
babelPluginProposalRecordAndTuple
|
153
|
+
] = await Promise.all([
|
154
|
+
import("@babel/plugin-proposal-do-expressions"),
|
155
|
+
import("@babel/plugin-proposal-function-bind"),
|
156
|
+
import("@babel/plugin-proposal-function-sent"),
|
157
|
+
import("@babel/plugin-proposal-partial-application"),
|
158
|
+
import("@babel/plugin-proposal-pipeline-operator"),
|
159
|
+
import("@babel/plugin-proposal-throw-expressions"),
|
160
|
+
import("@babel/plugin-proposal-record-and-tuple")
|
161
|
+
])
|
162
|
+
plugins.push(
|
163
|
+
[babelPluginProposalDoExpressions.default],
|
164
|
+
[babelPluginProposalFunctionBind.default],
|
165
|
+
[babelPluginProposalFunctionSent.default],
|
166
|
+
[babelPluginProposalPartialApplication.default],
|
167
|
+
[babelPluginProposalPipelineOperator.default, { proposal: "hack", topicToken: "%" }],
|
168
|
+
[babelPluginProposalThrowExpressions.default],
|
169
|
+
[babelPluginProposalRecordAndTuple.default, { syntaxType: "hash", importPolyfill: !0 }]
|
170
|
+
)
|
171
|
+
}
|
172
|
+
} else {
|
173
|
+
filePathResolved = uniqueID + ".ts"
|
174
|
+
const [
|
175
|
+
babelPluginTransformTypescript,
|
176
|
+
babelPluginProposalDoExpressions,
|
177
|
+
babelPluginProposalFunctionBind,
|
178
|
+
babelPluginProposalFunctionSent,
|
179
|
+
babelPluginProposalPartialApplication,
|
180
|
+
babelPluginProposalPipelineOperator,
|
181
|
+
babelPluginProposalThrowExpressions,
|
182
|
+
babelPluginProposalRecordAndTuple
|
183
|
+
] = await Promise.all([
|
184
|
+
import("@babel/plugin-transform-typescript"),
|
185
|
+
import("@babel/plugin-proposal-do-expressions"),
|
186
|
+
import("@babel/plugin-proposal-function-bind"),
|
187
|
+
import("@babel/plugin-proposal-function-sent"),
|
188
|
+
import("@babel/plugin-proposal-partial-application"),
|
189
|
+
import("@babel/plugin-proposal-pipeline-operator"),
|
190
|
+
import("@babel/plugin-proposal-throw-expressions"),
|
191
|
+
import("@babel/plugin-proposal-record-and-tuple")
|
192
|
+
])
|
193
|
+
plugins.push(
|
194
|
+
[babelPluginTransformTypescript.default, { allowDeclareFields: !0, optimizeConstEnums: !0 }],
|
195
|
+
[babelPluginProposalDoExpressions.default],
|
196
|
+
[babelPluginProposalFunctionBind.default],
|
197
|
+
[babelPluginProposalFunctionSent.default],
|
198
|
+
[babelPluginProposalPartialApplication.default],
|
199
|
+
[babelPluginProposalPipelineOperator.default, { proposal: "hack", topicToken: "%" }],
|
200
|
+
[babelPluginProposalThrowExpressions.default],
|
201
|
+
[babelPluginProposalRecordAndTuple.default, { syntaxType: "hash", importPolyfill: !0 }]
|
202
|
+
)
|
203
|
+
}
|
204
|
+
const bundle = await rollup({
|
205
|
+
input: filePathResolved,
|
206
|
+
plugins: [
|
207
|
+
{
|
208
|
+
name: "hackmud-script-manager",
|
209
|
+
transform: async code => (await preprocess(code, { uniqueID })).code
|
210
|
+
},
|
211
|
+
babel({ babelHelpers: "bundled", plugins, configFile: !1, extensions: supportedExtensions }),
|
212
|
+
rollupPluginCommonJS(),
|
213
|
+
rollupPluginNodeResolve({ extensions: supportedExtensions }),
|
214
|
+
rollupPluginJSON()
|
215
|
+
],
|
216
|
+
treeshake: { moduleSideEffects: !1 }
|
217
|
+
}),
|
218
|
+
seclevelNames = ["NULLSEC", "LOWSEC", "MIDSEC", "HIGHSEC", "FULLSEC"]
|
219
|
+
code = (await bundle.generate({})).output[0].code
|
220
|
+
const { file, seclevel } = transform(parse(code, { sourceType: "module" }), sourceCode, {
|
221
|
+
uniqueID,
|
222
|
+
scriptUser,
|
223
|
+
scriptName
|
224
|
+
})
|
225
|
+
if (null != statedSeclevel && seclevel < statedSeclevel)
|
226
|
+
throw Error(
|
227
|
+
`detected seclevel ${seclevelNames[seclevel]} is lower than stated seclevel ${seclevelNames[statedSeclevel]}`
|
228
|
+
)
|
229
|
+
code = generate(file).code
|
230
|
+
if (shouldMinify) code = await minify(file, { uniqueID, mangleNames, forceQuineCheats, autocomplete })
|
231
|
+
else {
|
232
|
+
traverse(file, {
|
233
|
+
MemberExpression({ node: memberExpression }) {
|
234
|
+
if (!memberExpression.computed) {
|
235
|
+
assert("Identifier" == memberExpression.property.type)
|
236
|
+
if ("prototype" == memberExpression.property.name) {
|
237
|
+
memberExpression.computed = !0
|
238
|
+
memberExpression.property = t.stringLiteral("prototype")
|
239
|
+
} else if ("__proto__" == memberExpression.property.name) {
|
240
|
+
memberExpression.computed = !0
|
241
|
+
memberExpression.property = t.stringLiteral("__proto__")
|
242
|
+
} else if (includesIllegalString(memberExpression.property.name)) {
|
243
|
+
memberExpression.computed = !0
|
244
|
+
memberExpression.property = t.stringLiteral(
|
245
|
+
replaceUnsafeStrings(uniqueID, memberExpression.property.name)
|
246
|
+
)
|
247
|
+
}
|
248
|
+
}
|
249
|
+
},
|
250
|
+
VariableDeclarator(path) {
|
251
|
+
const renameVariables = lValue => {
|
252
|
+
switch (lValue.type) {
|
253
|
+
case "Identifier":
|
254
|
+
includesIllegalString(lValue.name) &&
|
255
|
+
path.scope.rename(
|
256
|
+
lValue.name,
|
257
|
+
"$" +
|
258
|
+
Math.floor(Math.random() * 2 ** 52)
|
259
|
+
.toString(36)
|
260
|
+
.padStart(11, "0")
|
261
|
+
)
|
262
|
+
break
|
263
|
+
case "ObjectPattern":
|
264
|
+
for (const property of lValue.properties) {
|
265
|
+
assert("ObjectProperty" == property.type)
|
266
|
+
renameVariables(property.value)
|
267
|
+
}
|
268
|
+
break
|
269
|
+
case "ArrayPattern":
|
270
|
+
for (const element of lValue.elements) element && renameVariables(element)
|
271
|
+
break
|
272
|
+
default:
|
273
|
+
throw Error(`unknown lValue type "${lValue.type}"`)
|
274
|
+
}
|
275
|
+
}
|
276
|
+
renameVariables(path.node.id)
|
277
|
+
},
|
278
|
+
ObjectProperty({ node: objectProperty }) {
|
279
|
+
if ("Identifier" == objectProperty.key.type && includesIllegalString(objectProperty.key.name)) {
|
280
|
+
objectProperty.key = t.stringLiteral(replaceUnsafeStrings(uniqueID, objectProperty.key.name))
|
281
|
+
objectProperty.shorthand = !1
|
282
|
+
}
|
283
|
+
},
|
284
|
+
StringLiteral({ node }) {
|
285
|
+
node.value = replaceUnsafeStrings(uniqueID, node.value)
|
286
|
+
},
|
287
|
+
TemplateLiteral({ node }) {
|
288
|
+
for (const templateElement of node.quasis)
|
289
|
+
if (templateElement.value.cooked) {
|
290
|
+
templateElement.value.cooked = replaceUnsafeStrings(uniqueID, templateElement.value.cooked)
|
291
|
+
templateElement.value.raw = templateElement.value.cooked
|
292
|
+
.replaceAll("\\", "\\\\")
|
293
|
+
.replaceAll("`", "\\`")
|
294
|
+
.replaceAll("${", "$\\{")
|
295
|
+
} else templateElement.value.raw = replaceUnsafeStrings(uniqueID, templateElement.value.raw)
|
296
|
+
},
|
297
|
+
RegExpLiteral(path) {
|
298
|
+
path.node.pattern = replaceUnsafeStrings(uniqueID, path.node.pattern)
|
299
|
+
delete path.node.extra
|
300
|
+
}
|
301
|
+
})
|
302
|
+
code = await format(generate(file, { comments: !1 }).code, {
|
303
|
+
parser: "babel",
|
304
|
+
arrowParens: "avoid",
|
305
|
+
semi: !1,
|
306
|
+
trailingComma: "none"
|
307
|
+
})
|
308
|
+
}
|
309
|
+
code = postprocess(code, seclevel, uniqueID)
|
310
|
+
if (includesIllegalString(code))
|
311
|
+
throw Error(
|
312
|
+
'you found a weird edge case where I wasn\'t able to replace illegal strings like "SC$", please report thx'
|
313
|
+
)
|
314
|
+
return { script: code, warnings: [] }
|
315
|
+
}
|
316
|
+
export { processScript as default, minify, postprocess, preprocess, processScript, transform }
|