hackmud-script-manager 0.19.1-b720a68 → 0.19.1-b80922d

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
@@ -12,7 +12,7 @@ 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 version = "0.19.1-b720a68",
15
+ const version = "0.19.1-b80922d",
16
16
  options = new Map(),
17
17
  commands = [],
18
18
  userColours = new Cache(user => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackmud-script-manager",
3
- "version": "0.19.1-b720a68",
3
+ "version": "0.19.1-b80922d",
4
4
  "description": "Script manager for game hackmud, with minification, TypeScript support, and player script type definition generation.",
5
5
  "keywords": [
6
6
  "api",
@@ -3,11 +3,10 @@ export { minify } from "./minify";
3
3
  export { postprocess } from "./postprocess";
4
4
  export { preprocess } from "./preprocess";
5
5
  export { transform } from "./transform";
6
- export type ProcessOptions = {
6
+ export type ProcessOptions = LaxPartial<{
7
7
  /** whether to minify the given code */ minify: boolean;
8
8
  /** 11 a-z 0-9 characters */ uniqueID: string;
9
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
10
  filePath: string;
12
11
  /** whether to mangle function and class names (defaults to `false`) */ mangleNames: boolean;
13
12
  /** when set to `true` forces use of quine cheats
@@ -17,11 +16,13 @@ export type ProcessOptions = {
17
16
  * when left unset or set to `undefined`, automatically uses or doesn't use quine cheats based on character count
18
17
  */
19
18
  forceQuineCheats: boolean;
19
+ }> & {
20
+ scriptName: string | true;
20
21
  };
21
22
  /** Minifies a given script
22
23
  * @param code JavaScript or TypeScript code
23
24
  * @param options {@link ProcessOptions details} */
24
- export declare function processScript(code: string, { minify: shouldMinify, uniqueID, scriptUser, scriptName, filePath, mangleNames, forceQuineCheats }?: LaxPartial<ProcessOptions>): Promise<{
25
+ export declare function processScript(code: string, { minify: shouldMinify, uniqueID, scriptUser, scriptName, filePath, mangleNames, forceQuineCheats }: ProcessOptions): Promise<{
25
26
  script: string;
26
27
  warnings: {
27
28
  message: string;
@@ -48,13 +48,13 @@ async function processScript(
48
48
  .toString(36)
49
49
  .padStart(11, "0"),
50
50
  scriptUser,
51
- scriptName = "UNKNOWN",
51
+ scriptName,
52
52
  filePath,
53
53
  mangleNames = !1,
54
54
  forceQuineCheats
55
- } = {}
55
+ }
56
56
  ) {
57
- assert(/^\w{11}$/.exec(uniqueID), "src/processScript/index.ts:78:36")
57
+ assert(/^\w{11}$/.exec(uniqueID), "src/processScript/index.ts:77:36")
58
58
  const sourceCode = code
59
59
  let autocomplete, statedSeclevel
60
60
  const autocompleteMatch = /^function\s*\(.+\/\/(?<autocomplete>.+)/.exec(code)
@@ -115,7 +115,7 @@ async function processScript(
115
115
  }
116
116
  }
117
117
  }
118
- assert(/^\w{11}$/.exec(uniqueID), "src/processScript/index.ts:159:36")
118
+ assert(/^\w{11}$/.exec(uniqueID), "src/processScript/index.ts:158:36")
119
119
  const plugins = [
120
120
  [babelPluginProposalDecorators.default, { decoratorsBeforeExport: !0 }],
121
121
  [babelPluginTransformClassProperties.default],
@@ -249,7 +249,7 @@ async function processScript(
249
249
  traverse(file, {
250
250
  MemberExpression({ node: memberExpression }) {
251
251
  if (!memberExpression.computed) {
252
- assert("Identifier" == memberExpression.property.type, "src/processScript/index.ts:322:60")
252
+ assert("Identifier" == memberExpression.property.type, "src/processScript/index.ts:321:60")
253
253
  if ("prototype" == memberExpression.property.name) {
254
254
  memberExpression.computed = !0
255
255
  memberExpression.property = t.stringLiteral("prototype")
@@ -279,7 +279,7 @@ async function processScript(
279
279
  break
280
280
  case "ObjectPattern":
281
281
  for (const property of lValue.properties) {
282
- assert("ObjectProperty" == property.type, "src/processScript/index.ts:352:51")
282
+ assert("ObjectProperty" == property.type, "src/processScript/index.ts:351:51")
283
283
  renameVariables(property.value)
284
284
  }
285
285
  break
@@ -1,6 +1,6 @@
1
1
  import type { File } from "@babel/types";
2
2
  import type { LaxPartial } from "@samual/lib";
3
- type MinifyOptions = {
3
+ type MinifyOptions = LaxPartial<{
4
4
  /** 11 a-z 0-9 characters */ uniqueID: string;
5
5
  /** whether to mangle function and class names (defaults to `false`) */ mangleNames: boolean;
6
6
  /** when set to `true` forces use of quine cheats
@@ -11,8 +11,8 @@ type MinifyOptions = {
11
11
  */
12
12
  forceQuineCheats: boolean;
13
13
  /** the comment inserted after the function signature */ autocomplete: string;
14
- };
14
+ }>;
15
15
  /** @param file babel ast node representing a file containing transformed code
16
16
  * @param options {@link MinifyOptions details} */
17
- export declare function minify(file: File, { uniqueID, mangleNames, forceQuineCheats, autocomplete }?: LaxPartial<MinifyOptions>): Promise<string>;
17
+ export declare function minify(file: File, { uniqueID, mangleNames, forceQuineCheats, autocomplete }?: MinifyOptions): Promise<string>;
18
18
  export {};
@@ -1,8 +1,9 @@
1
- export type PreprocessOptions = {
2
- /** 11 a-z 0-9 characters */ uniqueID: string;
3
- };
1
+ import type { LaxPartial } from "@samual/lib";
2
+ export type PreprocessOptions = LaxPartial<{
3
+ uniqueID: string;
4
+ }>;
4
5
  /** @param code source code for preprocessing
5
6
  * @param options {@link PreprocessOptions details} */
6
- export declare function preprocess(code: string, { uniqueID }?: Partial<PreprocessOptions>): Promise<{
7
+ export declare function preprocess(code: string, { uniqueID }?: PreprocessOptions): Promise<{
7
8
  code: string;
8
9
  }>;
@@ -8,7 +8,7 @@ import { resolve } from "import-meta-resolve"
8
8
  const { default: traverse } = babelTraverse,
9
9
  { default: generate } = babelGenerator
10
10
  async function preprocess(code, { uniqueID = "00000000000" } = {}) {
11
- assert(/^\w{11}$/.test(uniqueID), "src/processScript/preprocess.ts:23:36")
11
+ assert(/^\w{11}$/.test(uniqueID), "src/processScript/preprocess.ts:22:36")
12
12
  const sourceCode = code
13
13
  let lengthBefore, file, program
14
14
  do {
@@ -47,7 +47,7 @@ async function preprocess(code, { uniqueID = "00000000000" } = {}) {
47
47
  })
48
48
  break
49
49
  } catch (error_) {
50
- assert(error_ instanceof SyntaxError, "src/processScript/preprocess.ts:67:42")
50
+ assert(error_ instanceof SyntaxError, "src/processScript/preprocess.ts:66:42")
51
51
  error = error_
52
52
  }
53
53
  if ("BABEL_PARSER_SYNTAX_ERROR" != error.code || "PrivateInExpectedIn" != error.reasonCode) {
@@ -1,10 +1,11 @@
1
1
  import type { File } from "@babel/types";
2
2
  import type { LaxPartial } from "@samual/lib";
3
- export type TransformOptions = {
3
+ export type TransformOptions = LaxPartial<{
4
4
  /** 11 a-z 0-9 characters */ uniqueID: string;
5
5
  /** the user going to be hosting this script (or set to `true` if not yet known) */ scriptUser: string | true;
6
- /** the name of this script (or set to `true` if not yet known) */ scriptName: string | true;
7
6
  seclevel: number;
7
+ }> & {
8
+ scriptName: string | true;
8
9
  };
9
10
  /** transform a given babel `File` to be hackmud compatible
10
11
  *
@@ -12,7 +13,7 @@ export type TransformOptions = {
12
13
  * @param file babel ast node representing a file containing preprocessed code
13
14
  * @param sourceCode the original untouched source code
14
15
  * @param options {@link TransformOptions details} */
15
- export declare function transform(file: File, sourceCode: string, { uniqueID, scriptUser, scriptName, seclevel }?: LaxPartial<TransformOptions>): {
16
+ export declare function transform(file: File, sourceCode: string, { uniqueID, scriptUser, scriptName, seclevel }: TransformOptions): {
16
17
  file: File;
17
18
  seclevel: number;
18
19
  };
@@ -21,11 +21,7 @@ const { default: traverse } = babelTraverse,
21
21
  "Symbol",
22
22
  "BigInt"
23
23
  ]
24
- function transform(
25
- file,
26
- sourceCode,
27
- { uniqueID = "00000000000", scriptUser, scriptName = "UNKNOWN", seclevel = 4 } = {}
28
- ) {
24
+ function transform(file, sourceCode, { uniqueID = "00000000000", scriptUser, scriptName, seclevel = 4 }) {
29
25
  const topFunctionName = `_${uniqueID}_SCRIPT_`,
30
26
  exports = new Map(),
31
27
  liveExports = new Map()
@@ -69,30 +65,30 @@ function transform(
69
65
  const referencePath = FunctionReferencePaths[0]
70
66
  assert(
71
67
  "MemberExpression" == referencePath.parent.type,
72
- "src/processScript/transform.ts:99:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
68
+ "src/processScript/transform.ts:98:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
73
69
  )
74
70
  assert(
75
71
  "Identifier" == referencePath.parent.property.type,
76
- "src/processScript/transform.ts:104:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
72
+ "src/processScript/transform.ts:103:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
77
73
  )
78
74
  assert(
79
75
  "prototype" == referencePath.parent.property.name,
80
- "src/processScript/transform.ts:109:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
76
+ "src/processScript/transform.ts:108:8 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
81
77
  )
82
78
  referencePath.parentPath.replaceWith(createGetFunctionPrototypeNode())
83
79
  } else {
84
80
  for (const referencePath of FunctionReferencePaths) {
85
81
  assert(
86
82
  "MemberExpression" == referencePath.parent.type,
87
- "src/processScript/transform.ts:117:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
83
+ "src/processScript/transform.ts:116:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
88
84
  )
89
85
  assert(
90
86
  "Identifier" == referencePath.parent.property.type,
91
- "src/processScript/transform.ts:122:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
87
+ "src/processScript/transform.ts:121:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
92
88
  )
93
89
  assert(
94
90
  "prototype" == referencePath.parent.property.name,
95
- "src/processScript/transform.ts:127:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
91
+ "src/processScript/transform.ts:126:9 `Function` isn't available in hackmud, only `Function.prototype` is accessible"
96
92
  )
97
93
  functionDotPrototypeIsReferencedMultipleTimes = !0
98
94
  referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_FUNCTION_DOT_PROTOTYPE_`))
@@ -128,12 +124,12 @@ function transform(
128
124
  const neededDbMethodLets = new Set()
129
125
  if (program.scope.hasGlobal("$db"))
130
126
  for (const referencePath of getReferencePathsToGlobal("$db", program)) {
131
- assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:181:69")
132
- assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:182:72")
127
+ assert("MemberExpression" == referencePath.parentPath.node.type, "src/processScript/transform.ts:180:69")
128
+ assert("Identifier" == referencePath.parentPath.node.property.type, "src/processScript/transform.ts:181:72")
133
129
  const databaseOpMethodName = referencePath.parentPath.node.property.name
134
130
  assert(
135
131
  validDBMethods.includes(databaseOpMethodName),
136
- `src/processScript/transform.ts:188:8 invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
132
+ `src/processScript/transform.ts:187:8 invalid db method "${databaseOpMethodName}", valid db methods are "${validDBMethods.join('", "')}"`
137
133
  )
138
134
  if ("CallExpression" == referencePath.parentPath.parentPath?.type)
139
135
  referencePath.parentPath.replaceWith(t.identifier(`$${uniqueID}$DB$${databaseOpMethodName}$`))
@@ -166,7 +162,7 @@ function transform(
166
162
  if (program.scope.hasGlobal("Object"))
167
163
  for (const referencePath of getReferencePathsToGlobal("Object", program))
168
164
  if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
169
- assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:235:64")
165
+ assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:234:64")
170
166
  if ("getPrototypeOf" == referencePath.parent.property.name) {
171
167
  referencePath.parentPath.replaceWith(t.identifier(`_${uniqueID}_GET_PROTOTYPE_OF_`))
172
168
  needGetPrototypeOf = !0
@@ -176,7 +172,7 @@ function transform(
176
172
  if (program.scope.hasGlobal("console"))
177
173
  for (const referencePath of getReferencePathsToGlobal("console", program))
178
174
  if ("MemberExpression" == referencePath.parent.type && !referencePath.parent.computed) {
179
- assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:250:64")
175
+ assert("Identifier" == referencePath.parent.property.type, "src/processScript/transform.ts:249:64")
180
176
  referencePath.parentPath.replaceWith(
181
177
  t.identifier(`_${uniqueID}_CONSOLE_METHOD_${referencePath.parent.property.name}_`)
182
178
  )
@@ -184,13 +180,13 @@ function transform(
184
180
  }
185
181
  const lastStatement = program.node.body.at(-1)
186
182
  let exportDefaultName
187
- assert(lastStatement, "src/processScript/transform.ts:264:27 program is empty")
183
+ assert(lastStatement, "src/processScript/transform.ts:263:27 program is empty")
188
184
  if ("ExportNamedDeclaration" == lastStatement.type) {
189
185
  program.node.body.pop()
190
186
  for (const specifier of lastStatement.specifiers) {
191
187
  assert(
192
188
  "ExportSpecifier" == specifier.type,
193
- `src/processScript/transform.ts:270:51 ${specifier.type} is currently unsupported`
189
+ `src/processScript/transform.ts:269:51 ${specifier.type} is currently unsupported`
194
190
  )
195
191
  const exportedName =
196
192
  "Identifier" == specifier.exported.type ? specifier.exported.name : specifier.exported.value
@@ -313,11 +309,11 @@ function transform(
313
309
  let hoistedGlobalBlockFunctions = 0
314
310
  for (const [globalBlockIndex, globalBlockStatement] of [...globalBlock.body.entries()].reverse())
315
311
  if ("VariableDeclaration" == globalBlockStatement.type) {
316
- assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:404:59")
312
+ assert(1 == globalBlockStatement.declarations.length, "src/processScript/transform.ts:403:59")
317
313
  const declarator = globalBlockStatement.declarations[0]
318
314
  assert(
319
315
  "Identifier" == declarator.id.type,
320
- `src/processScript/transform.ts:408:51 declarator.id.type was "${declarator.id.type}"`
316
+ `src/processScript/transform.ts:407:51 declarator.id.type was "${declarator.id.type}"`
321
317
  )
322
318
  program.scope.crawl()
323
319
  if (program.scope.hasGlobal(declarator.id.name)) {
@@ -332,9 +328,9 @@ function transform(
332
328
  Object.keys(program.scope.globals).some(global => globalBlockVariables.has(global))
333
329
  ) {
334
330
  const binding = program.scope.getBinding(declarator.id.name)
335
- assert(binding, "src/processScript/transform.ts:427:23")
331
+ assert(binding, "src/processScript/transform.ts:426:23")
336
332
  for (const referencePath of binding.referencePaths) {
337
- assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:430:56")
333
+ assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:429:56")
338
334
  referencePath.replaceWith(
339
335
  t.memberExpression(
340
336
  t.identifier(`$${uniqueID}$GLOBAL$`),
@@ -378,16 +374,16 @@ function transform(
378
374
  } else globalBlockVariables.add(declarator.id.name)
379
375
  } else if ("ClassDeclaration" == globalBlockStatement.type) {
380
376
  program.scope.crawl()
381
- assert(globalBlockStatement.id, "src/processScript/transform.ts:481:37")
377
+ assert(globalBlockStatement.id, "src/processScript/transform.ts:480:37")
382
378
  if (program.scope.hasGlobal(globalBlockStatement.id.name)) {
383
379
  globalBlock.body.splice(globalBlockIndex, 1)
384
380
  const [globalBlockPath] = program.unshiftContainer("body", globalBlock),
385
381
  [globalBlockStatementPath] = program.unshiftContainer("body", globalBlockStatement)
386
382
  program.scope.crawl()
387
383
  const binding = program.scope.getBinding(globalBlockStatement.id.name)
388
- assert(binding, "src/processScript/transform.ts:493:22")
384
+ assert(binding, "src/processScript/transform.ts:492:22")
389
385
  for (const referencePath of binding.referencePaths) {
390
- assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:496:55")
386
+ assert("Identifier" == referencePath.node.type, "src/processScript/transform.ts:495:55")
391
387
  referencePath.replaceWith(
392
388
  t.memberExpression(
393
389
  t.identifier(`$${uniqueID}$GLOBAL$`),
@@ -554,7 +550,7 @@ function transform(
554
550
  }
555
551
  },
556
552
  ClassBody({ node: classBody, scope, parent }) {
557
- assert(t.isClass(parent), "src/processScript/transform.ts:663:30")
553
+ assert(t.isClass(parent), "src/processScript/transform.ts:662:30")
558
554
  let thisIsReferenced = !1
559
555
  for (const classMethod of classBody.body) {
560
556
  if ("ClassMethod" != classMethod.type) continue
@@ -660,23 +656,23 @@ function transform(
660
656
  }
661
657
  function processFakeSubscriptObject(fakeSubscriptObjectName) {
662
658
  for (const referencePath of getReferencePathsToGlobal(fakeSubscriptObjectName, program)) {
663
- assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:777:60")
659
+ assert("MemberExpression" == referencePath.parent.type, "src/processScript/transform.ts:776:60")
664
660
  assert("Identifier" == referencePath.parent.property.type)
665
661
  assert(
666
662
  "MemberExpression" == referencePath.parentPath.parentPath?.node.type,
667
- "src/processScript/transform.ts:779:81"
663
+ "src/processScript/transform.ts:778:81"
668
664
  )
669
665
  assert(
670
666
  "Identifier" == referencePath.parentPath.parentPath.node.property.type,
671
- "src/processScript/transform.ts:780:83"
667
+ "src/processScript/transform.ts:779:83"
672
668
  )
673
669
  assert(
674
670
  /^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parent.property.name),
675
- `src/processScript/transform.ts:784:8 invalid user "${referencePath.parent.property.name}" in subscript`
671
+ `src/processScript/transform.ts:783:8 invalid user "${referencePath.parent.property.name}" in subscript`
676
672
  )
677
673
  assert(
678
674
  /^[_a-z][\d_a-z]{0,24}$/.test(referencePath.parentPath.parentPath.node.property.name),
679
- `src/processScript/transform.ts:789:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
675
+ `src/processScript/transform.ts:788:8 invalid script name "${referencePath.parentPath.parentPath.node.property.name}" in subscript`
680
676
  )
681
677
  if ("CallExpression" == referencePath.parentPath.parentPath.parentPath?.type)
682
678
  referencePath.parentPath.parentPath.replaceWith(
package/push.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { LaxPartial } from "@samual/lib";
2
2
  import type { Info } from ".";
3
- export type PushOptions = {
3
+ export type PushOptions = LaxPartial<{
4
4
  /** whether to do the minify step (defaults to `true`) */ minify: boolean;
5
5
  /** whether to mangle function and class names (defaults to `false`) */ mangleNames: boolean;
6
6
  /** array of scripts in the format `foo.bar`
@@ -17,7 +17,7 @@ export type PushOptions = {
17
17
  * when left unset or set to `undefined`, automatically uses or doesn't use quine cheats based on character count
18
18
  */
19
19
  forceQuineCheats: boolean;
20
- };
20
+ }>;
21
21
  /** Push scripts from a source directory to the hackmud directory.
22
22
  *
23
23
  * Pushes files directly in the source folder to all users
@@ -25,4 +25,4 @@ export type PushOptions = {
25
25
  * @param hackmudDirectory directory created by hackmud containing user data including scripts
26
26
  * @param options {@link PushOptions details}
27
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[]>;
28
+ export declare function push(sourceDirectory: string, hackmudDirectory: string, { scripts, onPush, minify, mangleNames, forceQuineCheats }?: PushOptions): Promise<Info[]>;
package/watch.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import type { LaxPartial } from "@samual/lib";
2
2
  import type { PushOptions } from "./push";
3
- export type WatchOptions = PushOptions & {
3
+ export type WatchOptions = PushOptions & LaxPartial<{
4
4
  /** if provided, will write typescript type declarations for all the scripts on every change detected
5
5
  *
6
6
  * writing the type declarations enables interscript type checking and autocompletetes for the args */
7
7
  typeDeclarationPath: string;
8
8
  onReady: () => void;
9
- };
9
+ }>;
10
10
  /** Watches target file or folder for updates and builds and pushes updated file.
11
11
  * @param sourceDirectory path to folder containing source files
12
12
  * @param hackmudDirectory path to hackmud directory
13
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>;
14
+ export declare function watch(sourceDirectory: string, hackmudDirectory: string, { scripts, onPush, minify, mangleNames, typeDeclarationPath: typeDeclarationPath_, onReady, forceQuineCheats }?: WatchOptions): Promise<void>;