├── .nvmrc ├── .editorconfig ├── rollup.config.js ├── lerna.json ├── .travis.yml ├── test ├── utils.js ├── test_duplicates.js └── test_alive.js ├── packages ├── core │ ├── CHANGELOG.md │ ├── package.json │ ├── README.md │ ├── src.js │ └── yarn.lock ├── duplicate │ ├── package.json │ ├── src.js │ ├── CHANGELOG.md │ └── README.md └── alive │ ├── package.json │ ├── src.js │ ├── CHANGELOG.md │ ├── README.md │ └── yarn.lock ├── README.md ├── LICENSE.md ├── CONTRIBUTING.md ├── .gitignore └── package.json /.nvmrc: -------------------------------------------------------------------------------- 1 | v8.2.1 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | charset = utf-8 8 | indent_style = space 9 | indent_size = 2 10 | 11 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | const commonjs = require('rollup-plugin-commonjs') 2 | const babel = require('rollup-plugin-babel') 3 | 4 | module.exports = { 5 | format: 'cjs', 6 | plugins: [ 7 | commonjs(), 8 | babel({ 9 | exclude: 'node_modules/**' 10 | }) 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "lerna": "2.0.0", 3 | "packages": [ 4 | "packages/*" 5 | ], 6 | "command": { 7 | "publish": { 8 | "ignore": [ 9 | "node_modules", 10 | "src.js" 11 | ] 12 | } 13 | }, 14 | "conventionalCommits": true, 15 | "npmClient": "yarn", 16 | "version": "independent" 17 | } 18 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | sudo: false 4 | 5 | cache: 6 | directories: 7 | - node_modules 8 | 9 | node_js: 10 | - 7 11 | - 8 12 | 13 | install: 14 | - npm install -g yarn lerna 15 | - yarn install 16 | 17 | script: 18 | - yarn coveralls 19 | 20 | notifications: 21 | email: 22 | on_success: never 23 | on_failure: change 24 | -------------------------------------------------------------------------------- /test/utils.js: -------------------------------------------------------------------------------- 1 | const remark = require('remark') 2 | const remarkLint = require('remark-lint') 3 | const dedent = require('dedent') 4 | 5 | // Utils: 6 | 7 | const lintFabric = (middleware) => { 8 | return (md, options) => { 9 | return remark() 10 | .use(remarkLint) 11 | .use(middleware, options) 12 | .process(dedent(md)) 13 | } 14 | } 15 | 16 | module.exports = lintFabric 17 | -------------------------------------------------------------------------------- /packages/core/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 5 | 6 | 7 | ## [0.2.1](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-core@0.2.0...remark-lint-are-links-valid-core@0.2.1) (2017-08-07) 8 | 9 | 10 | 11 | 12 | 13 | # [0.2.0](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-core@0.1.0...remark-lint-are-links-valid-core@0.2.0) (2017-08-07) 14 | 15 | 16 | ### Features 17 | 18 | * **documentation:** adds README for every package ([c56bbd8](https://github.com/wemake-services/remark-lint-are-links-valid/commit/c56bbd8)) 19 | -------------------------------------------------------------------------------- /packages/duplicate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-lint-are-links-valid-duplicate", 3 | "version": "0.2.2", 4 | "description": "Checks if links are unique", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "../../node_modules/.bin/rollup -c ../../rollup.config.js -i src.js -o index.js" 8 | }, 9 | "dependencies": { 10 | "remark-lint-are-links-valid-core": "^0.2.1" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/wemake-services/remark-lint-are-links-valid.git" 15 | }, 16 | "keywords": [ 17 | "remark", 18 | "remark-lint", 19 | "links", 20 | "validation", 21 | "markdown" 22 | ], 23 | "author": "Nikita Sobolev", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/wemake-services/remark-lint-are-links-valid/issues" 27 | }, 28 | "homepage": "https://github.com/wemake-services/remark-lint-are-links-valid#readme" 29 | } 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # remark-lint-are-links-valid 2 | 3 | [![Build Status](https://travis-ci.org/wemake-services/remark-lint-are-links-valid.svg?branch=master)](https://travis-ci.org/wemake-services/remark-lint-are-links-valid) [![Coverage Status](https://coveralls.io/repos/github/wemake-services/remark-lint-are-links-valid/badge.svg?branch=master)](https://coveralls.io/github/wemake-services/remark-lint-are-links-valid?branch=master) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) 4 | 5 | > Make your links to follow your rules! 6 | 7 | ## Installation 8 | 9 | Install only packages you need. See `packages/*` folder. 10 | 11 | Here are the list of rules: 12 | 1. `remark-lint-are-links-valid-duplicate` - checks that link is unique on a page 13 | 2. `remark-lint-are-links-valid-alive` - checks that link is reachable 14 | 15 | 16 | ## License 17 | 18 | MIT, see [LICENSE.md](LICENSE.md) for details. 19 | -------------------------------------------------------------------------------- /packages/alive/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-lint-are-links-valid-alive", 3 | "version": "0.3.0", 4 | "description": "Checks if links are still alive", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "../../node_modules/.bin/rollup -c ../../rollup.config.js -i src.js -o index.js" 8 | }, 9 | "dependencies": { 10 | "broken-link-checker": "^0.7.6", 11 | "remark-lint-are-links-valid-core": "^0.2.1" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/wemake-services/remark-lint-are-links-valid.git" 16 | }, 17 | "keywords": [ 18 | "remark", 19 | "remark-lint", 20 | "links", 21 | "validation", 22 | "markdown" 23 | ], 24 | "author": "Nikita Sobolev", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/wemake-services/remark-lint-are-links-valid/issues" 28 | }, 29 | "homepage": "https://github.com/wemake-services/remark-lint-are-links-valid#readme" 30 | } 31 | -------------------------------------------------------------------------------- /packages/core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-lint-are-links-valid-core", 3 | "version": "0.2.1", 4 | "description": "Checks if links are valid", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "../../node_modules/.bin/rollup -c ../../rollup.config.js -i src.js -o index.js" 8 | }, 9 | "dependencies": { 10 | "object.defaults": "^1.1.0", 11 | "unified-lint-rule": "^1.0.1", 12 | "unist-util-visit": "^1.1.3" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/wemake-services/remark-lint-are-links-valid.git" 17 | }, 18 | "keywords": [ 19 | "remark", 20 | "remark-lint", 21 | "links", 22 | "validation", 23 | "markdown" 24 | ], 25 | "author": "Nikita Sobolev", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/wemake-services/remark-lint-are-links-valid/issues" 29 | }, 30 | "homepage": "https://github.com/wemake-services/remark-lint-are-links-valid#readme" 31 | } 32 | -------------------------------------------------------------------------------- /packages/core/README.md: -------------------------------------------------------------------------------- 1 | # remark-lint-are-links-valid-core 2 | 3 | [![Build Status](https://travis-ci.org/wemake-services/remark-lint-are-links-valid.svg?branch=master)](https://travis-ci.org/wemake-services/remark-lint-are-links-valid) [![Coverage Status](https://coveralls.io/repos/github/wemake-services/remark-lint-are-links-valid/badge.svg?branch=master)](https://coveralls.io/github/wemake-services/remark-lint-are-links-valid?branch=master) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) 4 | 5 | > Make your links to follow your rules! 6 | 7 | 8 | ## Usage 9 | 10 | Should not be used directly. 11 | 12 | 13 | ## Changelog 14 | 15 | Follows `semver` and `conventional-commits`. See [CHANGELOG.md](CHANGELOG.md). 16 | 17 | 18 | ## License 19 | 20 | MIT, see [LICENSE.md](LICENCE.md) for details. 21 | 22 | 23 | ## Part of a bigger family 24 | 25 | This project is a part of [remark-lint-are-links-valid](https://github.com/wemake-services/remark-lint-are-links-valid) 26 | -------------------------------------------------------------------------------- /packages/duplicate/src.js: -------------------------------------------------------------------------------- 1 | const main = require('remark-lint-are-links-valid-core') 2 | 3 | function handleLinkDuplicateError (file, link) { 4 | const message = `Link is a duplicate: ${link.link.href}` 5 | const {node} = link 6 | 7 | file.info(message, node) 8 | } 9 | 10 | function checkDubplicates (file, links, settings) { 11 | const duplicates = [] 12 | const valid = {} 13 | 14 | links.map((link) => { 15 | const url = `${link.link.host}${link.link.path}` 16 | if (!(url in valid)) { 17 | valid[url] = link 18 | } else if ( 19 | settings.whiteListDomains.indexOf(link.link.host) === -1 20 | ) { 21 | duplicates.push(link) 22 | } 23 | }) 24 | 25 | duplicates.map((item) => handleLinkDuplicateError(file, item)) 26 | } 27 | 28 | function areLinksDuplicate (ast, file, options) { 29 | const links = main.findLinks(ast) 30 | const settings = main.getSettings(options) 31 | 32 | checkDubplicates(file, links, settings) 33 | } 34 | 35 | module.exports = main.createRule('duplicates', areLinksDuplicate) 36 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 wemake.service company 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /packages/duplicate/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 5 | 6 | 7 | ## [0.2.2](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-duplicate@0.2.1...remark-lint-are-links-valid-duplicate@0.2.2) (2017-12-10) 8 | 9 | 10 | 11 | 12 | 13 | ## [0.2.1](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-duplicate@0.2.0...remark-lint-are-links-valid-duplicate@0.2.1) (2017-08-07) 14 | 15 | 16 | 17 | 18 | 19 | # [0.2.0](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-duplicate@0.1.1...remark-lint-are-links-valid-duplicate@0.2.0) (2017-08-07) 20 | 21 | 22 | ### Features 23 | 24 | * **documentation:** adds README for every package ([c56bbd8](https://github.com/wemake-services/remark-lint-are-links-valid/commit/c56bbd8)) 25 | -------------------------------------------------------------------------------- /packages/core/src.js: -------------------------------------------------------------------------------- 1 | // Basic logics for all packages. 2 | 3 | const url = require('url') 4 | 5 | const rule = require('unified-lint-rule') 6 | const visit = require('unist-util-visit') 7 | const defaults = require('object.defaults') 8 | 9 | const findLinks = (ast) => { 10 | const links = [] 11 | 12 | visit(ast, 'link', (node) => { 13 | const link = url.parse(node.url) 14 | if (link.host !== null) { // links without `host` are just `#hashes` 15 | links.push({node, link}) 16 | } 17 | }) 18 | 19 | return links 20 | } 21 | 22 | const getSettings = (options) => { 23 | const defaultSettings = { 24 | // These settings allow duplicate links validation: 25 | allowDuplicates: false, 26 | whiteListDomains: [] 27 | } 28 | const settings = options || {} 29 | defaults(settings, defaultSettings) 30 | 31 | return settings 32 | } 33 | 34 | const createRule = (name, callback) => { 35 | return rule( 36 | `remark-lint:are-links-valid:${name}`, 37 | callback 38 | ) 39 | } 40 | 41 | export default { 42 | findLinks, 43 | getSettings, 44 | createRule 45 | } 46 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing toremark-are-links-valid 2 | 3 | 4 | ## Pull Requests Welcome 5 | 6 | 1. Fork `remark-are-links-valid` 7 | 2. Create a topic branch 8 | 3. Use `commitizen` to commit your changes, simply run `yarn commit` instead of `git commit` 9 | 4. Push commits to your fork 10 | 5. Open a pull request against `remark-are-links-valid/master` 11 | 12 | 13 | ## Bootstrap 14 | 15 | You will need to follow several step to setup development environment: 16 | 17 | 0. Install `nvm` and run `nvm install && nvm use` to install and activate our `node` version (you can skip this step if versions already match) 18 | 1. Install `yarn` and `lerna` with `npm install -g yarn lerna` 19 | 2. Run `yarn install && yarn build` 20 | 21 | 22 | ## Development 23 | 24 | This repository follows `conventional-commits`, please make sure you document your changes properly. 25 | 26 | Please, make sure that all these commands succeed before pushing anything: 27 | 28 | 1. `yarn test` 29 | 30 | 31 | ## Issues 32 | 33 | If you believe there to be a bug, please provide the maintainers with enough 34 | detail to reproduce or a link to an app exhibiting unexpected behavior. For 35 | help, please start with Stack Overflow. 36 | -------------------------------------------------------------------------------- /packages/alive/src.js: -------------------------------------------------------------------------------- 1 | const blc = require('broken-link-checker') 2 | const main = require('remark-lint-are-links-valid-core') 3 | 4 | function handleLinkDuplicateError (file, link, reason) { 5 | const message = `Link ${link.link.href} is not responding: ${reason}` 6 | const {node} = link 7 | 8 | file.info(message, node) 9 | } 10 | 11 | function findCheckableLinks (ast) { 12 | const ignoredSchemes = [ 13 | 'data:', 14 | 'geo:', 15 | 'irc:', 16 | 'mailto:', 17 | 'sms:', 18 | 'tel:' 19 | ] 20 | 21 | return main.findLinks(ast).filter(link => { 22 | return ignoredSchemes.indexOf(link.link.protocol) === -1 23 | }) 24 | } 25 | 26 | function areLinksAlive (ast, file, options, done) { 27 | const links = findCheckableLinks(ast) 28 | const settings = main.getSettings(options) 29 | 30 | const urlChecker = new blc.UrlChecker(settings, { 31 | link: (result, data) => { 32 | if (result.broken) { 33 | handleLinkDuplicateError(file, data, result.brokenReason) 34 | } 35 | }, 36 | end: () => done() 37 | }) 38 | 39 | if (links.length === 0) { 40 | // There are no links to handle: 41 | done() 42 | return 43 | } 44 | 45 | links.map((link) => { 46 | urlChecker.enqueue(link.link.href, null, link) 47 | }) 48 | } 49 | 50 | module.exports = main.createRule('alive', areLinksAlive) 51 | -------------------------------------------------------------------------------- /packages/alive/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 5 | 6 | 7 | # [0.3.0](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-alive@0.2.1...remark-lint-are-links-valid-alive@0.3.0) (2017-12-10) 8 | 9 | 10 | ### Bug Fixes 11 | 12 | * skip links for schemes that can't be checked ([6b97bcf](https://github.com/wemake-services/remark-lint-are-links-valid/commit/6b97bcf)) 13 | 14 | 15 | ### Features 16 | 17 | * **commit:** adds commitizen into scripts ([7cac9d3](https://github.com/wemake-services/remark-lint-are-links-valid/commit/7cac9d3)) 18 | 19 | 20 | 21 | 22 | 23 | ## [0.2.1](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-alive@0.2.0...remark-lint-are-links-valid-alive@0.2.1) (2017-08-07) 24 | 25 | 26 | 27 | 28 | 29 | # [0.2.0](https://github.com/wemake-services/remark-lint-are-links-valid/compare/remark-lint-are-links-valid-alive@0.1.1...remark-lint-are-links-valid-alive@0.2.0) (2017-08-07) 30 | 31 | 32 | ### Features 33 | 34 | * **documentation:** adds README for every package ([c56bbd8](https://github.com/wemake-services/remark-lint-are-links-valid/commit/c56bbd8)) 35 | -------------------------------------------------------------------------------- /packages/duplicate/README.md: -------------------------------------------------------------------------------- 1 | # remark-lint-are-links-valid-duplicate 2 | 3 | [![Build Status](https://travis-ci.org/wemake-services/remark-lint-are-links-valid.svg?branch=master)](https://travis-ci.org/wemake-services/remark-lint-are-links-valid) [![Coverage Status](https://coveralls.io/repos/github/wemake-services/remark-lint-are-links-valid/badge.svg?branch=master)](https://coveralls.io/github/wemake-services/remark-lint-are-links-valid?branch=master) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) 4 | 5 | > Make your links to follow your rules! 6 | 7 | 8 | ## Installation 9 | 10 | ```bash 11 | npm install remark-lint-are-links-valid-duplicate # or yarn 12 | ``` 13 | 14 | 15 | ## Usage 16 | 17 | Add `remark-lint-are-links-valid-duplicate` to `remark`'s [configuration](https://github.com/wooorm/remark/tree/master/packages/remark-cli): 18 | 19 | ```json 20 | { 21 | "plugins": [ 22 | ... 23 | "remark-lint-are-links-valid-duplicate" 24 | ] 25 | } 26 | ``` 27 | 28 | 29 | ## Options 30 | 31 | - `whiteListDomains` - this option will allow duplicate links for specified domains, default: `[]` 32 | 33 | 34 | ## Changelog 35 | 36 | Follows `semver` and `conventional-commits`. See [CHANGELOG.md](CHANGELOG.md). 37 | 38 | 39 | ## License 40 | 41 | MIT, see [LICENSE.md](LICENCE.md) for details. 42 | 43 | 44 | ## Part of a bigger family 45 | 46 | This project is a part of [remark-lint-are-links-valid](https://github.com/wemake-services/remark-lint-are-links-valid) 47 | -------------------------------------------------------------------------------- /packages/alive/README.md: -------------------------------------------------------------------------------- 1 | # remark-lint-are-links-valid-alive 2 | 3 | [![Build Status](https://travis-ci.org/wemake-services/remark-lint-are-links-valid.svg?branch=master)](https://travis-ci.org/wemake-services/remark-lint-are-links-valid) [![Coverage Status](https://coveralls.io/repos/github/wemake-services/remark-lint-are-links-valid/badge.svg?branch=master)](https://coveralls.io/github/wemake-services/remark-lint-are-links-valid?branch=master) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) 4 | 5 | > Make your links to follow to your rules! 6 | 7 | 8 | ## Installation 9 | 10 | ```bash 11 | npm install remark-lint-are-links-valid-alive # or yarn 12 | ``` 13 | 14 | 15 | ## Usage 16 | 17 | Add `remark-lint-are-links-valid-alive` to `remark`'s [configuration](https://github.com/wooorm/remark/tree/master/packages/remark-cli): 18 | 19 | ```json 20 | { 21 | "plugins": [ 22 | ... 23 | "remark-lint-are-links-valid-alive" 24 | ] 25 | } 26 | ``` 27 | 28 | 29 | ## Options 30 | 31 | `remark-lint-are-links-valid-alive` uses [`broken-link-checker`](https://www.npmjs.com/package/broken-link-checker) internally. So you can pass any its [options](https://www.npmjs.com/package/broken-link-checker#options) to `remark-lint-are-links-valid-alive`. 32 | 33 | Note, that this plugin will skip [unsupported](https://github.com/wemake-services/remark-lint-are-links-valid/blob/master/packages/alive/src.js#L13) URL schemes. 34 | 35 | 36 | ## Changelog 37 | 38 | Follows `semver` and `conventional-commits`. See [CHANGELOG.md](CHANGELOG.md). 39 | 40 | 41 | ## License 42 | 43 | MIT, see [LICENSE.md](LICENCE.md) for details. 44 | 45 | 46 | ## Part of a bigger family 47 | 48 | This project is a part of [remark-lint-are-links-valid](https://github.com/wemake-services/remark-lint-are-links-valid) 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #### joe made this: http://goel.io/joe 2 | 3 | #####=== OSX ===##### 4 | .DS_Store 5 | .AppleDouble 6 | .LSOverride 7 | 8 | # Icon must end with two \r 9 | Icon 10 | 11 | 12 | # Thumbnails 13 | ._* 14 | 15 | # Files that might appear in the root of a volume 16 | .DocumentRevisions-V100 17 | .fseventsd 18 | .Spotlight-V100 19 | .TemporaryItems 20 | .Trashes 21 | .VolumeIcon.icns 22 | 23 | # Directories potentially created on remote AFP share 24 | .AppleDB 25 | .AppleDesktop 26 | Network Trash Folder 27 | Temporary Items 28 | .apdisk 29 | 30 | #####=== Windows ===##### 31 | # Windows image file caches 32 | Thumbs.db 33 | ehthumbs.db 34 | 35 | # Folder config file 36 | Desktop.ini 37 | 38 | # Recycle Bin used on file shares 39 | $RECYCLE.BIN/ 40 | 41 | # Windows Installer files 42 | *.cab 43 | *.msi 44 | *.msm 45 | *.msp 46 | 47 | # Windows shortcuts 48 | *.lnk 49 | 50 | #####=== Linux ===##### 51 | *~ 52 | 53 | # KDE directory preferences 54 | .directory 55 | 56 | # Linux trash folder which might appear on any partition or disk 57 | .Trash-* 58 | 59 | #####=== Node ===##### 60 | 61 | # Logs 62 | logs 63 | *.log 64 | 65 | # Runtime data 66 | pids 67 | *.pid 68 | *.seed 69 | 70 | # Directory for instrumented libs generated by jscoverage/JSCover 71 | lib-cov 72 | 73 | # Coverage directory used by tools like istanbul 74 | coverage 75 | 76 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 77 | .grunt 78 | 79 | # node-waf configuration 80 | .lock-wscript 81 | 82 | # Compiled binary addons (http://nodejs.org/api/addons.html) 83 | build/Release 84 | 85 | # Dependency directory 86 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 87 | node_modules 88 | 89 | #####=== Custom ===##### 90 | 91 | # This files are built by babel: 92 | dist/ 93 | packages/*/index.js 94 | 95 | # Coverage: 96 | .nyc_output 97 | -------------------------------------------------------------------------------- /test/test_duplicates.js: -------------------------------------------------------------------------------- 1 | /* global describe it */ 2 | 3 | const chai = require('chai') 4 | const chaiAsPromised = require('chai-as-promised') 5 | chai.use(chaiAsPromised) 6 | const expect = chai.expect 7 | 8 | const duplicate = require('../packages/duplicate') 9 | const lintFabric = require('./utils') 10 | const lint = lintFabric(duplicate) 11 | 12 | // Test cases: 13 | 14 | describe('Are there duplicate links', () => { 15 | describe('No links situation', () => { 16 | it(`Expect no warnings`, (done) => { 17 | const result = lint(` 18 | Hello world! 19 | There is no problem there, because there're no links 20 | `) 21 | 22 | expect(result).to.eventually.have 23 | .property('messages').lengthOf(0) 24 | .notify(done) 25 | }) 26 | }) 27 | 28 | describe('Testing plugin with duplicated links', () => { 29 | const markdown = ` 30 | [First duplicated link](https://github.com/wemake-services/remark-lint-are-links-valid) 31 | [Second duplicted link](https://github.com/wemake-services/remark-lint-are-links-valid) 32 | ` 33 | 34 | it('Expect warnings with default settings', () => { 35 | const result = lint(markdown) 36 | 37 | return expect(result).to.eventually.have 38 | .property('messages').lengthOf(1) 39 | }) 40 | 41 | it('Expect no warnings with `whiteListDomains` setting', () => { 42 | const result = lint(markdown, {whiteListDomains: ['github.com']}) 43 | 44 | return expect(result).to.eventually.have 45 | .property('messages').lengthOf(0) 46 | }) 47 | }) 48 | 49 | describe('Hash links situation', () => { 50 | it(`Expect no warnings`, (done) => { 51 | const result = lint(` 52 | # Test 53 | [Link](#test) 54 | [Duplicate Link](#test) 55 | `) 56 | 57 | expect(result).to.eventually.have 58 | .property('messages').lengthOf(0) 59 | .notify(done) 60 | }) 61 | }) 62 | }) 63 | -------------------------------------------------------------------------------- /packages/core/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | array-each@^1.0.1: 6 | version "1.0.1" 7 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 8 | 9 | array-slice@^1.0.0: 10 | version "1.0.0" 11 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" 12 | 13 | co@3.1.0: 14 | version "3.1.0" 15 | resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" 16 | 17 | for-in@^1.0.1: 18 | version "1.0.2" 19 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 20 | 21 | for-own@^1.0.0: 22 | version "1.0.0" 23 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 24 | dependencies: 25 | for-in "^1.0.1" 26 | 27 | isobject@^3.0.0: 28 | version "3.0.1" 29 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 30 | 31 | object.defaults@^1.1.0: 32 | version "1.1.0" 33 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 34 | dependencies: 35 | array-each "^1.0.1" 36 | array-slice "^1.0.0" 37 | for-own "^1.0.0" 38 | isobject "^3.0.0" 39 | 40 | sliced@^1.0.1: 41 | version "1.0.1" 42 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 43 | 44 | unified-lint-rule@^1.0.1: 45 | version "1.0.1" 46 | resolved "https://registry.yarnpkg.com/unified-lint-rule/-/unified-lint-rule-1.0.1.tgz#1bf733d40e667bf1915c7156a83663ed00666c57" 47 | dependencies: 48 | wrapped "^1.0.1" 49 | 50 | unist-util-visit@^1.1.3: 51 | version "1.1.3" 52 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.1.3.tgz#ec268e731b9d277a79a5b5aa0643990e405d600b" 53 | 54 | wrapped@^1.0.1: 55 | version "1.0.1" 56 | resolved "https://registry.yarnpkg.com/wrapped/-/wrapped-1.0.1.tgz#c783d9d807b273e9b01e851680a938c87c907242" 57 | dependencies: 58 | co "3.1.0" 59 | sliced "^1.0.1" 60 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-lint-are-links-valid", 3 | "version": "0.0.0-development", 4 | "description": "This package allows to check either a link points to the existing resource.", 5 | "author": "Nikita Sobolev ", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/wemake-services/remark-lint-are-links-valid.git" 9 | }, 10 | "files": [ 11 | "lib", 12 | "dist", 13 | "test" 14 | ], 15 | "license": "MIT", 16 | "scripts": { 17 | "build": "lerna bootstrap && lerna run build", 18 | "coveralls": "npm run test && cat ./coverage/lcov.info | ./node_modules/.bin/coveralls", 19 | "test:code": "cross-env NODE_ENV=test nyc mocha && nyc report --reporter=lcov", 20 | "test": "npm run build && npm run test:code && npm run lint", 21 | "lint": "eslint test/ packages/*/src.js", 22 | "commit": "git-cz" 23 | }, 24 | "eslintConfig": { 25 | "extends": "standard" 26 | }, 27 | "eslintIgnore": [ 28 | "packages/*/index.js" 29 | ], 30 | "babel": { 31 | "presets": [ 32 | [ 33 | "es2015", 34 | { 35 | "modules": false 36 | } 37 | ] 38 | ], 39 | "plugins": [ 40 | "external-helpers" 41 | ] 42 | }, 43 | "devDependencies": { 44 | "babel-cli": "^6.24.1", 45 | "babel-core": "^6.25.0", 46 | "babel-eslint": "^8.0.2", 47 | "babel-plugin-external-helpers": "^6.22.0", 48 | "babel-preset-es2015": "^6.24.1", 49 | "chai": "^4.1.1", 50 | "chai-as-promised": "^7.1.1", 51 | "commitizen": "^2.9.6", 52 | "coveralls": "^2.13.1", 53 | "cross-env": "^5.1.1", 54 | "cz-lerna-changelog": "^1.2.1", 55 | "dedent": "^0.7.0", 56 | "eslint": "^4.10.0", 57 | "eslint-config-standard": "^10.2.1", 58 | "eslint-plugin-import": "^2.8.0", 59 | "eslint-plugin-node": "^5.1.1", 60 | "eslint-plugin-promise": "^3.6.0", 61 | "eslint-plugin-standard": "^3.0.1", 62 | "lerna": "^2.0.0", 63 | "mocha": "^4.0.1", 64 | "mocha-lcov-reporter": "^1.3.0", 65 | "nyc": "^11.3.0", 66 | "remark": "^8.0.0", 67 | "remark-lint": "^6.0.1", 68 | "rollup": "^0.51.5", 69 | "rollup-plugin-babel": "^2.7.1", 70 | "rollup-plugin-commonjs": "^8.2.6" 71 | }, 72 | "bugs": { 73 | "url": "https://github.com/wemake-services/remark-lint-are-links-valid/issues" 74 | }, 75 | "homepage": "https://github.com/wemake-services/remark-lint-are-links-valid", 76 | "config": { 77 | "commitizen": { 78 | "path": "./node_modules/cz-lerna-changelog" 79 | } 80 | }, 81 | "dependencies": {} 82 | } 83 | -------------------------------------------------------------------------------- /test/test_alive.js: -------------------------------------------------------------------------------- 1 | /* global describe it */ 2 | 3 | const chai = require('chai') 4 | const chaiAsPromised = require('chai-as-promised') 5 | chai.use(chaiAsPromised) 6 | const expect = chai.expect 7 | 8 | const alive = require('../packages/alive') 9 | const lintFabric = require('./utils') 10 | const lint = lintFabric(alive) 11 | 12 | // Test cases: 13 | 14 | describe('Are links alive', () => { 15 | describe('No links situation', () => { 16 | it(`Expect no warnings`, (done) => { 17 | const result = lint(` 18 | Hello world! 19 | There is no problem there, because there're no links 20 | `) 21 | 22 | expect(result).to.eventually.have 23 | .property('messages').lengthOf(0) 24 | .notify(done) 25 | }) 26 | }) 27 | 28 | describe('Broken links', () => { 29 | it(`Expect 404 warning`, (done) => { 30 | const result = lint(` 31 | [Does not exist](http://wemake.services/broken) 32 | `) 33 | 34 | expect(result).to.eventually.have 35 | .property('messages').lengthOf(1) 36 | .notify(done) 37 | }) 38 | }) 39 | 40 | describe('Alive links', () => { 41 | it(`Expect no warnings on alive links`, (done) => { 42 | const result = lint(` 43 | [Exists](http://wemake.services) 44 | `) 45 | 46 | expect(result).to.eventually.have 47 | .property('messages').lengthOf(0) 48 | .notify(done) 49 | }) 50 | 51 | it(`Expect no warnings on hash links`, (done) => { 52 | const result = lint(` 53 | # Test 54 | [Exists hash](#test) 55 | `) 56 | 57 | expect(result).to.eventually.have 58 | .property('messages').lengthOf(0) 59 | .notify(done) 60 | }) 61 | }) 62 | 63 | describe('Ignored schemes', () => { 64 | const ignoredURLs = [ 65 | {scheme: 'data', link: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='}, 66 | {scheme: 'geo', link: 'geo:37.786971,-122.399677'}, 67 | {scheme: 'irc', link: 'irc://irc.freenode.net/elixir-lang'}, 68 | {scheme: 'mailto', link: 'mailto:contact@wemake.services'}, 69 | {scheme: 'sms', link: 'sms:?body=Hello'}, 70 | {scheme: 'tel', link: 'tel:1-408-555-5555'} 71 | ] 72 | 73 | ignoredURLs.forEach(({scheme, link}) => { 74 | it(`Expect no warnings on ${scheme} scheme`, (done) => { 75 | const result = lint(` 76 | # I sure do love links 77 | [${scheme} link](${link}) 78 | `) 79 | 80 | expect(result).to.eventually.have 81 | .property('messages').lengthOf(0) 82 | .notify(done) 83 | }) 84 | }) 85 | }) 86 | }) 87 | -------------------------------------------------------------------------------- /packages/alive/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@^6.0.46": 6 | version "6.0.85" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.85.tgz#ec02bfe54a61044f2be44f13b389c6a0e8ee05ae" 8 | 9 | abbrev@1: 10 | version "1.1.0" 11 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 12 | 13 | ansi-regex@^0.2.0, ansi-regex@^0.2.1: 14 | version "0.2.1" 15 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" 16 | 17 | ansi-regex@^2.0.0: 18 | version "2.1.1" 19 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 20 | 21 | ansi-styles@^1.1.0: 22 | version "1.1.0" 23 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" 24 | 25 | ansi-styles@^2.2.1: 26 | version "2.2.1" 27 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 28 | 29 | array-each@^1.0.1: 30 | version "1.0.1" 31 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 32 | 33 | array-slice@^1.0.0: 34 | version "1.1.0" 35 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" 36 | 37 | bhttp@^1.2.1: 38 | version "1.2.4" 39 | resolved "https://registry.yarnpkg.com/bhttp/-/bhttp-1.2.4.tgz#fed0c24f765b35afc4940b08ab3214813e38f38f" 40 | dependencies: 41 | bluebird "^2.8.2" 42 | concat-stream "^1.4.7" 43 | debug "^2.1.1" 44 | dev-null "^0.1.1" 45 | errors "^0.2.0" 46 | extend "^2.0.0" 47 | form-data2 "^1.0.0" 48 | form-fix-array "^1.0.0" 49 | lodash "^2.4.1" 50 | stream-length "^1.0.2" 51 | string "^3.0.0" 52 | through2-sink "^1.0.0" 53 | through2-spy "^1.2.0" 54 | tough-cookie "^2.3.1" 55 | 56 | bluebird@^2.3.5, bluebird@^2.6.2, bluebird@^2.8.1, bluebird@^2.8.2: 57 | version "2.11.0" 58 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" 59 | 60 | broken-link-checker@^0.7.6: 61 | version "0.7.6" 62 | resolved "https://registry.yarnpkg.com/broken-link-checker/-/broken-link-checker-0.7.6.tgz#94e3b4c814521104c4dab247d7e1a8dd14616093" 63 | dependencies: 64 | bhttp "^1.2.1" 65 | calmcard "~0.1.1" 66 | chalk "^1.1.3" 67 | char-spinner "^1.0.1" 68 | condense-whitespace "^1.0.0" 69 | default-user-agent "^1.0.0" 70 | errno "~0.1.4" 71 | extend "^3.0.0" 72 | http-equiv-refresh "^1.0.0" 73 | humanize-duration "^3.9.1" 74 | is-stream "^1.0.1" 75 | is-string "^1.0.4" 76 | limited-request-queue "^2.0.0" 77 | link-types "^1.1.0" 78 | maybe-callback "^2.1.0" 79 | nopter "~0.3.0" 80 | parse5 "^3.0.2" 81 | robot-directives "~0.3.0" 82 | robots-txt-guard "~0.1.0" 83 | robots-txt-parse "~0.0.4" 84 | urlcache "~0.6.0" 85 | urlobj "0.0.10" 86 | 87 | caller-path@~0.1.0: 88 | version "0.1.0" 89 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 90 | dependencies: 91 | callsites "^0.2.0" 92 | 93 | callsites@^0.2.0: 94 | version "0.2.0" 95 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 96 | 97 | calmcard@~0.1.1: 98 | version "0.1.1" 99 | resolved "https://registry.yarnpkg.com/calmcard/-/calmcard-0.1.1.tgz#35ac2b66492b0ed39ad06a893a0ff6e61124e449" 100 | 101 | camelcase@^1.0.2: 102 | version "1.2.1" 103 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 104 | 105 | chalk@^1.1.3: 106 | version "1.1.3" 107 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 108 | dependencies: 109 | ansi-styles "^2.2.1" 110 | escape-string-regexp "^1.0.2" 111 | has-ansi "^2.0.0" 112 | strip-ansi "^3.0.0" 113 | supports-color "^2.0.0" 114 | 115 | chalk@~0.5.1: 116 | version "0.5.1" 117 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" 118 | dependencies: 119 | ansi-styles "^1.1.0" 120 | escape-string-regexp "^1.0.0" 121 | has-ansi "^0.1.0" 122 | strip-ansi "^0.3.0" 123 | supports-color "^0.2.0" 124 | 125 | char-spinner@^1.0.1: 126 | version "1.0.1" 127 | resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" 128 | 129 | cli-table@~0.3.1: 130 | version "0.3.1" 131 | resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" 132 | dependencies: 133 | colors "1.0.3" 134 | 135 | co@3.1.0: 136 | version "3.1.0" 137 | resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" 138 | 139 | colors@1.0.3: 140 | version "1.0.3" 141 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 142 | 143 | combined-stream2@^1.0.2: 144 | version "1.1.2" 145 | resolved "https://registry.yarnpkg.com/combined-stream2/-/combined-stream2-1.1.2.tgz#f6e14b7a015666f8c7b0a1fac506240164ac3570" 146 | dependencies: 147 | bluebird "^2.8.1" 148 | debug "^2.1.1" 149 | stream-length "^1.0.1" 150 | 151 | concat-stream@^1.4.7: 152 | version "1.6.0" 153 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 154 | dependencies: 155 | inherits "^2.0.3" 156 | readable-stream "^2.2.2" 157 | typedarray "^0.0.6" 158 | 159 | condense-whitespace@^1.0.0: 160 | version "1.0.0" 161 | resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" 162 | 163 | core-util-is@~1.0.0: 164 | version "1.0.2" 165 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 166 | 167 | debug@^2.1.1: 168 | version "2.6.8" 169 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 170 | dependencies: 171 | ms "2.0.0" 172 | 173 | default-user-agent@^1.0.0: 174 | version "1.0.0" 175 | resolved "https://registry.yarnpkg.com/default-user-agent/-/default-user-agent-1.0.0.tgz#16c46efdcaba3edc45f24f2bd4868b01b7c2adc6" 176 | dependencies: 177 | os-name "~1.0.3" 178 | 179 | dev-null@^0.1.1: 180 | version "0.1.1" 181 | resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" 182 | 183 | duplexer@~0.1.1: 184 | version "0.1.1" 185 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 186 | 187 | eol@~0.2.0: 188 | version "0.2.0" 189 | resolved "https://registry.yarnpkg.com/eol/-/eol-0.2.0.tgz#2f6db086a243a46e3e5dbd0e13435c7ebebf09dd" 190 | 191 | errno@~0.1.4: 192 | version "0.1.4" 193 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" 194 | dependencies: 195 | prr "~0.0.0" 196 | 197 | errors@^0.2.0: 198 | version "0.2.0" 199 | resolved "https://registry.yarnpkg.com/errors/-/errors-0.2.0.tgz#0f51e889daa3e11b19e7186d11f104aa66eb2403" 200 | 201 | escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: 202 | version "1.0.5" 203 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 204 | 205 | extend@^2.0.0: 206 | version "2.0.1" 207 | resolved "https://registry.yarnpkg.com/extend/-/extend-2.0.1.tgz#1ee8010689e7395ff9448241c98652bc759a8260" 208 | 209 | extend@^3.0.0: 210 | version "3.0.1" 211 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 212 | 213 | for-in@^1.0.1: 214 | version "1.0.2" 215 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 216 | 217 | for-own@^1.0.0: 218 | version "1.0.0" 219 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 220 | dependencies: 221 | for-in "^1.0.1" 222 | 223 | form-data2@^1.0.0: 224 | version "1.0.3" 225 | resolved "https://registry.yarnpkg.com/form-data2/-/form-data2-1.0.3.tgz#cba5e23601a6944d95ab7d7111ff9397a5cb2a4d" 226 | dependencies: 227 | bluebird "^2.8.2" 228 | combined-stream2 "^1.0.2" 229 | debug "^2.1.1" 230 | lodash "^2.4.1" 231 | mime "^1.2.11" 232 | uuid "^2.0.1" 233 | 234 | form-fix-array@^1.0.0: 235 | version "1.0.0" 236 | resolved "https://registry.yarnpkg.com/form-fix-array/-/form-fix-array-1.0.0.tgz#a1347a47e53117ab7bcdbf3e2f3ec91c66769bc8" 237 | 238 | has-ansi@^0.1.0: 239 | version "0.1.0" 240 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" 241 | dependencies: 242 | ansi-regex "^0.2.0" 243 | 244 | has-ansi@^2.0.0: 245 | version "2.0.0" 246 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 247 | dependencies: 248 | ansi-regex "^2.0.0" 249 | 250 | http-equiv-refresh@^1.0.0: 251 | version "1.0.0" 252 | resolved "https://registry.yarnpkg.com/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz#8ec538866042be5f3f7afa737d198d94beb1b07b" 253 | 254 | humanize-duration@^3.9.1: 255 | version "3.10.1" 256 | resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.10.1.tgz#65b550c0aa095156ecb7c340db44ee0bdf71af4b" 257 | 258 | inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 259 | version "2.0.3" 260 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 261 | 262 | is-browser@^2.0.1: 263 | version "2.0.1" 264 | resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.0.1.tgz#8bf0baf799a9c62fd9de5bcee4cf3397c3e7529a" 265 | 266 | is-object@^1.0.1: 267 | version "1.0.1" 268 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" 269 | 270 | is-stream@^1.0.1: 271 | version "1.1.0" 272 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 273 | 274 | is-string@^1.0.4: 275 | version "1.0.4" 276 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" 277 | 278 | isarray@0.0.1: 279 | version "0.0.1" 280 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 281 | 282 | isarray@~1.0.0: 283 | version "1.0.0" 284 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 285 | 286 | isbot@^2.0.0: 287 | version "2.0.3" 288 | resolved "https://registry.yarnpkg.com/isbot/-/isbot-2.0.3.tgz#65ca0dff20db6736cd73f1ca6e763788804006ad" 289 | 290 | isobject@^3.0.0: 291 | version "3.0.1" 292 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 293 | 294 | limited-request-queue@^2.0.0: 295 | version "2.0.0" 296 | resolved "https://registry.yarnpkg.com/limited-request-queue/-/limited-request-queue-2.0.0.tgz#14c7c120b138060b19a2a1030abaf6693572650d" 297 | dependencies: 298 | is-browser "^2.0.1" 299 | parse-domain "~0.2.0" 300 | 301 | link-types@^1.1.0: 302 | version "1.1.0" 303 | resolved "https://registry.yarnpkg.com/link-types/-/link-types-1.1.0.tgz#af65e59db52e70c1ffb18ac4c3cb056bfe796830" 304 | 305 | lodash@^2.4.1: 306 | version "2.4.2" 307 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" 308 | 309 | lru-cache@2.2.x: 310 | version "2.2.4" 311 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" 312 | 313 | maybe-callback@^2.1.0: 314 | version "2.1.0" 315 | resolved "https://registry.yarnpkg.com/maybe-callback/-/maybe-callback-2.1.0.tgz#8afa0ba7b691a7ab123e7f12f65e32bb5d1f8243" 316 | 317 | mime@^1.2.11: 318 | version "1.3.6" 319 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" 320 | 321 | minimist@^1.1.0: 322 | version "1.2.0" 323 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 324 | 325 | ms@2.0.0: 326 | version "2.0.0" 327 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 328 | 329 | nopt@^3.0.1: 330 | version "3.0.6" 331 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 332 | dependencies: 333 | abbrev "1" 334 | 335 | nopter@~0.3.0: 336 | version "0.3.0" 337 | resolved "https://registry.yarnpkg.com/nopter/-/nopter-0.3.0.tgz#b9690e6fab8f256b37e4e7ccd23e2b38450cc71f" 338 | dependencies: 339 | caller-path "~0.1.0" 340 | camelcase "^1.0.2" 341 | chalk "~0.5.1" 342 | cli-table "~0.3.1" 343 | eol "~0.2.0" 344 | nopt "^3.0.1" 345 | object-assign "^2.0.0" 346 | splitargs "~0.0.3" 347 | 348 | object-assign@^2.0.0: 349 | version "2.1.1" 350 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" 351 | 352 | object-assign@^4.0.1, object-assign@^4.1.0: 353 | version "4.1.1" 354 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 355 | 356 | object.defaults@^1.1.0: 357 | version "1.1.0" 358 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 359 | dependencies: 360 | array-each "^1.0.1" 361 | array-slice "^1.0.0" 362 | for-own "^1.0.0" 363 | isobject "^3.0.0" 364 | 365 | os-name@~1.0.3: 366 | version "1.0.3" 367 | resolved "https://registry.yarnpkg.com/os-name/-/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf" 368 | dependencies: 369 | osx-release "^1.0.0" 370 | win-release "^1.0.0" 371 | 372 | os-tmpdir@~1.0.1: 373 | version "1.0.2" 374 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 375 | 376 | osx-release@^1.0.0: 377 | version "1.1.0" 378 | resolved "https://registry.yarnpkg.com/osx-release/-/osx-release-1.1.0.tgz#f217911a28136949af1bf9308b241e2737d3cd6c" 379 | dependencies: 380 | minimist "^1.1.0" 381 | 382 | parse-domain@~0.2.0: 383 | version "0.2.2" 384 | resolved "https://registry.yarnpkg.com/parse-domain/-/parse-domain-0.2.2.tgz#188989b1e2e7398bff3c4f4fd7dca157eb51fac1" 385 | 386 | parse5@^3.0.2: 387 | version "3.0.2" 388 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" 389 | dependencies: 390 | "@types/node" "^6.0.46" 391 | 392 | process-nextick-args@~1.0.6: 393 | version "1.0.7" 394 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 395 | 396 | prr@~0.0.0: 397 | version "0.0.0" 398 | resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" 399 | 400 | punycode@^1.4.1: 401 | version "1.4.1" 402 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 403 | 404 | readable-stream@^2.2.2: 405 | version "2.3.3" 406 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 407 | dependencies: 408 | core-util-is "~1.0.0" 409 | inherits "~2.0.3" 410 | isarray "~1.0.0" 411 | process-nextick-args "~1.0.6" 412 | safe-buffer "~5.1.1" 413 | string_decoder "~1.0.3" 414 | util-deprecate "~1.0.1" 415 | 416 | readable-stream@~1.0.17: 417 | version "1.0.34" 418 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 419 | dependencies: 420 | core-util-is "~1.0.0" 421 | inherits "~2.0.1" 422 | isarray "0.0.1" 423 | string_decoder "~0.10.x" 424 | 425 | remark-lint-are-links-valid-core@^0.2.1: 426 | version "0.2.1" 427 | resolved "https://registry.yarnpkg.com/remark-lint-are-links-valid-core/-/remark-lint-are-links-valid-core-0.2.1.tgz#c2cd5dde5535793ea0985de45748db6035f46cc0" 428 | dependencies: 429 | object.defaults "^1.1.0" 430 | unified-lint-rule "^1.0.1" 431 | unist-util-visit "^1.1.3" 432 | 433 | robot-directives@~0.3.0: 434 | version "0.3.0" 435 | resolved "https://registry.yarnpkg.com/robot-directives/-/robot-directives-0.3.0.tgz#174fb1ffc2a9b97877301e87c89b395f429d1f65" 436 | dependencies: 437 | isbot "^2.0.0" 438 | useragent "^2.1.8" 439 | 440 | robots-txt-guard@~0.1.0: 441 | version "0.1.0" 442 | resolved "https://registry.yarnpkg.com/robots-txt-guard/-/robots-txt-guard-0.1.0.tgz#2fd5ec85cbeb4690431e9bbb5c84542f882859e8" 443 | 444 | robots-txt-parse@~0.0.4: 445 | version "0.0.4" 446 | resolved "https://registry.yarnpkg.com/robots-txt-parse/-/robots-txt-parse-0.0.4.tgz#f7d1f323f79921d7e9c6c4bbd25048f6e9810d71" 447 | dependencies: 448 | bluebird "^2.3.5" 449 | split "^0.3.0" 450 | stream-combiner "^0.2.1" 451 | through "^2.3.4" 452 | 453 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 454 | version "5.1.1" 455 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 456 | 457 | semver@^5.0.1: 458 | version "5.4.1" 459 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 460 | 461 | sliced@^1.0.1: 462 | version "1.0.1" 463 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 464 | 465 | split@^0.3.0: 466 | version "0.3.3" 467 | resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" 468 | dependencies: 469 | through "2" 470 | 471 | splitargs@~0.0.3: 472 | version "0.0.7" 473 | resolved "https://registry.yarnpkg.com/splitargs/-/splitargs-0.0.7.tgz#fe9f7ae657371b33b10cb80da143cf8249cf6b3b" 474 | 475 | stream-combiner@^0.2.1: 476 | version "0.2.2" 477 | resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" 478 | dependencies: 479 | duplexer "~0.1.1" 480 | through "~2.3.4" 481 | 482 | stream-length@^1.0.1, stream-length@^1.0.2: 483 | version "1.0.2" 484 | resolved "https://registry.yarnpkg.com/stream-length/-/stream-length-1.0.2.tgz#8277f3cbee49a4daabcfdb4e2f4a9b5e9f2c9f00" 485 | dependencies: 486 | bluebird "^2.6.2" 487 | 488 | string@^3.0.0: 489 | version "3.3.3" 490 | resolved "https://registry.yarnpkg.com/string/-/string-3.3.3.tgz#5ea211cd92d228e184294990a6cc97b366a77cb0" 491 | 492 | string_decoder@~0.10.x: 493 | version "0.10.31" 494 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 495 | 496 | string_decoder@~1.0.3: 497 | version "1.0.3" 498 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 499 | dependencies: 500 | safe-buffer "~5.1.0" 501 | 502 | strip-ansi@^0.3.0: 503 | version "0.3.0" 504 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" 505 | dependencies: 506 | ansi-regex "^0.2.1" 507 | 508 | strip-ansi@^3.0.0: 509 | version "3.0.1" 510 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 511 | dependencies: 512 | ansi-regex "^2.0.0" 513 | 514 | supports-color@^0.2.0: 515 | version "0.2.0" 516 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" 517 | 518 | supports-color@^2.0.0: 519 | version "2.0.0" 520 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 521 | 522 | through2-sink@^1.0.0: 523 | version "1.0.0" 524 | resolved "https://registry.yarnpkg.com/through2-sink/-/through2-sink-1.0.0.tgz#5f106bba1d7330dad3cba5c0ab1863923256c399" 525 | dependencies: 526 | through2 "~0.5.1" 527 | xtend "~3.0.0" 528 | 529 | through2-spy@^1.2.0: 530 | version "1.2.0" 531 | resolved "https://registry.yarnpkg.com/through2-spy/-/through2-spy-1.2.0.tgz#9c891ca9ca40e1e1e4cf31e1ac57f94cc9d248cb" 532 | dependencies: 533 | through2 "~0.5.1" 534 | xtend "~3.0.0" 535 | 536 | through2@~0.5.1: 537 | version "0.5.1" 538 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" 539 | dependencies: 540 | readable-stream "~1.0.17" 541 | xtend "~3.0.0" 542 | 543 | through@2, through@^2.3.4, through@~2.3.4: 544 | version "2.3.8" 545 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 546 | 547 | tmp@0.0.x: 548 | version "0.0.31" 549 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 550 | dependencies: 551 | os-tmpdir "~1.0.1" 552 | 553 | tough-cookie@^2.3.1: 554 | version "2.3.2" 555 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 556 | dependencies: 557 | punycode "^1.4.1" 558 | 559 | typedarray@^0.0.6: 560 | version "0.0.6" 561 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 562 | 563 | unified-lint-rule@^1.0.1: 564 | version "1.0.3" 565 | resolved "https://registry.yarnpkg.com/unified-lint-rule/-/unified-lint-rule-1.0.3.tgz#e302b0c4a7ac428c0980e049a500e59528001299" 566 | dependencies: 567 | wrapped "^1.0.1" 568 | 569 | unist-util-is@^2.1.2: 570 | version "2.1.2" 571 | resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.2.tgz#1193fa8f2bfbbb82150633f3a8d2eb9a1c1d55db" 572 | 573 | unist-util-visit-parents@^2.0.0: 574 | version "2.0.1" 575 | resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz#63fffc8929027bee04bfef7d2cce474f71cb6217" 576 | dependencies: 577 | unist-util-is "^2.1.2" 578 | 579 | unist-util-visit@^1.1.3: 580 | version "1.4.0" 581 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.0.tgz#1cb763647186dc26f5e1df5db6bd1e48b3cc2fb1" 582 | dependencies: 583 | unist-util-visit-parents "^2.0.0" 584 | 585 | urlcache@~0.6.0: 586 | version "0.6.0" 587 | resolved "https://registry.yarnpkg.com/urlcache/-/urlcache-0.6.0.tgz#6ea63562bce0cc821864d4452cfa07f82b02109c" 588 | dependencies: 589 | urlobj "0.0.8" 590 | 591 | urlobj@0.0.10: 592 | version "0.0.10" 593 | resolved "https://registry.yarnpkg.com/urlobj/-/urlobj-0.0.10.tgz#9103d232dfd8a8d25b15995bae8beec6b9ab995b" 594 | dependencies: 595 | is-object "^1.0.1" 596 | is-string "^1.0.4" 597 | object-assign "^4.1.0" 598 | 599 | urlobj@0.0.8: 600 | version "0.0.8" 601 | resolved "https://registry.yarnpkg.com/urlobj/-/urlobj-0.0.8.tgz#84fda38c2dc867805245c830e5063fb91e026f56" 602 | dependencies: 603 | is-object "^1.0.1" 604 | is-string "^1.0.4" 605 | object-assign "^4.0.1" 606 | 607 | useragent@^2.1.8: 608 | version "2.2.1" 609 | resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" 610 | dependencies: 611 | lru-cache "2.2.x" 612 | tmp "0.0.x" 613 | 614 | util-deprecate@~1.0.1: 615 | version "1.0.2" 616 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 617 | 618 | uuid@^2.0.1: 619 | version "2.0.3" 620 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 621 | 622 | win-release@^1.0.0: 623 | version "1.1.1" 624 | resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" 625 | dependencies: 626 | semver "^5.0.1" 627 | 628 | wrapped@^1.0.1: 629 | version "1.0.1" 630 | resolved "https://registry.yarnpkg.com/wrapped/-/wrapped-1.0.1.tgz#c783d9d807b273e9b01e851680a938c87c907242" 631 | dependencies: 632 | co "3.1.0" 633 | sliced "^1.0.1" 634 | 635 | xtend@~3.0.0: 636 | version "3.0.0" 637 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" 638 | --------------------------------------------------------------------------------