# MapExplorer Core
[![build status](https://travis-ci.org/stratumn/mapexplorer-core.svg?branch=master)](https://travis-ci.org/stratumn/mapexplorer-core.svg?branch=master)
Core library for building Map Explorer components
## Installation
### Browser
```html
```
If you want a specific version, include `https://libs.stratumn.com/mapexplorer-core-{version}.min.js` instead (for instance `https://libs.stratumn.com/mapexplorer-core-0.4.1.min.js`).
### Node.js
```
$ npm install mapexplorer-core
```
```javascript
var MapexplorerCore = require('mapexplorer-core');
```
### Bower
```
$ bower install mapexplorer-core
```
## Usage
### Display a map explorer
```javascript
const builder = new MapexplorerCore.ChainTreeBuilder(element);
// with an application and a mapId
builder.build({
id: myMapId,
application: myApplication
}, options);
// with a chainscript (JSON string of array of segment as POJO)
builder.build({
chainscript: myChainscript
}), options;
```
#### Available options
##### withArgs
```
Default: false
```
Display action arguments on the paths between segments.
##### duration
```
Default: 750
```
Transition duration
##### verticalSpacing
```
Default: 1.2
```
Vertical space factor between segment polygon
##### polygonSize
```
Default:
{
width: 78,
height: 91
}
```
Object with width and height properties that gives the size (in pixels) of the polygon representing
a segment.
##### getArrowLength()
```
Default: () => this.polygonSize.width
```
Function that returns the length (in pixels) of the transition arrow.
#### box
```
Default:
() => return {
width: this.polygonSize.width,
height: 25
}
```
Function that return an object with width and height properties that gives the size (in pixels) of the box containing the
segment text.
##### getSegmentText(node)
```
Default: node => compactHash(node.data.meta.linkHash)
```
Function that returns the text displayed on a segment.
##### getLinkText(node)
```
Default:
function(node) {
return node.target.data.link.meta.action +
(this.withArgs ? `(${node.target.data.link.meta.arguments.join(', ')})` : '');
}
```
Function that return the text displayed on a path between segments.
##### onclick(data)
```
Default: noop
```
##### onTag(tag)
```
Default: noop
```
Hook that is called when a segment is tagged
Event handler called when the user clicks on a segment.
### Display a merkle path tree
```javascript
const merklePathTree = new MapexplorerCore.MerklePathTree(element);
merklePathTree.display(merklePath);
```
where `merklePath` looks like:
```
[
{
"left": "14b9468d3b8ca51b45e27ecddc5875a48902a74d1182fed9693c1531dfcfd56c",
"right": "d15e1460234292852400271530be35cabe822eae5a4ed3376728d5acbbf04f27",
"parent": "3bfbc00bfe7aa149e17029e8bb08671636c1c1c16aa5addfc307d6c937134620"
},
{
"left": "3bfbc00bfe7aa149e17029e8bb08671636c1c1c16aa5addfc307d6c937134620",
"right": "9fd68d3335eabcad5777b4c717af6de3c51f4aa0af72c26aaf866cde176c96f1",
"parent": "8f16bfbe247be6ca881f3d9e462bc154f099298e26cd53662ef7119e1e60a887"
},
...
]
```
### Validate a chainscript
```javascript
new MapexplorerCore.ChainValidator(JSON.parse(chainscript)).validate()
```
Returns a Promise that resolves to an error object such as:
```
{
linkHash: [Promise, ...],
stateHash: [Promise, ...],
merklePath: [Promise, ...],
fossil: [Promise, ...]
}
```
Each promise, in each array of each category resolves to an error string if an inconsistency has been detected. It resolves to null otherwise.
Errors can be retrieved with (for instance):
```javascript
Promise.all(errors.linkHash).
then(err => err.filter(Boolean));
```
## Development
Install dependencies:
```
$ npm install
```
Build:
```
$ npm run build:all
```
Test:
```
$ npm test
```
Lint:
```
$ npm run lint
```
Lint and test:
```
$ npm run check
```
Bump version:
```
$ npm version major|minor|patch
```
Publish:
```
$ npm publish
```