README.md
1 # snapdragon-util [](https://www.npmjs.com/package/snapdragon-util) [](https://npmjs.org/package/snapdragon-util) [](https://npmjs.org/package/snapdragon-util) [](https://travis-ci.org/jonschlinkert/snapdragon-util) 2 3 > Utilities for the snapdragon parser/compiler. 4 5 <details> 6 <summary><strong>Table of Contents</strong></summary> 7 8 - [Install](#install) 9 - [Usage](#usage) 10 - [API](#api) 11 - [Release history](#release-history) 12 * [[3.0.0] - 2017-05-01](#300---2017-05-01) 13 * [[0.1.0]](#010) 14 - [About](#about) 15 16 </details> 17 18 ## Install 19 20 Install with [npm](https://www.npmjs.com/): 21 22 ```sh 23 $ npm install --save snapdragon-util 24 ``` 25 26 Install with [yarn](https://yarnpkg.com): 27 28 ```sh 29 $ yarn add snapdragon-util 30 ``` 31 32 ## Usage 33 34 ```js 35 var util = require('snapdragon-util'); 36 ``` 37 38 ## API 39 40 ### [.isNode](index.js#L21) 41 42 Returns true if the given value is a node. 43 44 **Params** 45 46 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 47 * `returns` **{Boolean}** 48 49 **Example** 50 51 ```js 52 var Node = require('snapdragon-node'); 53 var node = new Node({type: 'foo'}); 54 console.log(utils.isNode(node)); //=> true 55 console.log(utils.isNode({})); //=> false 56 ``` 57 58 ### [.noop](index.js#L37) 59 60 Emit an empty string for the given `node`. 61 62 **Params** 63 64 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 65 * `returns` **{undefined}** 66 67 **Example** 68 69 ```js 70 // do nothing for beginning-of-string 71 snapdragon.compiler.set('bos', utils.noop); 72 ``` 73 74 ### [.identity](index.js#L53) 75 76 Appdend `node.val` to `compiler.output`, exactly as it was created by the parser. 77 78 **Params** 79 80 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 81 * `returns` **{undefined}** 82 83 **Example** 84 85 ```js 86 snapdragon.compiler.set('text', utils.identity); 87 ``` 88 89 ### [.append](index.js#L76) 90 91 Previously named `.emit`, this method appends the given `val` to `compiler.output` for the given node. Useful when you know what value should be appended advance, regardless of the actual value of `node.val`. 92 93 **Params** 94 95 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 96 * `returns` **{Function}**: Returns a compiler middleware function. 97 98 **Example** 99 100 ```js 101 snapdragon.compiler 102 .set('i', function(node) { 103 this.mapVisit(node); 104 }) 105 .set('i.open', utils.append('<i>')) 106 .set('i.close', utils.append('</i>')) 107 ``` 108 109 ### [.toNoop](index.js#L99) 110 111 Used in compiler middleware, this onverts an AST node into an empty `text` node and deletes `node.nodes` if it exists. The advantage of this method is that, as opposed to completely removing the node, indices will not need to be re-calculated in sibling nodes, and nothing is appended to the output. 112 113 **Params** 114 115 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 116 * `nodes` **{Array}**: Optionally pass a new `nodes` value, to replace the existing `node.nodes` array. 117 118 **Example** 119 120 ```js 121 utils.toNoop(node); 122 // convert `node.nodes` to the given value instead of deleting it 123 utils.toNoop(node, []); 124 ``` 125 126 ### [.visit](index.js#L128) 127 128 Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon automatically calls registered compilers, this allows you to pass a visitor function. 129 130 **Params** 131 132 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 133 * `fn` **{Function}** 134 * `returns` **{Object}**: returns the node after recursively visiting all child nodes. 135 136 **Example** 137 138 ```js 139 snapdragon.compiler.set('i', function(node) { 140 utils.visit(node, function(childNode) { 141 // do stuff with "childNode" 142 return childNode; 143 }); 144 }); 145 ``` 146 147 ### [.mapVisit](index.js#L155) 148 149 Map [visit](#visit) the given `fn` over `node.nodes`. This is called by [visit](#visit), use this method if you do not want `fn` to be called on the first node. 150 151 **Params** 152 153 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 154 * `options` **{Object}** 155 * `fn` **{Function}** 156 * `returns` **{Object}**: returns the node 157 158 **Example** 159 160 ```js 161 snapdragon.compiler.set('i', function(node) { 162 utils.mapVisit(node, function(childNode) { 163 // do stuff with "childNode" 164 return childNode; 165 }); 166 }); 167 ``` 168 169 ### [.addOpen](index.js#L194) 170 171 Unshift an `*.open` node onto `node.nodes`. 172 173 **Params** 174 175 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 176 * `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node). 177 * `filter` **{Function}**: Optionaly specify a filter function to exclude the node. 178 * `returns` **{Object}**: Returns the created opening node. 179 180 **Example** 181 182 ```js 183 var Node = require('snapdragon-node'); 184 snapdragon.parser.set('brace', function(node) { 185 var match = this.match(/^{/); 186 if (match) { 187 var parent = new Node({type: 'brace'}); 188 utils.addOpen(parent, Node); 189 console.log(parent.nodes[0]): 190 // { type: 'brace.open', val: '' }; 191 192 // push the parent "brace" node onto the stack 193 this.push(parent); 194 195 // return the parent node, so it's also added to the AST 196 return brace; 197 } 198 }); 199 ``` 200 201 ### [.addClose](index.js#L244) 202 203 Push a `*.close` node onto `node.nodes`. 204 205 **Params** 206 207 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 208 * `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node). 209 * `filter` **{Function}**: Optionaly specify a filter function to exclude the node. 210 * `returns` **{Object}**: Returns the created closing node. 211 212 **Example** 213 214 ```js 215 var Node = require('snapdragon-node'); 216 snapdragon.parser.set('brace', function(node) { 217 var match = this.match(/^}/); 218 if (match) { 219 var parent = this.parent(); 220 if (parent.type !== 'brace') { 221 throw new Error('missing opening: ' + '}'); 222 } 223 224 utils.addClose(parent, Node); 225 console.log(parent.nodes[parent.nodes.length - 1]): 226 // { type: 'brace.close', val: '' }; 227 228 // no need to return a node, since the parent 229 // was already added to the AST 230 return; 231 } 232 }); 233 ``` 234 235 ### [.wrapNodes](index.js#L274) 236 237 Wraps the given `node` with `*.open` and `*.close` nodes. 238 239 **Params** 240 241 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 242 * `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node). 243 * `filter` **{Function}**: Optionaly specify a filter function to exclude the node. 244 * `returns` **{Object}**: Returns the node 245 246 ### [.pushNode](index.js#L299) 247 248 Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent. 249 250 **Params** 251 252 * `parent` **{Object}** 253 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 254 * `returns` **{Object}**: Returns the child node 255 256 **Example** 257 258 ```js 259 var parent = new Node({type: 'foo'}); 260 var node = new Node({type: 'bar'}); 261 utils.pushNode(parent, node); 262 console.log(parent.nodes[0].type) // 'bar' 263 console.log(node.parent.type) // 'foo' 264 ``` 265 266 ### [.unshiftNode](index.js#L325) 267 268 Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent. 269 270 **Params** 271 272 * `parent` **{Object}** 273 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 274 * `returns` **{undefined}** 275 276 **Example** 277 278 ```js 279 var parent = new Node({type: 'foo'}); 280 var node = new Node({type: 'bar'}); 281 utils.unshiftNode(parent, node); 282 console.log(parent.nodes[0].type) // 'bar' 283 console.log(node.parent.type) // 'foo' 284 ``` 285 286 ### [.popNode](index.js#L354) 287 288 Pop the last `node` off of `parent.nodes`. The advantage of using this method is that it checks for `node.nodes` and works with any version of `snapdragon-node`. 289 290 **Params** 291 292 * `parent` **{Object}** 293 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 294 * `returns` **{Number|Undefined}**: Returns the length of `node.nodes` or undefined. 295 296 **Example** 297 298 ```js 299 var parent = new Node({type: 'foo'}); 300 utils.pushNode(parent, new Node({type: 'foo'})); 301 utils.pushNode(parent, new Node({type: 'bar'})); 302 utils.pushNode(parent, new Node({type: 'baz'})); 303 console.log(parent.nodes.length); //=> 3 304 utils.popNode(parent); 305 console.log(parent.nodes.length); //=> 2 306 ``` 307 308 ### [.shiftNode](index.js#L382) 309 310 Shift the first `node` off of `parent.nodes`. The advantage of using this method is that it checks for `node.nodes` and works with any version of `snapdragon-node`. 311 312 **Params** 313 314 * `parent` **{Object}** 315 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 316 * `returns` **{Number|Undefined}**: Returns the length of `node.nodes` or undefined. 317 318 **Example** 319 320 ```js 321 var parent = new Node({type: 'foo'}); 322 utils.pushNode(parent, new Node({type: 'foo'})); 323 utils.pushNode(parent, new Node({type: 'bar'})); 324 utils.pushNode(parent, new Node({type: 'baz'})); 325 console.log(parent.nodes.length); //=> 3 326 utils.shiftNode(parent); 327 console.log(parent.nodes.length); //=> 2 328 ``` 329 330 ### [.removeNode](index.js#L409) 331 332 Remove the specified `node` from `parent.nodes`. 333 334 **Params** 335 336 * `parent` **{Object}** 337 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 338 * `returns` **{Object|undefined}**: Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`. 339 340 **Example** 341 342 ```js 343 var parent = new Node({type: 'abc'}); 344 var foo = new Node({type: 'foo'}); 345 utils.pushNode(parent, foo); 346 utils.pushNode(parent, new Node({type: 'bar'})); 347 utils.pushNode(parent, new Node({type: 'baz'})); 348 console.log(parent.nodes.length); //=> 3 349 utils.removeNode(parent, foo); 350 console.log(parent.nodes.length); //=> 2 351 ``` 352 353 ### [.isType](index.js#L443) 354 355 Returns true if `node.type` matches the given `type`. Throws a `TypeError` if `node` is not an instance of `Node`. 356 357 **Params** 358 359 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 360 * `type` **{String}** 361 * `returns` **{Boolean}** 362 363 **Example** 364 365 ```js 366 var Node = require('snapdragon-node'); 367 var node = new Node({type: 'foo'}); 368 console.log(utils.isType(node, 'foo')); // false 369 console.log(utils.isType(node, 'bar')); // true 370 ``` 371 372 ### [.hasType](index.js#L486) 373 374 Returns true if the given `node` has the given `type` in `node.nodes`. Throws a `TypeError` if `node` is not an instance of `Node`. 375 376 **Params** 377 378 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 379 * `type` **{String}** 380 * `returns` **{Boolean}** 381 382 **Example** 383 384 ```js 385 var Node = require('snapdragon-node'); 386 var node = new Node({ 387 type: 'foo', 388 nodes: [ 389 new Node({type: 'bar'}), 390 new Node({type: 'baz'}) 391 ] 392 }); 393 console.log(utils.hasType(node, 'xyz')); // false 394 console.log(utils.hasType(node, 'baz')); // true 395 ``` 396 397 ### [.firstOfType](index.js#L519) 398 399 Returns the first node from `node.nodes` of the given `type` 400 401 **Params** 402 403 * `nodes` **{Array}** 404 * `type` **{String}** 405 * `returns` **{Object|undefined}**: Returns the first matching node or undefined. 406 407 **Example** 408 409 ```js 410 var node = new Node({ 411 type: 'foo', 412 nodes: [ 413 new Node({type: 'text', val: 'abc'}), 414 new Node({type: 'text', val: 'xyz'}) 415 ] 416 }); 417 418 var textNode = utils.firstOfType(node.nodes, 'text'); 419 console.log(textNode.val); 420 //=> 'abc' 421 ``` 422 423 ### [.findNode](index.js#L556) 424 425 Returns the node at the specified index, or the first node of the given `type` from `node.nodes`. 426 427 **Params** 428 429 * `nodes` **{Array}** 430 * `type` **{String|Number}**: Node type or index. 431 * `returns` **{Object}**: Returns a node or undefined. 432 433 **Example** 434 435 ```js 436 var node = new Node({ 437 type: 'foo', 438 nodes: [ 439 new Node({type: 'text', val: 'abc'}), 440 new Node({type: 'text', val: 'xyz'}) 441 ] 442 }); 443 444 var nodeOne = utils.findNode(node.nodes, 'text'); 445 console.log(nodeOne.val); 446 //=> 'abc' 447 448 var nodeTwo = utils.findNode(node.nodes, 1); 449 console.log(nodeTwo.val); 450 //=> 'xyz' 451 ``` 452 453 ### [.isOpen](index.js#L584) 454 455 Returns true if the given node is an "*.open" node. 456 457 **Params** 458 459 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 460 * `returns` **{Boolean}** 461 462 **Example** 463 464 ```js 465 var Node = require('snapdragon-node'); 466 var brace = new Node({type: 'brace'}); 467 var open = new Node({type: 'brace.open'}); 468 var close = new Node({type: 'brace.close'}); 469 470 console.log(utils.isOpen(brace)); // false 471 console.log(utils.isOpen(open)); // true 472 console.log(utils.isOpen(close)); // false 473 ``` 474 475 ### [.isClose](index.js#L607) 476 477 Returns true if the given node is a "*.close" node. 478 479 **Params** 480 481 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 482 * `returns` **{Boolean}** 483 484 **Example** 485 486 ```js 487 var Node = require('snapdragon-node'); 488 var brace = new Node({type: 'brace'}); 489 var open = new Node({type: 'brace.open'}); 490 var close = new Node({type: 'brace.close'}); 491 492 console.log(utils.isClose(brace)); // false 493 console.log(utils.isClose(open)); // false 494 console.log(utils.isClose(close)); // true 495 ``` 496 497 ### [.hasOpen](index.js#L633) 498 499 Returns true if `node.nodes` **has** an `.open` node 500 501 **Params** 502 503 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 504 * `returns` **{Boolean}** 505 506 **Example** 507 508 ```js 509 var Node = require('snapdragon-node'); 510 var brace = new Node({ 511 type: 'brace', 512 nodes: [] 513 }); 514 515 var open = new Node({type: 'brace.open'}); 516 console.log(utils.hasOpen(brace)); // false 517 518 brace.pushNode(open); 519 console.log(utils.hasOpen(brace)); // true 520 ``` 521 522 ### [.hasClose](index.js#L663) 523 524 Returns true if `node.nodes` **has** a `.close` node 525 526 **Params** 527 528 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 529 * `returns` **{Boolean}** 530 531 **Example** 532 533 ```js 534 var Node = require('snapdragon-node'); 535 var brace = new Node({ 536 type: 'brace', 537 nodes: [] 538 }); 539 540 var close = new Node({type: 'brace.close'}); 541 console.log(utils.hasClose(brace)); // false 542 543 brace.pushNode(close); 544 console.log(utils.hasClose(brace)); // true 545 ``` 546 547 ### [.hasOpenAndClose](index.js#L697) 548 549 Returns true if `node.nodes` has both `.open` and `.close` nodes 550 551 **Params** 552 553 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 554 * `returns` **{Boolean}** 555 556 **Example** 557 558 ```js 559 var Node = require('snapdragon-node'); 560 var brace = new Node({ 561 type: 'brace', 562 nodes: [] 563 }); 564 565 var open = new Node({type: 'brace.open'}); 566 var close = new Node({type: 'brace.close'}); 567 console.log(utils.hasOpen(brace)); // false 568 console.log(utils.hasClose(brace)); // false 569 570 brace.pushNode(open); 571 brace.pushNode(close); 572 console.log(utils.hasOpen(brace)); // true 573 console.log(utils.hasClose(brace)); // true 574 ``` 575 576 ### [.addType](index.js#L719) 577 578 Push the given `node` onto the `state.inside` array for the given type. This array is used as a specialized "stack" for only the given `node.type`. 579 580 **Params** 581 582 * `state` **{Object}**: The `compiler.state` object or custom state object. 583 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 584 * `returns` **{Array}**: Returns the `state.inside` stack for the given type. 585 586 **Example** 587 588 ```js 589 var state = { inside: {}}; 590 var node = new Node({type: 'brace'}); 591 utils.addType(state, node); 592 console.log(state.inside); 593 //=> { brace: [{type: 'brace'}] } 594 ``` 595 596 ### [.removeType](index.js#L759) 597 598 Remove the given `node` from the `state.inside` array for the given type. This array is used as a specialized "stack" for only the given `node.type`. 599 600 **Params** 601 602 * `state` **{Object}**: The `compiler.state` object or custom state object. 603 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 604 * `returns` **{Array}**: Returns the `state.inside` stack for the given type. 605 606 **Example** 607 608 ```js 609 var state = { inside: {}}; 610 var node = new Node({type: 'brace'}); 611 utils.addType(state, node); 612 console.log(state.inside); 613 //=> { brace: [{type: 'brace'}] } 614 utils.removeType(state, node); 615 //=> { brace: [] } 616 ``` 617 618 ### [.isEmpty](index.js#L788) 619 620 Returns true if `node.val` is an empty string, or `node.nodes` does not contain any non-empty text nodes. 621 622 **Params** 623 624 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 625 * `fn` **{Function}** 626 * `returns` **{Boolean}** 627 628 **Example** 629 630 ```js 631 var node = new Node({type: 'text'}); 632 utils.isEmpty(node); //=> true 633 node.val = 'foo'; 634 utils.isEmpty(node); //=> false 635 ``` 636 637 ### [.isInsideType](index.js#L833) 638 639 Returns true if the `state.inside` stack for the given type exists and has one or more nodes on it. 640 641 **Params** 642 643 * `state` **{Object}** 644 * `type` **{String}** 645 * `returns` **{Boolean}** 646 647 **Example** 648 649 ```js 650 var state = { inside: {}}; 651 var node = new Node({type: 'brace'}); 652 console.log(utils.isInsideType(state, 'brace')); //=> false 653 utils.addType(state, node); 654 console.log(utils.isInsideType(state, 'brace')); //=> true 655 utils.removeType(state, node); 656 console.log(utils.isInsideType(state, 'brace')); //=> false 657 ``` 658 659 ### [.isInside](index.js#L867) 660 661 Returns true if `node` is either a child or grand-child of the given `type`, or `state.inside[type]` is a non-empty array. 662 663 **Params** 664 665 * `state` **{Object}**: Either the `compiler.state` object, if it exists, or a user-supplied state object. 666 * `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) 667 * `type` **{String}**: The `node.type` to check for. 668 * `returns` **{Boolean}** 669 670 **Example** 671 672 ```js 673 var state = { inside: {}}; 674 var node = new Node({type: 'brace'}); 675 var open = new Node({type: 'brace.open'}); 676 console.log(utils.isInside(state, open, 'brace')); //=> false 677 utils.pushNode(node, open); 678 console.log(utils.isInside(state, open, 'brace')); //=> true 679 ``` 680 681 ### [.last](index.js#L915) 682 683 Get the last `n` element from the given `array`. Used for getting 684 a node from `node.nodes.` 685 686 **Params** 687 688 * `array` **{Array}** 689 * `n` **{Number}** 690 * `returns` **{undefined}** 691 692 ### [.arrayify](index.js#L935) 693 694 Cast the given `val` to an array. 695 696 **Params** 697 698 * `val` **{any}** 699 * `returns` **{Array}** 700 701 **Example** 702 703 ```js 704 console.log(utils.arraify('')); 705 //=> [] 706 console.log(utils.arraify('foo')); 707 //=> ['foo'] 708 console.log(utils.arraify(['foo'])); 709 //=> ['foo'] 710 ``` 711 712 ### [.stringify](index.js#L948) 713 714 Convert the given `val` to a string by joining with `,`. Useful 715 for creating a cheerio/CSS/DOM-style selector from a list of strings. 716 717 **Params** 718 719 * `val` **{any}** 720 * `returns` **{Array}** 721 722 ### [.trim](index.js#L961) 723 724 Ensure that the given value is a string and call `.trim()` on it, 725 or return an empty string. 726 727 **Params** 728 729 * `str` **{String}** 730 * `returns` **{String}** 731 732 ## Release history 733 734 Changelog entries are classified using the following labels from [keep-a-changelog](https://github.com/olivierlacan/keep-a-changelog): 735 736 * `added`: for new features 737 * `changed`: for changes in existing functionality 738 * `deprecated`: for once-stable features removed in upcoming releases 739 * `removed`: for deprecated features removed in this release 740 * `fixed`: for any bug fixes 741 742 Custom labels used in this changelog: 743 744 * `dependencies`: bumps dependencies 745 * `housekeeping`: code re-organization, minor edits, or other changes that don't fit in one of the other categories. 746 747 ### [3.0.0] - 2017-05-01 748 749 **Changed** 750 751 * `.emit` was renamed to [.append](#append) 752 * `.addNode` was renamed to [.pushNode](#pushNode) 753 * `.getNode` was renamed to [.findNode](#findNode) 754 * `.isEmptyNodes` was renamed to [.isEmpty](#isEmpty): also now works with `node.nodes` and/or `node.val` 755 756 **Added** 757 758 * [.identity](#identity) 759 * [.removeNode](#removeNode) 760 * [.shiftNode](#shiftNode) 761 * [.popNode](#popNode) 762 763 ### [0.1.0] 764 765 First release. 766 767 ## About 768 769 ### Contributing 770 771 Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). 772 773 Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. 774 775 ### Building docs 776 777 _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ 778 779 To generate the readme, run the following command: 780 781 ```sh 782 $ npm install -g verbose/verb#dev verb-generate-readme && verb 783 ``` 784 785 ### Running tests 786 787 Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: 788 789 ```sh 790 $ npm install && npm test 791 ``` 792 793 ### Author 794 795 **Jon Schlinkert** 796 797 * [github/jonschlinkert](https://github.com/jonschlinkert) 798 * [twitter/jonschlinkert](https://twitter.com/jonschlinkert) 799 800 ### License 801 802 Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). 803 Released under the [MIT License](LICENSE). 804 805 *** 806 807 _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 01, 2017._