hackmud-script-manager 0.11.0-2c7f410 → 0.12.0-c276bb2
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 +228 -203
- package/index.d.ts +1 -1
- package/index.js +10 -718
- package/package.json +17 -7
- package/shared.js +902 -0
- package/lib.js +0 -74
package/bin/hsm.js
CHANGED
@@ -1,28 +1,30 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
const
|
2
|
+
import { resolve, basename, extname, dirname, relative } from 'path';
|
3
|
+
import { homedir } from 'os';
|
4
|
+
import chalk from 'chalk';
|
5
|
+
import fs from 'fs';
|
6
|
+
import { D as DynamicMap, s as supportedExtensions, p as processScript, h as hackmudLength, w as writeFilePersist, g as generateTypings, t as test, a as syncMacros, b as pull, c as watch, d as push } from '../shared.js';
|
7
|
+
import 'acorn';
|
8
|
+
import 'chokidar';
|
9
|
+
import 'escodegen';
|
10
|
+
import 'esprima';
|
11
|
+
import 'esquery';
|
12
|
+
import 'terser';
|
13
|
+
import 'typescript';
|
14
|
+
|
15
|
+
const { readFile: readFile, rmdir: removeDirectory, writeFile: writeFile, mkdir: makeDirectory } = fs.promises;
|
16
|
+
const configDirPath = resolve(homedir(), ".config");
|
17
|
+
const configFilePath = resolve(configDirPath, "hsm.json");
|
16
18
|
const options = new Map();
|
17
19
|
const commands = [];
|
18
20
|
let config;
|
19
|
-
const colourJ =
|
20
|
-
const colourK =
|
21
|
-
const colourM =
|
22
|
-
const colourW =
|
23
|
-
const colourL =
|
24
|
-
const colourB =
|
25
|
-
const userColours = new
|
21
|
+
const colourJ = chalk.rgb(0xFF, 0xF4, 0x04);
|
22
|
+
const colourK = chalk.rgb(0xF3, 0xF9, 0x98);
|
23
|
+
const colourM = chalk.rgb(0xB3, 0xFF, 0x9B);
|
24
|
+
const colourW = chalk.rgb(0xFF, 0x96, 0xE0);
|
25
|
+
const colourL = chalk.rgb(0x1E, 0xFF, 0x00);
|
26
|
+
const colourB = chalk.rgb(0xCA, 0xCA, 0xCA);
|
27
|
+
const userColours = new DynamicMap(user => {
|
26
28
|
let hash = 0;
|
27
29
|
for (const char of user)
|
28
30
|
hash += (hash >> 1) + hash + "xi1_8ratvsw9hlbgm02y5zpdcn7uekof463qj".indexOf(char) + 1;
|
@@ -57,209 +59,223 @@ for (const arg of process.argv.slice(2)) {
|
|
57
59
|
}
|
58
60
|
(async () => {
|
59
61
|
var _a, _b, _c, _d, _e, _f;
|
60
|
-
if (options.get("version") || options.get("v"))
|
62
|
+
if (options.get("version") || options.get("v")) {
|
61
63
|
version();
|
62
|
-
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
if (options.get("help") || options.get("h")) {
|
63
67
|
help();
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
const scripts = ((_b = options.get("scripts")) === null || _b === void 0 ? void 0 : _b.toString().split(",")) || [];
|
74
|
-
await (0, __1.push)(srcPath, hackmudPath, users, scripts, ({ file, users, error, minLength, srcLength }) => users.length && console.log(error
|
75
|
-
? `error "${error instanceof Error
|
76
|
-
? chalk_1.default.bold(error.message)
|
77
|
-
: error}" in ${chalk_1.default.dim(file)}`
|
78
|
-
: `pushed ${chalk_1.default.bold(file)} to ${users.map(user => chalk_1.default.bold(userColours.get(user))).join(", ")} | ${chalk_1.default.bold(String(minLength))} chars from ${chalk_1.default.bold(String(srcLength))} | saved ${chalk_1.default.bold(String(srcLength - minLength))} (${chalk_1.default.bold(`${Math.round((1 - (minLength / srcLength)) * 100)}%`)}) | ${chalk_1.default.bold(`${(0, path_1.resolve)(hackmudPath, users[0], "scripts", (0, path_1.basename)(file, (0, path_1.extname)(file)))}.js`)}`));
|
79
|
-
updateConfig();
|
80
|
-
}
|
81
|
-
else
|
82
|
-
console.log("you need to set hackmudPath in config before you can use this command");
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
switch (commands[0]) {
|
71
|
+
case "push":
|
72
|
+
{
|
73
|
+
const config = await getConfig();
|
74
|
+
if (!config.hackmudPath) {
|
75
|
+
console.log("you need to set hackmudPath in config before you can use this command");
|
76
|
+
break;
|
83
77
|
}
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
const genTypes = (_e = options.get("gen-types")) === null || _e === void 0 ? void 0 : _e.toString();
|
94
|
-
(0, __1.watch)(srcPath, hackmudPath, users, scripts, ({ file, users, error, minLength, srcLength }) => users.length && console.log(error
|
95
|
-
? `error "${error instanceof Error
|
96
|
-
? chalk_1.default.bold(error.message)
|
97
|
-
: error}" in ${chalk_1.default.dim(file)}`
|
98
|
-
: `pushed ${chalk_1.default.bold(file)} to ${users.map(user => chalk_1.default.bold(userColours.get(user))).join(", ")} | ${chalk_1.default.bold(String(minLength))} chars from ${chalk_1.default.bold(String(srcLength))} | saved ${chalk_1.default.bold(String(srcLength - minLength))} (${chalk_1.default.bold(`${Math.round((1 - (minLength / srcLength)) * 100)}%`)}) | ${chalk_1.default.bold(`${(0, path_1.resolve)(hackmudPath, users[0], "scripts", (0, path_1.basename)(file, (0, path_1.extname)(file)))}.js`)}`), { genTypes });
|
78
|
+
const srcPath = commands[1] || ".";
|
79
|
+
const hackmudPath = config.hackmudPath;
|
80
|
+
let users;
|
81
|
+
let scripts;
|
82
|
+
if (commands[2]) {
|
83
|
+
const match = commands[2].match(/^([a-z_][a-z_0-9]{0,24})\.([a-z_][a-z_0-9]{0,24})$/);
|
84
|
+
if (!match) {
|
85
|
+
console.log(`"${chalk.bold(commands[2])}" is not a valid script name`);
|
86
|
+
break;
|
99
87
|
}
|
100
|
-
|
101
|
-
|
88
|
+
users = [match[1]];
|
89
|
+
scripts = [match[2]];
|
102
90
|
}
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
const config = await getConfig();
|
107
|
-
if (config.hackmudPath) {
|
108
|
-
const script = commands[1];
|
109
|
-
if (script) {
|
110
|
-
const srcPath = commands[2] || ".";
|
111
|
-
const hackmudPath = config.hackmudPath;
|
112
|
-
try {
|
113
|
-
await (0, __1.pull)(srcPath, hackmudPath, script);
|
114
|
-
}
|
115
|
-
catch (error) {
|
116
|
-
console.log("something went wrong, did you forget to #down the script?");
|
117
|
-
}
|
118
|
-
}
|
119
|
-
else
|
120
|
-
help();
|
121
|
-
}
|
122
|
-
else
|
123
|
-
console.log("you need to set hackmudPath in config before you can use this command");
|
91
|
+
else {
|
92
|
+
users = ((_a = options.get("users")) === null || _a === void 0 ? void 0 : _a.toString().split(",")) || [];
|
93
|
+
scripts = ((_b = options.get("scripts")) === null || _b === void 0 ? void 0 : _b.toString().split(",")) || [];
|
124
94
|
}
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
95
|
+
await push(srcPath, hackmudPath, users, scripts, onPushLogger);
|
96
|
+
updateConfig();
|
97
|
+
}
|
98
|
+
break;
|
99
|
+
case "dev":
|
100
|
+
case "watch":
|
101
|
+
{
|
102
|
+
const config = await getConfig();
|
103
|
+
if (!config.hackmudPath) {
|
104
|
+
console.log("you need to set hackmudPath in config before you can use this command");
|
105
|
+
break;
|
135
106
|
}
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
else
|
151
|
-
console.log("no errors found");
|
107
|
+
const srcPath = commands[1] || ".";
|
108
|
+
const hackmudPath = config.hackmudPath;
|
109
|
+
const users = ((_c = options.get("users")) === null || _c === void 0 ? void 0 : _c.toString().split(",")) || [];
|
110
|
+
const scripts = ((_d = options.get("scripts")) === null || _d === void 0 ? void 0 : _d.toString().split(",")) || [];
|
111
|
+
const genTypes = (_e = options.get("gen-types")) === null || _e === void 0 ? void 0 : _e.toString();
|
112
|
+
watch(srcPath, hackmudPath, users, scripts, onPushLogger, { genTypes });
|
113
|
+
}
|
114
|
+
break;
|
115
|
+
case "pull":
|
116
|
+
{
|
117
|
+
const config = await getConfig();
|
118
|
+
if (!config.hackmudPath) {
|
119
|
+
console.log("you need to set hackmudPath in config before you can use this command");
|
120
|
+
break;
|
152
121
|
}
|
153
|
-
|
154
|
-
|
155
|
-
|
122
|
+
const script = commands[1];
|
123
|
+
if (!script) {
|
124
|
+
help();
|
125
|
+
break;
|
126
|
+
}
|
127
|
+
const srcPath = commands[2] || ".";
|
128
|
+
const hackmudPath = config.hackmudPath;
|
129
|
+
try {
|
130
|
+
await pull(srcPath, hackmudPath, script);
|
131
|
+
}
|
132
|
+
catch (error) {
|
133
|
+
console.log("something went wrong, did you forget to #down the script?");
|
134
|
+
}
|
135
|
+
}
|
136
|
+
break;
|
137
|
+
case "sync-macros":
|
138
|
+
{
|
139
|
+
const { hackmudPath } = await getConfig();
|
140
|
+
if (!hackmudPath) {
|
141
|
+
console.log("you need to set hackmudPath in config before you can use this command");
|
142
|
+
break;
|
143
|
+
}
|
144
|
+
const { macrosSynced, usersSynced } = await syncMacros(hackmudPath);
|
145
|
+
console.log(`synced ${macrosSynced} macros to ${usersSynced} users`);
|
146
|
+
}
|
147
|
+
break;
|
148
|
+
case "test":
|
149
|
+
{
|
150
|
+
const srcPath = resolve(commands[1] || ".");
|
151
|
+
let errors = 0;
|
152
|
+
console.log(`testing scripts in ${chalk.bold(srcPath)}\n`);
|
153
|
+
for (const { file, line, message } of await test(srcPath)) {
|
154
|
+
console.log(`error "${chalk.bold(message)}" in ${chalk.bold(file)} on line ${chalk.bold(String(line))}`);
|
155
|
+
errors++;
|
156
|
+
}
|
157
|
+
if (!errors) {
|
158
|
+
console.log("no errors found");
|
159
|
+
break;
|
160
|
+
}
|
161
|
+
if (errors) {
|
162
|
+
process.exitCode = 1;
|
163
|
+
console.log(`\nencountered ${chalk.bold(String(errors))} errors`);
|
164
|
+
break;
|
165
|
+
}
|
166
|
+
console.log("no errors found");
|
167
|
+
}
|
168
|
+
break;
|
169
|
+
case "gen-types":
|
170
|
+
{
|
171
|
+
const srcPath = resolve(commands[1] || ".");
|
156
172
|
let targetPath;
|
157
173
|
if (commands[2])
|
158
|
-
targetPath =
|
174
|
+
targetPath = resolve(commands[2]);
|
159
175
|
else
|
160
|
-
targetPath =
|
161
|
-
|
162
|
-
break;
|
176
|
+
targetPath = resolve(srcPath, "../player.d.ts");
|
177
|
+
generateTypings(srcPath, targetPath, (await getConfig()).hackmudPath);
|
163
178
|
}
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
}
|
179
|
-
else
|
180
|
-
help();
|
179
|
+
break;
|
180
|
+
case "config":
|
181
|
+
switch (commands[1]) {
|
182
|
+
case "get":
|
183
|
+
{
|
184
|
+
console.log(exploreObject(await getConfig(), commands.slice(2)));
|
185
|
+
}
|
186
|
+
break;
|
187
|
+
case "delete":
|
188
|
+
{
|
189
|
+
const keys = commands.slice(2);
|
190
|
+
if (!keys.length) {
|
191
|
+
help();
|
192
|
+
break;
|
181
193
|
}
|
182
|
-
break;
|
183
|
-
case "set": {
|
184
194
|
const config = await getConfig();
|
195
|
+
(_f = exploreObject(config, keys.slice(0, -1))) === null || _f === void 0 ? true : delete _f[keys.slice(-1)[0]];
|
196
|
+
console.log(config);
|
197
|
+
}
|
198
|
+
break;
|
199
|
+
case "set":
|
200
|
+
{
|
185
201
|
const keys = commands.slice(2);
|
186
202
|
const value = keys.pop();
|
187
|
-
if (keys.length) {
|
188
|
-
let object = config;
|
189
|
-
for (let key of keys.slice(0, -1))
|
190
|
-
object = typeof object[key] == "object" ? object[key] : object[key] = {};
|
191
|
-
object[keys.slice(-1)[0]] = value;
|
192
|
-
if (config.hackmudPath)
|
193
|
-
config.hackmudPath = (0, path_1.resolve)(config.hackmudPath);
|
194
|
-
console.log(config);
|
195
|
-
}
|
196
|
-
else
|
203
|
+
if (!keys.length) {
|
197
204
|
help();
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
205
|
+
break;
|
206
|
+
}
|
207
|
+
const config = await getConfig();
|
208
|
+
let object = config;
|
209
|
+
for (let key of keys.slice(0, -1))
|
210
|
+
object = typeof object[key] == "object" ? object[key] : object[key] = {};
|
211
|
+
object[keys.slice(-1)[0]] = value;
|
212
|
+
if (config.hackmudPath)
|
213
|
+
config.hackmudPath = resolve(config.hackmudPath);
|
214
|
+
console.log(config);
|
204
215
|
}
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
{
|
216
|
+
break;
|
217
|
+
default: {
|
218
|
+
if (commands[1])
|
219
|
+
console.log("unknown command");
|
210
220
|
help();
|
211
221
|
}
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
222
|
+
}
|
223
|
+
break;
|
224
|
+
case "help":
|
225
|
+
case "h":
|
226
|
+
{
|
227
|
+
help();
|
228
|
+
}
|
229
|
+
break;
|
230
|
+
case "version":
|
231
|
+
case "v":
|
232
|
+
{
|
233
|
+
version();
|
234
|
+
}
|
235
|
+
break;
|
236
|
+
case "golf":
|
237
|
+
case "minify":
|
238
|
+
{
|
239
|
+
if (!commands[1]) {
|
240
|
+
console.log(`Target required\nUsage: ${basename(process.argv[1])} ${commands[0]} <target> [output]`);
|
241
|
+
break;
|
217
242
|
}
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
if (!commands[1]) {
|
223
|
-
console.log(`Target required\nUsage: ${(0, path_1.basename)(process.argv[1])} ${commands[0]} <target> [output]`);
|
224
|
-
break;
|
225
|
-
}
|
226
|
-
const fileExtension = (0, path_1.extname)(commands[1]);
|
227
|
-
if (!__1.supportedExtensions.includes(fileExtension)) {
|
228
|
-
console.log(`Unsupported file extension "${chalk_1.default.bold(fileExtension)}"\nSupported extensions are "${__1.supportedExtensions.map(extension => chalk_1.default.bold(extension)).join('", "')}"`);
|
229
|
-
break;
|
230
|
-
}
|
231
|
-
await readFile(commands[1], { encoding: "utf-8" }).then(async (source) => {
|
232
|
-
const { script, srcLength, warnings } = await (0, __1.processScript)(source);
|
233
|
-
for (const { message, line } of warnings)
|
234
|
-
console.log(`warning "${chalk_1.default.bold(message)}" on line ${chalk_1.default.bold(String(line))}`);
|
235
|
-
let outputPath;
|
236
|
-
if (commands[2])
|
237
|
-
outputPath = commands[2];
|
238
|
-
else {
|
239
|
-
const fileBaseName = (0, path_1.basename)(commands[1], fileExtension);
|
240
|
-
outputPath = (0, path_1.resolve)((0, path_1.dirname)(commands[1]), fileBaseName.endsWith(".src")
|
241
|
-
? `${fileBaseName.slice(0, -4)}.js` :
|
242
|
-
fileExtension == ".js"
|
243
|
-
? `${fileBaseName}.min.js`
|
244
|
-
: `${fileBaseName}.js`);
|
245
|
-
}
|
246
|
-
const scriptLength = (0, lib_1.hackmudLength)(script);
|
247
|
-
await (0, lib_1.writeFilePersist)(outputPath, script)
|
248
|
-
.catch(async (error) => {
|
249
|
-
if (!commands[2] || error.code != "EISDIR")
|
250
|
-
throw error;
|
251
|
-
outputPath = (0, path_1.resolve)(outputPath, `${(0, path_1.basename)(commands[1], fileExtension)}.js`);
|
252
|
-
await (0, lib_1.writeFilePersist)(outputPath, script);
|
253
|
-
})
|
254
|
-
.then(() => console.log(`wrote ${chalk_1.default.bold(scriptLength)} chars to ${chalk_1.default.bold((0, path_1.relative)(".", outputPath))} | saved ${chalk_1.default.bold(srcLength - scriptLength)} chars`), (error) => console.log(error.message));
|
255
|
-
}, (error) => console.log(error.message));
|
243
|
+
const fileExtension = extname(commands[1]);
|
244
|
+
if (!supportedExtensions.includes(fileExtension)) {
|
245
|
+
console.log(`Unsupported file extension "${chalk.bold(fileExtension)}"\nSupported extensions are "${supportedExtensions.map(extension => chalk.bold(extension)).join('", "')}"`);
|
246
|
+
break;
|
256
247
|
}
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
248
|
+
await readFile(commands[1], { encoding: "utf-8" }).then(async (source) => {
|
249
|
+
const { script, srcLength, warnings } = await processScript(source);
|
250
|
+
for (const { message, line } of warnings)
|
251
|
+
console.log(`warning "${chalk.bold(message)}" on line ${chalk.bold(String(line))}`);
|
252
|
+
let outputPath;
|
253
|
+
if (commands[2])
|
254
|
+
outputPath = commands[2];
|
255
|
+
else {
|
256
|
+
const fileBaseName = basename(commands[1], fileExtension);
|
257
|
+
outputPath = resolve(dirname(commands[1]), fileBaseName.endsWith(".src")
|
258
|
+
? `${fileBaseName.slice(0, -4)}.js` :
|
259
|
+
fileExtension == ".js"
|
260
|
+
? `${fileBaseName}.min.js`
|
261
|
+
: `${fileBaseName}.js`);
|
262
|
+
}
|
263
|
+
const scriptLength = hackmudLength(script);
|
264
|
+
await writeFilePersist(outputPath, script)
|
265
|
+
.catch(async (error) => {
|
266
|
+
if (!commands[2] || error.code != "EISDIR")
|
267
|
+
throw error;
|
268
|
+
outputPath = resolve(outputPath, `${basename(commands[1], fileExtension)}.js`);
|
269
|
+
await writeFilePersist(outputPath, script);
|
270
|
+
})
|
271
|
+
.then(() => console.log(`wrote ${chalk.bold(scriptLength)} chars to ${chalk.bold(relative(".", outputPath))} | saved ${chalk.bold(srcLength - scriptLength)} chars`), (error) => console.log(error.message));
|
272
|
+
}, (error) => console.log(error.message));
|
262
273
|
}
|
274
|
+
break;
|
275
|
+
default: {
|
276
|
+
if (commands[0])
|
277
|
+
console.log("unknown command");
|
278
|
+
help();
|
263
279
|
}
|
264
280
|
}
|
265
281
|
updateConfig();
|
@@ -308,7 +324,7 @@ function help() {
|
|
308
324
|
case "minify":
|
309
325
|
case "golf":
|
310
326
|
{
|
311
|
-
console.log(`${
|
327
|
+
console.log(`${basename(process.argv[1])} ${commands[0]} <target> [output]`);
|
312
328
|
}
|
313
329
|
break;
|
314
330
|
default: {
|
@@ -317,7 +333,7 @@ function help() {
|
|
317
333
|
}
|
318
334
|
}
|
319
335
|
async function version() {
|
320
|
-
console.log(JSON.parse(await readFile(
|
336
|
+
console.log(JSON.parse(await readFile(resolve(__dirname, "../package.json"), { encoding: "utf-8" })).version || "unknown");
|
321
337
|
}
|
322
338
|
async function getConfig() {
|
323
339
|
if (config)
|
@@ -375,3 +391,12 @@ function updateConfig() {
|
|
375
391
|
});
|
376
392
|
}
|
377
393
|
}
|
394
|
+
function onPushLogger({ file, users, srcLength, minLength, error }) {
|
395
|
+
if (!users.length)
|
396
|
+
return;
|
397
|
+
if (error) {
|
398
|
+
console.log(`error "${chalk.bold(error.message)}" in ${chalk.bold(file)}`);
|
399
|
+
return;
|
400
|
+
}
|
401
|
+
console.log(`pushed ${chalk.bold(file)} to ${users.map(user => chalk.bold(userColours.get(user))).join(", ")} | ${chalk.bold(String(minLength))} chars from ${chalk.bold(String(srcLength))} | saved ${chalk.bold(String(srcLength - minLength))} (${chalk.bold(`${Math.round((1 - (minLength / srcLength)) * 100)}%`)}) | ${chalk.bold(`${resolve(config.hackmudPath, users[0], "scripts", basename(file, extname(file)))}.js`)}`);
|
402
|
+
}
|