{"id":20885734,"url":"https://github.com/sabakihq/go-board","last_synced_at":"2025-10-07T05:59:24.919Z","repository":{"id":65331969,"uuid":"200835648","full_name":"SabakiHQ/go-board","owner":"SabakiHQ","description":"A Go board data type.","archived":false,"fork":false,"pushed_at":"2021-09-19T15:06:26.000Z","size":100,"stargazers_count":25,"open_issues_count":1,"forks_count":11,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-30T01:44:56.623Z","etag":null,"topics":["baduk","board-game","datatype","go","strategy","weiqi"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SabakiHQ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":"https://www.paypal.me/yishn/5"}},"created_at":"2019-08-06T11:11:56.000Z","updated_at":"2025-08-20T00:13:03.000Z","dependencies_parsed_at":"2023-01-17T13:15:48.594Z","dependency_job_id":null,"html_url":"https://github.com/SabakiHQ/go-board","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/SabakiHQ/go-board","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SabakiHQ%2Fgo-board","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SabakiHQ%2Fgo-board/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SabakiHQ%2Fgo-board/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SabakiHQ%2Fgo-board/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SabakiHQ","download_url":"https://codeload.github.com/SabakiHQ/go-board/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SabakiHQ%2Fgo-board/sbom","scorecard":{"id":124691,"data":{"date":"2025-08-11","repo":{"name":"github.com/SabakiHQ/go-board","commit":"927573aa72ea88558653b085a3efaed721cc5b31"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/nodejs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/SabakiHQ/go-board/nodejs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/SabakiHQ/go-board/nodejs.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/nodejs.yml:21","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"28 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-h6ch-v84p-w6p9","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T03:29:05.591Z","repository_id":65331969,"created_at":"2025-08-16T03:29:05.592Z","updated_at":"2025-08-16T03:29:05.592Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278728303,"owners_count":26035412,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["baduk","board-game","datatype","go","strategy","weiqi"],"created_at":"2024-11-18T08:14:19.959Z","updated_at":"2025-10-07T05:59:24.877Z","avatar_url":"https://github.com/SabakiHQ.png","language":"JavaScript","funding_links":["https://www.paypal.me/yishn/5"],"categories":[],"sub_categories":[],"readme":"# @sabaki/go-board [![Build Status](https://travis-ci.org/SabakiHQ/go-board.svg?branch=master)](https://travis-ci.org/SabakiHQ/go-board)\n\nA Go board data type.\n\n## Installation\n\nUse npm to install:\n\n~~~\n$ npm install @sabaki/go-board\n~~~\n\n## Usage\n\n~~~js\nconst Board = require('@sabaki/go-board')\n\nlet board = new Board([\n    [ 0, 0, 0,-1,-1,-1, 1, 0, 1, 1,-1,-1, 0,-1, 0,-1,-1, 1, 0],\n    [ 0, 0,-1, 0,-1, 1, 1, 1, 0, 1,-1, 0,-1,-1,-1,-1, 1, 1, 0],\n    [ 0, 0,-1,-1,-1, 1, 1, 0, 0, 1, 1,-1,-1, 1,-1, 1, 0, 1, 0],\n    [ 0, 0, 0, 0,-1,-1, 1, 0, 1,-1, 1, 1, 1, 1, 1, 0, 1, 0, 0],\n    [ 0, 0, 0, 0,-1, 0,-1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0],\n    [ 0, 0,-1, 0, 0,-1,-1, 1, 0,-1,-1, 1,-1,-1, 0, 1, 0, 0, 1],\n    [ 0, 0, 0,-1,-1, 1, 1, 1, 1, 1, 1, 1, 1,-1,-1,-1, 1, 1, 1],\n    [ 0, 0,-1, 1, 1, 0, 1,-1,-1, 1, 0, 1,-1, 0, 1,-1,-1,-1, 1],\n    [ 0, 0,-1,-1, 1, 1, 1, 0,-1, 1,-1,-1, 0,-1,-1, 1, 1, 1, 1],\n    [ 0, 0,-1, 1, 1,-1,-1,-1,-1, 1, 1, 1,-1,-1,-1,-1, 1,-1,-1],\n    [-1,-1,-1,-1, 1, 1, 1,-1, 0,-1, 1,-1,-1, 0,-1, 1, 1,-1, 0],\n    [-1, 1,-1, 0,-1,-1,-1,-1,-1,-1, 1,-1, 0,-1,-1, 1,-1, 0,-1],\n    [ 1, 1, 1, 1,-1, 1, 1, 1,-1, 1, 0, 1,-1, 0,-1, 1,-1,-1, 0],\n    [ 0, 1,-1, 1, 1,-1,-1, 1,-1, 1, 1, 1,-1, 1,-1, 1, 1,-1, 1],\n    [ 0, 0,-1, 1, 0, 0, 1, 1,-1,-1, 0, 1,-1, 1,-1, 1,-1, 0,-1],\n    [ 0, 0, 1, 0, 1, 0, 1, 1, 1,-1,-1, 1,-1,-1, 1,-1,-1,-1, 0],\n    [ 0, 0, 0, 0, 1, 1, 0, 1,-1, 0,-1,-1, 1, 1, 1, 1,-1,-1,-1],\n    [ 0, 0, 1, 1,-1, 1, 1,-1, 0,-1,-1, 1, 1, 1, 1, 0, 1,-1, 1],\n    [ 0, 0, 0, 1,-1,-1,-1,-1,-1, 0,-1,-1, 1, 1, 0, 1, 1, 1, 0]\n])\n\nlet move = board.makeMove(1, [9, 4])\n~~~\n\n## API\n\n### Sign Map\n\nThe board arrangement is represented by an array of arrays. Each of those subarrays represent one row, all containing the same number of integers. `-1` denotes a white stone, `1` a black stone, and `0` represents an empty vertex.\n\n#### Example\n\n~~~js\n[[ 0, 0, 1, 0,-1,-1, 1, 0, 0],\n [ 1, 0, 1,-1,-1, 1, 1, 1, 0],\n [ 0, 0, 1,-1, 0, 1,-1,-1, 0],\n [ 1, 1, 1,-1,-1,-1, 1,-1, 0],\n [ 1,-1, 1, 1,-1, 1, 1, 1, 0],\n [-1,-1,-1,-1,-1, 1, 0, 0, 0],\n [ 0,-1,-1, 0,-1, 1, 1, 1, 1],\n [ 0, 0, 0, 0, 0,-1,-1,-1, 1],\n [ 0, 0, 0, 0, 0, 0, 0,-1, 0]]\n~~~\n\n### Vertex\n\nBoard positions are represented by a vertex, i.e. an array of the form `[x, y]` where `x` and `y` are non-negative integers, zero-based coordinates. `[0, 0]` denotes the upper left position of the board.\n\n---\n\n### `class Board`\n\n#### Constructors\n\n##### `new Board([signMap])`\n\n- `signMap` [`\u003cSignMap\u003e`](#sign-map) *(optional)* - Default: `[]`\n\n##### `Board.fromDimensions(width[, height])`\n\n- `width` `\u003cInteger\u003e`\n- `height` `\u003cInteger\u003e` *(optional)* - Default: `width`\n\nReturns a new `Board` instance with a [sign map](#sign-map) of the given dimensions that is filled with `0`.\n\n#### Properties\n\n##### `board.signMap`\n\n[`\u003cSignMap\u003e`](#sign-map) - The underlying sign map of the board.\n\n##### `board.width`\n\n`\u003cInteger\u003e` - The board width.\n\n##### `board.height`\n\n`\u003cInteger\u003e` - The board height.\n\n#### Stone Arrangement Functions\n\n##### `board.get(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nReturns the sign at the given `vertex`.\n\n##### `board.set(vertex, sign)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n- `sign` `\u003cInteger\u003e` - One of `-1`, `0`, or `1`\n\nSets the sign at the given `vertex`. No validity checks will be made. This function mutates the board and returns `this` to enable chaining.\n\n##### `board.has(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nReturns a boolean whether the given `vertex` is valid or can be found on the board.\n\n##### `board.clear()`\n\nSets the sign of all vertices to `0`. This function mutates the board and returns `this` to enable chaining.\n\n##### `board.makeMove(sign, vertex[, options])`\n\n- `sign` `\u003cInteger\u003e` - One of `-1`, `0`, or `1`\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n- `options` `\u003cObject\u003e` *(optional)*\n    - `preventOverwrite` `\u003cBoolean\u003e` - Default: `false`\n    - `preventSuicide` `\u003cBoolean\u003e` - Default: `false`\n    - `preventKo` `\u003cBoolean\u003e` - Default: `false`\n\nReturns a new board instance that represents the board state after the player who corresponds to the given `sign` makes a move at `vertex`. The capture count will also be updated correctly. If `board` is [valid](#boardisvalid) then the new returned board instance will also be valid. This function will not mutate `board`. If `sign` is `0` or `vertex` not valid, this function will be equivalent to [`clone()`](#boardclone).\n\nIf `preventOverwrite` is set to `true`, this function will throw an error if the attempted move is on a vertex that is already occupied by a stone.\n\nIf `preventSuicide` is set to `true`, this function will throw an error if the attempted move is a suicide.\n\nIf `preventKo` is set to `true`, this function will throw an error if the attempted move repeats the position that led to `board`.\n\n##### `board.analyzeMove(sign, vertex)`\n\n- `sign` `\u003cInteger\u003e` - One of `-1`, `0`, or `1`\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nAnalyzes the hypothetical move that the player who corresponds to the given `sign` would make at `vertex`. Returns an object with the following keys with boolean values:\n\n- `pass` - Specifies if the move would be a pass (`sign` is `0` or `vertex` is not valid)\n- `overwrite` - Specifies if the move would overwrite an occupied stone on the board\n- `capturing` - Specifies if the move would capture some enemy stone\n- `suicide` - Specifies if the move would end up in a suicide\n- `ko` - Specifies if the move would repeat the position that led to `board`\n\n#### Capture Count Functions\n\n##### `board.getCaptures(sign)`\n\n- `sign` `\u003cInteger\u003e` - One of `-1` or `1`\n\nReturns the number of stones that the player, who corresponds to the given `sign`, captured.\n\n##### `board.setCaptures(sign, mutator)`\n\n- `sign` `\u003cInteger\u003e` - One of `-1` or `1`\n- `mutator` `\u003cFunction | Integer\u003e`\n\nIf `mutator` is a function of the following form\n\n~~~js\n(prevCaptures: \u003cInteger\u003e) -\u003e \u003cInteger\u003e\n~~~\n\nwe will update the capture count of the player who corresponds to the given `sign` according to the `mutator` function. If `mutator` is an integer, we will directly set the capture count to `mutator` instead. This function mutates the board and returns `this` to enable chaining.\n\n#### Board Property Functions\n\n##### `board.isSquare()`\n\nEquivalent to `board.width === board.height`.\n\n##### `board.isEmpty()`\n\nReturns `true` if [`signMap`](#boardsignmap) contains `0` only, otherwise `false`.\n\n##### `board.isValid()`\n\nReturns `true` if all [chains](#boardgetchainvertex) have at least one liberty, otherwise `false`.\n\n#### Topology Functions\n\n##### `board.getDistance(vertex1, vertex2)`\n\n- `vertex1` [`\u003cVertex\u003e`](#vertex)\n- `vertex2` [`\u003cVertex\u003e`](#vertex)\n\nReturns the [Manhattan distance](https://en.wikipedia.org/wiki/Taxicab_geometry) between the given vertices.\n\n##### `board.getNeighbors(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nReturns an array of [vertices](#vertex) on the board that are exactly [Manhattan distance](https://en.wikipedia.org/wiki/Taxicab_geometry) `1` away from the given `vertex`.\n\n##### `board.getConnectedComponent(vertex, predicate)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n- `predicate` `\u003cFunction\u003e`\n\n`predicate` is a function of the following form:\n\n~~~js\n(vertex: \u003cVertex\u003e) -\u003e \u003cBoolean\u003e\n~~~\n\nReturns a list of [vertices](#vertex) that fulfill `predicate` and connect to `vertex` through a string of vertices that all fulfill `predicate`.\n\n##### `board.getChain(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nEquivalent to `board.getConnectedComponent(vertex, v =\u003e board.get(v) === board.get(vertex))`.\n\n##### `board.getRelatedChains(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nReturns an array of [vertices](#vertex) of the same sign as `vertex` that belong to the same enemy area as `vertex`.\n\n##### `board.getLiberties(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nReturns an array of [vertices](#vertex) that represents the liberties of the chain that `vertex` belongs to.\n\n##### `board.hasLiberties(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nEquivalent to `board.getLiberties(vertex).length \u003e 0`, but faster.\n\n#### Helper Functions\n\n##### `board.clone()`\n\nReturns a new `Board` instance that is equivalent to `board`, but mutations to either of them will not affect one another.\n\n##### `board.diff(otherBoard)`\n\n- `board` [`\u003cBoard\u003e`](#class-board)\n\nReturns an array of [vertices](#vertex) whose signs are not identical in `board` and `otherBoard`. If `otherBoard` has different dimensions from `board`, this will return `null`.\n\n##### `board.stringifyVertex(vertex)`\n\n- `vertex` [`\u003cVertex\u003e`](#vertex)\n\nReturns a string that represents the given `vertex`. If `vertex` is invalid or not on the board, an empty string will be returned.\n\n##### `board.parseVertex(coord)`\n\n- `coord` `\u003cString\u003e`\n\nReturns a [vertex](#vertex) that the given `coord` represents. If `coord` is invalid or not on the board, `[-1, -1]` will be returned.\n\n##### `board.getHandicapPlacement(count)`\n\n- `count` `\u003cInteger\u003e`\n\nReturns a list of [vertices](#vertex) that represent the positions of black handicap stones.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsabakihq%2Fgo-board","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsabakihq%2Fgo-board","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsabakihq%2Fgo-board/lists"}