@connectorvol/chessops 1.0.0 → 2.0.1

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 (93) hide show
  1. package/dist/{esm/attacks.js → attacks.js} +2 -3
  2. package/dist/{esm/board.js → board.js} +25 -9
  3. package/dist/{esm/chess.js → chess.js} +24 -18
  4. package/dist/{esm/compat.js → compat.js} +1 -2
  5. package/dist/{esm/debug.js → debug.js} +0 -1
  6. package/dist/{esm/fen.js → fen.js} +1 -2
  7. package/dist/{types/index.d.ts → index.d.ts} +6 -3
  8. package/dist/{esm/index.js → index.js} +1 -2
  9. package/dist/{esm/pgn.js → pgn.js} +54 -34
  10. package/dist/pgnOps.svelte.d.ts +31 -0
  11. package/dist/pgnOps.svelte.js +122 -0
  12. package/dist/{esm/san.js → san.js} +2 -5
  13. package/dist/{esm/setup.js → setup.js} +29 -26
  14. package/dist/{esm/squareSet.js → squareSet.js} +17 -16
  15. package/dist/{esm/transform.js → transform.js} +10 -14
  16. package/dist/{esm/types.js → types.js} +0 -1
  17. package/dist/{esm/util.js → util.js} +0 -1
  18. package/dist/{types/variant.d.ts → variant.d.ts} +2 -1
  19. package/dist/{esm/variant.js → variant.js} +21 -26
  20. package/package.json +31 -59
  21. package/dist/cjs/attacks.js +0 -152
  22. package/dist/cjs/attacks.js.map +0 -1
  23. package/dist/cjs/board.js +0 -143
  24. package/dist/cjs/board.js.map +0 -1
  25. package/dist/cjs/chess.js +0 -638
  26. package/dist/cjs/chess.js.map +0 -1
  27. package/dist/cjs/compat.js +0 -89
  28. package/dist/cjs/compat.js.map +0 -1
  29. package/dist/cjs/debug.js +0 -103
  30. package/dist/cjs/debug.js.map +0 -1
  31. package/dist/cjs/fen.js +0 -325
  32. package/dist/cjs/fen.js.map +0 -1
  33. package/dist/cjs/index.js +0 -94
  34. package/dist/cjs/index.js.map +0 -1
  35. package/dist/cjs/pgn.js +0 -796
  36. package/dist/cjs/pgn.js.map +0 -1
  37. package/dist/cjs/san.js +0 -174
  38. package/dist/cjs/san.js.map +0 -1
  39. package/dist/cjs/setup.js +0 -167
  40. package/dist/cjs/setup.js.map +0 -1
  41. package/dist/cjs/squareSet.js +0 -206
  42. package/dist/cjs/squareSet.js.map +0 -1
  43. package/dist/cjs/transform.js +0 -57
  44. package/dist/cjs/transform.js.map +0 -1
  45. package/dist/cjs/types.js +0 -24
  46. package/dist/cjs/types.js.map +0 -1
  47. package/dist/cjs/util.js +0 -104
  48. package/dist/cjs/util.js.map +0 -1
  49. package/dist/cjs/variant.js +0 -833
  50. package/dist/cjs/variant.js.map +0 -1
  51. package/dist/esm/attacks.js.map +0 -1
  52. package/dist/esm/board.js.map +0 -1
  53. package/dist/esm/chess.js.map +0 -1
  54. package/dist/esm/compat.js.map +0 -1
  55. package/dist/esm/debug.js.map +0 -1
  56. package/dist/esm/fen.js.map +0 -1
  57. package/dist/esm/index.js.map +0 -1
  58. package/dist/esm/pgn.js.map +0 -1
  59. package/dist/esm/san.js.map +0 -1
  60. package/dist/esm/setup.js.map +0 -1
  61. package/dist/esm/squareSet.js.map +0 -1
  62. package/dist/esm/transform.js.map +0 -1
  63. package/dist/esm/types.js.map +0 -1
  64. package/dist/esm/util.js.map +0 -1
  65. package/dist/esm/variant.js.map +0 -1
  66. package/src/attacks.ts +0 -160
  67. package/src/board.ts +0 -168
  68. package/src/chess.ts +0 -687
  69. package/src/compat.ts +0 -120
  70. package/src/debug.ts +0 -100
  71. package/src/fen.ts +0 -328
  72. package/src/index.ts +0 -85
  73. package/src/pgn.ts +0 -876
  74. package/src/san.ts +0 -190
  75. package/src/setup.ts +0 -203
  76. package/src/squareSet.ts +0 -243
  77. package/src/transform.ts +0 -49
  78. package/src/types.ts +0 -93
  79. package/src/util.ts +0 -116
  80. package/src/variant.ts +0 -939
  81. /package/dist/{types/attacks.d.ts → attacks.d.ts} +0 -0
  82. /package/dist/{types/board.d.ts → board.d.ts} +0 -0
  83. /package/dist/{types/chess.d.ts → chess.d.ts} +0 -0
  84. /package/dist/{types/compat.d.ts → compat.d.ts} +0 -0
  85. /package/dist/{types/debug.d.ts → debug.d.ts} +0 -0
  86. /package/dist/{types/fen.d.ts → fen.d.ts} +0 -0
  87. /package/dist/{types/pgn.d.ts → pgn.d.ts} +0 -0
  88. /package/dist/{types/san.d.ts → san.d.ts} +0 -0
  89. /package/dist/{types/setup.d.ts → setup.d.ts} +0 -0
  90. /package/dist/{types/squareSet.d.ts → squareSet.d.ts} +0 -0
  91. /package/dist/{types/transform.d.ts → transform.d.ts} +0 -0
  92. /package/dist/{types/types.d.ts → types.d.ts} +0 -0
  93. /package/dist/{types/util.d.ts → util.d.ts} +0 -0
@@ -67,17 +67,15 @@ const makeSanWithoutSuffix = (pos, move) => {
67
67
  return san;
68
68
  };
69
69
  export const makeSanAndPlay = (pos, move) => {
70
- var _a;
71
70
  const san = makeSanWithoutSuffix(pos, move);
72
71
  pos.play(move);
73
- if ((_a = pos.outcome()) === null || _a === void 0 ? void 0 : _a.winner)
72
+ if (pos.outcome()?.winner)
74
73
  return san + "#";
75
74
  if (pos.isCheck())
76
75
  return san + "+";
77
76
  return san;
78
77
  };
79
78
  export const makeSanVariation = (pos, variation) => {
80
- var _a;
81
79
  pos = pos.clone();
82
80
  const line = [];
83
81
  for (let i = 0; i < variation.length; i++) {
@@ -92,7 +90,7 @@ export const makeSanVariation = (pos, variation) => {
92
90
  line.push(san);
93
91
  if (san === "--")
94
92
  return line.join("");
95
- if (i === variation.length - 1 && ((_a = pos.outcome()) === null || _a === void 0 ? void 0 : _a.winner))
93
+ if (i === variation.length - 1 && pos.outcome()?.winner)
96
94
  line.push("#");
97
95
  else if (pos.isCheck())
98
96
  line.push("+");
@@ -164,4 +162,3 @@ export const parseSan = (pos, san) => {
164
162
  promotion,
165
163
  };
166
164
  };
167
- //# sourceMappingURL=san.js.map
@@ -2,6 +2,12 @@ import { Board, boardEquals } from "./board.js";
2
2
  import { SquareSet } from "./squareSet.js";
3
3
  import { ROLES } from "./types.js";
4
4
  export class MaterialSide {
5
+ pawn;
6
+ knight;
7
+ bishop;
8
+ rook;
9
+ queen;
10
+ king;
5
11
  constructor() { }
6
12
  static empty() {
7
13
  const m = new MaterialSide();
@@ -53,6 +59,8 @@ export class MaterialSide {
53
59
  }
54
60
  }
55
61
  export class Material {
62
+ white;
63
+ black;
56
64
  constructor(white, black) {
57
65
  this.white = white;
58
66
  this.black = black;
@@ -95,6 +103,8 @@ export class Material {
95
103
  }
96
104
  }
97
105
  export class RemainingChecks {
106
+ white;
107
+ black;
98
108
  constructor(white, black) {
99
109
  this.white = white;
100
110
  this.black = black;
@@ -129,29 +139,22 @@ export const emptySetup = () => ({
129
139
  halfmoves: 0,
130
140
  fullmoves: 1,
131
141
  });
132
- export const setupClone = (setup) => {
133
- var _a, _b;
134
- return ({
135
- board: setup.board.clone(),
136
- pockets: (_a = setup.pockets) === null || _a === void 0 ? void 0 : _a.clone(),
137
- turn: setup.turn,
138
- castlingRights: setup.castlingRights,
139
- epSquare: setup.epSquare,
140
- remainingChecks: (_b = setup.remainingChecks) === null || _b === void 0 ? void 0 : _b.clone(),
141
- halfmoves: setup.halfmoves,
142
- fullmoves: setup.fullmoves,
143
- });
144
- };
145
- export const setupEquals = (left, right) => {
146
- var _a, _b;
147
- return boardEquals(left.board, right.board) &&
148
- ((right.pockets && ((_a = left.pockets) === null || _a === void 0 ? void 0 : _a.equals(right.pockets))) || (!left.pockets && !right.pockets)) &&
149
- left.turn === right.turn &&
150
- left.castlingRights.equals(right.castlingRights) &&
151
- left.epSquare === right.epSquare &&
152
- ((right.remainingChecks && ((_b = left.remainingChecks) === null || _b === void 0 ? void 0 : _b.equals(right.remainingChecks))) ||
153
- (!left.remainingChecks && !right.remainingChecks)) &&
154
- left.halfmoves === right.halfmoves &&
155
- left.fullmoves === right.fullmoves;
156
- };
157
- //# sourceMappingURL=setup.js.map
142
+ export const setupClone = (setup) => ({
143
+ board: setup.board.clone(),
144
+ pockets: setup.pockets?.clone(),
145
+ turn: setup.turn,
146
+ castlingRights: setup.castlingRights,
147
+ epSquare: setup.epSquare,
148
+ remainingChecks: setup.remainingChecks?.clone(),
149
+ halfmoves: setup.halfmoves,
150
+ fullmoves: setup.fullmoves,
151
+ });
152
+ export const setupEquals = (left, right) => boardEquals(left.board, right.board) &&
153
+ ((right.pockets && left.pockets?.equals(right.pockets)) || (!left.pockets && !right.pockets)) &&
154
+ left.turn === right.turn &&
155
+ left.castlingRights.equals(right.castlingRights) &&
156
+ left.epSquare === right.epSquare &&
157
+ ((right.remainingChecks && left.remainingChecks?.equals(right.remainingChecks)) ||
158
+ (!left.remainingChecks && !right.remainingChecks)) &&
159
+ left.halfmoves === right.halfmoves &&
160
+ left.fullmoves === right.fullmoves;
@@ -1,22 +1,24 @@
1
1
  const popcnt32 = (n) => {
2
- n = n - ((n >>> 1) & 1431655765);
3
- n = (n & 858993459) + ((n >>> 2) & 858993459);
4
- return Math.imul((n + (n >>> 4)) & 252645135, 16843009) >> 24;
2
+ n = n - ((n >>> 1) & 0x5555_5555);
3
+ n = (n & 0x3333_3333) + ((n >>> 2) & 0x3333_3333);
4
+ return Math.imul((n + (n >>> 4)) & 0x0f0f_0f0f, 0x0101_0101) >> 24;
5
5
  };
6
6
  const bswap32 = (n) => {
7
- n = ((n >>> 8) & 16711935) | ((n & 16711935) << 8);
7
+ n = ((n >>> 8) & 0x00ff_00ff) | ((n & 0x00ff_00ff) << 8);
8
8
  return ((n >>> 16) & 0xffff) | ((n & 0xffff) << 16);
9
9
  };
10
10
  const rbit32 = (n) => {
11
- n = ((n >>> 1) & 1431655765) | ((n & 1431655765) << 1);
12
- n = ((n >>> 2) & 858993459) | ((n & 858993459) << 2);
13
- n = ((n >>> 4) & 252645135) | ((n & 252645135) << 4);
11
+ n = ((n >>> 1) & 0x5555_5555) | ((n & 0x5555_5555) << 1);
12
+ n = ((n >>> 2) & 0x3333_3333) | ((n & 0x3333_3333) << 2);
13
+ n = ((n >>> 4) & 0x0f0f_0f0f) | ((n & 0x0f0f_0f0f) << 4);
14
14
  return bswap32(n);
15
15
  };
16
16
  /**
17
17
  * An immutable set of squares, implemented as a bitboard.
18
18
  */
19
19
  export class SquareSet {
20
+ lo;
21
+ hi;
20
22
  constructor(lo, hi) {
21
23
  this.lo = lo | 0;
22
24
  this.hi = hi | 0;
@@ -28,31 +30,31 @@ export class SquareSet {
28
30
  return new SquareSet(0xff, 0).shl64(8 * rank);
29
31
  }
30
32
  static fromFile(file) {
31
- return new SquareSet(16843009 << file, 16843009 << file);
33
+ return new SquareSet(0x0101_0101 << file, 0x0101_0101 << file);
32
34
  }
33
35
  static empty() {
34
36
  return new SquareSet(0, 0);
35
37
  }
36
38
  static full() {
37
- return new SquareSet(4294967295, 4294967295);
39
+ return new SquareSet(0xffff_ffff, 0xffff_ffff);
38
40
  }
39
41
  static corners() {
40
- return new SquareSet(0x81, 2164260864);
42
+ return new SquareSet(0x81, 0x8100_0000);
41
43
  }
42
44
  static center() {
43
- return new SquareSet(402653184, 0x18);
45
+ return new SquareSet(0x1800_0000, 0x18);
44
46
  }
45
47
  static backranks() {
46
- return new SquareSet(0xff, 4278190080);
48
+ return new SquareSet(0xff, 0xff00_0000);
47
49
  }
48
50
  static backrank(color) {
49
- return color === "white" ? new SquareSet(0xff, 0) : new SquareSet(0, 4278190080);
51
+ return color === "white" ? new SquareSet(0xff, 0) : new SquareSet(0, 0xff00_0000);
50
52
  }
51
53
  static lightSquares() {
52
- return new SquareSet(1437226410, 1437226410);
54
+ return new SquareSet(0x55aa_55aa, 0x55aa_55aa);
53
55
  }
54
56
  static darkSquares() {
55
- return new SquareSet(2857740885, 2857740885);
57
+ return new SquareSet(0xaa55_aa55, 0xaa55_aa55);
56
58
  }
57
59
  complement() {
58
60
  return new SquareSet(~this.lo, ~this.hi);
@@ -199,4 +201,3 @@ export class SquareSet {
199
201
  }
200
202
  }
201
203
  }
202
- //# sourceMappingURL=squareSet.js.map
@@ -32,17 +32,13 @@ export const transformBoard = (board, f) => {
32
32
  b[role] = f(board[role]);
33
33
  return b;
34
34
  };
35
- export const transformSetup = (setup, f) => {
36
- var _a, _b;
37
- return ({
38
- board: transformBoard(setup.board, f),
39
- pockets: (_a = setup.pockets) === null || _a === void 0 ? void 0 : _a.clone(),
40
- turn: setup.turn,
41
- castlingRights: f(setup.castlingRights),
42
- epSquare: defined(setup.epSquare) ? f(SquareSet.fromSquare(setup.epSquare)).first() : undefined,
43
- remainingChecks: (_b = setup.remainingChecks) === null || _b === void 0 ? void 0 : _b.clone(),
44
- halfmoves: setup.halfmoves,
45
- fullmoves: setup.fullmoves,
46
- });
47
- };
48
- //# sourceMappingURL=transform.js.map
35
+ export const transformSetup = (setup, f) => ({
36
+ board: transformBoard(setup.board, f),
37
+ pockets: setup.pockets?.clone(),
38
+ turn: setup.turn,
39
+ castlingRights: f(setup.castlingRights),
40
+ epSquare: defined(setup.epSquare) ? f(SquareSet.fromSquare(setup.epSquare)).first() : undefined,
41
+ remainingChecks: setup.remainingChecks?.clone(),
42
+ halfmoves: setup.halfmoves,
43
+ fullmoves: setup.fullmoves,
44
+ });
@@ -16,4 +16,3 @@ export const RULES = [
16
16
  "racingkings",
17
17
  "crazyhouse",
18
18
  ];
19
- //# sourceMappingURL=types.js.map
@@ -84,4 +84,3 @@ export const makeUci = (move) => isDrop(move)
84
84
  (move.promotion ? roleToChar(move.promotion) : "");
85
85
  export const kingCastlesTo = (color, side) => color === "white" ? (side === "a" ? 2 : 6) : side === "a" ? 58 : 62;
86
86
  export const rookCastlesTo = (color, side) => color === "white" ? (side === "a" ? 3 : 5) : side === "a" ? 59 : 61;
87
- //# sourceMappingURL=util.js.map
@@ -3,7 +3,8 @@ import { Castles, castlingSide, Chess, Context, equalsIgnoreMoves, IllegalSetup,
3
3
  import { Setup } from "./setup.js";
4
4
  import { SquareSet } from "./squareSet.js";
5
5
  import { Color, Outcome, Piece, Rules, Square } from "./types.js";
6
- export { Castles, castlingSide, Chess, Context, equalsIgnoreMoves, IllegalSetup, isImpossibleCheck, normalizeMove, Position, PositionError, };
6
+ export type { Context } from "./chess.js";
7
+ export { Castles, castlingSide, Chess, equalsIgnoreMoves, IllegalSetup, isImpossibleCheck, normalizeMove, Position, PositionError, };
7
8
  export declare class Crazyhouse extends Position {
8
9
  private constructor();
9
10
  reset(): void;
@@ -38,11 +38,10 @@ export class Crazyhouse extends Position {
38
38
  }
39
39
  validate() {
40
40
  return super.validate().chain((_) => {
41
- var _a, _b;
42
- if ((_a = this.pockets) === null || _a === void 0 ? void 0 : _a.count("king")) {
41
+ if (this.pockets?.count("king")) {
43
42
  return Result.err(new PositionError(IllegalSetup.Kings));
44
43
  }
45
- if ((((_b = this.pockets) === null || _b === void 0 ? void 0 : _b.size()) || 0) + this.board.occupied.size() > 64) {
44
+ if ((this.pockets?.size() || 0) + this.board.occupied.size() > 64) {
46
45
  return Result.err(new PositionError(IllegalSetup.Variant));
47
46
  }
48
47
  return Result.ok(undefined);
@@ -62,12 +61,11 @@ export class Crazyhouse extends Position {
62
61
  this.pockets.count("queen") <= 0);
63
62
  }
64
63
  dropDests(ctx) {
65
- var _a, _b;
66
64
  const mask = this.board.occupied
67
65
  .complement()
68
- .intersect(((_a = this.pockets) === null || _a === void 0 ? void 0 : _a[this.turn].hasNonPawns())
66
+ .intersect(this.pockets?.[this.turn].hasNonPawns()
69
67
  ? SquareSet.full()
70
- : ((_b = this.pockets) === null || _b === void 0 ? void 0 : _b[this.turn].hasPawns())
68
+ : this.pockets?.[this.turn].hasPawns()
71
69
  ? SquareSet.backranks().complement()
72
70
  : SquareSet.empty());
73
71
  ctx = ctx || this.ctx();
@@ -129,9 +127,9 @@ export class Atomic extends Position {
129
127
  .intersect(this.board.occupied)
130
128
  .diff(this.board.pawn)) {
131
129
  const piece = this.board.take(explode);
132
- if ((piece === null || piece === void 0 ? void 0 : piece.role) === "rook")
130
+ if (piece?.role === "rook")
133
131
  this.castles.discardRook(explode);
134
- if ((piece === null || piece === void 0 ? void 0 : piece.role) === "king")
132
+ if (piece?.role === "king")
135
133
  this.castles.discardColor(piece.color);
136
134
  }
137
135
  }
@@ -329,9 +327,8 @@ export class ThreeCheck extends Position {
329
327
  this.remainingChecks = RemainingChecks.default();
330
328
  }
331
329
  setupUnchecked(setup) {
332
- var _a;
333
330
  super.setupUnchecked(setup);
334
- this.remainingChecks = ((_a = setup.remainingChecks) === null || _a === void 0 ? void 0 : _a.clone()) || RemainingChecks.default();
331
+ this.remainingChecks = setup.remainingChecks?.clone() || RemainingChecks.default();
335
332
  }
336
333
  static default() {
337
334
  const pos = new this();
@@ -465,16 +462,16 @@ export class RacingKings extends Position {
465
462
  }
466
463
  const hordeBoard = () => {
467
464
  const board = Board.empty();
468
- board.occupied = new SquareSet(4294967295, 4294901862);
465
+ board.occupied = new SquareSet(0xffff_ffff, 0xffff_0066);
469
466
  board.promoted = SquareSet.empty();
470
- board.white = new SquareSet(4294967295, 102);
471
- board.black = new SquareSet(0, 4294901760);
472
- board.pawn = new SquareSet(4294967295, 16711782);
473
- board.knight = new SquareSet(0, 1107296256);
474
- board.bishop = new SquareSet(0, 603979776);
475
- board.rook = new SquareSet(0, 2164260864);
476
- board.queen = new SquareSet(0, 134217728);
477
- board.king = new SquareSet(0, 268435456);
467
+ board.white = new SquareSet(0xffff_ffff, 0x0000_0066);
468
+ board.black = new SquareSet(0, 0xffff_0000);
469
+ board.pawn = new SquareSet(0xffff_ffff, 0x00ff_0066);
470
+ board.knight = new SquareSet(0, 0x4200_0000);
471
+ board.bishop = new SquareSet(0, 0x2400_0000);
472
+ board.rook = new SquareSet(0, 0x8100_0000);
473
+ board.queen = new SquareSet(0, 0x0800_0000);
474
+ board.king = new SquareSet(0, 0x1000_0000);
478
475
  return board;
479
476
  };
480
477
  export class Horde extends Position {
@@ -782,7 +779,6 @@ export const setupPosition = (rules, setup) => {
782
779
  }
783
780
  };
784
781
  export const isStandardMaterial = (pos) => {
785
- var _a, _b, _c, _d, _e;
786
782
  switch (pos.rules) {
787
783
  case "chess":
788
784
  case "antichess":
@@ -792,11 +788,11 @@ export const isStandardMaterial = (pos) => {
792
788
  return COLORS.every((color) => isStandardMaterialSide(pos.board, color));
793
789
  case "crazyhouse": {
794
790
  const promoted = pos.board.promoted;
795
- return (promoted.size() + pos.board.pawn.size() + (((_a = pos.pockets) === null || _a === void 0 ? void 0 : _a.count("pawn")) || 0) <= 16 &&
796
- pos.board.knight.diff(promoted).size() + (((_b = pos.pockets) === null || _b === void 0 ? void 0 : _b.count("knight")) || 0) <= 4 &&
797
- pos.board.bishop.diff(promoted).size() + (((_c = pos.pockets) === null || _c === void 0 ? void 0 : _c.count("bishop")) || 0) <= 4 &&
798
- pos.board.rook.diff(promoted).size() + (((_d = pos.pockets) === null || _d === void 0 ? void 0 : _d.count("rook")) || 0) <= 4 &&
799
- pos.board.queen.diff(promoted).size() + (((_e = pos.pockets) === null || _e === void 0 ? void 0 : _e.count("queen")) || 0) <= 2);
791
+ return (promoted.size() + pos.board.pawn.size() + (pos.pockets?.count("pawn") || 0) <= 16 &&
792
+ pos.board.knight.diff(promoted).size() + (pos.pockets?.count("knight") || 0) <= 4 &&
793
+ pos.board.bishop.diff(promoted).size() + (pos.pockets?.count("bishop") || 0) <= 4 &&
794
+ pos.board.rook.diff(promoted).size() + (pos.pockets?.count("rook") || 0) <= 4 &&
795
+ pos.board.queen.diff(promoted).size() + (pos.pockets?.count("queen") || 0) <= 2);
800
796
  }
801
797
  case "horde":
802
798
  return COLORS.every((color) => pos.board.pieces(color, "king").nonEmpty()
@@ -809,4 +805,3 @@ export const isStandardMaterial = (pos) => {
809
805
  pos.board.pieces(color, "queen").size() <= 1);
810
806
  }
811
807
  };
812
- //# sourceMappingURL=variant.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@connectorvol/chessops",
3
- "version": "1.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Chess and chess variant rules and operations",
5
5
  "keywords": [
6
6
  "chess",
@@ -10,78 +10,50 @@
10
10
  "typescript",
11
11
  "uci"
12
12
  ],
13
- "license": "GPL-3.0-or-later",
14
- "author": "Niklas Fiekas <niklas.fiekas@backscattering.de>",
15
- "repository": "github:niklasf/chessops",
16
- "funding": "https://github.com/sponsors/niklasf",
13
+ "license": "MIT",
14
+ "author": "Moiseenko Vadim (mvkvol@yandex.ru)",
15
+ "repository": "sourcecraft.dev/mvkvol/chess",
16
+ "funding": "https://sourcecraft.dev/mvkvol/portal",
17
17
  "files": [
18
- "/src",
19
- "/dist",
20
- "!/**/*.test.*"
18
+ "dist",
19
+ "!dist/**/*.test.*",
20
+ "!dist/**/*.spec.*"
21
21
  ],
22
22
  "type": "module",
23
23
  "sideEffects": false,
24
- "main": "dist/cjs/index.js",
25
- "module": "dist/esm/index.js",
26
- "types": "index.d.ts",
27
- "typesVersions": {
28
- "*": {
29
- "*": [
30
- "dist/types/*"
31
- ]
32
- }
33
- },
24
+ "main": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "svelte": "./dist/index.js",
34
27
  "exports": {
35
28
  ".": {
36
- "types": "./dist/types/index.d.ts",
37
- "import": "./dist/esm/index.js",
38
- "require": "./dist/cjs/index.js"
29
+ "types": "./dist/index.d.ts",
30
+ "svelte": "./dist/index.js",
31
+ "import": "./dist/index.js",
32
+ "require": "./dist/index.js"
39
33
  },
40
34
  "./*": {
41
- "types": "./dist/types/*.d.ts",
42
- "import": "./dist/esm/*.js",
43
- "require": "./dist/cjs/*.js"
35
+ "types": "./dist/*.d.ts",
36
+ "svelte": "./dist/*.js",
37
+ "import": "./dist/*.js",
38
+ "require": "./dist/*.js"
44
39
  }
45
40
  },
46
41
  "scripts": {
47
- "package": "tsc --declarationDir dist/types && tsc --outDir dist/cjs --module commonjs --declaration false && bun pm pack",
42
+ "dev": "vite dev",
43
+ "build": "vite build",
44
+ "preview": "vite preview",
45
+ "package": "svelte-kit sync && svelte-package && bun pm pack",
48
46
  "publish": "bun publish",
49
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
50
- "doc": "typedoc src/types.ts src/attacks.ts src/util.ts src/squareSet.ts src/board.ts src/setup.ts src/chess.ts src/compat.ts src/debug.ts src/fen.ts src/san.ts src/transform.ts src/variant.ts src/pgn.ts",
51
- "lint": "eslint",
52
- "format": "dprint fmt",
53
- "check-format": "dprint check"
47
+ "prepublishOnly": "bun pm pack",
48
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
49
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
50
+ "test": "vitest run"
54
51
  },
55
52
  "dependencies": {
56
- "@badrap/result": "^0.3"
57
- },
58
- "devDependencies": {
59
- "@jest/globals": "^30",
60
- "@types/node": "^24.9.1",
61
- "@typescript-eslint/eslint-plugin": "^8",
62
- "@typescript-eslint/parser": "^8",
63
- "dprint": "^0.50",
64
- "eslint": "^9",
65
- "jest": "^30",
66
- "ts-jest": "^29",
67
- "typedoc": "^0.28",
68
- "typescript": "^5"
53
+ "@badrap/result": "^0.3",
54
+ "@connectorvol/shared": "2.0.0"
69
55
  },
70
- "jest": {
71
- "extensionsToTreatAsEsm": [
72
- ".ts"
73
- ],
74
- "moduleNameMapper": {
75
- "^(.*)\\.js$": "$1"
76
- },
77
- "testRegex": ".*\\.test\\.ts$",
78
- "transform": {
79
- "\\.ts$": [
80
- "ts-jest",
81
- {
82
- "useESM": true
83
- }
84
- ]
85
- }
56
+ "peerDependencies": {
57
+ "svelte": "^5.53.12"
86
58
  }
87
59
  }
@@ -1,152 +0,0 @@
1
- "use strict";
2
- /**
3
- * Compute attacks and rays.
4
- *
5
- * These are low-level functions that can be used to implement chess rules.
6
- *
7
- * Implementation notes: Sliding attacks are computed using
8
- * [Hyperbola Quintessence](https://www.chessprogramming.org/Hyperbola_Quintessence).
9
- * Magic Bitboards would deliver slightly faster lookups, but also require
10
- * initializing considerably larger attack tables. On the web, initialization
11
- * time is important, so the chosen method may strike a better balance.
12
- *
13
- * @packageDocumentation
14
- */
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.between = exports.ray = exports.attacks = exports.queenAttacks = exports.rookAttacks = exports.bishopAttacks = exports.pawnAttacks = exports.knightAttacks = exports.kingAttacks = void 0;
17
- const squareSet_js_1 = require("./squareSet.js");
18
- const util_js_1 = require("./util.js");
19
- const computeRange = (square, deltas) => {
20
- let range = squareSet_js_1.SquareSet.empty();
21
- for (const delta of deltas) {
22
- const sq = square + delta;
23
- if (0 <= sq && sq < 64 && Math.abs((0, util_js_1.squareFile)(square) - (0, util_js_1.squareFile)(sq)) <= 2) {
24
- range = range.with(sq);
25
- }
26
- }
27
- return range;
28
- };
29
- const tabulate = (f) => {
30
- const table = [];
31
- for (let square = 0; square < 64; square++)
32
- table[square] = f(square);
33
- return table;
34
- };
35
- const KING_ATTACKS = tabulate((sq) => computeRange(sq, [-9, -8, -7, -1, 1, 7, 8, 9]));
36
- const KNIGHT_ATTACKS = tabulate((sq) => computeRange(sq, [-17, -15, -10, -6, 6, 10, 15, 17]));
37
- const PAWN_ATTACKS = {
38
- white: tabulate((sq) => computeRange(sq, [7, 9])),
39
- black: tabulate((sq) => computeRange(sq, [-7, -9])),
40
- };
41
- /**
42
- * Gets squares attacked or defended by a king on `square`.
43
- */
44
- const kingAttacks = (square) => KING_ATTACKS[square];
45
- exports.kingAttacks = kingAttacks;
46
- /**
47
- * Gets squares attacked or defended by a knight on `square`.
48
- */
49
- const knightAttacks = (square) => KNIGHT_ATTACKS[square];
50
- exports.knightAttacks = knightAttacks;
51
- /**
52
- * Gets squares attacked or defended by a pawn of the given `color`
53
- * on `square`.
54
- */
55
- const pawnAttacks = (color, square) => PAWN_ATTACKS[color][square];
56
- exports.pawnAttacks = pawnAttacks;
57
- const FILE_RANGE = tabulate((sq) => squareSet_js_1.SquareSet.fromFile((0, util_js_1.squareFile)(sq)).without(sq));
58
- const RANK_RANGE = tabulate((sq) => squareSet_js_1.SquareSet.fromRank((0, util_js_1.squareRank)(sq)).without(sq));
59
- const DIAG_RANGE = tabulate((sq) => {
60
- const diag = new squareSet_js_1.SquareSet(134480385, 2151686160);
61
- const shift = 8 * ((0, util_js_1.squareRank)(sq) - (0, util_js_1.squareFile)(sq));
62
- return (shift >= 0 ? diag.shl64(shift) : diag.shr64(-shift)).without(sq);
63
- });
64
- const ANTI_DIAG_RANGE = tabulate((sq) => {
65
- const diag = new squareSet_js_1.SquareSet(270549120, 16909320);
66
- const shift = 8 * ((0, util_js_1.squareRank)(sq) + (0, util_js_1.squareFile)(sq) - 7);
67
- return (shift >= 0 ? diag.shl64(shift) : diag.shr64(-shift)).without(sq);
68
- });
69
- const hyperbola = (bit, range, occupied) => {
70
- let forward = occupied.intersect(range);
71
- let reverse = forward.bswap64(); // Assumes no more than 1 bit per rank
72
- forward = forward.minus64(bit);
73
- reverse = reverse.minus64(bit.bswap64());
74
- return forward.xor(reverse.bswap64()).intersect(range);
75
- };
76
- const fileAttacks = (square, occupied) => hyperbola(squareSet_js_1.SquareSet.fromSquare(square), FILE_RANGE[square], occupied);
77
- const rankAttacks = (square, occupied) => {
78
- const range = RANK_RANGE[square];
79
- let forward = occupied.intersect(range);
80
- let reverse = forward.rbit64();
81
- forward = forward.minus64(squareSet_js_1.SquareSet.fromSquare(square));
82
- reverse = reverse.minus64(squareSet_js_1.SquareSet.fromSquare(63 - square));
83
- return forward.xor(reverse.rbit64()).intersect(range);
84
- };
85
- /**
86
- * Gets squares attacked or defended by a bishop on `square`, given `occupied`
87
- * squares.
88
- */
89
- const bishopAttacks = (square, occupied) => {
90
- const bit = squareSet_js_1.SquareSet.fromSquare(square);
91
- return hyperbola(bit, DIAG_RANGE[square], occupied).xor(hyperbola(bit, ANTI_DIAG_RANGE[square], occupied));
92
- };
93
- exports.bishopAttacks = bishopAttacks;
94
- /**
95
- * Gets squares attacked or defended by a rook on `square`, given `occupied`
96
- * squares.
97
- */
98
- const rookAttacks = (square, occupied) => fileAttacks(square, occupied).xor(rankAttacks(square, occupied));
99
- exports.rookAttacks = rookAttacks;
100
- /**
101
- * Gets squares attacked or defended by a queen on `square`, given `occupied`
102
- * squares.
103
- */
104
- const queenAttacks = (square, occupied) => (0, exports.bishopAttacks)(square, occupied).xor((0, exports.rookAttacks)(square, occupied));
105
- exports.queenAttacks = queenAttacks;
106
- /**
107
- * Gets squares attacked or defended by a `piece` on `square`, given
108
- * `occupied` squares.
109
- */
110
- const attacks = (piece, square, occupied) => {
111
- switch (piece.role) {
112
- case "pawn":
113
- return (0, exports.pawnAttacks)(piece.color, square);
114
- case "knight":
115
- return (0, exports.knightAttacks)(square);
116
- case "bishop":
117
- return (0, exports.bishopAttacks)(square, occupied);
118
- case "rook":
119
- return (0, exports.rookAttacks)(square, occupied);
120
- case "queen":
121
- return (0, exports.queenAttacks)(square, occupied);
122
- case "king":
123
- return (0, exports.kingAttacks)(square);
124
- }
125
- };
126
- exports.attacks = attacks;
127
- /**
128
- * Gets all squares of the rank, file or diagonal with the two squares
129
- * `a` and `b`, or an empty set if they are not aligned.
130
- */
131
- const ray = (a, b) => {
132
- const other = squareSet_js_1.SquareSet.fromSquare(b);
133
- if (RANK_RANGE[a].intersects(other))
134
- return RANK_RANGE[a].with(a);
135
- if (ANTI_DIAG_RANGE[a].intersects(other))
136
- return ANTI_DIAG_RANGE[a].with(a);
137
- if (DIAG_RANGE[a].intersects(other))
138
- return DIAG_RANGE[a].with(a);
139
- if (FILE_RANGE[a].intersects(other))
140
- return FILE_RANGE[a].with(a);
141
- return squareSet_js_1.SquareSet.empty();
142
- };
143
- exports.ray = ray;
144
- /**
145
- * Gets all squares between `a` and `b` (bounds not included), or an empty set
146
- * if they are not on the same rank, file or diagonal.
147
- */
148
- const between = (a, b) => (0, exports.ray)(a, b)
149
- .intersect(squareSet_js_1.SquareSet.full().shl64(a).xor(squareSet_js_1.SquareSet.full().shl64(b)))
150
- .withoutFirst();
151
- exports.between = between;
152
- //# sourceMappingURL=attacks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attacks.js","sourceRoot":"","sources":["../../src/attacks.ts"],"names":[],"mappings":"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"}