-
Notifications
You must be signed in to change notification settings - Fork 1
/
package.json
34 lines (34 loc) · 24.1 KB
/
package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"name": "bughouse",
"description": "Bughouse chess engine based on chess.js by Joseph Thomas.",
"version": "0.0.1",
"author": {
"name": "Saagar Deshpande",
"email": "saagar@hcs.harvard.edu"
},
"engine": "node >= 0.4.1",
"repository": {
"type": "git",
"url": "http://github.com/raysaagar/signalfire.git"
},
"keywords": [
"chess",
"algebraic notation"
],
"main": "./lib/main.js",
"scripts": {
"pretest": "jslint --plusplus ./lib/*.js",
"test": "mocha"
},
"devDependencies": {
"mocha": "1.7.x",
"jslint": "0.1.x"
},
"readme": "# node-chess - algebraic chess engine\nnode-chess is an algebraic notation driven chess engine that can validate board position and produce a list of viable moves (notated).\n\n[![Build Status](https://secure.travis-ci.org/brozeph/node-chess.png?branch=master)](http://travis-ci.org/brozeph/node-chess?branch=master)\n\n## Features\n* Accepts moves in algebraic notation\n* Lists valid moves in algebraic notation\n* Fuzzy algebraic notation parsing\n* En Passant validation\n* 3-fold repetition detection\n* Stalemate detection\n* Check detection\n* Checkmate detection\n* Undo moves easily\n* Easily readable object structure\n* High unit test coverage\n\n## Installation\n\tnpm install chess\n\n## Public API\n\n### Create a new game\n\tvar chess = require('chess');\n\n\t// create a game client\n\tvar gc = chess.create(),\n\t m = null,\n\t status = null;\n\n\t// look at the valid moves\n\tstatus = gc.getStatus();\n\n\t// make a move\n\tm = gc.move('a4');\n\n\t// look at the status again after the move to see\n\t// the opposing side's available moves\n\tstatus = gc.getStatus();\n\n#### chess.move() Function\nFrom the above example, the response object that is returned when calling chess.move() looks like the following:\n\n\t{ move :\n\t\t{\tcapturedPiece : null, // the captured piece (if capture occurred)\n\t\t\tcastle : false, // was the move a castle?\n\t\t\tenPassant : false, // was the move en passant?\n\t\t\tpostSquare : { file: 'a', rank: 4, piece: {\n\t\t\t\tmoveCount: 1,\n\t\t\t\tside: { name: 'white' },\n\t\t\t\ttype: 'pawn',\n\t\t\t\tnotation: 'R'\n\t\t\t} },\n\t\t\tprevSquare : { file: 'a', rank: 2, piece: null } },\n\t undo : __function__ } // undo() can be used to back out the previous move\n\n##### move Object\nThe move object contains a collection of properties and an undo function pointer. The five properties of the move object are:\n\n* capturedPiece - If a piece was captured during the move, it will be represented here.\n* castle - If the move was a castle, this will be set to true, otherwise false.\n* enPassant - If the move was en passant, this will be set to true, otherwise false.\n* postSquare - The destination square object for the move.\n* prevSquare - The square object from which the move was originated.\n\n##### undo() Function\nTo back out the move:\n\n\tm.undo();\n\n#### chess.getStatus() Function\nThe status object is as follows (abbreviated in parts to improve readability):\n\n\t{ board: // this is the top level board\n\t\t{ squares: // an array of all squares on the board\n\t\t\t[ { file: 'a', rank: 1, piece: { // the file, rank and piece on the square\n\t\t\t\tmoveCount: 0,\n\t\t\t\tside: { name: 'white' },\n\t\t\t\ttype: 'rook',\n\t\t\t\tnotation: 'R'\n\t\t\t} },\n\t\t\t/* the rest of the squares... */\n\t\t\t]},\n\t isCheck: false, // is the King currently in check?\n\t isCheckmate: false, // is the King currently in checkmate?\n\t isRepetition: false, // has 3-fold repetition occurred?\n\t isStalemate: false, // is the board in stalemate?\n\t notatedMoves: // all possible moves (notated) with details for each move\n\t { a3: \n\t\t { src:\n\t\t\t { file: 'a'\n\t\t\t rank: 2,\n\t\t\t piece:\n\t\t\t { moveCount: 0,\n\t\t\t\t side: {name: 'white' },\n\t\t\t\t type: 'pawn',\n\t\t\t\t notation: 'R' } },\n\t\t\t dest: { file: 'a', rank: 3, piece: null } },\n\t\t\t/* the rest of the available moves... */\n\t\t }\n\t}\n\n##### status\nThe status object returned via the getStatus() function call contains several Object properties:\n\n* board - The underlying board Object which contains the collection of squares.\n* isCheck - If the status of the board is check, this will be true.\n* isCheckmate - If the status of the board is checkmate, this will be true. Additionally, the notatedMoves property will be empty.\n* isRepetition - If 3-fold repetition has occurred, this will be true. The notatedMoves property will not be empty as the game can technically continue.\n* isStalemate - If the board is in stalemate, this will be set to true.\n* notatedMoves - A hash containing all available moves on the board.\n\n##### status.notatedMoves\nEach object within the notatedMoves hash represents a possible move. The key to the hash is the algebraic notation of the move. The value for each key in the hash has two properties:\n\n* src - The starting square (which contains a piece) of the move\n* dest - The destination square of the move\n\nThe following code is an example of how to iterate the available notated moves for the game.\n\n\tvar gc = chess.create(),\n\t\ti = 0,\n\t\tkey = '',\n\t\tstatus = gc.getStatus();\n\t\n\tfor (i = 0; i < Object.keys(status.notatedMoves).length; i++) {\n\t\tkey = Object.keys(status.notatedMoves)[i];\n\n\t\tconsole.log(status.notatedMoves[key]);\n\t}\n\n#### Example usage\nThe following usage of the code is playing out the 3rd game in the series between Fischer and Petrosian in Buenos Aires, 1971. The game ended a draw due to 3 fold repetition.\n\n\tvar chess = require('chess'),\n\t\tutil = require('util');\n\n\tvar gc = chess.create();\n\n\t// 1. e4 e6\n\tgc.move('e4');\n\tgc.move('e6');\n\t// 2. d4 d5\n\tgc.move('d4');\n\tgc.move('d5');\n\t// 3. Nc3 Nf6\n\tgc.move('Nc3');\n\tgc.move('Nf6');\n\t// 4. Bg5 dxe4\n\tgc.move('Bg5');\n\tgc.move('dxe4');\n\t// 5. Nxe4 Be7\n\tgc.move('Nxe4');\n\tgc.move('Be7');\n\t// 6. Bxf6 gxf6\n\tgc.move('Bxf6');\n\tgc.move('gxf6');\n\t// 7. g3 f5\n\tgc.move('g3');\t\n\tgc.move('f5'); \n\t// 8. Nc3 Bf6\n\tgc.move('Nc3');\n\tgc.move('Bf6'); \n\t// 9. Nge2 Nc6\n\tgc.move('Nge2');\n\tgc.move('Nc6');\n\t// 10. d5 exd5\n\tgc.move('d5');\n\tgc.move('exd5'); \n\t// 11. Nxd5 Bxb2\n\tgc.move('Nxd5');\n\tgc.move('Bxb2');\n\t// 12. Bg2 O-O\n\tgc.move('Bg2');\n\tgc.move('0-0'); \n\t// 13. O-O Bh8\n\tgc.move('0-0');\n\tgc.move('Bh8'); \n\t// 14. Nef4 Ne5\n\tgc.move('Nef4');\n\tgc.move('Ne5'); \n\t// 15. Qh5 Ng6\n\tgc.move('Qh5');\n\tgc.move('Ng6'); \n\t// 16. Rad1 c6\n\tgc.move('Rad1');\n\tgc.move('c6');\n\t// 17. Ne3 Qf6\n\tgc.move('Ne3');\n\tgc.move('Qf6'); \n\t// 18. Kh1 Bg7\n\tgc.move('Kh1');\n\tgc.move('Bg7'); \n\t// 19. Bh3 Ne7\n\tgc.move('Bh3');\n\tgc.move('Ne7'); \n\t// 20. Rd3 Be6\n\tgc.move('Rd3');\n\tgc.move('Be6');\n\t// 21. Rfd1 Bh6\n\tgc.move('Rfd1');\n\tgc.move('Bh6');\n\t// 22. Rd4 Bxf4\n\tgc.move('Rd4');\n\tgc.move('Bxf4'); \n\t// 23. Rxf4 Rad8\n\tgc.move('Rxf4');\n\tgc.move('Rad8'); \n\t// 24. Rxd8 Rxd8\n\tgc.move('Rxd8');\n\tgc.move('Rxd8'); \n\t// 25. Bxf5 Nxf5\n\tgc.move('Bxf5');\n\tgc.move('Nxf5');\n\t// 26. Nxf5 Rd5\n\tgc.move('Nxf5');\n\tgc.move('Rd5'); \n\t// 27. g4 Bxf5\n\tgc.move('g4');\n\tgc.move('Bxf5'); \n\t// 28. gxf5 h6\n\tgc.move('gxf5');\n\tgc.move('h6'); \n\t// 29. h3 Kh7\n\tgc.move('h3');\n\tgc.move('Kh7'); \n\t// 30. Qe2 Qe5\n\tgc.move('Qe2');\n\tgc.move('Qe5');\n\t// 31. Qh5 Qf6\n\tgc.move('Qh5');\n\tgc.move('Qf6'); \n\t// 32. Qe2 Re5\n\tgc.move('Qe2');\n\tgc.move('Re5'); \n\t// 33. Qd3 Rd5\n\tgc.move('Qd3');\n\tgc.move('Rd5'); \n\t// 34. Qe2\n\tgc.move('Qe2');\n\n\tconsole.log(util.inspect(gc.getStatus(), false, 7));\n\n##### Output\nThe above code produces the following output:\n\n\t{ board: \n\t { squares: \n\t [ { file: 'a', rank: 1, piece: null },\n\t { file: 'b', rank: 1, piece: null },\n\t { file: 'c', rank: 1, piece: null },\n\t { file: 'd', rank: 1, piece: null },\n\t { file: 'e', rank: 1, piece: null },\n\t { file: 'f', rank: 1, piece: null },\n\t { file: 'g', rank: 1, piece: null },\n\t { file: 'h',\n\t rank: 1,\n\t piece: \n\t { moveCount: 2,\n\t side: { name: 'white' },\n\t type: 'king',\n\t notation: 'K' } },\n\t { file: 'a',\n\t rank: 2,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'b', rank: 2, piece: null },\n\t { file: 'c',\n\t rank: 2,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'd', rank: 2, piece: null },\n\t { file: 'e',\n\t rank: 2,\n\t piece: \n\t { moveCount: 6,\n\t side: { name: 'white' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t { file: 'f',\n\t rank: 2,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'g', rank: 2, piece: null },\n\t { file: 'h', rank: 2, piece: null },\n\t { file: 'a', rank: 3, piece: null },\n\t { file: 'b', rank: 3, piece: null },\n\t { file: 'c', rank: 3, piece: null },\n\t { file: 'd', rank: 3, piece: null },\n\t { file: 'e', rank: 3, piece: null },\n\t { file: 'f', rank: 3, piece: null },\n\t { file: 'g', rank: 3, piece: null },\n\t { file: 'h',\n\t rank: 3,\n\t piece: \n\t { moveCount: 1,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'a', rank: 4, piece: null },\n\t { file: 'b', rank: 4, piece: null },\n\t { file: 'c', rank: 4, piece: null },\n\t { file: 'd', rank: 4, piece: null },\n\t { file: 'e', rank: 4, piece: null },\n\t { file: 'f',\n\t rank: 4,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'white' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t { file: 'g', rank: 4, piece: null },\n\t { file: 'h', rank: 4, piece: null },\n\t { file: 'a', rank: 5, piece: null },\n\t { file: 'b', rank: 5, piece: null },\n\t { file: 'c', rank: 5, piece: null },\n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t { file: 'e', rank: 5, piece: null },\n\t { file: 'f',\n\t rank: 5,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'g', rank: 5, piece: null },\n\t { file: 'h', rank: 5, piece: null },\n\t { file: 'a', rank: 6, piece: null },\n\t { file: 'b', rank: 6, piece: null },\n\t { file: 'c',\n\t rank: 6,\n\t piece: \n\t { moveCount: 1,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'd', rank: 6, piece: null },\n\t { file: 'e', rank: 6, piece: null },\n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t { file: 'g', rank: 6, piece: null },\n\t { file: 'h',\n\t rank: 6,\n\t piece: \n\t { moveCount: 1,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'a',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'b',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'c', rank: 7, piece: null },\n\t { file: 'd', rank: 7, piece: null },\n\t { file: 'e', rank: 7, piece: null },\n\t { file: 'f',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t { file: 'g', rank: 7, piece: null },\n\t { file: 'h',\n\t rank: 7,\n\t piece: \n\t { moveCount: 2,\n\t side: { name: 'black' },\n\t type: 'king',\n\t notation: 'K' } },\n\t { file: 'a', rank: 8, piece: null },\n\t { file: 'b', rank: 8, piece: null },\n\t { file: 'c', rank: 8, piece: null },\n\t { file: 'd', rank: 8, piece: null },\n\t { file: 'e', rank: 8, piece: null },\n\t { file: 'f', rank: 8, piece: null },\n\t { file: 'g', rank: 8, piece: null },\n\t { file: 'h', rank: 8, piece: null } ],\n\t _events: { move: [Function] } },\n\t isCheck: false,\n\t isCheckmate: false,\n\t isRepetition: true,\n\t isStalemate: false,\n\t notatedMoves: \n\t { Rd4: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 4, piece: null } },\n\t Rd3: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 3, piece: null } },\n\t Rd2: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 2, piece: null } },\n\t Rd1: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 1, piece: null } },\n\t Rd6: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 6, piece: null } },\n\t Rd7: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 7, piece: null } },\n\t Rd8: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'd', rank: 8, piece: null } },\n\t Rc5: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'c', rank: 5, piece: null } },\n\t Rb5: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'b', rank: 5, piece: null } },\n\t Ra5: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'a', rank: 5, piece: null } },\n\t Re5: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: { file: 'e', rank: 5, piece: null } },\n\t Rxf5: \n\t { src: \n\t { file: 'd',\n\t rank: 5,\n\t piece: \n\t { moveCount: 4,\n\t side: { name: 'black' },\n\t type: 'rook',\n\t notation: 'R' } },\n\t dest: \n\t { file: 'f',\n\t rank: 5,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } } },\n\t c5: \n\t { src: \n\t { file: 'c',\n\t rank: 6,\n\t piece: \n\t { moveCount: 1,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t dest: { file: 'c', rank: 5, piece: null } },\n\t Qxf5: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: \n\t { file: 'f',\n\t rank: 5,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'white' },\n\t type: 'pawn',\n\t notation: '' } } },\n\t Qe6: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'e', rank: 6, piece: null } },\n\t Qd6: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'd', rank: 6, piece: null } },\n\t Qg6: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'g', rank: 6, piece: null } },\n\t Qe7: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'e', rank: 7, piece: null } },\n\t Qd8: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'd', rank: 8, piece: null } },\n\t Qg5: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'g', rank: 5, piece: null } },\n\t Qh4: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'h', rank: 4, piece: null } },\n\t Qe5: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'e', rank: 5, piece: null } },\n\t Qd4: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'd', rank: 4, piece: null } },\n\t Qc3: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'c', rank: 3, piece: null } },\n\t Qb2: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'b', rank: 2, piece: null } },\n\t Qa1: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'a', rank: 1, piece: null } },\n\t Qg7: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'g', rank: 7, piece: null } },\n\t Qh8: \n\t { src: \n\t { file: 'f',\n\t rank: 6,\n\t piece: \n\t { moveCount: 3,\n\t side: { name: 'black' },\n\t type: 'queen',\n\t notation: 'Q' } },\n\t dest: { file: 'h', rank: 8, piece: null } },\n\t h5: \n\t { src: \n\t { file: 'h',\n\t rank: 6,\n\t piece: \n\t { moveCount: 1,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t dest: { file: 'h', rank: 5, piece: null } },\n\t a6: \n\t { src: \n\t { file: 'a',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t dest: { file: 'a', rank: 6, piece: null } },\n\t a5: \n\t { src: \n\t { file: 'a',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t dest: { file: 'a', rank: 5, piece: null } },\n\t b6: \n\t { src: \n\t { file: 'b',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t dest: { file: 'b', rank: 6, piece: null } },\n\t b5: \n\t { src: \n\t { file: 'b',\n\t rank: 7,\n\t piece: \n\t { moveCount: 0,\n\t side: { name: 'black' },\n\t type: 'pawn',\n\t notation: '' } },\n\t dest: { file: 'b', rank: 5, piece: null } },\n\t Kh8: \n\t { src: \n\t { file: 'h',\n\t rank: 7,\n\t piece: \n\t { moveCount: 2,\n\t side: { name: 'black' },\n\t type: 'king',\n\t notation: 'K' } },\n\t dest: { file: 'h', rank: 8, piece: null } },\n\t Kg7: \n\t { src: \n\t { file: 'h',\n\t rank: 7,\n\t piece: \n\t { moveCount: 2,\n\t side: { name: 'black' },\n\t type: 'king',\n\t notation: 'K' } },\n\t dest: { file: 'g', rank: 7, piece: null } },\n\t Kg8: \n\t { src: \n\t { file: 'h',\n\t rank: 7,\n\t piece: \n\t { moveCount: 2,\n\t side: { name: 'black' },\n\t type: 'king',\n\t notation: 'K' } },\n\t dest: { file: 'g', rank: 8, piece: null } } } }\n",
"readmeFilename": "README.md",
"_id": "chess@0.1.4",
"dist": {
"shasum": "ffe94e6ac7c72ed6f853cbc43089213496055c6b"
},
"_from": "chess@*"
}