hackmud-script-manager 0.20.4-550e28d → 0.20.4-6815ce0
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 +61 -35
- package/env.d.ts +315 -310
- package/index.js +1 -1
- package/package.json +38 -38
- package/processScript/index.js +2 -2
- package/processScript/transform.js +50 -29
- package/push.js +4 -4
- package/watch.js +8 -7
package/README.md
CHANGED
@@ -20,6 +20,10 @@ You can read about how HSM works [in my blog post](https://samual.uk/blog/js-cod
|
|
20
20
|
> ```
|
21
21
|
> You will need to run `Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser` in PowerShell as an administrator. For more information, see [Microsoft's page about Execution Policies](https://learn.microsoft.com/en-gb/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.4).
|
22
22
|
|
23
|
+

|
24
|
+

|
25
|
+

|
26
|
+
|
23
27
|
## Features
|
24
28
|
- Minification
|
25
29
|
- This includes auto quine cheating.
|
package/bin/hsm.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
|
-
import {
|
2
|
+
import { AutoMap } from "@samual/lib/AutoMap"
|
3
3
|
import { assert } from "@samual/lib/assert"
|
4
4
|
import { countHackmudCharacters } from "@samual/lib/countHackmudCharacters"
|
5
5
|
import { writeFilePersistent } from "@samual/lib/writeFilePersistent"
|
@@ -13,10 +13,10 @@ import { syncMacros } from "../syncMacros.js"
|
|
13
13
|
import "@samual/lib/readDirectoryWithStats"
|
14
14
|
import "path/posix"
|
15
15
|
import "@samual/lib/copyFilePersistent"
|
16
|
-
const
|
16
|
+
const formatOption = name => colourN(`-${1 == name.length ? "" : "-"}${name}`),
|
17
17
|
options = new Map(),
|
18
18
|
commands = [],
|
19
|
-
userColours = new
|
19
|
+
userColours = new AutoMap(user => {
|
20
20
|
let hash = 0
|
21
21
|
for (const char of user) hash += (hash >> 1) + hash + "xi1_8ratvsw9hlbgm02y5zpdcn7uekof463qj".indexOf(char) + 1
|
22
22
|
return [colourJ, colourK, colourM, colourW, colourL, colourB][hash % 6](user)
|
@@ -58,11 +58,11 @@ const pushModule = import("../push.js"),
|
|
58
58
|
process.version.startsWith("v21.") &&
|
59
59
|
console.warn(
|
60
60
|
colourF(
|
61
|
-
|
61
|
+
`Warning: Support for Node.js 21 will be dropped in the next minor version of HSM\n Your current version of Node.js is ${chalk.bold(process.version)}\n You should update your version of Node.js\n https://nodejs.org/en/download/package-manager\n`
|
62
62
|
)
|
63
63
|
)
|
64
64
|
if ("v" == commands[0] || "version" == commands[0] || popOption("version", "v")?.value) {
|
65
|
-
console.log(
|
65
|
+
console.log("0.20.4-6815ce0")
|
66
66
|
process.exit()
|
67
67
|
}
|
68
68
|
if (popOption("help", "h")?.value) {
|
@@ -83,7 +83,7 @@ switch (commands[0]) {
|
|
83
83
|
noMinifyIncompatibleOption = mangleNamesOption || forceQuineCheatsOption
|
84
84
|
if (noMinifyOption && noMinifyIncompatibleOption) {
|
85
85
|
logError(
|
86
|
-
`Options ${
|
86
|
+
`Options ${formatOption(noMinifyOption.name)} and ${formatOption(noMinifyIncompatibleOption.name)} are incompatible\n`
|
87
87
|
)
|
88
88
|
logHelp()
|
89
89
|
process.exit(1)
|
@@ -106,6 +106,7 @@ switch (commands[0]) {
|
|
106
106
|
)
|
107
107
|
process.exit(1)
|
108
108
|
}
|
109
|
+
complainAboutUnrecognisedOptions()
|
109
110
|
const { processScript } = await processScriptModule,
|
110
111
|
fileBaseName = basename(target, fileExtension),
|
111
112
|
fileBaseNameEndsWithDotSrc = fileBaseName.endsWith(".src"),
|
@@ -178,15 +179,15 @@ switch (commands[0]) {
|
|
178
179
|
}
|
179
180
|
} else scripts.push("*.*")
|
180
181
|
if ("push" == commands[0]) {
|
181
|
-
const { push, MissingSourceFolderError, MissingHackmudFolderError, NoUsersError } =
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
182
|
+
const { push, MissingSourceFolderError, MissingHackmudFolderError, NoUsersError } = await pushModule
|
183
|
+
complainAboutUnrecognisedOptions()
|
184
|
+
const infos = await push(sourcePath, hackmudPath, {
|
185
|
+
scripts,
|
186
|
+
onPush: info => logInfo(info, hackmudPath),
|
187
|
+
minify: noMinifyOption && !noMinifyOption.value,
|
188
|
+
mangleNames: mangleNamesOption?.value,
|
189
|
+
forceQuineCheats: forceQuineCheatsOption?.value
|
190
|
+
})
|
190
191
|
if (infos instanceof Error) {
|
191
192
|
logError(infos.message)
|
192
193
|
if (infos instanceof MissingSourceFolderError || infos instanceof NoUsersError) {
|
@@ -200,12 +201,13 @@ switch (commands[0]) {
|
|
200
201
|
} else infos.length || logError("Could not find any scripts to push")
|
201
202
|
} else {
|
202
203
|
const typeDeclarationPathOption = popOption(
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
204
|
+
"type-declaration-path",
|
205
|
+
"type-declaration",
|
206
|
+
"dts",
|
207
|
+
"gen-types"
|
208
|
+
)
|
209
|
+
complainAboutUnrecognisedOptions()
|
210
|
+
const { watch } = await watchModule
|
209
211
|
watch(sourcePath, hackmudPath, {
|
210
212
|
scripts,
|
211
213
|
onPush: info => logInfo(info, hackmudPath),
|
@@ -229,6 +231,7 @@ switch (commands[0]) {
|
|
229
231
|
logHelp()
|
230
232
|
process.exit(1)
|
231
233
|
}
|
234
|
+
complainAboutUnrecognisedOptions()
|
232
235
|
const sourcePath = commands[2] || "."
|
233
236
|
await pull(sourcePath, hackmudPath, script).catch(error => {
|
234
237
|
console.error(error)
|
@@ -238,8 +241,9 @@ switch (commands[0]) {
|
|
238
241
|
break
|
239
242
|
case "sync-macros":
|
240
243
|
{
|
241
|
-
const hackmudPath = getHackmudPath()
|
242
|
-
|
244
|
+
const hackmudPath = getHackmudPath()
|
245
|
+
complainAboutUnrecognisedOptions()
|
246
|
+
const { macrosSynced, usersSynced } = await syncMacros(hackmudPath)
|
243
247
|
log(`Synced ${macrosSynced} macros to ${usersSynced} users`)
|
244
248
|
}
|
245
249
|
break
|
@@ -247,7 +251,15 @@ switch (commands[0]) {
|
|
247
251
|
case "gen-type-declaration":
|
248
252
|
case "gen-dts":
|
249
253
|
case "gen-types":
|
254
|
+
case "emit-dts":
|
250
255
|
{
|
256
|
+
"emit-dts" != commands[0] &&
|
257
|
+
"gen-dts" != commands[0] &&
|
258
|
+
console.warn(
|
259
|
+
colourF(
|
260
|
+
`Warning: ${colourC("hsm")} ${colourL(commands[0])} is being deprecated and will be removed\n in the next minor release of HSM\n You should switch to using its alias ${colourC("hsm")} ${colourL("emit-dts")}\n`
|
261
|
+
)
|
262
|
+
)
|
251
263
|
const hackmudPath = getHackmudPath(),
|
252
264
|
target = commands[1]
|
253
265
|
if (!target) {
|
@@ -255,12 +267,13 @@ switch (commands[0]) {
|
|
255
267
|
logHelp()
|
256
268
|
process.exit(1)
|
257
269
|
}
|
270
|
+
complainAboutUnrecognisedOptions()
|
258
271
|
const sourcePath = resolve(target),
|
259
272
|
outputPath = commands[2] || "./player.d.ts",
|
260
273
|
typeDeclaration = await generateTypeDeclaration(sourcePath, hackmudPath)
|
261
274
|
let typeDeclarationPath = resolve(outputPath)
|
262
275
|
await writeFile(typeDeclarationPath, typeDeclaration).catch(error => {
|
263
|
-
assert(error instanceof Error, "src/bin/hsm.ts:
|
276
|
+
assert(error instanceof Error, "src/bin/hsm.ts:353:35")
|
264
277
|
if ("EISDIR" != error.code) throw error
|
265
278
|
typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
|
266
279
|
return writeFile(typeDeclarationPath, typeDeclaration)
|
@@ -281,21 +294,20 @@ function logHelp() {
|
|
281
294
|
const pushCommandDescription = "Push scripts from a directory to hackmud user's scripts directories",
|
282
295
|
forceQuineCheatsOptionDescription = `Force quine cheats on. Use ${colourN("--force-quine-cheats")}=${colourV("false")} to force off`,
|
283
296
|
hackmudPathOption = `${colourN("--hackmud-path")}=${colourB("<path>")}\n Override hackmud path`
|
284
|
-
console.log(colourN("Version") + colourS(": ") + colourV(version))
|
285
297
|
switch (commands[0]) {
|
286
298
|
case "dev":
|
287
299
|
case "watch":
|
288
300
|
case "push":
|
289
301
|
console.log(
|
290
302
|
colourS(
|
291
|
-
|
303
|
+
`${colourJ("push" == commands[0] ? pushCommandDescription : "Watch a directory and push a script when modified")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourB('<directory> ["<script user>.<script name>"...]')}\n\n${colourA("Arguments:")}\n${colourB("<directory>")}\n The source directory containing your scripts\n${colourB("<script user>")}\n A user to push script(s) to. Can be set to wild card (${colourV("*")}) which will try\n and discover users to push to\n${colourB("<script name>")}\n Name of a script to push. Can be set to wild card (${colourV("*")}) to find all scripts\n\n${colourA("Options:")}\n${colourN("--no-minify")}\n Skip minification to produce a "readable" script\n${colourN("--mangle-names")}\n Reduce character count further but lose function names in error call stacks\n${colourN("--force-quine-cheats")}\n ${forceQuineCheatsOptionDescription}\n${hackmudPathOption}\n${"push" == commands[0] ? "" : `${colourN("--type-declaration-path")}=${colourB("<path>")}\n Path to generate a type declaration file for the scripts\n`}\n${colourA("Examples:")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourV("src")}\n Pushes all scripts found in ${colourV("src")} folder to all users\n${colourC("hsm")} ${colourL(commands[0])} ${colourV("src")} ${colourC("foo")}${colourV(".")}${colourL("bar")}\n Pushes a script named ${colourL("bar")} found in ${colourV("src")} folder to user ${userColours.get("foo")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourV("src")} ${colourC("foo")}${colourV(".")}${colourL("bar")} ${colourC("baz")}${colourV(".")}${colourL("qux")}\n Multiple can be specified\n${colourC("hsm")} ${colourL(commands[0])} ${colourV("src")} ${colourC("foo")}${colourV(".")}${colourL("*")}\n Pushes all scripts found in ${colourV("src")} folder to user ${userColours.get("foo")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourV("src")} ${colourC("*")}${colourV(".")}${colourL("foo")}\n Pushes all scripts named ${colourL("foo")} found in ${colourV("src")} folder to all user\n${colourC("hsm")} ${colourL(commands[0])} ${colourV("src")} ${colourC("*")}${colourV(".")}${colourL("*")}\n Pushes all scripts found in ${colourV("src")} folder to all users`
|
292
304
|
)
|
293
305
|
)
|
294
306
|
break
|
295
307
|
case "pull":
|
296
308
|
console.log(
|
297
309
|
colourS(
|
298
|
-
|
310
|
+
`${colourJ("Pull a script a from a hackmud user's script directory")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourB("<script user>")}${colourV(".")}${colourB("<script name>")}\n\n${colourA("Options:")}\n${hackmudPathOption}`
|
299
311
|
)
|
300
312
|
)
|
301
313
|
break
|
@@ -303,7 +315,7 @@ function logHelp() {
|
|
303
315
|
case "golf":
|
304
316
|
console.log(
|
305
317
|
colourS(
|
306
|
-
|
318
|
+
`${colourJ("Minify a script file on the spot")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourB("<target> [output path]")}\n\n${colourA("Options:")}\n${colourN("--no-minify")}\n Skip minification to produce a "readable" script\n${colourN("--mangle-names")}\n Reduce character count further but lose function names in error call stacks\n${colourN("--force-quine-cheats")}\n ${forceQuineCheatsOptionDescription}\n${colourN("--watch")}\n Watch for changes`
|
307
319
|
)
|
308
320
|
)
|
309
321
|
break
|
@@ -311,6 +323,14 @@ function logHelp() {
|
|
311
323
|
case "gen-type-declaration":
|
312
324
|
case "gen-dts":
|
313
325
|
case "gen-types":
|
326
|
+
case "emit-dts":
|
327
|
+
"emit-dts" != commands[0] &&
|
328
|
+
"gen-dts" != commands[0] &&
|
329
|
+
console.warn(
|
330
|
+
colourF(
|
331
|
+
`Warning: ${colourC("hsm")} ${colourL(commands[0])} is being deprecated and will be removed\n in the next minor release of HSM\n You should switch to using its alias ${colourC("hsm")} ${colourL("emit-dts")}\n`
|
332
|
+
)
|
333
|
+
)
|
314
334
|
console.log(
|
315
335
|
colourS(
|
316
336
|
`${colourJ("Generate a type declaration file for a directory of scripts")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourB("<directory> [output path]")}\n\n${colourA("Options:")}\n${hackmudPathOption}`
|
@@ -320,14 +340,14 @@ function logHelp() {
|
|
320
340
|
case "sync-macros":
|
321
341
|
console.log(
|
322
342
|
colourS(
|
323
|
-
|
343
|
+
`${colourJ("Sync macros across all hackmud users")}\n\n${colourA("Options:")}\n${hackmudPathOption}`
|
324
344
|
)
|
325
345
|
)
|
326
346
|
break
|
327
347
|
default:
|
328
348
|
console.log(
|
329
349
|
colourS(
|
330
|
-
|
350
|
+
`${colourJ("Hackmud Script Manager")}\n${colourN("Version") + colourS(": ") + colourV("0.20.4-6815ce0")}\n\n${colourA("Commands:")}\n${colourL("push")}\n ${pushCommandDescription}\n${colourL("dev")}\n Watch a directory and push a script when modified\n${colourL("minify")}\n Minify a script file on the spot\n${colourL("emit-dts")}\n Generate a type declaration file for a directory of scripts\n${colourL("sync-macros")}\n Sync macros across all hackmud users\n${colourL("pull")}\n Pull a script a from a hackmud user's script directory`
|
331
351
|
)
|
332
352
|
)
|
333
353
|
}
|
@@ -345,7 +365,7 @@ function logError(message) {
|
|
345
365
|
process.exitCode = 1
|
346
366
|
}
|
347
367
|
function getHackmudPath() {
|
348
|
-
const hackmudPathOption = popOption("hackmud-path")
|
368
|
+
const hackmudPathOption = popOption("hackmud-path")?.value
|
349
369
|
if (null != hackmudPathOption && "string" != typeof hackmudPathOption) {
|
350
370
|
logError(`Option ${colourN("--hackmud-path")} must be a string, got ${colourV(hackmudPathOption)}\n`)
|
351
371
|
logHelp()
|
@@ -359,7 +379,7 @@ function getHackmudPath() {
|
|
359
379
|
}
|
360
380
|
function assertOptionIsBoolean(option) {
|
361
381
|
if ("boolean" != typeof option.value) {
|
362
|
-
logError(`The value for ${
|
382
|
+
logError(`The value for ${formatOption(option.name)} must be ${colourV("true")} or ${colourV("false")}\n`)
|
363
383
|
logHelp()
|
364
384
|
process.exit(1)
|
365
385
|
}
|
@@ -367,9 +387,7 @@ function assertOptionIsBoolean(option) {
|
|
367
387
|
function popOption(...names) {
|
368
388
|
const presentOptionNames = names.filter(name => options.has(name))
|
369
389
|
if (!presentOptionNames.length) return
|
370
|
-
const presentOptionNamesWithDashDash = presentOptionNames.map(
|
371
|
-
colourN(`-${1 == name.length ? "" : "-"}${name}`)
|
372
|
-
)
|
390
|
+
const presentOptionNamesWithDashDash = presentOptionNames.map(formatOption)
|
373
391
|
if (presentOptionNames.length > 1) {
|
374
392
|
logError(
|
375
393
|
`The options ${presentOptionNamesWithDashDash.join(", ")} are aliases for each other. Please only specify one`
|
@@ -380,3 +398,11 @@ function popOption(...names) {
|
|
380
398
|
options.delete(presentOptionNames[0])
|
381
399
|
return { name: presentOptionNamesWithDashDash[0], value }
|
382
400
|
}
|
401
|
+
function complainAboutUnrecognisedOptions() {
|
402
|
+
if (options.size) {
|
403
|
+
logError(
|
404
|
+
`Unrecognised option${options.size > 1 ? "s" : ""}: ${[...options.keys()].map(formatOption).join(", ")}`
|
405
|
+
)
|
406
|
+
process.exit(1)
|
407
|
+
}
|
408
|
+
}
|