hackmud-script-manager 0.21.1-8e6657c → 0.21.1-93e7bef

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
@@ -55,14 +55,16 @@ const pushModule = import("../push.js"),
55
55
  colourS = chalk.rgb(122, 178, 244),
56
56
  colourV = chalk.rgb(255, 0, 236),
57
57
  colourW = chalk.rgb(255, 150, 224)
58
- process.version.startsWith("v21.") &&
58
+ if (process.version.startsWith("v21.")) {
59
+ process.exitCode = 1
59
60
  console.warn(
60
61
  colourF(
61
62
  `${chalk.bold("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
63
  )
63
64
  )
65
+ }
64
66
  if ("v" == commands[0] || "version" == commands[0] || popOption("version", "v")?.value) {
65
- console.log("0.21.1-8e6657c")
67
+ console.log("0.21.1-93e7bef")
66
68
  process.exit()
67
69
  }
68
70
  let warnedDeprecatedEmitDtsAlias = !1
@@ -79,13 +81,14 @@ switch (commands[0]) {
79
81
  case "minify":
80
82
  {
81
83
  const noMinifyOption = popOption("no-minify", "skip-minify")
82
- noMinifyOption &&
83
- "no-minify" != noMinifyOption.name &&
84
+ if (noMinifyOption && "no-minify" != noMinifyOption.name) {
85
+ process.exitCode = 1
84
86
  console.warn(
85
87
  colourF(
86
88
  `${chalk.bold("Warning:")} ${formatOption(noMinifyOption.name)} is deprecated and will be removed in the next minor\n release of HSM\n You should switch to using its alias ${colourN("--no-minify")}\n`
87
89
  )
88
90
  )
91
+ }
89
92
  const mangleNamesOption = popOption("mangle-names"),
90
93
  forceQuineCheatsOption = popOption("force-quine-cheats"),
91
94
  noQuineCheatsOptions = popOption("no-quine-cheats"),
@@ -158,6 +161,7 @@ switch (commands[0]) {
158
161
  rootFolderPath
159
162
  }),
160
163
  timeTook = performance.now() - timeStart
164
+ warnings.length && (process.exitCode = 1)
161
165
  for (const { message } of warnings)
162
166
  console.warn(colourF(`${chalk.bold("Warning:")} ${message}`))
163
167
  await writeFilePersistent(outputPath, script)
@@ -207,14 +211,18 @@ switch (commands[0]) {
207
211
  "dts",
208
212
  "gen-types"
209
213
  )
210
- dtsPathOption &&
214
+ if (
215
+ dtsPathOption &&
211
216
  "dts-path" != dtsPathOption.name &&
212
- "type-declaration-path" != dtsPathOption.name &&
217
+ "type-declaration-path" != dtsPathOption.name
218
+ ) {
219
+ process.exitCode = 1
213
220
  console.warn(
214
221
  colourF(
215
222
  `${chalk.bold("Warning:")} ${formatOption(dtsPathOption.name)} is deprecated and will be removed in the\n next minor release of HSM\n You should switch to using its alias ${colourN("--dts-path")}\n`
216
223
  )
217
224
  )
225
+ }
218
226
  complainAboutUnrecognisedOptions()
219
227
  const { watch } = await watchModule
220
228
  watch(sourcePath, hackmudPath, {
@@ -244,7 +252,7 @@ switch (commands[0]) {
244
252
  const typeDeclaration = await generateTypeDeclaration(sourcePath, hackmudPath)
245
253
  declarationPathPromise = writeFile(typeDeclarationPath, typeDeclaration)
246
254
  .catch(error => {
247
- assert(error instanceof Error, "src/bin/hsm.ts:292:38")
255
+ assert(error instanceof Error, "src/bin/hsm.ts:299:38")
248
256
  if ("EISDIR" != error.code) throw error
249
257
  typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
250
258
  return writeFile(typeDeclarationPath, typeDeclaration)
@@ -311,6 +319,7 @@ switch (commands[0]) {
311
319
  {
312
320
  if ("emit-dts" != commands[0] && "gen-dts" != commands[0]) {
313
321
  warnedDeprecatedEmitDtsAlias = !0
322
+ process.exitCode = 1
314
323
  console.warn(
315
324
  colourF(
316
325
  `${chalk.bold("Warning:")} ${colourC("hsm")} ${colourL(commands[0])} is 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`
@@ -330,7 +339,7 @@ switch (commands[0]) {
330
339
  typeDeclaration = await generateTypeDeclaration(sourcePath, hackmudPath)
331
340
  let typeDeclarationPath = resolve(outputPath)
332
341
  await writeFile(typeDeclarationPath, typeDeclaration).catch(error => {
333
- assert(error instanceof Error, "src/bin/hsm.ts:428:35")
342
+ assert(error instanceof Error, "src/bin/hsm.ts:438:35")
334
343
  if ("EISDIR" != error.code) throw error
335
344
  typeDeclarationPath = resolve(typeDeclarationPath, "player.d.ts")
336
345
  return writeFile(typeDeclarationPath, typeDeclaration)
@@ -379,14 +388,14 @@ function logHelp() {
379
388
  case "gen-dts":
380
389
  case "gen-types":
381
390
  case "emit-dts":
382
- warnedDeprecatedEmitDtsAlias ||
383
- "emit-dts" == commands[0] ||
384
- "gen-dts" == commands[0] ||
391
+ if (!warnedDeprecatedEmitDtsAlias && "emit-dts" != commands[0] && "gen-dts" != commands[0]) {
392
+ process.exitCode = 1
385
393
  console.warn(
386
394
  colourF(
387
395
  `${chalk.bold("Warning:")} ${colourC("hsm")} ${colourL(commands[0])} is 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`
388
396
  )
389
397
  )
398
+ }
390
399
  console.log(
391
400
  colourS(
392
401
  `${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}`
@@ -403,7 +412,7 @@ function logHelp() {
403
412
  default:
404
413
  console.log(
405
414
  colourS(
406
- `${colourJ("Hackmud Script Manager")}\n${colourN("Version") + colourS(": ") + colourV("0.21.1-8e6657c")}\n\n${colourA("Commands:")}\n${colourL("push")}\n ${pushCommandDescription}\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\n\n${colourA("Options:")}\n${colourN("--help")}\n Can be used on any command e.g. ${colourC("hsm")} ${colourL("push")} ${colourN("--help")} to show helpful information`
415
+ `${colourJ("Hackmud Script Manager")}\n${colourN("Version") + colourS(": ") + colourV("0.21.1-93e7bef")}\n\n${colourA("Commands:")}\n${colourL("push")}\n ${pushCommandDescription}\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\n\n${colourA("Options:")}\n${colourN("--help")}\n Can be used on any command e.g. ${colourC("hsm")} ${colourL("push")} ${colourN("--help")} to show helpful information`
407
416
  )
408
417
  )
409
418
  }
@@ -412,6 +421,7 @@ function logInfo({ path, users, characterCount, error, warnings }, hackmudPath)
412
421
  path = relative(".", path)
413
422
  if (error) logError(`Error "${chalk.bold(error.message)}" in ${chalk.bold(path)}`)
414
423
  else {
424
+ warnings.length && (process.exitCode = 1)
415
425
  for (const warning of warnings) console.warn(colourF(`${chalk.bold("Warning:")} ${warning.message}`))
416
426
  log(
417
427
  `Pushed ${chalk.bold(path)} to ${users.map(user => chalk.bold(userColours.get(user))).join(", ")} | ${chalk.bold(characterCount + "")} chars | ${chalk.bold(resolve(hackmudPath, users[0], "scripts", basename(path, extname(path))) + ".js")}`
package/env.d.ts CHANGED
@@ -703,14 +703,14 @@ type MongoObject = { [k: string]: MongoValue, [k: `$${string}`]: never }
703
703
  type MongoQueryValue = MongoPrimitive | MongoQueryValue[] | MongoQueryObject
704
704
 
705
705
  type MongoQueryObject =
706
- { [k: string]: MongoQueryValue, [k: `$${string}`]: MongoValue, $type?: keyof MongoTypeStringsToTypes | (string & {}) }
706
+ { [k: string]: MongoQueryValue, [k: `$${string}`]: MongoValue } & { $type?: keyof MongoTypeStringsToTypes | (string & {}) }
707
707
 
708
708
  type MongoTypeStringsToTypes = {
709
709
  double: number
710
710
  string: string
711
711
  object: MongoObject
712
712
  array: MongoValue[]
713
- objectId: ObjectId
713
+ objectId: MongoObjectId
714
714
  bool: boolean
715
715
  date: Date
716
716
  null: null
@@ -720,8 +720,8 @@ type MongoTypeStringsToTypes = {
720
720
 
721
721
  type MongoTypeString = keyof MongoTypeStringsToTypes
722
722
  type MongoTypeNumber = -1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 127
723
- type MongoId = Exclude<MongoPrimitive, null> | MongoObject
724
- type MongoQueryId = Exclude<MongoPrimitive, null> | MongoQueryObject
723
+ type MongoId = Exclude<MongoPrimitive, null | false> | MongoObjectId | MongoObject
724
+ type MongoQueryId = Exclude<MongoPrimitive, null | false> | MongoObjectId | MongoQueryObject
725
725
  type MongoDocument = MongoObject & { _id?: MongoId }
726
726
 
727
727
  type MongoQueryType<TQuery extends MongoQueryObject> = {
@@ -865,8 +865,8 @@ type BrainContext = Replace<CliContext, { /** Whether the script is being run vi
865
865
  // when anyField: true is given, other fields (except _id) are omitted
866
866
 
867
867
  type MongoProject<TDocument, TProjection> =
868
- true extends (1 extends TProjection[keyof TProjection] ? true : TProjection[keyof TProjection]) ?
869
- (TProjection extends { _id: false | 0 } ? {} : { _id: TDocument extends { _id: infer TId } ? TId : MongoId }) &
868
+ (TProjection extends { _id: false | 0 } ? {} : { _id: TDocument extends { _id: infer TId } ? TId : MongoId }) & (
869
+ true extends (1 extends TProjection[keyof TProjection] ? true : TProjection[keyof TProjection]) ?
870
870
  {
871
871
  [K in
872
872
  keyof TDocument as K extends keyof TProjection ? TProjection[K] extends true | 1 ? K : never : never
@@ -877,7 +877,8 @@ type MongoProject<TDocument, TProjection> =
877
877
  keyof TProjection as TProjection[K] extends true | 1 ? K extends keyof TDocument ? never : K : never
878
878
  ]?: MongoValue
879
879
  }
880
- : { [k: string]: MongoValue } & { [K in keyof TDocument as K extends keyof TProjection ? never : K]: TDocument[K] }
880
+ : { [k: string]: MongoValue } & { [K in keyof TDocument as K extends keyof TProjection ? never : K]: TDocument[K] }
881
+ )
881
882
 
882
883
  type DeepFreeze<T> = { readonly [P in keyof T]: DeepFreeze<T[P]> }
883
884
 
@@ -885,9 +886,9 @@ declare global {
885
886
  type ScriptSuccess<T = unknown> = { ok: true } & T
886
887
  type ScriptFailure = { ok: false, msg?: string }
887
888
  type ScriptResponse<T = unknown> = ScriptSuccess<T> | ScriptFailure
888
- type Scriptor<TArgs extends any[] = any[]> = { name: string, call: (...args: TArgs) => unknown }
889
+ type Scriptor<TArgs = any> = { name: string, call: (args: TArgs) => unknown }
889
890
  type Context = CliContext | SubscriptContext | ScriptorContext | BrainContext
890
- type ObjectId = { $oid: string }
891
+ type MongoObjectId = { $oid: string }
891
892
 
892
893
  interface PlayerFullsec {}
893
894
  interface PlayerHighsec {}
@@ -978,7 +979,7 @@ declare global {
978
979
  us: <T extends MongoDocument>(query: MongoQuery<T> | MongoQuery<T>[], command: MongoUpdateCommand<T>) =>
979
980
  { n: number, ok: 0 | 1, opTime: { t: number }, nModified: number }[]
980
981
 
981
- ObjectId: () => ObjectId
982
+ ObjectId: () => MongoObjectId
982
983
  }
983
984
 
984
985
  /** Debug Log.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackmud-script-manager",
3
- "version": "0.21.1-8e6657c",
3
+ "version": "0.21.1-93e7bef",
4
4
  "description": "Script manager for game hackmud, with minification, TypeScript support, and player script type definition generation.",
5
5
  "keywords": [
6
6
  "api",
@@ -2,155 +2,95 @@ import babelGenerator from "@babel/generator"
2
2
  import { parse } from "@babel/parser"
3
3
  import babelTraverse from "@babel/traverse"
4
4
  import t from "@babel/types"
5
- import { assert, ensure } from "@samual/lib/assert"
5
+ import { assert } from "@samual/lib/assert"
6
6
  import { spliceString } from "@samual/lib/spliceString"
7
7
  import { tokenizer, tokTypes } from "acorn"
8
8
  import { resolve } from "import-meta-resolve"
9
- import { validDBMethods } from "../constants.js"
10
9
  const { default: traverse } = babelTraverse,
11
10
  { default: generate } = babelGenerator,
12
- SUBSCRIPT_PREFIXES = ["s", "fs", "4s", "hs", "3s", "ms", "2s", "ls", "1s", "ns", "0s"],
13
- PREPROCESSOR_NAMES = [...SUBSCRIPT_PREFIXES, "D", "G", "FMCL", "db"]
11
+ SUBSCRIPT_PREFIXES = ["s", "fs", "4s", "hs", "3s", "ms", "2s", "ls", "1s", "ns", "0s"]
14
12
  async function preprocess(code, { uniqueId = "00000000000" } = {}) {
15
- assert(/^\w{11}$/.test(uniqueId), "src/processScript/preprocess.ts:28:36")
16
- const sourceCode = code,
17
- tokens = [...tokenizer(code, { ecmaVersion: "latest" })],
18
- needExportDefault =
19
- ensure(tokens[0], "src/processScript/preprocess.ts:34:21").type == tokTypes._function &&
20
- ensure(tokens[1], "src/processScript/preprocess.ts:34:77").type == tokTypes.parenL,
21
- maybePrivatePrefix = `$${uniqueId}$MAYBE_PRIVATE$`
22
- for (const token of [...tokens].reverse()) {
23
- assert("value" in token, "src/processScript/preprocess.ts:39:28")
24
- if (token.type == tokTypes.privateId) {
25
- assert("string" == typeof token.value, "src/processScript/preprocess.ts:42:43")
26
- PREPROCESSOR_NAMES.includes(token.value) &&
27
- (code = spliceString(code, maybePrivatePrefix + token.value, token.start, token.end - token.start))
13
+ assert(/^\w{11}$/.test(uniqueId), "src/processScript/preprocess.ts:26:36")
14
+ const tokensIterable = tokenizer(code, { ecmaVersion: "latest" })
15
+ for (const token of tokensIterable) {
16
+ assert("value" in token, "src/processScript/preprocess.ts:31:28")
17
+ if (token.type != tokTypes.privateId) continue
18
+ assert("string" == typeof token.value, "src/processScript/preprocess.ts:36:42")
19
+ if (!SUBSCRIPT_PREFIXES.includes(token.value)) continue
20
+ const nextToken = tokensIterable.getToken()
21
+ if (nextToken.type != tokTypes._in && nextToken.type != tokTypes.dot)
22
+ throw SyntaxError("Subscripts must be in the form of #fs.foo.bar")
23
+ }
24
+ const sourceCode = code
25
+ let lengthBefore, file, program
26
+ do {
27
+ lengthBefore = code.length
28
+ code = code
29
+ .replace(/^\s+/, "")
30
+ .replace(/^\/\/.*/, "")
31
+ .replace(/^\/\*[\s\S]*?\*\//, "")
32
+ } while (code.length != lengthBefore)
33
+ code = code.replace(/^function\s*\(/, "export default function (")
34
+ for (;;) {
35
+ let error
36
+ try {
37
+ file = parse(code, {
38
+ plugins: [
39
+ "typescript",
40
+ ["decorators", { decoratorsBeforeExport: !0 }],
41
+ "doExpressions",
42
+ "functionBind",
43
+ "functionSent",
44
+ "partialApplication",
45
+ ["pipelineOperator", { proposal: "hack", topicToken: "%" }],
46
+ "throwExpressions",
47
+ ["recordAndTuple", { syntaxType: "hash" }],
48
+ "classProperties",
49
+ "classPrivateProperties",
50
+ "classPrivateMethods",
51
+ "logicalAssignment",
52
+ "numericSeparator",
53
+ "nullishCoalescingOperator",
54
+ "optionalChaining",
55
+ "optionalCatchBinding",
56
+ "objectRestSpread"
57
+ ],
58
+ sourceType: "module"
59
+ })
60
+ break
61
+ } catch (error_) {
62
+ assert(error_ instanceof SyntaxError, "src/processScript/preprocess.ts:89:42")
63
+ error = error_
64
+ }
65
+ if ("BABEL_PARSER_SYNTAX_ERROR" != error.code || "PrivateInExpectedIn" != error.reasonCode) {
66
+ console.log(/.+/.exec(code.slice(error.pos))?.[0])
67
+ throw error
68
+ }
69
+ const codeSlice = code.slice(error.pos)
70
+ let match
71
+ if ((match = /^#[0-4fhmln]s\.scripts\.quine\(\)/.exec(codeSlice)))
72
+ code = spliceString(code, JSON.stringify(sourceCode), error.pos, match[0].length)
73
+ else if ((match = /^#[0-4fhmln]?s\./.exec(codeSlice))) code = spliceString(code, "$", error.pos, 1)
74
+ else if ((match = /^#D[^\w$]/.exec(codeSlice))) code = spliceString(code, "$", error.pos, 1)
75
+ else if ((match = /^#FMCL/.exec(codeSlice)))
76
+ code = spliceString(code, `$${uniqueId}$FMCL$`, error.pos, match[0].length)
77
+ else if ((match = /^#G/.exec(codeSlice)))
78
+ code = spliceString(code, `$${uniqueId}$GLOBAL$`, error.pos, match[0].length)
79
+ else {
80
+ if (!(match = /^#db\./.exec(codeSlice))) throw error
81
+ code = spliceString(code, "$", error.pos, 1)
28
82
  }
29
83
  }
30
- needExportDefault && (code = "export default " + code)
31
- let program
32
- traverse(
33
- parse(code, {
34
- plugins: [
35
- "typescript",
36
- ["decorators", { decoratorsBeforeExport: !0 }],
37
- "doExpressions",
38
- "functionBind",
39
- "functionSent",
40
- "partialApplication",
41
- ["pipelineOperator", { proposal: "hack", topicToken: "%" }],
42
- "throwExpressions",
43
- ["recordAndTuple", { syntaxType: "hash" }],
44
- "classProperties",
45
- "classPrivateProperties",
46
- "classPrivateMethods",
47
- "logicalAssignment",
48
- "numericSeparator",
49
- "nullishCoalescingOperator",
50
- "optionalChaining",
51
- "optionalCatchBinding",
52
- "objectRestSpread"
53
- ],
54
- sourceType: "module"
55
- }),
56
- {
57
- Program(path) {
58
- program = path
59
- },
60
- Identifier(path) {
61
- if (!path.node.name.startsWith(maybePrivatePrefix)) return
62
- const name = path.node.name.slice(maybePrivatePrefix.length)
63
- if ("ClassProperty" == path.parent.type && path.parent.key == path.node)
64
- path.parentPath.replaceWith(
65
- t.classPrivateProperty(
66
- t.privateName(t.identifier(name)),
67
- path.parent.value,
68
- path.parent.decorators,
69
- path.parent.static
70
- )
71
- )
72
- else if ("MemberExpression" == path.parent.type)
73
- if (path.parent.property == path.node) {
74
- assert(!path.parent.computed, "src/processScript/preprocess.ts:95:36")
75
- path.replaceWith(t.privateName(t.identifier(name)))
76
- } else {
77
- assert(path.parent.object == path.node, "src/processScript/preprocess.ts:98:46")
78
- if ("db" == name) {
79
- if (path.parent.computed)
80
- throw Error(
81
- "Index notation cannot be used on #db, must be in the form of #db.<DB method name>"
82
- )
83
- if ("Identifier" != path.parent.property.type)
84
- throw Error(
85
- `Expected DB method name to be an Identifier, got ${path.parent.property.type} instead`
86
- )
87
- if (!validDBMethods.includes(path.parent.property.name))
88
- throw Error("Invalid DB method #db." + path.parent.property.name)
89
- path.node.name = "$db"
90
- } else {
91
- assert(SUBSCRIPT_PREFIXES.includes(name), "src/processScript/preprocess.ts:112:49")
92
- if (path.parent.computed)
93
- throw Error(
94
- `Index notation cannot be used for subscripts, must be in the form of #${name}.foo.bar`
95
- )
96
- if ("Identifier" != path.parent.property.type)
97
- throw Error(
98
- `Expected subscript user name to be Identifier but got ${path.parent.property.type} instead`
99
- )
100
- if ("MemberExpression" != path.parentPath.parent.type)
101
- throw Error(`Subscripts must be in the form of #${name}.foo.bar`)
102
- if (path.parentPath.parent.computed)
103
- throw Error(
104
- `Index notation cannot be used for subscripts, must be in the form of #${name}.foo.bar`
105
- )
106
- if ("Identifier" != path.parentPath.parent.property.type)
107
- throw Error(
108
- `Expected subscript subname to be Identifier but got ${path.parent.property.type} instead`
109
- )
110
- "CallExpression" == path.parentPath.parentPath?.parent.type &&
111
- "scripts" == path.parent.property.name &&
112
- "quine" == path.parentPath.parent.property.name
113
- ? ensure(
114
- path.parentPath.parentPath.parentPath,
115
- "src/processScript/preprocess.ts:134:54"
116
- ).replaceWith(t.stringLiteral(sourceCode))
117
- : (path.node.name = "$" + name)
118
- }
119
- }
120
- else if (
121
- "BinaryExpression" == path.parent.type &&
122
- path.parent.left == path.node &&
123
- "in" == path.parent.operator
124
- )
125
- path.replaceWith(t.privateName(t.identifier(name)))
126
- else if ("ClassMethod" == path.parent.type && path.parent.key == path.node) {
127
- assert("constructor" != path.parent.kind, "src/processScript/preprocess.ts:142:47")
128
- path.parentPath.replaceWith(
129
- t.classPrivateMethod(
130
- path.parent.kind,
131
- t.privateName(t.identifier(name)),
132
- path.parent.params,
133
- path.parent.body,
134
- path.parent.static
135
- )
136
- )
137
- } else if ("FMCL" == name) path.node.name = `$${uniqueId}$FMCL$`
138
- else if ("G" == name) path.node.name = `$${uniqueId}$GLOBAL$`
139
- else {
140
- if ("D" != name) {
141
- if ("db" == name) throw Error("Invalid #db syntax, must be in the form of #db.<DB method name>")
142
- assert(SUBSCRIPT_PREFIXES.includes(name), "src/processScript/preprocess.ts:161:51 " + name)
143
- throw Error(`Invalid subscript syntax, must be in the form of #${name}.foo.bar`)
144
- }
145
- path.node.name = "$D"
146
- }
147
- }
84
+ traverse(file, {
85
+ Program(path) {
86
+ program = path
87
+ path.skip()
148
88
  }
149
- )
89
+ })
150
90
  const needRecord = program.scope.hasGlobal("Record"),
151
91
  needTuple = program.scope.hasGlobal("Tuple")
152
92
  ;(needRecord || needTuple) &&
153
- program.node.body.unshift(
93
+ file.program.body.unshift(
154
94
  t.importDeclaration(
155
95
  needRecord
156
96
  ? needTuple
@@ -164,7 +104,7 @@ async function preprocess(code, { uniqueId = "00000000000" } = {}) {
164
104
  )
165
105
  )
166
106
  program.scope.hasGlobal("Proxy") &&
167
- program.node.body.unshift(
107
+ file.program.body.unshift(
168
108
  t.importDeclaration(
169
109
  [t.importDefaultSpecifier(t.identifier("Proxy"))],
170
110
  t.stringLiteral(resolve("proxy-polyfill/src/proxy.js", import.meta.url).slice(7))
@@ -174,6 +114,6 @@ async function preprocess(code, { uniqueId = "00000000000" } = {}) {
174
114
  throw Error(
175
115
  "Scripts that only contain a single function declaration are no longer supported.\nPrefix the function declaration with `export default`."
176
116
  )
177
- return { code: generate(program.node).code }
117
+ return { code: generate(file).code }
178
118
  }
179
119
  export { preprocess }