chess-fen is a library which includes tools for working with Forsyth–Edwards Notation (FEN) in an immutable manner.
npm install chess-fen
Since 1.0.0 chess-fen is no longer a standard notation parser and instead focuses on being a
simple data structure with basic primitives for working with FEN notation. This means the previous
Fen.move()
method has been removed along with associated classes, types and functions for working
with parsing chess moves.
There have also been some significant changes to the types ( https://github.com/cymantex/chess-fen/blob/master/src/module/types.ts).
const emptyPosition = new Fen(Fen.emptyPosition);
//Each update() creates a new Fen instance.
const smotheredMate = emptyPosition
.update("h8", PIECES.k)
.update("h7", PIECES.p)
.update("g7", PIECES.p)
.update("e8", PIECES.r)
.update("a8", PIECES.q)
.update("g5", PIECES.N)
.update("c4", PIECES.Q)
.update("h2", PIECES.K);
smotheredMate.printBoard();
// -------------------
// | q . . . r . . k |
// | . . . . . . p p |
// | . . . . . . . . |
// | . . . . . . N . |
// | . . Q . . . . . |
// | . . . . . . . . |
// | . . . . . . . K |
// | . . . . . . . . |
// -------------------
// The original Fen will not be mutated
emptyPosition.printBoard();
// -------------------
// | . . . . . . . . |
// | . . . . . . . . |
// | . . . . . . . . |
// | . . . . . . . . |
// | . . . . . . . . |
// | . . . . . . . . |
// | . . . . . . . . |
// | . . . . . . . . |
// -------------------
The constructor takes an optional parameter which specifies the FEN board position.
const startingPosition = new Fen();
console.log(startingPosition.toString());
// rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
console.log(new Fen("rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2").toString());
// rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2
console.log(new Fen(Fen.emptyPosition).toString());
// 8/8/8/8/8/8/8/8 w KQkq - 0 1
Gets the content of the specified position.
const startingPosition = new Fen();
console.log(startingPosition.get("e1"));
// K
console.log(startingPosition.get("e4"));
// empty
console.log(startingPosition.get("k9"));
// null
// You can also send the x and y as a Position.
console.log(startingPosition.get(new Position(4, 7)));
// white king
Removes the content on the specified position if there is any.
console.log(new Fen().clear("e1").toString());
// "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQ1BNR w KQkq - 0 1"
Replaces the content of the specified position.
console.log(new Fen().update("e1", BoardContent.BlackBishop).toString());
// rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQbBNR w KQkq - 0 1
const startingPosition = new Fen();
console.log(startingPosition.isOccupied("e2"));
// true
console.log(startingPosition.isOccupied("e4"));
// false
const startingPosition = new Fen();
console.log(startingPosition.isEmpty("e2"));
// false
console.log(startingPosition.isEmpty("e4"));
// true
console.log(new Fen(Fen.startingPosition));
// Fen {
// rows: 8,
// columns: 8,
// board: [
// ['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
// ['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
// [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
// [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
// [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
// [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
// ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
// ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']
// ],
// toMove: 'white',
// castlingRights: {
// white: { queenside: true, kingside: true },
// black: { queenside: true, kingside: true }
// },
// enPassantSquare: '-',
// halfMoves: 0,
// fullMoves: 1
// }