@pkmn/engine 0.1.0-dev.f4ba6ebd → 0.1.0-dev.f6545544

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.
Files changed (77) hide show
  1. package/README.md +5 -4
  2. package/build/pkg/addon/browser.d.ts +3 -0
  3. package/build/pkg/addon/browser.js +47 -0
  4. package/build/pkg/addon/browser.js.map +1 -0
  5. package/build/pkg/addon/node.d.ts +3 -0
  6. package/build/pkg/addon/node.js +110 -0
  7. package/build/pkg/addon/node.js.map +1 -0
  8. package/build/pkg/addon/wasm.d.ts +2 -0
  9. package/build/pkg/addon/wasm.js +53 -0
  10. package/build/pkg/addon/wasm.js.map +1 -0
  11. package/build/pkg/addon.d.ts +25 -3
  12. package/build/pkg/addon.js +34 -65
  13. package/build/pkg/addon.js.map +1 -1
  14. package/build/pkg/data/layout.json +15 -2
  15. package/build/pkg/data/protocol.json +23 -9
  16. package/build/pkg/data.d.ts +23 -1
  17. package/build/pkg/data.js.map +1 -1
  18. package/build/pkg/gen1.d.ts +15 -18
  19. package/build/pkg/gen1.js +28 -19
  20. package/build/pkg/gen1.js.map +1 -1
  21. package/build/pkg/index.d.ts +39 -89
  22. package/build/pkg/index.js +23 -70
  23. package/build/pkg/index.js.map +1 -1
  24. package/build/pkg/protocol.d.ts +20 -1
  25. package/build/pkg/protocol.js +105 -103
  26. package/build/pkg/protocol.js.map +1 -1
  27. package/build/tools/debug.js +52 -76
  28. package/build/tools/debug.js.map +1 -1
  29. package/build/tools/display/debug.jsx +152 -0
  30. package/build/tools/display/debug.jsx.map +1 -0
  31. package/build/tools/display/index.js +152 -0
  32. package/build/tools/display/index.js.map +1 -0
  33. package/build/tools/display/ui.jsx +359 -0
  34. package/build/tools/display/ui.jsx.map +1 -0
  35. package/build/tools/display/util.js +33 -0
  36. package/build/tools/display/util.js.map +1 -0
  37. package/build.zig +196 -84
  38. package/package.json +51 -135
  39. package/src/bin/install-pkmn-engine +3 -2
  40. package/src/bin/pkmn-debug +1 -1
  41. package/src/lib/bindings/c.zig +255 -0
  42. package/src/lib/bindings/node.zig +121 -0
  43. package/src/lib/bindings/wasm.zig +59 -0
  44. package/src/lib/common/array.zig +1 -1
  45. package/src/lib/common/debug.zig +39 -8
  46. package/src/lib/common/optional.zig +1 -1
  47. package/src/lib/common/options.zig +4 -0
  48. package/src/lib/common/protocol.zig +4 -8
  49. package/src/lib/common/rational.zig +7 -5
  50. package/src/lib/common/rng.zig +1 -3
  51. package/src/lib/common/util.zig +1 -1
  52. package/src/lib/gen1/calc.zig +208 -61
  53. package/src/lib/gen1/chance.zig +40 -22
  54. package/src/lib/gen1/data/moves.zig +2 -4
  55. package/src/lib/gen1/data/species.zig +1 -3
  56. package/src/lib/gen1/data/types.zig +1 -2
  57. package/src/lib/gen1/data.zig +9 -13
  58. package/src/lib/gen1/helpers.zig +5 -21
  59. package/src/lib/gen1/mechanics.zig +107 -82
  60. package/src/lib/gen2/calc.zig +9 -17
  61. package/src/lib/gen2/chance.zig +0 -3
  62. package/src/lib/gen2/data/items.zig +1 -3
  63. package/src/lib/gen2/data/moves.zig +2 -4
  64. package/src/lib/gen2/data/species.zig +1 -3
  65. package/src/lib/gen2/data/types.zig +1 -2
  66. package/src/lib/gen2/data.zig +11 -15
  67. package/src/lib/gen2/generated.zig +18 -23
  68. package/src/lib/gen2/helpers.zig +5 -16
  69. package/src/lib/gen2/mechanics.zig +41 -44
  70. package/src/lib/node.zig +3 -116
  71. package/src/lib/pkmn.zig +7 -2
  72. package/src/lib/wasm.zig +13 -9
  73. package/src/tools/display/dom.ts +95 -0
  74. package/src/tools/display/ui.css +354 -0
  75. package/build/test/display.js +0 -405
  76. package/build/test/display.js.map +0 -1
  77. package/src/test/display/pkmn.html.tmpl +0 -368
package/build.zig CHANGED
@@ -1,5 +1,5 @@
1
- const std = @import("std");
2
1
  const builtin = @import("builtin");
2
+ const std = @import("std");
3
3
 
4
4
  pub const Options = struct {
5
5
  showdown: ?bool = null,
@@ -27,8 +27,14 @@ pub fn module(b: *std.Build, options: Options) *std.Build.Module {
27
27
  build_options.addOption(?bool, "chance", options.chance);
28
28
  build_options.addOption(?bool, "calc", options.calc);
29
29
 
30
- const root_source_file = .{ .cwd_relative = dirname ++ "/src/lib/pkmn.zig" };
31
- const imports = &.{.{ .name = "build_options", .module = build_options.createModule() }};
30
+ const root_source_file: std.Build.LazyPath =
31
+ .{ .cwd_relative = dirname ++ "/src/lib/pkmn.zig" };
32
+ const Import = if (@hasDecl(std.Build.Module, "Import"))
33
+ std.Build.Module.Import
34
+ else
35
+ std.Build.ModuleDependency;
36
+ const imports: []const Import =
37
+ &.{.{ .name = "build_options", .module = build_options.createModule() }};
32
38
  return b.createModule(if (@hasDecl(std.Build, "CreateModuleOptions"))
33
39
  .{ .source_file = root_source_file, .dependencies = imports }
34
40
  else
@@ -43,6 +49,10 @@ pub fn build(b: *std.Build) !void {
43
49
  const node_headers = b.option([]const u8, "node-headers", "Path to node-headers");
44
50
  const node_import_lib =
45
51
  b.option([]const u8, "node-import-library", "Path to node import library (Windows)");
52
+ const demo = if (try exists("src/tools/demo.zig"))
53
+ b.option(bool, "demo", "Build the demo library") orelse false
54
+ else
55
+ false;
46
56
  const wasm = b.option(bool, "wasm", "Build a WASM library") orelse false;
47
57
  const wasm_stack_size =
48
58
  b.option(u64, "wasm-stack-size", "The size of WASM stack") orelse std.wasm.page_size;
@@ -73,6 +83,7 @@ pub fn build(b: *std.Build) !void {
73
83
  const log = b.option(bool, "log", "Enable protocol message logging") orelse false;
74
84
  const chance = b.option(bool, "chance", "Enable update probability tracking") orelse false;
75
85
  const calc = b.option(bool, "calc", "Enable damage calculator support") orelse false;
86
+ const extra = b.option([]const []const u8, "option", "Enable extra option");
76
87
 
77
88
  const options = b.addOptions();
78
89
  options.addOption(?bool, "showdown", showdown);
@@ -80,17 +91,37 @@ pub fn build(b: *std.Build) !void {
80
91
  options.addOption(?bool, "chance", chance);
81
92
  options.addOption(?bool, "calc", calc);
82
93
 
94
+ if (extra) |opts| {
95
+ for (opts) |opt| {
96
+ if (std.mem.indexOfScalar(u8, opt, '=')) |i| {
97
+ options.addOption(?bool, opt[0..i], if (std.mem.eql(u8, opt[i + 1 ..], "true"))
98
+ true
99
+ else if (std.mem.eql(u8, opt[i + 1 ..], "false"))
100
+ false
101
+ else {
102
+ std.log.err("Invalid option: {s}\n", .{opt});
103
+ return error.InvalidOption;
104
+ });
105
+ } else {
106
+ options.addOption(?bool, opt, true);
107
+ }
108
+ }
109
+ }
110
+
83
111
  const name = if (showdown) "pkmn-showdown" else "pkmn";
84
112
 
85
- const pkmn = if (@hasDecl(std.Build, "CreateModuleOptions")) null else b.addModule("pkmn", .{
86
- .root_source_file = if (has_path)
87
- .{ .path = "src/lib/pkmn.zig" }
88
- else
89
- b.path("src/lib/pkmn.zig"),
90
- .optimize = optimize,
91
- .target = target,
92
- .imports = &.{.{ .name = "build_options", .module = options.createModule() }},
93
- });
113
+ const pkmn: ?*std.Build.Module = if (@hasDecl(std.Build, "CreateModuleOptions"))
114
+ null
115
+ else
116
+ b.addModule("pkmn", .{
117
+ .root_source_file = if (has_path)
118
+ .{ .path = "src/lib/pkmn.zig" }
119
+ else
120
+ b.path("src/lib/pkmn.zig"),
121
+ .optimize = optimize,
122
+ .target = target,
123
+ .imports = &.{.{ .name = "build_options", .module = options.createModule() }},
124
+ });
94
125
 
95
126
  var c = false;
96
127
  if (node_headers) |headers| {
@@ -131,73 +162,18 @@ pub fn build(b: *std.Build) !void {
131
162
  // rename the file ourself in install-pkmn-engine
132
163
  b.installArtifact(lib);
133
164
  } else if (wasm) {
134
- const entry = @hasDecl(Step.Compile, "Entry");
135
- const mode = switch (optimize) {
136
- .ReleaseFast, .ReleaseSafe => .ReleaseSmall,
137
- else => optimize,
138
- };
139
- const freestanding = if (@hasDecl(std.Build, "resolveTargetQuery"))
140
- b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding })
141
- else
142
- ResolvedTarget{ .cpu_arch = .wasm32, .os_tag = .freestanding };
143
- const path = if (has_path) .{ .path = "src/lib/wasm.zig" } else b.path("src/lib/wasm.zig");
144
- const bin = if (entry) bin: {
145
- const exe = b.addExecutable(if (force_pic) .{
146
- .name = name,
147
- .root_source_file = path,
148
- .optimize = mode,
149
- .target = freestanding,
150
- } else .{
151
- .name = name,
152
- .root_source_file = path,
153
- .optimize = mode,
154
- .target = freestanding,
155
- .strip = strip,
156
- .pic = pic,
157
- });
158
- (if (root_module) exe.root_module else exe).export_symbol_names = &[_][]const u8{
159
- "SHOWDOWN",
160
- "LOG",
161
- "CHANCE",
162
- "CALC",
163
- "GEN1_CHOICES_SIZE",
164
- "GEN1_LOGS_SIZE",
165
- };
166
- exe.entry = .disabled;
167
- break :bin exe;
168
- } else bin: {
169
- const lib = b.addSharedLibrary(.{
170
- .name = name,
171
- .root_source_file = path,
172
- .optimize = mode,
173
- .target = freestanding,
174
- });
175
- lib.rdynamic = true;
176
- break :bin lib;
177
- };
178
- bin.stack_size = wasm_stack_size;
179
- if (@hasDecl(@TypeOf(bin.*), "strip")) bin.strip = strip orelse false;
180
- if (force_pic and pic orelse false) bin.force_pic = pic;
181
- (if (root_module) bin.root_module else bin).addOptions("build_options", options);
182
-
183
- const opt = b.findProgram(&.{"wasm-opt"}, &.{"./node_modules/.bin"}) catch null;
184
- if (optimize != .Debug and opt != null) {
185
- const out = b.fmt("build/lib/{s}.wasm", .{name});
186
- const sh = b.addSystemCommand(&.{ opt.?, "-O4" });
187
- sh.addArtifactArg(bin);
188
- sh.addArg("-o");
189
- if (@hasDecl(@TypeOf(sh.*), "addFileSourceArg")) {
190
- sh.addFileSourceArg(if (has_path) .{ .path = out } else b.path(out));
191
- } else {
192
- sh.addFileArg(if (has_path) .{ .path = out } else b.path(out));
193
- }
194
- b.getInstallStep().dependOn(&sh.step);
195
- if (!entry) b.installArtifact(bin);
196
- } else if (entry) {
197
- b.getInstallStep().dependOn(&b.addInstallArtifact(bin, .{
198
- .dest_dir = .{ .override = std.Build.InstallDir{ .lib = {} } },
199
- }).step);
200
- }
165
+ const path = "src/lib/wasm.zig";
166
+ try buildWasm(b, name, path, optimize, strip, pic, wasm_stack_size, null, options);
167
+ } else if (demo) {
168
+ const path = "src/tools/demo.zig";
169
+ const n = if (showdown) "demo-showdown" else "demo";
170
+ const mod = pkmn orelse module(b, .{
171
+ .showdown = showdown,
172
+ .log = log,
173
+ .chance = chance,
174
+ .calc = calc,
175
+ });
176
+ try buildWasm(b, n, path, optimize, strip, pic, wasm_stack_size, mod, options);
201
177
  } else if (dynamic) {
202
178
  const path = if (has_path) .{ .path = "src/lib/c.zig" } else b.path("src/lib/c.zig");
203
179
  const lib = b.addSharedLibrary(if (force_pic) .{
@@ -292,7 +268,7 @@ pub fn build(b: *std.Build) !void {
292
268
  b.installFile(file, b.fmt("share/pkgconfig/{s}", .{pc}));
293
269
  }
294
270
 
295
- const config = .{
271
+ const config: Config = .{
296
272
  .target = target,
297
273
  .optimize = optimize,
298
274
  .pic = pic,
@@ -350,6 +326,119 @@ pub fn build(b: *std.Build) !void {
350
326
  }
351
327
  }
352
328
 
329
+ fn buildWasm(
330
+ b: *std.Build,
331
+ name: []const u8,
332
+ root_src_file: []const u8,
333
+ optimize: std.builtin.OptimizeMode,
334
+ strip: ?bool,
335
+ pic: ?bool,
336
+ wasm_stack_size: u64,
337
+ import: ?*std.Build.Module,
338
+ options: anytype,
339
+ ) !void {
340
+ const entry = @hasDecl(Step.Compile, "Entry");
341
+ const mode = switch (optimize) {
342
+ .ReleaseFast, .ReleaseSafe => .ReleaseSmall,
343
+ else => optimize,
344
+ };
345
+ // https://webassembly.org/features/
346
+ var features = std.Target.wasm.featureSet(&.{
347
+ .atomics,
348
+ .bulk_memory,
349
+ // .exception_handling,
350
+ .extended_const,
351
+ // .half_precision,
352
+ // .multimemory,
353
+ .mutable_globals,
354
+ .nontrapping_fptoint,
355
+ .reference_types,
356
+ // .relaxed_simd,
357
+ .sign_ext,
358
+ .simd128,
359
+ // .tail_call,
360
+ });
361
+ if (builtin.zig_version.order(try std.SemanticVersion.parse("0.12.0")) != .lt) {
362
+ features.addFeature(@intFromEnum(std.Target.wasm.Feature.multivalue));
363
+ }
364
+ const freestanding = if (@hasDecl(std.Build, "resolveTargetQuery"))
365
+ b.resolveTargetQuery(.{
366
+ .cpu_arch = .wasm32,
367
+ .os_tag = .freestanding,
368
+ .cpu_features_add = features,
369
+ })
370
+ else
371
+ ResolvedTarget{
372
+ .cpu_arch = .wasm32,
373
+ .os_tag = .freestanding,
374
+ .cpu_features_add = features,
375
+ };
376
+ const path = if (has_path) .{ .path = root_src_file } else b.path(root_src_file);
377
+ const bin = if (entry) bin: {
378
+ const exe = b.addExecutable(if (force_pic) .{
379
+ .name = name,
380
+ .root_source_file = path,
381
+ .optimize = mode,
382
+ .target = freestanding,
383
+ } else .{
384
+ .name = name,
385
+ .root_source_file = path,
386
+ .optimize = mode,
387
+ .target = freestanding,
388
+ .strip = strip,
389
+ .pic = pic,
390
+ });
391
+
392
+ var file = try std.fs.cwd().openFile(root_src_file, .{});
393
+ defer file.close();
394
+ const bytes = try file.readToEndAlloc(b.allocator, std.math.maxInt(usize));
395
+ (if (root_module) exe.root_module else exe).export_symbol_names = try exports(b, bytes);
396
+ exe.entry = .disabled;
397
+ break :bin exe;
398
+ } else bin: {
399
+ const lib = b.addSharedLibrary(.{
400
+ .name = name,
401
+ .root_source_file = path,
402
+ .optimize = mode,
403
+ .target = freestanding,
404
+ });
405
+ lib.rdynamic = true;
406
+ break :bin lib;
407
+ };
408
+ if (import) |i| {
409
+ if (root_module) {
410
+ bin.root_module.addImport("pkmn", i);
411
+ } else {
412
+ bin.addModule("pkmn", i);
413
+ }
414
+ }
415
+ bin.stack_size = wasm_stack_size;
416
+ if (@hasDecl(@TypeOf(bin.*), "strip")) bin.strip = strip orelse false;
417
+ if (force_pic and pic orelse false) bin.force_pic = pic;
418
+ (if (root_module) bin.root_module else bin).addOptions("build_options", options);
419
+
420
+ const opt = b.findProgram(&.{"wasm-opt"}, &.{"./node_modules/.bin"}) catch null;
421
+ if (optimize != .Debug and opt != null) {
422
+ const out = b.fmt("build/lib/{s}.wasm", .{name});
423
+ const sh = b.addSystemCommand(&.{ opt.?, "--enable-bulk-memory", "--enable-simd", "-O4" });
424
+ sh.addArtifactArg(bin);
425
+ sh.addArg("-o");
426
+ if (@hasDecl(@TypeOf(sh.*), "addFileSourceArg")) {
427
+ sh.addFileSourceArg(if (has_path) .{ .path = out } else b.path(out));
428
+ } else {
429
+ sh.addFileArg(if (has_path) .{ .path = out } else b.path(out));
430
+ }
431
+ b.getInstallStep().dependOn(&sh.step);
432
+ if (!entry) b.installArtifact(bin);
433
+ } else if (entry) {
434
+ b.getInstallStep().dependOn(&b.addInstallArtifact(bin, .{
435
+ .dest_dir = .{ .override = std.Build.InstallDir{ .lib = {} } },
436
+ }).step);
437
+ } else {
438
+ b.installArtifact(bin);
439
+ }
440
+ }
441
+
353
442
  fn maybeStrip(
354
443
  b: *std.Build,
355
444
  artifact: *Step.Compile,
@@ -433,10 +522,7 @@ const ToolConfig = struct {
433
522
  };
434
523
 
435
524
  fn tool(b: *std.Build, path: []const u8, config: ToolConfig) !?*Step.Run {
436
- std.fs.cwd().access(path, .{}) catch |err| switch (err) {
437
- error.FileNotFound => return null,
438
- else => |e| return e,
439
- };
525
+ if (!try exists(path)) return null;
440
526
  var name = config.tool.name orelse std.fs.path.basename(path);
441
527
  const index = std.mem.lastIndexOfScalar(u8, name, '.');
442
528
  if (index) |i| name = name[0..i];
@@ -478,6 +564,14 @@ fn tool(b: *std.Build, path: []const u8, config: ToolConfig) !?*Step.Run {
478
564
  return run;
479
565
  }
480
566
 
567
+ fn exists(path: []const u8) !bool {
568
+ std.fs.cwd().access(path, .{}) catch |err| switch (err) {
569
+ error.FileNotFound => return false,
570
+ else => |e| return e,
571
+ };
572
+ return true;
573
+ }
574
+
481
575
  const ToolsStep = struct {
482
576
  step: std.Build.Step,
483
577
 
@@ -494,3 +588,21 @@ fn detect(target: anytype) std.Target {
494
588
  if (@hasField(@TypeOf(target), "result")) return target.result;
495
589
  return (std.zig.system.NativeTargetInfo.detect(target) catch unreachable).target;
496
590
  }
591
+
592
+ pub fn exports(b: *std.Build, bytes: []const u8) ![][]const u8 {
593
+ var symbols = std.ArrayList([]const u8).init(b.allocator);
594
+
595
+ var it = std.mem.splitSequence(u8, bytes, "export ");
596
+ _ = it.next();
597
+ while (it.next()) |s| {
598
+ if (std.mem.startsWith(u8, s, "const ")) {
599
+ const i = std.mem.indexOf(u8, s[6..], " ").?;
600
+ try symbols.append(s[6 .. 6 + i]);
601
+ } else { // "fn "
602
+ const i = std.mem.indexOf(u8, s[3..], "(").?;
603
+ try symbols.append(s[3 .. 3 + i]);
604
+ }
605
+ }
606
+
607
+ return symbols.items;
608
+ }
package/package.json CHANGED
@@ -1,19 +1,31 @@
1
1
  {
2
2
  "name": "@pkmn/engine",
3
- "version": "0.1.0-dev.f4ba6ebd",
3
+ "version": "0.1.0-dev.f6545544",
4
4
  "description": "A minimal, complete, Pokémon battle simulation engine optimized for performance",
5
5
  "repository": "github:pkmn/engine",
6
6
  "license": "MIT",
7
7
  "sideEffects": false,
8
8
  "main": "build/pkg/index.js",
9
9
  "types": "build/pkg/index.d.ts",
10
+ "browser": {
11
+ "./build/pkg/addon/node.js": "./build/pkg/addon/browser.js"
12
+ },
10
13
  "files": [
11
14
  "build.zig",
12
- "build/pkg/data.d.ts",
13
- "build/pkg/data.js.map",
14
15
  "build/pkg/addon.d.ts",
15
16
  "build/pkg/addon.js.map",
16
17
  "build/pkg/addon.js",
18
+ "build/pkg/addon/browser.d.ts",
19
+ "build/pkg/addon/browser.js.map",
20
+ "build/pkg/addon/browser.js",
21
+ "build/pkg/addon/node.d.ts",
22
+ "build/pkg/addon/node.js.map",
23
+ "build/pkg/addon/node.js",
24
+ "build/pkg/addon/wasm.d.ts",
25
+ "build/pkg/addon/wasm.js.map",
26
+ "build/pkg/addon/wasm.js",
27
+ "build/pkg/data.d.ts",
28
+ "build/pkg/data.js.map",
17
29
  "build/pkg/data.js",
18
30
  "build/pkg/data/ids.json",
19
31
  "build/pkg/data/layout.json",
@@ -27,15 +39,24 @@
27
39
  "build/pkg/protocol.d.ts",
28
40
  "build/pkg/protocol.js.map",
29
41
  "build/pkg/protocol.js",
30
- "build/test/display.js.map",
31
- "build/test/display.js",
32
42
  "build/tools/debug.js.map",
33
43
  "build/tools/debug.js",
44
+ "build/tools/display/index.js.map",
45
+ "build/tools/display/index.js",
46
+ "build/tools/display/debug.jsx.map",
47
+ "build/tools/display/debug.jsx",
48
+ "build/tools/display/ui.jsx.map",
49
+ "build/tools/display/ui.jsx",
50
+ "build/tools/display/util.js.map",
51
+ "build/tools/display/util.js",
52
+ "src/lib/bindings/c.zig",
53
+ "src/lib/bindings/node.zig",
54
+ "src/lib/bindings/wasm.zig",
55
+ "src/lib/common/array.zig",
34
56
  "src/lib/common/battle.zig",
35
57
  "src/lib/common/data.zig",
36
58
  "src/lib/common/debug.zig",
37
59
  "src/lib/common/js.zig",
38
- "src/lib/common/array.zig",
39
60
  "src/lib/common/optional.zig",
40
61
  "src/lib/common/options.zig",
41
62
  "src/lib/common/protocol.zig",
@@ -63,7 +84,8 @@
63
84
  "src/lib/node.zig",
64
85
  "src/lib/pkmn.zig",
65
86
  "src/lib/wasm.zig",
66
- "src/test/display/pkmn.html.tmpl"
87
+ "src/tools/display/dom.ts",
88
+ "src/tools/display/ui.css"
67
89
  ],
68
90
  "engines": {
69
91
  "node": ">=16.0.0"
@@ -76,160 +98,54 @@
76
98
  "access": "public"
77
99
  },
78
100
  "dependencies": {
79
- "@pkmn/data": "^0.9.11",
80
- "@pkmn/protocol": "^0.6.25"
101
+ "@pkmn/data": "^0.9.23",
102
+ "@pkmn/protocol": "^0.6.29"
81
103
  },
82
104
  "devDependencies": {
83
- "@pkmn/eslint-config": "^8.1.0",
84
- "@pkmn/img": "^0.2.31",
105
+ "@pkmn/eslint-config": "^9.3.0",
106
+ "@pkmn/img": "^0.2.33",
85
107
  "@pkmn/sets": "^5.1.2",
86
- "@pkmn/sim": "0.9.11",
108
+ "@pkmn/sim": "0.9.23",
109
+ "@pkmn/smogon": "^0.5.15",
87
110
  "@types/html-minifier": "^4.0.5",
88
- "@types/jest": "^29.5.12",
111
+ "@types/jest": "^29.5.14",
89
112
  "@types/minimist": "^1.2.5",
90
113
  "@types/mustache": "^4.2.5",
91
- "@types/node": "^22.0.2",
114
+ "@types/node": "^22.9.3",
115
+ "@types/react": "^18.3.12",
92
116
  "@types/semver": "^7.5.8",
93
- "@vitest/coverage-v8": "^2.0.5",
94
- "binaryen": "^118.0.0",
95
- "eslint": "<=8",
117
+ "@types/vscode": "^1.95.0",
118
+ "@vitest/coverage-v8": "^2.1.5",
119
+ "@vscode/vsce": "^3.2.1",
120
+ "binaryen": "^120.0.0",
121
+ "esbuild": "^0.24.0",
122
+ "eslint": "^9.15.0",
96
123
  "html-minifier": "^4.0.0",
97
- "json-stringify-pretty-compact": "4.0.0",
124
+ "json-stringify-pretty-compact": "3.0.0",
98
125
  "minimist": "^1.2.8",
99
126
  "mustache": "^4.2.0",
100
127
  "semver": "^7.6.3",
101
128
  "source-map-support": "^0.5.21",
102
129
  "table": "^6.8.2",
103
130
  "trakr": "^0.2.0",
104
- "typescript": "^5.5.4",
105
- "vitest": "^2.0.5"
131
+ "typescript": "^5.7.2",
132
+ "vitest": "^2.1.5"
106
133
  },
107
134
  "scripts": {
108
- "lint": "eslint --cache src --ext ts,js && eslint src/bin/*",
109
- "fix": "eslint --fix src --ext ts,js && eslint --fix src/bin/*",
135
+ "lint": "eslint --cache src",
136
+ "fix": "eslint --fix src",
110
137
  "compile": "tsc -p .",
111
138
  "build": "npm run compile",
112
139
  "test": "vitest src/pkg",
113
140
  "test:integration": "vitest src/test",
114
141
  "debug": "npm run compile && node build/tools/debug",
142
+ "demo": "npm run compile && node build/tools/demo",
115
143
  "fuzz": "npm run compile && node build/test/fuzz",
116
144
  "generate": "npm run compile && node build/tools/generate",
117
145
  "release": "npm run compile && node build/tools/release",
118
146
  "benchmark": "npm run compile && node build/test/benchmark",
119
147
  "integration": "npm run compile && node build/test/integration",
148
+ "extension": "npm -C src/tools/vscode run build",
120
149
  "postinstall": "node src/bin/install-pkmn-engine"
121
- },
122
- "eslintConfig": {
123
- "extends": "@pkmn",
124
- "ignorePatterns": [
125
- "dist/",
126
- "node_modules/",
127
- "examples/zig",
128
- "build/"
129
- ],
130
- "env": {
131
- "es6": true,
132
- "node": true,
133
- "browser": true
134
- },
135
- "overrides": [
136
- {
137
- "files": [
138
- "**/*.ts"
139
- ],
140
- "parserOptions": {
141
- "project": [
142
- "./tsconfig.json",
143
- "./examples/js/tsconfig.json"
144
- ]
145
- }
146
- },
147
- {
148
- "files": [
149
- "src/test/display.ts"
150
- ],
151
- "rules": {
152
- "@typescript-eslint/no-unnecessary-type-assertion": "off"
153
- }
154
- },
155
- {
156
- "files": [
157
- "src/pkg/index.ts",
158
- "src/test/display.ts",
159
- "src/test/integration.ts"
160
- ],
161
- "rules": {
162
- "no-control-regex": "off",
163
- "@typescript-eslint/no-empty-interface": "off",
164
- "@typescript-eslint/no-shadow": "off",
165
- "@typescript-eslint/no-unsafe-declaration-merging": "off"
166
- }
167
- },
168
- {
169
- "files": [
170
- "src/pkg/addon.ts"
171
- ],
172
- "rules": {
173
- "@typescript-eslint/no-var-requires": "off"
174
- }
175
- },
176
- {
177
- "files": [
178
- "src/test/benchmark*.ts"
179
- ],
180
- "rules": {
181
- "@typescript-eslint/no-unused-vars": "off",
182
- "@typescript-eslint/no-redundant-type-constituents": "off"
183
- }
184
- },
185
- {
186
- "files": [
187
- "src/pkg/protocol.test.ts"
188
- ],
189
- "rules": {
190
- "jest/no-standalone-expect": "off",
191
- "jest/no-conditional-expect": "off"
192
- }
193
- },
194
- {
195
- "files": [
196
- "src/test/*.test.ts",
197
- "src/test/regression/*.test.ts"
198
- ],
199
- "rules": {
200
- "jest/no-standalone-expect": "off"
201
- }
202
- },
203
- {
204
- "files": [
205
- "src/test/showdown/**"
206
- ],
207
- "rules": {
208
- "jest/expect-expect": [
209
- "warn",
210
- {
211
- "assertFunctionNames": [
212
- "expect",
213
- "expectLog",
214
- "verify"
215
- ]
216
- }
217
- ]
218
- }
219
- },
220
- {
221
- "files": [
222
- "src/tools/generate.ts"
223
- ],
224
- "rules": {
225
- "@typescript-eslint/restrict-template-expressions": [
226
- "error",
227
- {
228
- "allowBoolean": true
229
- }
230
- ]
231
- }
232
- }
233
- ]
234
150
  }
235
151
  }
@@ -257,7 +257,7 @@ const downloadImportLib = async () => {
257
257
  }
258
258
 
259
259
  const dir = path.join(ROOT, 'build', 'lib');
260
- const url = new URL('./win-x64/node.lib', process.release.headersUrl).href;
260
+ const url = process.release.libUrl;
261
261
  const dest = path.join(dir, path.basename(url));
262
262
  if (fs.existsSync(path.join(dest))) {
263
263
  log('Node import library:', dest);
@@ -325,6 +325,7 @@ const downloadImportLib = async () => {
325
325
  const libs = path.join(ROOT, 'build', 'lib');
326
326
  if (fs.existsSync(libs)) {
327
327
  for (const file of fs.readdirSync(libs)) {
328
+ if (!file.startsWith('pkmn')) continue;
328
329
  const type = path.extname(file).slice(1);
329
330
  if (type !== 'node' && type !== 'wasm') continue;
330
331
  // If we don't copy the addon before loading it Windows will return an
@@ -393,7 +394,7 @@ const downloadImportLib = async () => {
393
394
  try {
394
395
  const actual = path.join(ROOT, 'build', 'lib', `${prefix}pkmn${suffix}.node.${ext}`);
395
396
  fs.renameSync(actual, artifact);
396
- } catch (err) {
397
+ } catch {
397
398
  // ziglang/zig#19743 changed this path
398
399
  const actual = path.join(ROOT, 'build', 'bin', `${prefix}pkmn${suffix}.node.${ext}`);
399
400
  fs.renameSync(actual, artifact);
@@ -15,7 +15,7 @@ const ROOT = resolve(__dirname, '..', '..');
15
15
  const packageJSON = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
16
16
 
17
17
  const missing = [];
18
- for (const dep of ['@pkmn/img', 'html-minifier', 'mustache']) {
18
+ for (const dep of ['@pkmn/img', 'html-minifier', 'esbuild']) {
19
19
  try {
20
20
  require.resolve(dep);
21
21
  } catch (e) {