hackmud-script-manager 0.19.1-003b022 → 0.19.1-07fc9cb

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/bin/hsm.js CHANGED
@@ -3,17 +3,16 @@ import { Cache } from "@samual/lib/Cache"
3
3
  import { assert } from "@samual/lib/assert"
4
4
  import { countHackmudCharacters } from "@samual/lib/countHackmudCharacters"
5
5
  import { writeFilePersistent } from "@samual/lib/writeFilePersistent"
6
- import { readFile, writeFile, mkdir, rmdir } from "fs/promises"
6
+ import { writeFile, readFile } from "fs/promises"
7
7
  import { homedir } from "os"
8
- import { resolve, extname, basename, dirname, relative } from "path"
8
+ import { extname, basename, resolve, dirname, relative } from "path"
9
9
  import { supportedExtensions } from "../constants.js"
10
10
  import { generateTypeDeclaration } from "../generateTypeDeclaration.js"
11
11
  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 configDirectoryPath = resolve(homedir(), ".config"),
16
- configFilePath = resolve(configDirectoryPath, "hsm.json"),
15
+ const version = "0.19.1-07fc9cb",
17
16
  options = new Map(),
18
17
  commands = [],
19
18
  userColours = new Cache(user => {
@@ -21,119 +20,7 @@ const configDirectoryPath = resolve(homedir(), ".config"),
21
20
  for (const char of user) hash += (hash >> 1) + hash + "xi1_8ratvsw9hlbgm02y5zpdcn7uekof463qj".indexOf(char) + 1
22
21
  return [colourJ, colourK, colourM, colourW, colourL, colourB][hash % 6](user)
23
22
  }),
24
- logNeedHackmudPathMessage = () =>
25
- console.error(
26
- colourS(
27
- `${colourD("You need to set hackmudPath in config before you can use this command")}\n\n${colourA("To fix this:")}\nOpen hackmud and run "${colourC("#dir")}"\nThis will open a file browser and print your hackmud user's script directory\nGo up 2 directories and then copy the path\nThen in a terminal run "${colourC("hsm")} ${colourL("config set")} ${colourV("hackmudPath")} ${colourB("<the path you copied>")}"`
28
- )
29
- ),
30
- logHelp = () => {
31
- const pushCommandDescription = "Push scripts from a directory to hackmud user's scripts directories",
32
- mangleNamesOptionDescription =
33
- "Reduce character count further but lose function names in error call stacks",
34
- forceQuineCheatsOptionDescription = `Force quine cheats on. Use ${colourN("--force-quine-cheats")}=${colourV("false")} to force off.`
35
- console.log(colourN("Version") + colourS(": ") + colourV("0.19.1-003b022"))
36
- switch (commands[0]) {
37
- case "config":
38
- switch (commands[1]) {
39
- case "get":
40
- console.log(
41
- `\n${colourJ("Retrieve a value from the config file")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(`${commands[0]} ${commands[1]}`)} ${colourB("<key>")}`
42
- )
43
- break
44
- case "set":
45
- console.log(
46
- `\n${colourJ("Assign a value to the config file")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(`${commands[0]} ${commands[1]}`)} ${colourB("<key> <value>")}`
47
- )
48
- break
49
- case "delete":
50
- console.log(
51
- `\n${colourJ("Remove a key and value from the config file")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(`${commands[0]} ${commands[1]}`)} ${colourB("<key>")}`
52
- )
53
- break
54
- default:
55
- console.log(
56
- colourS(
57
- `${colourN("Config path")}: ${colourV(configFilePath)}\n\n${colourJ("Modify the config file")}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(commands[0] + " get")} ${colourB("<key>")}\n Retrieve a value from the config file\n${colourC("hsm")} ${colourL(commands[0] + " set")} ${colourB("<key> <value>")}\n Assign a value to the config file\n${colourC("hsm")} ${colourL(commands[0] + " delete")} ${colourB("<key>")}\n Remove a key and value from the config file`
58
- )
59
- )
60
- }
61
- break
62
- case "push":
63
- console.log(
64
- colourS(
65
- `\n${colourJ(pushCommandDescription)}\n\n${colourA("Usage:")}\n${colourC("hsm")} ${colourL(commands[0])} ${colourB("<directory> [<script user>.<script name>...]")}\n\n${colourA("Options:")}\n${colourN("--no-minify")}\n Skip minification to produce a "readable" script\n${colourN("--mangle-names")}\n ${mangleNamesOptionDescription}\n${colourN("--force-quine-cheats")}\n ${forceQuineCheatsOptionDescription}`
66
- )
67
- )
68
- break
69
- case "dev":
70
- case "watch":
71
- console.log(
72
- colourS(
73
- `\n${colourJ("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("Options:")}\n${colourN("--no-minify")}\n Skip minification to produce a "readable" script\n${colourN("--mangle-names")}\n ${mangleNamesOptionDescription}\n${colourN("--type-declaration-path")}=${colourB("<path>")}\n Path to generate a type declaration file for the scripts\n${colourN("--force-quine-cheats")}\n ${forceQuineCheatsOptionDescription}`
74
- )
75
- )
76
- break
77
- case "pull":
78
- console.log(
79
- colourS(
80
- `\n${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>")}`
81
- )
82
- )
83
- break
84
- case "minify":
85
- case "golf":
86
- console.log(
87
- colourS(
88
- `\n${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 ${mangleNamesOptionDescription}\n${colourN("--force-quine-cheats")}\n ${forceQuineCheatsOptionDescription}\n${colourN("--watch")}\n Watch for changes`
89
- )
90
- )
91
- break
92
- case "generate-type-declaration":
93
- case "gen-type-declaration":
94
- case "gen-dts":
95
- case "gen-types":
96
- console.log(
97
- colourS(
98
- `${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]")}`
99
- )
100
- )
101
- break
102
- case "sync-macros":
103
- console.log("\n" + colourJ("Sync macros across all hackmud users"))
104
- break
105
- default:
106
- console.log(
107
- colourS(
108
- `\n${colourJ("Hackmud Script Manager")}\n\n${colourA("Commands:")}\n${colourL("push")}\n ${pushCommandDescription}\n${colourL("dev")}\n Watch a directory and push a script when modified\n${colourL("golf")}\n Minify a script file on the spot\n${colourL("gen-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("config")}\n Modify and view the config file\n${colourL("pull")}\n Pull a script a from a hackmud user's script directory`
109
- )
110
- )
111
- }
112
- },
113
- exploreObject = (object, keys, createPath = !1) => {
114
- for (const key of keys)
115
- object =
116
- createPath ?
117
- "object" == typeof object[key] ?
118
- object[key]
119
- : (object[key] = {})
120
- : object?.[key]
121
- return object
122
- },
123
- logInfo = ({ file, users, minLength, error }, hackmudPath) => {
124
- error ?
125
- logError(`error "${chalk.bold(error.message)}" in ${chalk.bold(file)}`)
126
- : console.log(
127
- `pushed ${chalk.bold(file)} to ${users.map(user => chalk.bold(userColours.get(user))).join(", ")} | ${chalk.bold(minLength + "")} chars | ${chalk.bold(resolve(hackmudPath, users[0], "scripts", basename(file, extname(file))) + ".js")}`
128
- )
129
- },
130
- log = message => {
131
- console.log(colourS(message))
132
- },
133
- logError = message => {
134
- console.error(colourD(message))
135
- process.exitCode = 1
136
- }
23
+ log = message => console.log(colourS(message))
137
24
  for (const argument of process.argv.slice(2))
138
25
  if ("-" == argument[0]) {
139
26
  const [key, valueRaw] = argument.split("=")
@@ -150,35 +37,10 @@ for (const argument of process.argv.slice(2))
150
37
  else for (const option of key.slice(1)) options.set(option, value)
151
38
  } else commands.push(argument)
152
39
  if ("v" == commands[0] || "version" == commands[0] || options.get("version") || options.get("v")) {
153
- console.log("0.19.1-003b022")
40
+ console.log(version)
154
41
  process.exit()
155
42
  }
156
- let configDidNotExist = !1
157
- const configPromise = readFile(configFilePath, { encoding: "utf-8" }).then(
158
- configFile => {
159
- let temporaryConfig
160
- try {
161
- temporaryConfig = JSON.parse(configFile)
162
- } catch {
163
- log("Config file was corrupted, resetting")
164
- return {}
165
- }
166
- if (!temporaryConfig || "object" != typeof temporaryConfig) {
167
- log("Config file was corrupted, resetting")
168
- return {}
169
- }
170
- if ("hackmudPath" in temporaryConfig && "string" != typeof temporaryConfig.hackmudPath) {
171
- log('Property "hackmudPath" of config file was corrupted, removing')
172
- delete temporaryConfig.hackmudPath
173
- }
174
- return temporaryConfig
175
- },
176
- () => {
177
- configDidNotExist = !0
178
- return {}
179
- }
180
- ),
181
- pushModule = import("../push.js"),
43
+ const pushModule = import("../push.js"),
182
44
  processScriptModule = import("../processScript/index.js"),
183
45
  watchModule = import("../watch.js"),
184
46
  chokidarModule = import("chokidar"),
@@ -203,12 +65,8 @@ let autoExit = !0
203
65
  switch (commands[0]) {
204
66
  case "push":
205
67
  {
206
- const { hackmudPath } = await configPromise
207
- if (!hackmudPath) {
208
- logNeedHackmudPathMessage()
209
- break
210
- }
211
- const sourcePath = commands[1]
68
+ const hackmudPath = getHackmudPath(),
69
+ sourcePath = commands[1]
212
70
  if (!sourcePath) {
213
71
  logError("Must provide the directory to push from\n")
214
72
  logHelp()
@@ -276,12 +134,8 @@ switch (commands[0]) {
276
134
  case "dev":
277
135
  case "watch":
278
136
  {
279
- const { hackmudPath } = await configPromise
280
- if (!hackmudPath) {
281
- logNeedHackmudPathMessage()
282
- break
283
- }
284
- const sourcePath = commands[1]
137
+ const hackmudPath = getHackmudPath(),
138
+ sourcePath = commands[1]
285
139
  if (!sourcePath) {
286
140
  logError("Must provide the directory to watch\n")
287
141
  logHelp()
@@ -354,34 +208,24 @@ switch (commands[0]) {
354
208
  break
355
209
  case "pull":
356
210
  {
357
- const { hackmudPath } = await configPromise
358
- if (!hackmudPath) {
359
- logNeedHackmudPathMessage()
360
- break
361
- }
362
- const script = commands[1]
211
+ const hackmudPath = getHackmudPath(),
212
+ script = commands[1]
363
213
  if (!script) {
364
214
  logError("Must provide the script to pull\n")
365
215
  logHelp()
366
216
  break
367
217
  }
368
218
  const sourcePath = commands[2] || "."
369
- try {
370
- await pull(sourcePath, hackmudPath, script)
371
- } catch (error) {
219
+ await pull(sourcePath, hackmudPath, script).catch(error => {
372
220
  console.error(error)
373
221
  logError(`Something went wrong, did you forget to ${colourC("#down")} the script?`)
374
- }
222
+ })
375
223
  }
376
224
  break
377
225
  case "sync-macros":
378
226
  {
379
- const { hackmudPath } = await configPromise
380
- if (!hackmudPath) {
381
- logNeedHackmudPathMessage()
382
- break
383
- }
384
- const { macrosSynced, usersSynced } = await syncMacros(hackmudPath)
227
+ const hackmudPath = getHackmudPath(),
228
+ { macrosSynced, usersSynced } = await syncMacros(hackmudPath)
385
229
  log(`Synced ${macrosSynced} macros to ${usersSynced} users`)
386
230
  }
387
231
  break
@@ -398,100 +242,17 @@ switch (commands[0]) {
398
242
  }
399
243
  const sourcePath = resolve(target),
400
244
  outputPath = commands[2] || "./player.d.ts",
401
- typeDeclaration = await generateTypeDeclaration(sourcePath, (await configPromise).hackmudPath)
245
+ typeDeclaration = await generateTypeDeclaration(sourcePath, getHackmudPath())
402
246
  let typeDeclarationPath = resolve(outputPath)
403
- try {
404
- await writeFile(typeDeclarationPath, typeDeclaration)
405
- } catch (error) {
406
- assert(error instanceof Error)
247
+ await writeFile(typeDeclarationPath, typeDeclaration).catch(error => {
248
+ assert(error instanceof Error, "src/bin/hsm.ts:327:35")
407
249
  if ("EISDIR" != error.code) throw error
408
250
  typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
409
- await writeFile(typeDeclarationPath, typeDeclaration)
410
- }
251
+ return writeFile(typeDeclarationPath, typeDeclaration)
252
+ })
411
253
  log("Wrote type declaration to " + chalk.bold(typeDeclarationPath))
412
254
  }
413
255
  break
414
- case "config":
415
- switch (commands[1]) {
416
- case "get":
417
- {
418
- const key = commands[2]
419
- key ? log(exploreObject(await configPromise, key.split("."))) : console.log(await configPromise)
420
- }
421
- break
422
- case "delete":
423
- {
424
- const key = commands[2]
425
- if (!key) {
426
- logError("Must provide a key to delete\n")
427
- logHelp()
428
- break
429
- }
430
- const keyParts = key.split("."),
431
- pathName = keyParts
432
- .map(name => (/^[a-z_$][\w$]*$/i.test(name) ? name : JSON.stringify(name)))
433
- .join("."),
434
- lastKey = keyParts.pop(),
435
- config = await configPromise
436
- delete exploreObject(config, keyParts)?.[lastKey]
437
- log(`Removed ${colourV(pathName)} from config file`)
438
- }
439
- break
440
- case "set":
441
- {
442
- const key = commands[2],
443
- value = commands[3]
444
- if (!key) {
445
- logError("Must provide a key and value\n")
446
- logHelp()
447
- break
448
- }
449
- const keys = key.split("."),
450
- pathName = keys
451
- .map(name => (/^[a-z_$][\w$]*$/i.test(name) ? name : JSON.stringify(name)))
452
- .join(".")
453
- if (!value) {
454
- logError(`Must provide a value for the key ${pathName}\n`)
455
- logHelp()
456
- break
457
- }
458
- const lastKey = keys.pop(),
459
- config = await configPromise
460
- if (keys.length || "hackmudPath" != lastKey) {
461
- let object = config
462
- for (const key of keys)
463
- if ("object" == typeof object[key]) object = object[key]
464
- else {
465
- object[key] = {}
466
- object = object[key]
467
- }
468
- object[lastKey] = value
469
- } else config.hackmudPath = resolve(value.startsWith("~/") ? homedir() + value.slice(1) : value)
470
- console.log(config)
471
- await (async config => {
472
- const json = JSON.stringify(config, void 0, "\t")
473
- configDidNotExist && log("Creating config file at " + configFilePath)
474
- await writeFile(configFilePath, json).catch(async error => {
475
- switch (error.code) {
476
- case "EISDIR":
477
- await rmdir(configFilePath)
478
- break
479
- case "ENOENT":
480
- await mkdir(configDirectoryPath)
481
- break
482
- default:
483
- throw error
484
- }
485
- await writeFile(configFilePath, json)
486
- })
487
- })(config)
488
- }
489
- break
490
- default:
491
- commands[1] && logError(`Unknown command: ${JSON.stringify(commands[1])}\n`)
492
- logHelp()
493
- }
494
- break
495
256
  case "help":
496
257
  case "h":
497
258
  logHelp()
@@ -555,36 +316,31 @@ switch (commands[0]) {
555
316
  : fileBaseName + ".js"
556
317
  )
557
318
  const golfFile = () =>
558
- readFile(target, { encoding: "utf-8" }).then(
559
- async source => {
560
- const timeStart = performance.now(),
561
- { script, warnings } = await processScript(source, {
562
- minify: !(options.get("no-minify") || options.get("skip-minify")),
563
- scriptUser,
564
- scriptName,
565
- filePath: target,
566
- mangleNames,
567
- forceQuineCheats
568
- }),
569
- timeTook = performance.now() - timeStart
570
- for (const { message, line } of warnings)
571
- log(`Warning "${chalk.bold(message)}" on line ${chalk.bold(line + "")}`)
572
- await writeFilePersistent(outputPath, script)
573
- .catch(async error => {
574
- if (!commands[2] || "EISDIR" != error.code) throw error
575
- outputPath = resolve(outputPath, basename(target, fileExtension) + ".js")
576
- await writeFilePersistent(outputPath, script)
577
- })
578
- .then(
579
- () =>
580
- log(
581
- `Wrote ${chalk.bold(countHackmudCharacters(script))} chars to ${chalk.bold(relative(".", outputPath))} | took ${Math.round(100 * timeTook) / 100}ms`
582
- ),
583
- error => logError(error.message)
319
+ readFile(target, { encoding: "utf-8" }).then(async source => {
320
+ const timeStart = performance.now(),
321
+ { script, warnings } = await processScript(source, {
322
+ minify: !(options.get("no-minify") || options.get("skip-minify")),
323
+ scriptUser,
324
+ scriptName,
325
+ filePath: target,
326
+ mangleNames,
327
+ forceQuineCheats
328
+ }),
329
+ timeTook = performance.now() - timeStart
330
+ for (const { message, line } of warnings)
331
+ log(`Warning "${chalk.bold(message)}" on line ${chalk.bold(line + "")}`)
332
+ await writeFilePersistent(outputPath, script)
333
+ .catch(error => {
334
+ if (!commands[2] || "EISDIR" != error.code) throw error
335
+ outputPath = resolve(outputPath, basename(target, fileExtension) + ".js")
336
+ return writeFilePersistent(outputPath, script)
337
+ })
338
+ .then(() =>
339
+ log(
340
+ `Wrote ${chalk.bold(countHackmudCharacters(script))} chars to ${chalk.bold(relative(".", outputPath))} | took ${Math.round(100 * timeTook) / 100}ms`
584
341
  )
585
- },
586
- error => logError(error.message)
587
- )
342
+ )
343
+ })
588
344
  if (options.get("watch")) {
589
345
  const { watch: watchFile } = await chokidarModule
590
346
  watchFile(target, { awaitWriteFinish: { stabilityThreshold: 100 } })
@@ -595,7 +351,86 @@ switch (commands[0]) {
595
351
  }
596
352
  break
597
353
  default:
598
- commands[0] && logError(`Unknown command: ${JSON.stringify(commands[0])}\n`)
354
+ commands[0] && logError(`Unknown command: ${colourL(commands[0])}\n`)
599
355
  logHelp()
600
356
  }
601
357
  autoExit && process.exit()
358
+ function logHelp() {
359
+ const pushCommandDescription = "Push scripts from a directory to hackmud user's scripts directories",
360
+ forceQuineCheatsOptionDescription = `Force quine cheats on. Use ${colourN("--force-quine-cheats")}=${colourV("false")} to force off`,
361
+ hackmudPathOption = `${colourN("--hackmud-path")}=${colourB("<path>")}\n Override hackmud path`
362
+ console.log(colourN("Version") + colourS(": ") + colourV(version))
363
+ switch (commands[0]) {
364
+ case "dev":
365
+ case "watch":
366
+ case "push":
367
+ console.log(
368
+ colourS(
369
+ `\n${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\tPushes 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\tPushes 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\tPushes 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\tPushes all scripts found in ${colourV("src")} folder to all users`
370
+ )
371
+ )
372
+ break
373
+ case "pull":
374
+ console.log(
375
+ colourS(
376
+ `\n${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}`
377
+ )
378
+ )
379
+ break
380
+ case "minify":
381
+ case "golf":
382
+ console.log(
383
+ colourS(
384
+ `\n${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`
385
+ )
386
+ )
387
+ break
388
+ case "generate-type-declaration":
389
+ case "gen-type-declaration":
390
+ case "gen-dts":
391
+ case "gen-types":
392
+ console.log(
393
+ colourS(
394
+ `${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}`
395
+ )
396
+ )
397
+ break
398
+ case "sync-macros":
399
+ console.log(
400
+ colourS(
401
+ `\n${colourJ("Sync macros across all hackmud users")}\n\n${colourA("Options:")}\n${hackmudPathOption}`
402
+ )
403
+ )
404
+ break
405
+ default:
406
+ console.log(
407
+ colourS(
408
+ `\n${colourJ("Hackmud Script Manager")}\n\n${colourA("Commands:")}\n${colourL("push")}\n ${pushCommandDescription}\n${colourL("dev")}\n Watch a directory and push a script when modified\n${colourL("golf")}\n Minify a script file on the spot\n${colourL("gen-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`
409
+ )
410
+ )
411
+ }
412
+ }
413
+ function logInfo({ file, users, minLength, error }, hackmudPath) {
414
+ error ?
415
+ logError(`error "${chalk.bold(error.message)}" in ${chalk.bold(file)}`)
416
+ : console.log(
417
+ `pushed ${chalk.bold(file)} to ${users.map(user => chalk.bold(userColours.get(user))).join(", ")} | ${chalk.bold(minLength + "")} chars | ${chalk.bold(resolve(hackmudPath, users[0], "scripts", basename(file, extname(file))) + ".js")}`
418
+ )
419
+ }
420
+ function logError(message) {
421
+ console.error(colourD(message))
422
+ process.exitCode = 1
423
+ }
424
+ function getHackmudPath() {
425
+ const hackmudPathOption = options.get("hackmud-path")
426
+ if (null != hackmudPathOption && "string" != typeof hackmudPathOption) {
427
+ logError(`Option ${colourN("--hackmud-path")} must be a string, got ${colourV(hackmudPathOption)}\n`)
428
+ logHelp()
429
+ process.exit(1)
430
+ }
431
+ return (
432
+ hackmudPathOption ||
433
+ process.env.HSM_HACKMUD_PATH ||
434
+ ("win32" == process.platform ? resolve(process.env.APPDATA, "hackmud") : resolve(homedir(), ".config/hackmud"))
435
+ )
436
+ }
@@ -1,6 +1,6 @@
1
1
  import { readDirectoryWithStats } from "@samual/lib/readDirectoryWithStats"
2
2
  import { basename, resolve } from "path"
3
- const generateTypeDeclaration = async (sourceDirectory, hackmudPath) => {
3
+ async function generateTypeDeclaration(sourceDirectory, hackmudPath) {
4
4
  const users = new Set()
5
5
  if (hackmudPath)
6
6
  for (const { stats, name } of await readDirectoryWithStats(hackmudPath))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackmud-script-manager",
3
- "version": "0.19.1-003b022",
3
+ "version": "0.19.1-07fc9cb",
4
4
  "description": "Script manager for game hackmud, with minification, TypeScript support, and player script type definition generation.",
5
5
  "keywords": [
6
6
  "api",
@@ -59,7 +59,7 @@
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.10.2-5919775",
62
+ "@samual/lib": "0.10.2-e64c5bc",
63
63
  "acorn": "^8.11.3",
64
64
  "chalk": "^5.3.0",
65
65
  "chokidar": "^3.6.0",
@@ -69,17 +69,15 @@
69
69
  "rollup": "^4.14.2",
70
70
  "terser": "^5.30.3"
71
71
  },
72
- "engines": {
73
- "node": "^18 || >=20",
74
- "pnpm": "^9.0.1"
75
- },
76
72
  "type": "module",
77
73
  "exports": {
78
74
  "./*": "./*.js",
79
75
  "./*.js": "./*.js"
80
76
  },
81
77
  "bin": {
82
- "hsm.d": "bin/hsm.d.ts",
83
78
  "hsm": "bin/hsm.js"
79
+ },
80
+ "engines": {
81
+ "node": "^18 || >=20"
84
82
  }
85
83
  }