hackmud-script-manager 0.19.1-3ef8894 → 0.19.1-531ddb2

Sign up to get free protection for your applications and to get access to all the features.
package/pull.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { copyFilePersistent } from "@samual/lib/copyFilePersistent"
2
2
  import { resolve } from "path"
3
- const pull = async (sourceFolderPath, hackmudPath, script) => {
3
+ async function pull(sourceFolderPath, hackmudPath, script) {
4
4
  const [user, name] = script.split(".")
5
5
  if (!user || !name) throw Error('`script` argument must be in "user.name" format')
6
6
  await copyFilePersistent(
package/push.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { Cache } from "@samual/lib/Cache"
2
2
  import { countHackmudCharacters } from "@samual/lib/countHackmudCharacters"
3
+ import { readDirectoryWithStats } from "@samual/lib/readDirectoryWithStats"
3
4
  import { writeFilePersistent } from "@samual/lib/writeFilePersistent"
4
- import { readFile, readdir, stat } from "fs/promises"
5
+ import { readFile } from "fs/promises"
5
6
  import { basename, resolve, extname } from "path"
6
7
  import { supportedExtensions } from "./constants.js"
7
8
  import { processScript } from "./processScript/index.js"
@@ -41,240 +42,228 @@ import "./processScript/preprocess.js"
41
42
  import "import-meta-resolve"
42
43
  import "./processScript/transform.js"
43
44
  import "@samual/lib/clearObject"
44
- const readDirectoryWithStats = async path =>
45
- Promise.all(
46
- (await readdir(path)).map(async name => {
47
- const resolvedPath = resolve(path, name)
48
- return { path: resolvedPath, name, stats: await stat(resolvedPath) }
49
- })
50
- ),
51
- push = async (
52
- sourceDirectory,
53
- hackmudDirectory,
54
- { scripts = ["*.*"], onPush = () => {}, minify = !0, mangleNames = !1, forceQuineCheats } = {}
55
- ) => {
56
- const scriptNamesByUser = new Cache(_user => new Set()),
57
- wildScriptUsers = new Set(),
58
- wildUserScripts = new Set()
59
- let pushEverything = !1
60
- for (const fullScriptName of scripts) {
61
- const [user, scriptName] = fullScriptName.split(".")
62
- user && "*" != user ?
63
- scriptName && "*" != scriptName ?
64
- scriptNamesByUser.get(user).add(scriptName)
65
- : wildScriptUsers.add(user)
66
- : scriptName && "*" != scriptName ? wildUserScripts.add(scriptName)
67
- : (pushEverything = !0)
68
- }
69
- const usersByGlobalScriptsToPush = new Cache(_user => new Set()),
70
- allInfo = [],
71
- scriptNamesAlreadyPushedByUser = new Cache(_user => new Set())
72
- let sourceDirectoryDirents
73
- if (wildUserScripts.size || pushEverything) {
74
- let hackmudDirectoryEntries
75
- ;[hackmudDirectoryEntries, sourceDirectoryDirents] = await Promise.all([
76
- readDirectoryWithStats(hackmudDirectory),
77
- readDirectoryWithStats(sourceDirectory)
78
- ])
79
- const allUsers = new Set([
80
- ...sourceDirectoryDirents.filter(({ stats }) => stats.isDirectory()).map(({ path }) => basename(path)),
81
- ...hackmudDirectoryEntries.filter(({ stats }) => stats.isDirectory()).map(({ name }) => name),
82
- ...hackmudDirectoryEntries
83
- .filter(({ name, stats }) => stats.isFile() && name.endsWith(".key"))
84
- .map(({ name }) => name.slice(0, -4)),
85
- ...scriptNamesByUser.keys(),
86
- ...wildScriptUsers
87
- ])
88
- if (pushEverything) for (const user of allUsers) wildScriptUsers.add(user)
89
- else
90
- for (const user of allUsers) {
91
- const scriptNames = scriptNamesByUser.get(user)
92
- for (const scriptName of wildUserScripts) scriptNames.add(scriptName)
93
- }
94
- }
95
- await Promise.all(
96
- [...wildScriptUsers].map(async user => {
97
- await readDirectoryWithStats(resolve(sourceDirectory, user)).then(
98
- async entries => {
99
- await Promise.all(
100
- entries.map(async ({ stats, name, path }) => {
101
- if (name.endsWith(".d.ts")) return
102
- const extension = extname(name)
103
- if (stats.isFile() && supportedExtensions.includes(extension)) {
104
- const scriptName = basename(name, extension),
105
- { script: minifiedCode } = await processScript(
106
- await readFile(path, { encoding: "utf-8" }),
107
- {
108
- minify,
109
- scriptUser: user,
110
- scriptName,
111
- filePath: path,
112
- mangleNames,
113
- forceQuineCheats
114
- }
115
- ),
116
- info = {
117
- file: `${user}/${name}`,
118
- users: [user],
119
- minLength: countHackmudCharacters(minifiedCode),
120
- error: void 0
45
+ async function push(
46
+ sourceDirectory,
47
+ hackmudDirectory,
48
+ { scripts = ["*.*"], onPush = () => {}, minify = !0, mangleNames = !1, forceQuineCheats } = {}
49
+ ) {
50
+ const scriptNamesByUser = new Cache(_user => new Set()),
51
+ wildScriptUsers = new Set(),
52
+ wildUserScripts = new Set()
53
+ let pushEverything = !1
54
+ for (const fullScriptName of scripts) {
55
+ const [user, scriptName] = fullScriptName.split(".")
56
+ user && "*" != user ?
57
+ scriptName && "*" != scriptName ?
58
+ scriptNamesByUser.get(user).add(scriptName)
59
+ : wildScriptUsers.add(user)
60
+ : scriptName && "*" != scriptName ? wildUserScripts.add(scriptName)
61
+ : (pushEverything = !0)
62
+ }
63
+ const usersByGlobalScriptsToPush = new Cache(_user => new Set()),
64
+ allInfo = [],
65
+ scriptNamesAlreadyPushedByUser = new Cache(_user => new Set())
66
+ let sourceDirectoryDirents
67
+ if (wildUserScripts.size || pushEverything) {
68
+ let hackmudDirectoryEntries
69
+ ;[hackmudDirectoryEntries, sourceDirectoryDirents] = await Promise.all([
70
+ readDirectoryWithStats(hackmudDirectory),
71
+ readDirectoryWithStats(sourceDirectory)
72
+ ])
73
+ const allUsers = new Set([
74
+ ...sourceDirectoryDirents.filter(({ stats }) => stats.isDirectory()).map(({ path }) => basename(path)),
75
+ ...hackmudDirectoryEntries.filter(({ stats }) => stats.isDirectory()).map(({ name }) => name),
76
+ ...hackmudDirectoryEntries
77
+ .filter(({ name, stats }) => stats.isFile() && name.endsWith(".key"))
78
+ .map(({ name }) => name.slice(0, -4)),
79
+ ...scriptNamesByUser.keys(),
80
+ ...wildScriptUsers
81
+ ])
82
+ if (pushEverything) for (const user of allUsers) wildScriptUsers.add(user)
83
+ else
84
+ for (const user of allUsers) {
85
+ const scriptNames = scriptNamesByUser.get(user)
86
+ for (const scriptName of wildUserScripts) scriptNames.add(scriptName)
87
+ }
88
+ }
89
+ await Promise.all(
90
+ [...wildScriptUsers].map(async user => {
91
+ await readDirectoryWithStats(resolve(sourceDirectory, user)).then(
92
+ async entries => {
93
+ await Promise.all(
94
+ entries.map(async ({ stats, name, path }) => {
95
+ if (name.endsWith(".d.ts")) return
96
+ const extension = extname(name)
97
+ if (stats.isFile() && supportedExtensions.includes(extension)) {
98
+ const scriptName = basename(name, extension),
99
+ { script: minifiedCode } = await processScript(
100
+ await readFile(path, { encoding: "utf-8" }),
101
+ {
102
+ minify,
103
+ scriptUser: user,
104
+ scriptName,
105
+ filePath: path,
106
+ mangleNames,
107
+ forceQuineCheats
121
108
  }
122
- scriptNamesAlreadyPushedByUser.get(user).add(scriptName)
123
- allInfo.push(info)
124
- await writeFilePersistent(
125
- resolve(hackmudDirectory, user, `scripts/${scriptName}.js`),
126
- minifiedCode
127
- )
128
- onPush(info)
129
- }
130
- })
131
- )
132
- },
133
- error => {
134
- if ("ENOENT" != error.code) throw error
135
- }
136
- )
137
- })
138
- )
139
- await Promise.all(
140
- [...scriptNamesByUser].map(async ([user, scripts]) => {
141
- wildScriptUsers.has(user) ||
142
- (await Promise.all(
143
- [...scripts].map(async scriptName => {
144
- let code, fileName, filePath
145
- for (const extension of supportedExtensions)
146
- try {
147
- fileName = `${scriptName}${extension}`
148
- code = await readFile((filePath = resolve(sourceDirectory, user, fileName)), {
149
- encoding: "utf-8"
150
- })
151
- break
152
- } catch {}
153
- if (code) {
154
- const { script: minifiedCode } = await processScript(code, {
155
- minify,
156
- scriptUser: user,
157
- scriptName,
158
- filePath,
159
- mangleNames,
160
- forceQuineCheats
161
- }),
109
+ ),
162
110
  info = {
163
- file: `${user}/${fileName}`,
111
+ file: `${user}/${name}`,
164
112
  users: [user],
165
113
  minLength: countHackmudCharacters(minifiedCode),
166
114
  error: void 0
167
115
  }
116
+ scriptNamesAlreadyPushedByUser.get(user).add(scriptName)
168
117
  allInfo.push(info)
169
118
  await writeFilePersistent(
170
- resolve(hackmudDirectory, user, "scripts", scriptName + ".js"),
119
+ resolve(hackmudDirectory, user, `scripts/${scriptName}.js`),
171
120
  minifiedCode
172
121
  )
173
122
  onPush(info)
174
- } else usersByGlobalScriptsToPush.get(scriptName).add(user)
123
+ }
175
124
  })
176
- ))
177
- })
178
- )
179
- await (wildScriptUsers.size ?
180
- Promise.all(
181
- (sourceDirectoryDirents || (await readDirectoryWithStats(sourceDirectory))).map(
182
- async ({ path, stats, name }) => {
183
- if (name.endsWith(".d.ts")) return
184
- const extension = extname(name)
185
- if (!stats.isFile() || !supportedExtensions.includes(extension)) return
186
- const scriptName = basename(name, extension),
187
- usersToPushTo = [...wildScriptUsers, ...usersByGlobalScriptsToPush.get(scriptName)].filter(
188
- user => !scriptNamesAlreadyPushedByUser.get(user).has(scriptName)
189
- )
190
- if (!usersToPushTo.length) return
191
- const uniqueID = Math.floor(Math.random() * 2 ** 52)
192
- .toString(36)
193
- .padStart(11, "0"),
194
- { script: minifiedCode } = await processScript(
195
- await readFile(path, { encoding: "utf-8" }),
196
- {
125
+ )
126
+ },
127
+ error => {
128
+ if ("ENOENT" != error.code) throw error
129
+ }
130
+ )
131
+ })
132
+ )
133
+ await Promise.all(
134
+ [...scriptNamesByUser].map(async ([user, scripts]) => {
135
+ wildScriptUsers.has(user) ||
136
+ (await Promise.all(
137
+ [...scripts].map(async scriptName => {
138
+ let code, fileName, filePath
139
+ for (const extension of supportedExtensions)
140
+ try {
141
+ fileName = `${scriptName}${extension}`
142
+ code = await readFile((filePath = resolve(sourceDirectory, user, fileName)), {
143
+ encoding: "utf-8"
144
+ })
145
+ break
146
+ } catch {}
147
+ if (code) {
148
+ const { script: minifiedCode } = await processScript(code, {
197
149
  minify,
198
- scriptUser: !0,
150
+ scriptUser: user,
199
151
  scriptName,
200
- uniqueID,
201
- filePath: path,
152
+ filePath,
202
153
  mangleNames,
203
154
  forceQuineCheats
155
+ }),
156
+ info = {
157
+ file: `${user}/${fileName}`,
158
+ users: [user],
159
+ minLength: countHackmudCharacters(minifiedCode),
160
+ error: void 0
204
161
  }
205
- ),
206
- info = {
207
- file: name,
208
- users: usersToPushTo,
209
- minLength: countHackmudCharacters(minifiedCode),
210
- error: void 0
211
- }
212
- await Promise.all(
213
- usersToPushTo.map(user =>
214
- writeFilePersistent(
215
- resolve(hackmudDirectory, user, `scripts/${scriptName}.js`),
216
- minifiedCode
217
- .replace(RegExp(`\\$${uniqueID}\\$SCRIPT_USER\\$`, "g"), user)
218
- .replace(
219
- RegExp(`\\$${uniqueID}\\$FULL_SCRIPT_NAME\\$`, "g"),
220
- `${user}.${scriptName}`
221
- )
222
- )
162
+ allInfo.push(info)
163
+ await writeFilePersistent(
164
+ resolve(hackmudDirectory, user, "scripts", scriptName + ".js"),
165
+ minifiedCode
223
166
  )
167
+ onPush(info)
168
+ } else usersByGlobalScriptsToPush.get(scriptName).add(user)
169
+ })
170
+ ))
171
+ })
172
+ )
173
+ await (wildScriptUsers.size ?
174
+ Promise.all(
175
+ (sourceDirectoryDirents || (await readDirectoryWithStats(sourceDirectory))).map(
176
+ async ({ path, stats, name }) => {
177
+ if (name.endsWith(".d.ts")) return
178
+ const extension = extname(name)
179
+ if (!stats.isFile() || !supportedExtensions.includes(extension)) return
180
+ const scriptName = basename(name, extension),
181
+ usersToPushTo = [...wildScriptUsers, ...usersByGlobalScriptsToPush.get(scriptName)].filter(
182
+ user => !scriptNamesAlreadyPushedByUser.get(user).has(scriptName)
224
183
  )
225
- allInfo.push(info)
226
- onPush(info)
227
- }
228
- )
184
+ if (!usersToPushTo.length) return
185
+ const uniqueID = Math.floor(Math.random() * 2 ** 52)
186
+ .toString(36)
187
+ .padStart(11, "0"),
188
+ { script: minifiedCode } = await processScript(await readFile(path, { encoding: "utf-8" }), {
189
+ minify,
190
+ scriptUser: !0,
191
+ scriptName,
192
+ uniqueID,
193
+ filePath: path,
194
+ mangleNames,
195
+ forceQuineCheats
196
+ }),
197
+ info = {
198
+ file: name,
199
+ users: usersToPushTo,
200
+ minLength: countHackmudCharacters(minifiedCode),
201
+ error: void 0
202
+ }
203
+ await Promise.all(
204
+ usersToPushTo.map(user =>
205
+ writeFilePersistent(
206
+ resolve(hackmudDirectory, user, `scripts/${scriptName}.js`),
207
+ minifiedCode
208
+ .replace(RegExp(`\\$${uniqueID}\\$SCRIPT_USER\\$`, "g"), user)
209
+ .replace(
210
+ RegExp(`\\$${uniqueID}\\$FULL_SCRIPT_NAME\\$`, "g"),
211
+ `${user}.${scriptName}`
212
+ )
213
+ )
214
+ )
215
+ )
216
+ allInfo.push(info)
217
+ onPush(info)
218
+ }
229
219
  )
230
- : Promise.all(
231
- [...usersByGlobalScriptsToPush].map(async ([scriptName, users]) => {
232
- let code, fileName, filePath
233
- for (const extension of supportedExtensions)
234
- try {
235
- fileName = `${scriptName}${extension}`
236
- code = await readFile((filePath = resolve(sourceDirectory, fileName)), {
237
- encoding: "utf-8"
238
- })
239
- break
240
- } catch {}
241
- if (code) {
242
- const uniqueID = Math.floor(Math.random() * 2 ** 52)
243
- .toString(36)
244
- .padStart(11, "0"),
245
- { script: minifiedCode } = await processScript(code, {
246
- minify,
247
- scriptUser: !0,
248
- scriptName,
249
- uniqueID,
250
- filePath,
251
- mangleNames,
252
- forceQuineCheats
253
- }),
254
- info = {
255
- file: fileName,
256
- users: [...users],
257
- minLength: countHackmudCharacters(minifiedCode),
258
- error: void 0
259
- }
260
- await Promise.all(
261
- [...users].map(user =>
262
- writeFilePersistent(
263
- resolve(hackmudDirectory, user, `scripts/${scriptName}.js`),
264
- minifiedCode
265
- .replace(RegExp(`\\$${uniqueID}\\$SCRIPT_USER\\$`, "g"), user)
266
- .replace(
267
- RegExp(`\\$${uniqueID}\\$FULL_SCRIPT_NAME\\$`, "g"),
268
- `${user}.${scriptName}`
269
- )
270
- )
220
+ )
221
+ : Promise.all(
222
+ [...usersByGlobalScriptsToPush].map(async ([scriptName, users]) => {
223
+ let code, fileName, filePath
224
+ for (const extension of supportedExtensions)
225
+ try {
226
+ fileName = `${scriptName}${extension}`
227
+ code = await readFile((filePath = resolve(sourceDirectory, fileName)), { encoding: "utf-8" })
228
+ break
229
+ } catch {}
230
+ if (code) {
231
+ const uniqueID = Math.floor(Math.random() * 2 ** 52)
232
+ .toString(36)
233
+ .padStart(11, "0"),
234
+ { script: minifiedCode } = await processScript(code, {
235
+ minify,
236
+ scriptUser: !0,
237
+ scriptName,
238
+ uniqueID,
239
+ filePath,
240
+ mangleNames,
241
+ forceQuineCheats
242
+ }),
243
+ info = {
244
+ file: fileName,
245
+ users: [...users],
246
+ minLength: countHackmudCharacters(minifiedCode),
247
+ error: void 0
248
+ }
249
+ await Promise.all(
250
+ [...users].map(user =>
251
+ writeFilePersistent(
252
+ resolve(hackmudDirectory, user, `scripts/${scriptName}.js`),
253
+ minifiedCode
254
+ .replace(RegExp(`\\$${uniqueID}\\$SCRIPT_USER\\$`, "g"), user)
255
+ .replace(
256
+ RegExp(`\\$${uniqueID}\\$FULL_SCRIPT_NAME\\$`, "g"),
257
+ `${user}.${scriptName}`
258
+ )
271
259
  )
272
260
  )
273
- allInfo.push(info)
274
- onPush(info)
275
- }
276
- })
277
- ))
278
- return allInfo
279
- }
261
+ )
262
+ allInfo.push(info)
263
+ onPush(info)
264
+ }
265
+ })
266
+ ))
267
+ return allInfo
268
+ }
280
269
  export { push as default, push }
File without changes
@@ -0,0 +1,2 @@
1
+ export declare function generateTypeDeclaration(sourceDirectory: string, hackmudPath?: string): Promise<string>;
2
+ export default generateTypeDeclaration;
@@ -0,0 +1,31 @@
1
+ import type { LaxPartial } from "@samual/lib";
2
+ export { minify } from "./minify";
3
+ export { postprocess } from "./postprocess";
4
+ export { preprocess } from "./preprocess";
5
+ export { transform } from "./transform";
6
+ export type ProcessOptions = {
7
+ /** whether to minify the given code */ minify: boolean;
8
+ /** 11 a-z 0-9 characters */ uniqueID: string;
9
+ /** the user going to be hosting this script (or set to `true` if not yet known) */ scriptUser: string | true;
10
+ /** the name of this script (or set to `true` if not yet known) */ scriptName: string | true;
11
+ filePath: string;
12
+ /** whether to mangle function and class names (defaults to `false`) */ mangleNames: boolean;
13
+ /** when set to `true` forces use of quine cheats
14
+ *
15
+ * when set to `false` forces quine cheats not to be used
16
+ *
17
+ * when left unset or set to `undefined`, automatically uses or doesn't use quine cheats based on character count
18
+ */
19
+ forceQuineCheats: boolean;
20
+ };
21
+ /** Minifies a given script
22
+ * @param code JavaScript or TypeScript code
23
+ * @param options {@link ProcessOptions details} */
24
+ export declare function processScript(code: string, { minify: shouldMinify, uniqueID, scriptUser, scriptName, filePath, mangleNames, forceQuineCheats }?: LaxPartial<ProcessOptions>): Promise<{
25
+ script: string;
26
+ warnings: {
27
+ message: string;
28
+ line: number;
29
+ }[];
30
+ }>;
31
+ export default processScript;
@@ -0,0 +1,18 @@
1
+ import type { File } from "@babel/types";
2
+ import type { LaxPartial } from "@samual/lib";
3
+ type MinifyOptions = {
4
+ /** 11 a-z 0-9 characters */ uniqueID: string;
5
+ /** whether to mangle function and class names (defaults to `false`) */ mangleNames: boolean;
6
+ /** when set to `true` forces use of quine cheats
7
+ *
8
+ * when set to `false` forces quine cheats not to be used
9
+ *
10
+ * when left unset or set to `undefined`, automatically uses or doesn't use quine cheats based on character count
11
+ */
12
+ forceQuineCheats: boolean;
13
+ /** the comment inserted after the function signature */ autocomplete: string;
14
+ };
15
+ /** @param file babel ast node representing a file containing transformed code
16
+ * @param options {@link MinifyOptions details} */
17
+ export declare function minify(file: File, { uniqueID, mangleNames, forceQuineCheats, autocomplete }?: LaxPartial<MinifyOptions>): Promise<string>;
18
+ export default minify;
@@ -0,0 +1,9 @@
1
+ export type PreprocessOptions = {
2
+ /** 11 a-z 0-9 characters */ uniqueID: string;
3
+ };
4
+ /** @param code source code for preprocessing
5
+ * @param options {@link PreprocessOptions details} */
6
+ export declare function preprocess(code: string, { uniqueID }?: Partial<PreprocessOptions>): Promise<{
7
+ code: string;
8
+ }>;
9
+ export default preprocess;
@@ -1,5 +1,5 @@
1
1
  import type { NodePath } from "@babel/traverse";
2
2
  import type { Identifier, Program } from "@babel/types";
3
- export declare const getReferencePathsToGlobal: (name: string, program: NodePath<Program>) => NodePath<Identifier>[];
3
+ export declare function getReferencePathsToGlobal(name: string, program: NodePath<Program>): NodePath<Identifier>[];
4
4
  export declare const includesIllegalString: (toCheck: string) => boolean;
5
5
  export declare const replaceUnsafeStrings: (uniqueID: string, toReplace: string) => string;
@@ -0,0 +1,18 @@
1
+ import type { File } from "@babel/types";
2
+ export type TransformOptions = {
3
+ /** 11 a-z 0-9 characters */ uniqueID: string;
4
+ /** the user going to be hosting this script (or set to `true` if not yet known) */ scriptUser: string | true;
5
+ /** the name of this script (or set to `true` if not yet known) */ scriptName: string | true;
6
+ seclevel: number;
7
+ };
8
+ /** transform a given babel `File` to be hackmud compatible
9
+ *
10
+ * (returned File will need `postprocess()`ing)
11
+ * @param file babel ast node representing a file containing preprocessed code
12
+ * @param sourceCode the original untouched source code
13
+ * @param options {@link TransformOptions details} */
14
+ export declare function transform(file: File, sourceCode: string, { uniqueID, scriptUser, scriptName, seclevel }?: Partial<TransformOptions>): {
15
+ file: File;
16
+ seclevel: number;
17
+ };
18
+ export default transform;
package/src/pull.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /** Copies script from hackmud to local source folder.
2
+ * @param sourceFolderPath path to folder containing source files
3
+ * @param hackmudPath path to hackmud directory
4
+ * @param script to pull in `user.name` format */
5
+ export declare function pull(sourceFolderPath: string, hackmudPath: string, script: string): Promise<void>;
6
+ export default pull;
package/src/push.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import type { LaxPartial } from "@samual/lib";
2
+ import type { Info } from ".";
3
+ export type PushOptions = {
4
+ /** whether to do the minify step (defaults to `true`) */ minify: boolean;
5
+ /** whether to mangle function and class names (defaults to `false`) */ mangleNames: boolean;
6
+ /** array of scripts in the format `foo.bar`
7
+ *
8
+ * also accepts wild card (`*`) e.g. `*.bar` or `foo.*`
9
+ *
10
+ * pushes everything by default (`*.*`) */
11
+ scripts: string[];
12
+ /** callback called on script push */ onPush: (info: Info) => void;
13
+ /** when set to `true` forces use of quine cheats
14
+ *
15
+ * when set to `false` forces quine cheats not to be used
16
+ *
17
+ * when left unset or set to `undefined`, automatically uses or doesn't use quine cheats based on character count
18
+ */
19
+ forceQuineCheats: boolean;
20
+ };
21
+ /** Push scripts from a source directory to the hackmud directory.
22
+ *
23
+ * Pushes files directly in the source folder to all users
24
+ * @param sourceDirectory directory containing source code
25
+ * @param hackmudDirectory directory created by hackmud containing user data including scripts
26
+ * @param options {@link PushOptions details}
27
+ * @returns array of info on pushed scripts */
28
+ export declare function push(sourceDirectory: string, hackmudDirectory: string, { scripts, onPush, minify, mangleNames, forceQuineCheats }?: LaxPartial<PushOptions>): Promise<Info[]>;
29
+ export default push;
@@ -1,4 +1,4 @@
1
- export declare const syncMacros: (hackmudPath: string) => Promise<{
1
+ export declare function syncMacros(hackmudPath: string): Promise<{
2
2
  macrosSynced: number;
3
3
  usersSynced: number;
4
4
  }>;
package/src/watch.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { LaxPartial } from "@samual/lib";
2
+ import type { PushOptions } from "./push";
3
+ export type WatchOptions = PushOptions & {
4
+ /** if provided, will write typescript type declarations for all the scripts on every change detected
5
+ *
6
+ * writing the type declarations enables interscript type checking and autocompletetes for the args */
7
+ typeDeclarationPath: string;
8
+ onReady: () => void;
9
+ };
10
+ /** Watches target file or folder for updates and builds and pushes updated file.
11
+ * @param sourceDirectory path to folder containing source files
12
+ * @param hackmudDirectory path to hackmud directory
13
+ * @param options {@link WatchOptions details} and {@link PushOptions more details} */
14
+ export declare function watch(sourceDirectory: string, hackmudDirectory: string, { scripts, onPush, minify, mangleNames, typeDeclarationPath: typeDeclarationPath_, onReady, forceQuineCheats }?: LaxPartial<WatchOptions>): Promise<void>;
15
+ export default watch;
package/syncMacros.js CHANGED
@@ -1,12 +1,13 @@
1
- import { readdir, readFile, stat, writeFile } from "fs/promises"
1
+ import { readDirectoryWithStats } from "@samual/lib/readDirectoryWithStats"
2
+ import { readFile, stat, writeFile } from "fs/promises"
2
3
  import { extname, basename, resolve } from "path"
3
- const syncMacros = async hackmudPath => {
4
- const files = await readdir(hackmudPath, { withFileTypes: !0 }),
4
+ async function syncMacros(hackmudPath) {
5
+ const files = await readDirectoryWithStats(hackmudPath),
5
6
  macros = new Map(),
6
7
  users = []
7
8
  await Promise.all(
8
9
  files.map(async file => {
9
- if (file.isFile())
10
+ if (file.stats.isFile())
10
11
  switch (extname(file.name)) {
11
12
  case ".macros":
12
13
  {