hackmud-script-manager 0.13.0-a60a7a2 → 0.13.0-c461329
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/.gitattributes +1 -0
- package/.github/workflows/codeql-analysis.yml +39 -0
- package/.github/workflows/publish.yml +42 -0
- package/.vscode/settings.json +6 -0
- package/babel.config.json +6 -0
- package/package.json +12 -21
- package/rollup.config.js +110 -0
- package/scripts/build-package-json.js +36 -0
- package/scripts/jsconfig.json +5 -0
- package/scripts/version-dev.js +25 -0
- package/src/bin/hsm.ts +505 -0
- package/src/constants.json +3 -0
- package/src/generateTypings.ts +116 -0
- package/src/index.ts +19 -0
- package/src/modules.d.ts +5 -0
- package/src/processScript/index.ts +198 -0
- package/src/processScript/minify.ts +529 -0
- package/src/processScript/postprocess.ts +38 -0
- package/src/processScript/preprocess.ts +146 -0
- package/src/processScript/transform.ts +760 -0
- package/src/pull.ts +16 -0
- package/src/push.ts +314 -0
- package/src/syncMacros.ts +52 -0
- package/src/test.ts +59 -0
- package/src/tsconfig.json +20 -0
- package/src/watch.ts +156 -0
- package/tsconfig.json +12 -0
- package/assert-1b7dada8.js +0 -1
- package/bin/hsm.d.ts +0 -2
- package/bin/hsm.js +0 -2
- package/generateTypings.d.ts +0 -2
- package/generateTypings.js +0 -1
- package/index.d.ts +0 -15
- package/index.js +0 -1
- package/processScript/compile.d.ts +0 -17
- package/processScript/compile.js +0 -1
- package/processScript/index.d.ts +0 -30
- package/processScript/index.js +0 -1
- package/processScript/minify.d.ts +0 -7
- package/processScript/minify.js +0 -1
- package/processScript/postProcess.d.ts +0 -2
- package/processScript/postProcess.js +0 -1
- package/processScript/preProcess.d.ts +0 -15
- package/processScript/preProcess.js +0 -1
- package/pull.d.ts +0 -9
- package/pull.js +0 -1
- package/push.d.ts +0 -26
- package/push.js +0 -1
- package/spliceString-2c6f214f.js +0 -1
- package/syncMacros.d.ts +0 -5
- package/syncMacros.js +0 -1
- package/test.d.ts +0 -6
- package/test.js +0 -1
- package/watch.d.ts +0 -14
- package/watch.js +0 -1
@@ -0,0 +1,198 @@
|
|
1
|
+
import babelGenerator from "@babel/generator"
|
2
|
+
import { parse } from "@babel/parser"
|
3
|
+
import babelPluginProposalClassProperties from "@babel/plugin-proposal-class-properties"
|
4
|
+
import babelPluginProposalClassStaticBlock from "@babel/plugin-proposal-class-static-block"
|
5
|
+
import babelPluginProposalDecorators from "@babel/plugin-proposal-decorators"
|
6
|
+
import babelPluginProposalDoExpressions from "@babel/plugin-proposal-do-expressions"
|
7
|
+
import babelPluginProposalFunctionBind from "@babel/plugin-proposal-function-bind"
|
8
|
+
import babelPluginProposalFunctionSent from "@babel/plugin-proposal-function-sent"
|
9
|
+
import babelPluginProposalJSONStrings from "@babel/plugin-proposal-json-strings"
|
10
|
+
import babelPluginProposalLogicalAssignmentOperators from "@babel/plugin-proposal-logical-assignment-operators"
|
11
|
+
import babelPluginProposalNullishCoalescingOperator from "@babel/plugin-proposal-nullish-coalescing-operator"
|
12
|
+
import babelPluginProposalNumericSeparator from "@babel/plugin-proposal-numeric-separator"
|
13
|
+
import babelPluginProposalObjectRestSpread from "@babel/plugin-proposal-object-rest-spread"
|
14
|
+
import babelPluginProposalOptionalCatchBinding from "@babel/plugin-proposal-optional-catch-binding"
|
15
|
+
import babelPluginProposalOptionalChaining from "@babel/plugin-proposal-optional-chaining"
|
16
|
+
import babelPluginProposalPartialApplication from "@babel/plugin-proposal-partial-application"
|
17
|
+
import babelPluginProposalPipelineOperator from "@babel/plugin-proposal-pipeline-operator"
|
18
|
+
import babelPluginProposalPrivatePropertyInObject from "@babel/plugin-proposal-private-property-in-object"
|
19
|
+
import babelPluginProposalRecordAndTuple from "@babel/plugin-proposal-record-and-tuple"
|
20
|
+
import babelPluginProposalThrowExpressions from "@babel/plugin-proposal-throw-expressions"
|
21
|
+
import babelPluginTransformExponentiationOperator from "@babel/plugin-transform-exponentiation-operator"
|
22
|
+
import babelPluginTransformTypescript from "@babel/plugin-transform-typescript"
|
23
|
+
import rollupPluginBabel_ from "@rollup/plugin-babel"
|
24
|
+
import rollupPluginCommonJS from "@rollup/plugin-commonjs"
|
25
|
+
import rollupPluginJSON from "@rollup/plugin-json"
|
26
|
+
import rollupPluginNodeResolve from "@rollup/plugin-node-resolve"
|
27
|
+
import { assert, countHackmudCharacters } from "@samual/lib"
|
28
|
+
import { resolve as resolvePath } from "path"
|
29
|
+
import { performance } from "perf_hooks"
|
30
|
+
import prettier from "prettier"
|
31
|
+
import { rollup } from "rollup"
|
32
|
+
import { supportedExtensions as extensions } from "../constants.json"
|
33
|
+
import minify from "./minify"
|
34
|
+
import postprocess from "./postprocess"
|
35
|
+
import preprocess from "./preprocess"
|
36
|
+
import transform from "./transform"
|
37
|
+
|
38
|
+
const { default: rollupPluginBabel } = rollupPluginBabel_ as any as typeof import("@rollup/plugin-babel")
|
39
|
+
const { format } = prettier
|
40
|
+
const { default: generate } = babelGenerator as any as typeof import("@babel/generator")
|
41
|
+
|
42
|
+
export { minify } from "./minify"
|
43
|
+
export { postprocess } from "./postprocess"
|
44
|
+
export { preprocess } from "./preprocess"
|
45
|
+
export { transform as compile } from "./transform"
|
46
|
+
|
47
|
+
export type ProcessOptions = {
|
48
|
+
/** whether to minify the given code */
|
49
|
+
minify: boolean
|
50
|
+
|
51
|
+
/** 11 a-z 0-9 characters */
|
52
|
+
uniqueID: string
|
53
|
+
|
54
|
+
/** the user the script will be uploaded to (or set to `true` if it is not yet known) */
|
55
|
+
scriptUser: string | true
|
56
|
+
|
57
|
+
/** the name of this script (or set to `true` if it is not yet known) */
|
58
|
+
scriptName: string | true
|
59
|
+
|
60
|
+
filePath: string
|
61
|
+
|
62
|
+
/** whether to mangle function and class names (defaults to `false`) */
|
63
|
+
mangleNames: boolean
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Minifies a given script
|
68
|
+
*
|
69
|
+
* @param code JavaScript or TypeScript code
|
70
|
+
* @param options {@link ProcessOptions details}
|
71
|
+
*/
|
72
|
+
export async function processScript(
|
73
|
+
code: string,
|
74
|
+
{
|
75
|
+
minify: shouldMinify = true,
|
76
|
+
uniqueID = Math.floor(Math.random() * (2 ** 52)).toString(36).padStart(11, "0"),
|
77
|
+
scriptUser = "UNKNOWN",
|
78
|
+
scriptName = "UNKNOWN",
|
79
|
+
filePath,
|
80
|
+
mangleNames = false
|
81
|
+
}: Partial<ProcessOptions> = {}
|
82
|
+
): Promise<{
|
83
|
+
srcLength: number
|
84
|
+
script: string
|
85
|
+
warnings: { message: string, line: number }[]
|
86
|
+
timeTook: number
|
87
|
+
}> {
|
88
|
+
assert(uniqueID.match(/^\w{11}$/))
|
89
|
+
|
90
|
+
if (filePath)
|
91
|
+
filePath = resolvePath(filePath)
|
92
|
+
else
|
93
|
+
filePath = "script"
|
94
|
+
|
95
|
+
const time = performance.now()
|
96
|
+
const sourceCode = code
|
97
|
+
let autocomplete
|
98
|
+
let seclevel
|
99
|
+
let semicolons
|
100
|
+
|
101
|
+
({ autocomplete, code, seclevel, semicolons } = preprocess(code, { uniqueID }))
|
102
|
+
assert(uniqueID.match(/^\w{11}$/))
|
103
|
+
|
104
|
+
const filePathResolved = filePath
|
105
|
+
? resolvePath(filePath)
|
106
|
+
: "script"
|
107
|
+
|
108
|
+
const bundle = await rollup({
|
109
|
+
plugins: [
|
110
|
+
{
|
111
|
+
name: "emit script",
|
112
|
+
buildStart() {
|
113
|
+
this.emitFile({
|
114
|
+
type: "chunk",
|
115
|
+
id: filePathResolved
|
116
|
+
})
|
117
|
+
},
|
118
|
+
load(id) {
|
119
|
+
if (id == filePathResolved)
|
120
|
+
return code
|
121
|
+
|
122
|
+
return null
|
123
|
+
},
|
124
|
+
transform(code) {
|
125
|
+
return preprocess(code, { uniqueID }).code
|
126
|
+
}
|
127
|
+
},
|
128
|
+
rollupPluginBabel({
|
129
|
+
babelHelpers: "bundled",
|
130
|
+
plugins: [
|
131
|
+
[ babelPluginTransformTypescript.default ],
|
132
|
+
[ babelPluginProposalDecorators.default, { decoratorsBeforeExport: true } ],
|
133
|
+
[ babelPluginProposalDoExpressions.default ],
|
134
|
+
[ babelPluginProposalFunctionBind.default ],
|
135
|
+
[ babelPluginProposalFunctionSent.default ],
|
136
|
+
[ babelPluginProposalPartialApplication.default ],
|
137
|
+
[ babelPluginProposalPipelineOperator.default, { proposal: "hack", topicToken: "%" } ],
|
138
|
+
[ babelPluginProposalThrowExpressions.default ],
|
139
|
+
[ babelPluginProposalRecordAndTuple.default, { syntaxType: "hash", importPolyfill: true } ],
|
140
|
+
[ babelPluginProposalClassProperties.default ],
|
141
|
+
[ babelPluginProposalClassStaticBlock.default ],
|
142
|
+
[ babelPluginProposalPrivatePropertyInObject.default ],
|
143
|
+
[ babelPluginProposalLogicalAssignmentOperators.default ],
|
144
|
+
[ babelPluginProposalNumericSeparator.default ],
|
145
|
+
[ babelPluginProposalNullishCoalescingOperator.default ],
|
146
|
+
[ babelPluginProposalOptionalChaining.default ],
|
147
|
+
[ babelPluginProposalOptionalCatchBinding.default ],
|
148
|
+
[ babelPluginProposalJSONStrings.default ],
|
149
|
+
[ babelPluginProposalObjectRestSpread.default ],
|
150
|
+
[ babelPluginTransformExponentiationOperator.default ]
|
151
|
+
],
|
152
|
+
configFile: false,
|
153
|
+
extensions
|
154
|
+
}),
|
155
|
+
rollupPluginCommonJS(),
|
156
|
+
rollupPluginNodeResolve({ extensions }),
|
157
|
+
rollupPluginJSON()
|
158
|
+
]
|
159
|
+
})
|
160
|
+
|
161
|
+
code = (await bundle.generate({})).output[0].code
|
162
|
+
|
163
|
+
const file = parse(code, { sourceType: "module" })
|
164
|
+
|
165
|
+
code = generate(await transform(file, sourceCode, { uniqueID, scriptUser, scriptName, seclevel })!).code
|
166
|
+
|
167
|
+
// TODO fix incorrect source length again
|
168
|
+
|
169
|
+
// the typescript inserts semicolons where they weren't already so we take
|
170
|
+
// all semicolons out of the count and add the number of semicolons in the
|
171
|
+
// source to make things fair
|
172
|
+
let srcLength = countHackmudCharacters(code.replace(/^function\s*\w+\(/, "function("))
|
173
|
+
- (code.match(/;/g)?.length || 0)
|
174
|
+
+ semicolons
|
175
|
+
// + (code.match(/SC\$[a-zA-Z_][a-zA-Z0-9_]*\$[a-zA-Z_][a-zA-Z0-9_]*\(/g)?.length ?? 0)
|
176
|
+
// + (code.match(/DB\$/g)?.length ?? 0)
|
177
|
+
|
178
|
+
if (shouldMinify)
|
179
|
+
code = await minify(code, autocomplete, { uniqueID, mangleNames })
|
180
|
+
else {
|
181
|
+
code = format(code, {
|
182
|
+
parser: "babel",
|
183
|
+
arrowParens: "avoid",
|
184
|
+
semi: false
|
185
|
+
})
|
186
|
+
}
|
187
|
+
|
188
|
+
code = postprocess(code, seclevel, uniqueID)
|
189
|
+
|
190
|
+
return {
|
191
|
+
srcLength,
|
192
|
+
script: code,
|
193
|
+
warnings: [],
|
194
|
+
timeTook: performance.now() - time
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
export default processScript
|