├── test ├── fixtures │ ├── expected │ │ ├── no-pagination │ │ │ └── topics │ │ │ │ ├── world.html │ │ │ │ ├── this-is.html │ │ │ │ ├── this.html │ │ │ │ ├── tag.html │ │ │ │ ├── skol.html │ │ │ │ └── hello.html │ │ └── pagination │ │ │ └── topics │ │ │ ├── world │ │ │ └── index.html │ │ │ ├── this-is │ │ │ └── index.html │ │ │ ├── this │ │ │ └── index.html │ │ │ ├── skol │ │ │ ├── 2 │ │ │ │ └── index.html │ │ │ ├── 3 │ │ │ │ └── index.html │ │ │ ├── 4 │ │ │ │ └── index.html │ │ │ └── index.html │ │ │ ├── tag │ │ │ ├── 2 │ │ │ │ └── index.html │ │ │ ├── 3 │ │ │ │ └── index.html │ │ │ └── index.html │ │ │ └── hello │ │ │ ├── 2 │ │ │ └── index.html │ │ │ ├── 3 │ │ │ └── index.html │ │ │ ├── 4 │ │ │ └── index.html │ │ │ └── index.html │ ├── tag.hbt │ └── src │ │ ├── about.html │ │ ├── page.html │ │ ├── index.html │ │ └── json.html └── index.js ├── .gitignore ├── package.json ├── CHANGELOG.md ├── README.md ├── lib └── index.js └── yarn.lock /test/fixtures/expected/no-pagination/topics/world.html: -------------------------------------------------------------------------------- 1 |

Posts for world

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/no-pagination/topics/this-is.html: -------------------------------------------------------------------------------- 1 |

Posts for this-is

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/no-pagination/topics/this.html: -------------------------------------------------------------------------------- 1 |

Posts for this

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/world/index.html: -------------------------------------------------------------------------------- 1 |

Posts for world

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/this-is/index.html: -------------------------------------------------------------------------------- 1 |

Posts for this-is

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/this/index.html: -------------------------------------------------------------------------------- 1 |

Posts for this

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/skol/4/index.html: -------------------------------------------------------------------------------- 1 |

Posts for skol

2 | Previous -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/skol/index.html: -------------------------------------------------------------------------------- 1 |

Posts for skol

2 | Next -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/tag/3/index.html: -------------------------------------------------------------------------------- 1 |

Posts for tag

2 | Previous -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/tag/index.html: -------------------------------------------------------------------------------- 1 |

Posts for tag

2 | Next -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/hello/4/index.html: -------------------------------------------------------------------------------- 1 |

Posts for hello

2 | Previous -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/hello/index.html: -------------------------------------------------------------------------------- 1 |

Posts for hello

2 | Next -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/skol/2/index.html: -------------------------------------------------------------------------------- 1 |

Posts for skol

2 | PreviousNext -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/skol/3/index.html: -------------------------------------------------------------------------------- 1 |

Posts for skol

2 | PreviousNext -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/tag/2/index.html: -------------------------------------------------------------------------------- 1 |

Posts for tag

2 | PreviousNext -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/hello/2/index.html: -------------------------------------------------------------------------------- 1 |

Posts for hello

2 | PreviousNext -------------------------------------------------------------------------------- /test/fixtures/expected/pagination/topics/hello/3/index.html: -------------------------------------------------------------------------------- 1 |

Posts for hello

2 | PreviousNext -------------------------------------------------------------------------------- /test/fixtures/expected/no-pagination/topics/tag.html: -------------------------------------------------------------------------------- 1 |

Posts for tag

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/no-pagination/topics/skol.html: -------------------------------------------------------------------------------- 1 |

Posts for skol

2 | -------------------------------------------------------------------------------- /test/fixtures/expected/no-pagination/topics/hello.html: -------------------------------------------------------------------------------- 1 |

Posts for hello

2 | -------------------------------------------------------------------------------- /test/fixtures/tag.hbt: -------------------------------------------------------------------------------- 1 |

Posts for {{tag}}

2 | {{#if pagination.previous}}Previous{{/if}}{{#if pagination.next}}Next{{/if}} -------------------------------------------------------------------------------- /test/fixtures/src/about.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: about 3 | tags: hello, skøl 4 | date: 2014-02-02T17:39:06.157Z 5 | --- 6 | 7 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt odio provident at, cum, quasi perferendis suscipit aliquam dolores alias sequi vel ullam! Corrupti libero aliquid, tempora esse cupiditate impedit consectetur. 8 | -------------------------------------------------------------------------------- /test/fixtures/src/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: test page 2 3 | tags: hello, this, tag, skØl 4 | date: 2014-02-07T17:39:06.157Z 5 | --- 6 | 7 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt odio provident at, cum, quasi perferendis suscipit aliquam dolores alias sequi vel ullam! Corrupti libero aliquid, tempora esse cupiditate impedit consectetur. -------------------------------------------------------------------------------- /test/fixtures/src/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: test 3 | tags: hello, world, this is, tag, sköl 4 | date: 2014-03-02T17:39:06.157Z 5 | --- 6 | 7 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt odio provident at, cum, quasi perferendis suscipit aliquam dolores alias sequi vel ullam! Corrupti libero aliquid, tempora esse cupiditate impedit consectetur. -------------------------------------------------------------------------------- /test/fixtures/src/json.html: -------------------------------------------------------------------------------- 1 | --- 2 | { 3 | "title": "test json", 4 | "tags": ["hello", "tag", "skol"], 5 | "date": "2014-01-07T17:39:06.157Z" 6 | } 7 | --- 8 | 9 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt odio provident at, cum, quasi perferendis suscipit aliquam dolores alias sequi vel ullam! Corrupti libero aliquid, tempora esse cupiditate impedit consectetur. 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Deployed apps should consider commenting this line out: 24 | # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 25 | node_modules 26 | 27 | # Test Fixture build results 28 | test/fixtures/build/* 29 | 30 | # JetBrains project files 31 | .idea -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "metalsmith-tags", 3 | "version": "2.1.0", 4 | "description": "A metalsmith plugin to create dedicated pages for tags in posts or pages.", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "test": "./node_modules/.bin/mocha --reporter spec" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/totocaster/metalsmith-tags" 12 | }, 13 | "keywords": [ 14 | "metalsmith", 15 | "plugin", 16 | "tags" 17 | ], 18 | "author": "Toto Tvalavadze ", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/totocaster/metalsmith-tags/issues" 22 | }, 23 | "homepage": "https://github.com/totocaster/metalsmith-tags", 24 | "devDependencies": { 25 | "assert-dir-equal": "1.0.1", 26 | "debug": "^3.1.0", 27 | "handlebars": "*", 28 | "metalsmith": "1.x", 29 | "metalsmith-layouts": "1.x", 30 | "mocha": "2.x", 31 | "moment": "^2.10.3" 32 | }, 33 | "dependencies": { 34 | "slug": "^0.9.1" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | # 2.0.0 3 | 4 | * Breaking: Combined the tagsCollection and tagsUrlSafe properties into one property. 5 | 6 | 7 | # 1.3.0 8 | 9 | * Feature: Add a tagCollection property that holds a display and urlSafe format of each tag. 10 | 11 | 12 | # 1.2.0 13 | 14 | * Feature: Can supply an optional function to control how tags are formatted. 15 | 16 | 17 | # 1.1.0 18 | 19 | * Feature: Add `urlSafe` property to each object for better url creation in templates. 20 | 21 | 22 | # 1.0.0 23 | 24 | * Feature: Use [node-slug](https://github.com/dodo/node-slug) package when creating a page's slug. 25 | 26 | 27 | # 0.13.0 28 | 29 | * Feature: added better support for `metalsmith-pagination` plug-in. 30 | 31 | 32 | # 0.12.0 33 | 34 | * Feature: added new `tagsUrlSafe` property to every file, so there is access to url safe tag slugs. 35 | 36 | 37 | # 0.11.0 38 | 39 | * Feature: added support for metalsmith-layouts. 40 | 41 | 42 | # 0.10.1 43 | 44 | * Feature: allow skipping of updating of metadata. 45 | 46 | 47 | # 0.10.0 48 | 49 | * Performance: hopefully improve performance of metalsmith-tags with large blogs by 50 | reducing overhead. 51 | 52 | 53 | # 0.9.1 54 | 55 | * Bugfix: When trimming a tag make sure it's a string. 56 | 57 | 58 | # 0.9.0 59 | 60 | * Bugfix: Don't convert spaces in tags to `-` for views. [#16](https://github.com/totocaster/metalsmith-tags/pull/16) 61 | * Update dependencies. 62 | 63 | 64 | # 0.8.1 65 | 66 | * Adds support for arrays of tags [#3](https://github.com/totocaster/metalsmith-tags/pull/3) 67 | 68 | 69 | 70 | # 0.8.0 71 | 72 | * Support metalsmith `1.x` [#13](https://github.com/totocaster/metalsmith-tags/pull/13) 73 | * Use `metalsmith.data()` so you can now manipulate the data later as you desire. [#13](https://github.com/totocaster/metalsmith-tags/pull/13) 74 | * Unified code style. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # metalsmith-tags 2 | 3 | A metalsmith plugin to create dedicated pages for tags in provided in metalsmith pages. 4 | 5 | **NOTE**: looking for new maintainers of this project. please consult [this issue for discussion.](https://github.com/totocaster/metalsmith-tags/issues/26) 6 | 7 | ## Installation 8 | 9 | $ npm install metalsmith-tags 10 | 11 | ## Description in Pages 12 | 13 | In your pages: 14 | 15 | ``` 16 | --- 17 | title: This is page with tags 18 | tags: tagged, page, metalsmith, plugin 19 | --- 20 | 21 | Hello World 22 | ``` 23 | 24 | You can use different handle for the tags, by configuring the `handle` option. `tags` is the default. 25 | 26 | 27 | ## CLI Usage 28 | 29 | Install the node modules and then add the `metalsmith-tags` key to your `metalsmith.json` plugins. The simplest use case just requires tag handle you want to use: 30 | 31 | ```json 32 | { 33 | "plugins": { 34 | "metalsmith-tags": { 35 | "handle": "tags", 36 | "path": "topics/:tag.html", 37 | "layout": "/partials/tag.hbt", 38 | /* Can also use deprecated template property. 39 | "template": "/partials/tag.hbt", 40 | */ 41 | "normalize": true, 42 | "sortBy": "date", 43 | "reverse": true, 44 | "skipMetadata": false, 45 | "slug": { 46 | "mode": "rfc3986" 47 | } 48 | } 49 | } 50 | } 51 | ``` 52 | 53 | ## JavaScript Usage 54 | 55 | Pass the plugin to `Metalsmith#use`: 56 | 57 | ```js 58 | var tags = require('metalsmith-tags'); 59 | 60 | metalsmith 61 | .use(tags({ 62 | // yaml key for tag list in you pages 63 | handle: 'tags', 64 | // path for result pages 65 | path:'topics/:tag.html', 66 | // layout to use for tag listing 67 | layout:'/partials/tag.hbt', 68 | // Can also use `template` property for use with the (deprecated) 69 | // metalsmith-templates plugin. The `template` property is deprecated here 70 | // as well but still available for use. 71 | // template:'/partials/tag.hbt', 72 | // ------ 73 | // Normalize special characters like ØçßÜ to their ASCII equivalents ocssü 74 | // makes use of the value assigned to the 'slug' property below 75 | normalize: true, 76 | // provide posts sorted by 'date' (optional) 77 | sortBy: 'date', 78 | // sort direction (optional) 79 | reverse: true, 80 | // skip updating metalsmith's metadata object. 81 | // useful for improving performance on large blogs 82 | // (optional) 83 | skipMetadata: false, 84 | // Use a non-default key in the metadata. Useful if you you want to 85 | // have two sets of tags in different sets with metalsmith-branch. 86 | metadataKey: "category", 87 | // Any options you want to pass to the [slug](https://github.com/dodo/node-slug) package. 88 | // Can also supply a custom slug function. 89 | // slug: function(tag) { return tag.toLowerCase() } 90 | slug: {mode: 'rfc3986'} 91 | })); 92 | ``` 93 | 94 | ## Result 95 | 96 | This will generate `topics/[tagname].html` pages in your `build` directory with array of `pagination.files` objects on which you can iterate on. You can use `tag` for tag name in your layouts. (You can refer to tests folder for tags layout.) 97 | 98 | The `tags` property on your pages will remain, but it will be modified to an array of objects containing a `name` and `slug` property for each tag. 99 | 100 | You can use `metalsmith-permalink` to customize the permalink of the tag pages as you would do with anything else. 101 | 102 | It is possible to use `opts.metadataKey` for defining the name of the global tag list. 103 | By default it is `'tags'`. 104 | 105 | ### Normalized characters 106 | 107 | Handle with care. This is to be seen rather as a fallback as it heavily depends on your 'slug' settings. If you use the standard setting provided in this readme (*rfc3986*), you should be good to go. Should fix [issue #48](https://github.com/totocaster/metalsmith-tags/issues/48). 108 | 109 | ## Pagination 110 | 111 | Additionally you can paginate your tag pages. To do so add two additional properties to your configuration object, `pathPage` and `perPage`, and modify `path` to point to the root pagination location: 112 | 113 | ```json 114 | { 115 | "handle": "tags", 116 | "path": "topics/:tag/index.html", 117 | "pathPage": "topics/:tag/:num/index.html", 118 | "perPage": 6, 119 | "layout": "/partials/tag.hbt", 120 | /* Can also use deprecated template property. 121 | "template": "/partials/tag.hbt", 122 | */ 123 | "sortBy": "date", 124 | "reverse": true, 125 | "skipMetadata": false, 126 | "slug": { 127 | "mode": "rfc3986" 128 | } 129 | } 130 | ``` 131 | 132 | This will paginate your array of tags so that 6 appear per page, with additional tag pages being nested underneath the first page of tags. For additional details please look at the tests. 133 | 134 | ## Contribution 135 | 136 | Feel free to contribute to this plug-in. Fork, commit, send pull request. 137 | Issues, suggestions and bugs are more than welcome. 138 | 139 | In case you add functionality, please write corresponding test. Test using `npm test`. 140 | 141 | Thanks! 142 | 143 | ## License 144 | 145 | MIT 146 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | var debug = require('debug')('metalsmith-tags'); 2 | var slug = require('slug'); 3 | 4 | /** 5 | * A metalsmith plugin to create dedicated pages for tags in posts or pages. 6 | * 7 | * @return {Function} 8 | */ 9 | function plugin(opts) { 10 | /** 11 | * Holds a mapping of tag names to an array of files with that tag. 12 | * @type {Object} 13 | */ 14 | var tagList = {}; 15 | 16 | opts = opts || {}; 17 | opts.path = opts.path || 'tags/:tag/index.html'; 18 | opts.pathPage = opts.pathPage || 'tags/:tag/:num/index.html'; 19 | opts.layout = opts.layout || 'partials/tag.hbt'; 20 | opts.handle = opts.handle || 'tags'; 21 | opts.metadataKey = opts.metadataKey || 'tags'; 22 | opts.normalize = opts.normalize || opts.slugify || false; 23 | opts.sortBy = opts.sortBy || 'title'; 24 | opts.reverse = opts.reverse || false; 25 | opts.perPage = opts.perPage || 0; 26 | opts.skipMetadata = opts.skipMetadata || false; 27 | opts.slug = opts.slug || {mode: 'rfc3986'}; 28 | 29 | return function(files, metalsmith, done) { 30 | /** 31 | * Get a safe tag 32 | * @param {string} a tag name 33 | * @return {string} safe tag 34 | */ 35 | function safeTag(tag) { 36 | if (typeof opts.slug === 'function') { 37 | return opts.slug(tag); 38 | } 39 | 40 | return slug(tag, opts.slug); 41 | } 42 | 43 | /** 44 | * Sort tags by property given in opts.sortBy. 45 | * @param {Object} a Post object. 46 | * @param {Object} b Post object. 47 | * @return {number} sort value. 48 | */ 49 | function sortBy(a, b) { 50 | a = a[opts.sortBy]; 51 | b = b[opts.sortBy]; 52 | if (!a && !b) { 53 | return 0; 54 | } 55 | if (!a) { 56 | return -1; 57 | } 58 | if (!b) { 59 | return 1; 60 | } 61 | if (b > a) { 62 | return -1; 63 | } 64 | if (a > b) { 65 | return 1; 66 | } 67 | return 0; 68 | } 69 | 70 | function getFilePath(path, opts) { 71 | return path 72 | .replace(/:num/g, opts.num) 73 | .replace(/:tag/g, safeTag(opts.tag)); 74 | } 75 | 76 | // Find all tags and their associated files. 77 | // Using a for-loop so we don't incur the cost of creating a large array 78 | // of file names that we use to loop over the files object. 79 | for (var fileName in files) { 80 | var data = files[fileName]; 81 | if (!data) { 82 | continue; 83 | } 84 | 85 | var tagsData = data[opts.handle]; 86 | 87 | // If we have tag data for this file then turn it into an array of 88 | // individual tags where each tag has been sanitized. 89 | if (tagsData) { 90 | // Convert data into array. 91 | if (typeof tagsData === 'string') { 92 | tagsData = tagsData.split(','); 93 | } 94 | 95 | // Re-initialize tag array. 96 | data[opts.handle] = []; 97 | 98 | tagsData.forEach(function(rawTag) { 99 | // Trim leading + trailing white space from tag. 100 | var tag = '' 101 | if (typeof rawTag === 'object') { 102 | tag = String(rawTag.name).trim(); 103 | } else { 104 | tag = String(rawTag).trim(); 105 | } 106 | 107 | // If normalize/slugify was set to true, remove all special characters like ÄÖØß... 108 | var tag = opts.normalize ? safeTag(tag) : tag; 109 | debug(tag); 110 | 111 | // Save url safe formatted and display versions of tag data 112 | // Prevent transforming into a safe tag again, if it was done before 113 | data[opts.handle].push({ name: tag, slug: opts.normalize ? tag : safeTag(tag)}); 114 | 115 | // Add each tag to our overall tagList and initialize array if it 116 | // doesn't exist. 117 | if (!tagList[tag]) { 118 | tagList[tag] = []; 119 | } 120 | 121 | // Store a reference to where the file data exists to reduce our 122 | // overhead. 123 | tagList[tag].push(fileName); 124 | }); 125 | } 126 | } 127 | 128 | // Add to metalsmith.metadata for access outside of the tag files. 129 | if (!opts.skipMetadata) { 130 | var metadata = metalsmith.metadata(); 131 | metadata[opts.metadataKey] = metadata[opts.metadataKey] || {}; 132 | } 133 | 134 | for (var tag in tagList) { 135 | // Map the array of tagList names back to the actual data object. 136 | // Sort tags via opts.sortBy property value. 137 | var posts = tagList[tag].map(function(fileName) { 138 | return files[fileName]; 139 | }).sort(sortBy); 140 | 141 | // Reverse posts if desired. 142 | if (opts.reverse) { 143 | posts.reverse(); 144 | } 145 | 146 | if (!opts.skipMetadata) { 147 | metadata[opts.metadataKey][tag] = posts; 148 | metadata[opts.metadataKey][tag].urlSafe = safeTag(tag); 149 | } 150 | 151 | // If we set opts.perPage to 0 then we don't want to paginate and as such 152 | // we should have all posts shown on one page. 153 | var postsPerPage = opts.perPage === 0 ? posts.length : opts.perPage; 154 | var numPages = Math.ceil(posts.length / postsPerPage); 155 | var pages = []; 156 | 157 | for (var i = 0; i < numPages; i++) { 158 | var pageFiles = posts.slice(i * postsPerPage, (i + 1) * postsPerPage); 159 | 160 | // Generate a new file based on the filename with correct metadata. 161 | var page = { 162 | layout: opts.layout, 163 | // TODO: remove this property when metalsmith-templates usage 164 | // declines. 165 | template: opts.template, 166 | contents: '', 167 | tag: tag, 168 | pagination: { 169 | num: i + 1, 170 | pages: pages, 171 | tag: tag, 172 | files: pageFiles 173 | } 174 | }; 175 | 176 | // Render the non-first pages differently to the rest, when set. 177 | if (i > 0 && opts.pathPage) { 178 | page.path = getFilePath(opts.pathPage, page.pagination); 179 | } else { 180 | page.path = getFilePath(opts.path, page.pagination); 181 | } 182 | 183 | // Add new page to files object. 184 | files[page.path] = page; 185 | 186 | // Update next/prev references. 187 | var previousPage = pages[i - 1]; 188 | if (previousPage) { 189 | page.pagination.previous = previousPage; 190 | previousPage.pagination.next = page; 191 | } 192 | 193 | pages.push(page); 194 | } 195 | } 196 | 197 | // update metadata 198 | if (!opts.skipMetadata) { 199 | metalsmith.metadata(metadata); 200 | } 201 | 202 | /* clearing this after each pass avoids 203 | * double counting when using metalsmith-watch 204 | */ 205 | tagList = {}; 206 | done(); 207 | 208 | }; 209 | } 210 | 211 | /** 212 | * Expose `plugin`. 213 | */ 214 | module.exports = plugin; 215 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var equal = require('assert-dir-equal'); 3 | var Metalsmith = require('metalsmith'); 4 | var layouts = require('metalsmith-layouts'); 5 | var tags = require('../lib'); 6 | var Handlebars = require('handlebars'); 7 | var moment = require('moment'); 8 | var slug = require('slug'); 9 | 10 | Handlebars.registerHelper('dateFormat', function(context, format) { 11 | var f = format || 'DD/MM/YYYY'; 12 | return moment(new Date(context)).utcOffset('+0000').format(f); 13 | }); 14 | 15 | describe('metalsmith-tags', function() { 16 | 17 | it('should modify comma separated tags into dehumanized array', function(done) { 18 | Metalsmith('test/fixtures') 19 | .use(tags({ 20 | handle: 'tags', 21 | path:'topics' 22 | })) 23 | .build(function(err,files){ 24 | if (err) return done(err); 25 | assert.equal(files['index.html'].tags.toString(),[ 26 | { name: 'hello', slug: 'hello'}, 27 | { name: 'world', slug: 'world'}, 28 | { name: 'this is', slug: 'this-is'}, 29 | { name: 'tag', slug: 'tag'}, 30 | { name: 'skol', slug: 'skol'}, 31 | ].toString()); 32 | done(); 33 | }); 34 | }); 35 | 36 | it('should create a tags property to metalsmith.metadata', function(done) { 37 | var tagList; 38 | 39 | Metalsmith('test/fixtures') 40 | .use(tags({ 41 | handle: 'tags', 42 | path: 'topics' 43 | })) 44 | .use(function(files, metalsmith, done) { 45 | tagList = metalsmith.metadata().tags; 46 | done(); 47 | }) 48 | .build(function(err, files){ 49 | if (err) return done(err); 50 | var tagListKeys = Object.keys(tagList).sort(); 51 | assert.deepEqual(tagListKeys, [ 52 | 'hello', 53 | 'skol', 54 | 'skØl', 55 | 'sköl', 56 | 'skøl', 57 | 'tag', 58 | 'this', 59 | 'this is', 60 | 'world', 61 | ]); 62 | // Ensure every object in the metadata tags array is a data object. 63 | tagListKeys.forEach(function(tagName) { 64 | var tagPostsArray = tagList[tagName]; 65 | tagPostsArray.forEach(function(fileData) { 66 | assert.equal(typeof fileData, 'object'); 67 | assert.ok(fileData.stats); 68 | assert.ok(fileData.contents); 69 | assert.ok(fileData.tags); 70 | }); 71 | }); 72 | done(); 73 | }); 74 | }); 75 | 76 | it('should normalize special characters into their ascii equivalent using given slug function', function(done) { 77 | var tagList; 78 | 79 | Metalsmith('test/fixtures') 80 | .use(tags({ 81 | handle: 'tags', 82 | path: 'topics', 83 | normalize: true, 84 | })) 85 | .use(function(files, metalsmith, done) { 86 | tagList = metalsmith.metadata().tags; 87 | done(); 88 | }) 89 | .build(function(err, files){ 90 | if (err) return done(err); 91 | var tagListKeys = Object.keys(tagList).sort(); 92 | assert.deepEqual(tagListKeys, [ 93 | 'hello', 94 | 'skol', 95 | 'tag', 96 | 'this', 97 | 'this-is', 98 | 'world', 99 | ]); 100 | // Ensure every object in the metadata tags array is a data object. 101 | tagListKeys.forEach(function(tagName) { 102 | var tagPostsArray = tagList[tagName]; 103 | tagPostsArray.forEach(function(fileData) { 104 | assert.equal(typeof fileData, 'object'); 105 | assert.ok(fileData.stats); 106 | assert.ok(fileData.contents); 107 | assert.ok(fileData.tags); 108 | }); 109 | }); 110 | done(); 111 | }); 112 | }); 113 | 114 | it('should add a urlSafe property to each tag post list', function(done) { 115 | var tagList; 116 | 117 | Metalsmith('test/fixtures') 118 | .use(tags({ 119 | handle: 'tags', 120 | path: 'topics', 121 | })) 122 | .use(function(files, metalsmith, done) { 123 | tagList = metalsmith.metadata().tags; 124 | done(); 125 | }) 126 | .build(function(err, files){ 127 | if (err) return done(err); 128 | var tagListKeys = Object.keys(tagList).sort(); 129 | assert.deepEqual(tagListKeys, [ 130 | 'hello', 131 | 'skol', 132 | 'skØl', 133 | 'sköl', 134 | 'skøl', 135 | 'tag', 136 | 'this', 137 | 'this is', 138 | 'world', 139 | ]); 140 | // Ensure every object in the metadata tags array is a data object. 141 | tagListKeys.forEach(function(tagName) { 142 | var tagPostsArray = tagList[tagName]; 143 | assert.ok(tagList[tagName].urlSafe); 144 | assert.equal(typeof tagList[tagName].urlSafe, 'string'); 145 | assert.equal(slug(tagName, {mode: 'rfc3986'}), tagList[tagName].urlSafe); 146 | }); 147 | done(); 148 | }); 149 | }); 150 | 151 | it('should skip creating a tags property on metalsmith.metadata', function(done) { 152 | var tagList; 153 | 154 | Metalsmith('test/fixtures') 155 | .use(tags({ 156 | handle: 'tags', 157 | path: 'topics', 158 | skipMetadata: true 159 | })) 160 | .use(function(files, metalsmith, done) { 161 | tagList = metalsmith.metadata().tags; 162 | done(); 163 | }) 164 | .build(function(err, files){ 165 | if (err) return done(err); 166 | assert.equal(typeof tagList, 'undefined'); 167 | done(); 168 | }); 169 | }); 170 | 171 | var templateConfig = { 172 | engine: 'handlebars', 173 | directory: './', 174 | pattern: "topics/**/*.html" 175 | }; 176 | 177 | it('should create tag page with post lists according to template and sorted by date decreasing', function(done) { 178 | Metalsmith('test/fixtures') 179 | .use(tags({ 180 | handle: 'tags', 181 | path: 'topics/:tag.html', 182 | layout: './tag.hbt', 183 | normalize: true, 184 | sortBy: 'date', 185 | reverse: true 186 | })) 187 | .use(layouts(templateConfig)) 188 | .build(function(err){ 189 | if (err) return done(err); 190 | equal('test/fixtures/expected/no-pagination/topics', 'test/fixtures/build/topics'); 191 | done(); 192 | }); 193 | }); 194 | 195 | it('should create tag pages with pagination with post lists according to template and sorted by date decreasing', function(done) { 196 | Metalsmith('test/fixtures') 197 | .use(tags({ 198 | handle: 'tags', 199 | path: 'topics/:tag/index.html', 200 | pathPage: 'topics/:tag/:num/index.html', 201 | perPage: 1, 202 | layout: './tag.hbt', 203 | normalize: true, 204 | sortBy: 'date', 205 | reverse: true 206 | })) 207 | .use(layouts(templateConfig)) 208 | .build(function(err){ 209 | if (err) return done(err); 210 | equal('test/fixtures/expected/pagination/topics', 'test/fixtures/build/topics'); 211 | done(); 212 | }); 213 | }); 214 | 215 | it('should support custom slug functions', function(done) { 216 | Metalsmith('test/fixtures') 217 | .use(tags({ 218 | handle: 'tags', 219 | path: 'topics', 220 | slug: function(tag) { 221 | return tag.toUpperCase(); 222 | } 223 | })) 224 | .build(function(err, files) { 225 | if (err) return done(err); 226 | assert.equal(files['index.html'].tags.toString(),[ 227 | { name: 'hello', slug: 'HELLO'}, 228 | { name: 'world', slug: 'WORLD'}, 229 | { name: 'this is', slug: 'THIS IS'}, 230 | { name: 'tag', slug: 'TAG'}, 231 | { name: 'skol', slug: 'SKOL'}, 232 | ].toString()); 233 | done(); 234 | }); 235 | }) 236 | }); 237 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | absolute@0.0.1: 6 | version "0.0.1" 7 | resolved "https://registry.yarnpkg.com/absolute/-/absolute-0.0.1.tgz#c22822f87e1c939f579887504d9c109c4173829d" 8 | 9 | acorn@^4.0.3: 10 | version "4.0.13" 11 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" 12 | 13 | align-text@^0.1.1, align-text@^0.1.3: 14 | version "0.1.4" 15 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 16 | dependencies: 17 | kind-of "^3.0.2" 18 | longest "^1.0.1" 19 | repeat-string "^1.5.2" 20 | 21 | alter@~0.2.0: 22 | version "0.2.0" 23 | resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" 24 | dependencies: 25 | stable "~0.1.3" 26 | 27 | amdefine@>=0.0.4: 28 | version "1.0.1" 29 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 30 | 31 | ansi-red@^0.1.1: 32 | version "0.1.1" 33 | resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" 34 | dependencies: 35 | ansi-wrap "0.1.0" 36 | 37 | ansi-regex@^0.2.0, ansi-regex@^0.2.1: 38 | version "0.2.1" 39 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" 40 | 41 | ansi-styles@^1.1.0: 42 | version "1.1.0" 43 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" 44 | 45 | ansi-wrap@0.1.0: 46 | version "0.1.0" 47 | resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" 48 | 49 | argparse@^1.0.7: 50 | version "1.0.9" 51 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 52 | dependencies: 53 | sprintf-js "~1.0.2" 54 | 55 | array-differ@^1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 58 | 59 | array-union@^1.0.1: 60 | version "1.0.2" 61 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 62 | dependencies: 63 | array-uniq "^1.0.1" 64 | 65 | array-uniq@^1.0.1: 66 | version "1.0.3" 67 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 68 | 69 | arrify@^1.0.0: 70 | version "1.0.1" 71 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 72 | 73 | assert-dir-equal@1.0.1: 74 | version "1.0.1" 75 | resolved "https://registry.yarnpkg.com/assert-dir-equal/-/assert-dir-equal-1.0.1.tgz#1a0bc214bd227282d7b3cc8b61381a934edcebc9" 76 | dependencies: 77 | buffer-equal "0.0.0" 78 | fs-readdir-recursive "0.0.1" 79 | is-utf8 "~0.2.0" 80 | 81 | ast-traverse@~0.1.1: 82 | version "0.1.1" 83 | resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" 84 | 85 | ast-types@0.8.12: 86 | version "0.8.12" 87 | resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" 88 | 89 | ast-types@0.9.6: 90 | version "0.9.6" 91 | resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" 92 | 93 | async@^1.3.0, async@^1.4.0: 94 | version "1.5.2" 95 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 96 | 97 | async@~0.9.0: 98 | version "0.9.2" 99 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 100 | 101 | balanced-match@^1.0.0: 102 | version "1.0.0" 103 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 104 | 105 | bluebird@^3.1.1: 106 | version "3.5.0" 107 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" 108 | 109 | brace-expansion@^1.1.7: 110 | version "1.1.8" 111 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 112 | dependencies: 113 | balanced-match "^1.0.0" 114 | concat-map "0.0.1" 115 | 116 | breakable@~1.0.0: 117 | version "1.0.0" 118 | resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" 119 | 120 | buffer-equal@0.0.0: 121 | version "0.0.0" 122 | resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.0.tgz#4a68196ac33522daa17ec99858b302a636b62cf1" 123 | 124 | camelcase@^1.0.2, camelcase@^1.2.1: 125 | version "1.2.1" 126 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 127 | 128 | center-align@^0.1.1: 129 | version "0.1.3" 130 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 131 | dependencies: 132 | align-text "^0.1.3" 133 | lazy-cache "^1.0.3" 134 | 135 | chalk@^0.5.0: 136 | version "0.5.1" 137 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" 138 | dependencies: 139 | ansi-styles "^1.1.0" 140 | escape-string-regexp "^1.0.0" 141 | has-ansi "^0.1.0" 142 | strip-ansi "^0.3.0" 143 | supports-color "^0.2.0" 144 | 145 | cliui@^2.1.0: 146 | version "2.1.0" 147 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 148 | dependencies: 149 | center-align "^0.1.1" 150 | right-align "^0.1.1" 151 | wordwrap "0.0.2" 152 | 153 | clone@^0.1.11: 154 | version "0.1.19" 155 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85" 156 | 157 | co-from-stream@0.0.0: 158 | version "0.0.0" 159 | resolved "https://registry.yarnpkg.com/co-from-stream/-/co-from-stream-0.0.0.tgz#1a5cd8ced77263946094fa39f2499a63297bcaf9" 160 | dependencies: 161 | co-read "0.0.1" 162 | 163 | co-fs-extra@0.0.2: 164 | version "0.0.2" 165 | resolved "https://registry.yarnpkg.com/co-fs-extra/-/co-fs-extra-0.0.2.tgz#02cfb5cd5c24b25f6880d3e602a79bbe3a40f934" 166 | dependencies: 167 | co-fs "1.2.0" 168 | fs-extra "0.12.0" 169 | thunkify "2.1.2" 170 | 171 | co-fs@1.2.0: 172 | version "1.2.0" 173 | resolved "https://registry.yarnpkg.com/co-fs/-/co-fs-1.2.0.tgz#a6df045ce58c04eed45586ff4385032813aba64e" 174 | dependencies: 175 | co-from-stream "0.0.0" 176 | thunkify "0.0.1" 177 | 178 | co-read@0.0.1: 179 | version "0.0.1" 180 | resolved "https://registry.yarnpkg.com/co-read/-/co-read-0.0.1.tgz#f81b3eb8a86675fec51e3d883a7f564e873c9389" 181 | 182 | co@3.1.0, co@~3.1.0: 183 | version "3.1.0" 184 | resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" 185 | 186 | coffee-script@^1.12.4: 187 | version "1.12.7" 188 | resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" 189 | 190 | commander@0.6.1: 191 | version "0.6.1" 192 | resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" 193 | 194 | commander@2.3.0: 195 | version "2.3.0" 196 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" 197 | 198 | commander@^2.5.0, commander@^2.6.0: 199 | version "2.11.0" 200 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 201 | 202 | commoner@~0.10.3: 203 | version "0.10.8" 204 | resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" 205 | dependencies: 206 | commander "^2.5.0" 207 | detective "^4.3.1" 208 | glob "^5.0.15" 209 | graceful-fs "^4.1.2" 210 | iconv-lite "^0.4.5" 211 | mkdirp "^0.5.0" 212 | private "^0.1.6" 213 | q "^1.1.2" 214 | recast "^0.11.17" 215 | 216 | concat-map@0.0.1: 217 | version "0.0.1" 218 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 219 | 220 | consolidate@^0.14.0: 221 | version "0.14.5" 222 | resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" 223 | dependencies: 224 | bluebird "^3.1.1" 225 | 226 | debug@2.2.0: 227 | version "2.2.0" 228 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 229 | dependencies: 230 | ms "0.7.1" 231 | 232 | debug@^2.2.0: 233 | version "2.6.9" 234 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 235 | dependencies: 236 | ms "2.0.0" 237 | 238 | debug@^3.1.0: 239 | version "3.1.0" 240 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 241 | dependencies: 242 | ms "2.0.0" 243 | 244 | decamelize@^1.0.0: 245 | version "1.2.0" 246 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 247 | 248 | defined@^1.0.0: 249 | version "1.0.0" 250 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 251 | 252 | defs@~1.1.0: 253 | version "1.1.1" 254 | resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" 255 | dependencies: 256 | alter "~0.2.0" 257 | ast-traverse "~0.1.1" 258 | breakable "~1.0.0" 259 | esprima-fb "~15001.1001.0-dev-harmony-fb" 260 | simple-fmt "~0.1.0" 261 | simple-is "~0.2.0" 262 | stringmap "~0.2.2" 263 | stringset "~0.2.1" 264 | tryor "~0.1.2" 265 | yargs "~3.27.0" 266 | 267 | detective@^4.3.1: 268 | version "4.5.0" 269 | resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1" 270 | dependencies: 271 | acorn "^4.0.3" 272 | defined "^1.0.0" 273 | 274 | diff@1.4.0: 275 | version "1.4.0" 276 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 277 | 278 | escape-string-regexp@1.0.2: 279 | version "1.0.2" 280 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" 281 | 282 | escape-string-regexp@^1.0.0: 283 | version "1.0.5" 284 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 285 | 286 | esprima-fb@~15001.1001.0-dev-harmony-fb: 287 | version "15001.1001.0-dev-harmony-fb" 288 | resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" 289 | 290 | esprima@^4.0.0: 291 | version "4.0.0" 292 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 293 | 294 | esprima@~3.1.0: 295 | version "3.1.3" 296 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 297 | 298 | extend-shallow@^2.0.1: 299 | version "2.0.1" 300 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 301 | dependencies: 302 | is-extendable "^0.1.0" 303 | 304 | extend@^3.0.0: 305 | version "3.0.1" 306 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 307 | 308 | fs-extra@0.12.0: 309 | version "0.12.0" 310 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.12.0.tgz#407cf6e11321e440d66f9486fba1cc9eb4c21868" 311 | dependencies: 312 | jsonfile "^2.0.0" 313 | mkdirp "^0.5.0" 314 | ncp "^0.6.0" 315 | rimraf "^2.2.8" 316 | 317 | fs-extra@~0.10.0: 318 | version "0.10.0" 319 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.10.0.tgz#99c0ec2fd5eaaad9d646245e4b014b56729982af" 320 | dependencies: 321 | jsonfile "^1.2.0" 322 | mkdirp "^0.5.0" 323 | ncp "^0.5.1" 324 | rimraf "^2.2.8" 325 | 326 | fs-readdir-recursive@0.0.1: 327 | version "0.0.1" 328 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.0.1.tgz#f2223ab40293e436696d33b67f6b3e6d2e6a8c12" 329 | 330 | fs-readdir-recursive@^1.0.0: 331 | version "1.0.0" 332 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 333 | 334 | fs.realpath@^1.0.0: 335 | version "1.0.0" 336 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 337 | 338 | glob@3.2.11: 339 | version "3.2.11" 340 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" 341 | dependencies: 342 | inherits "2" 343 | minimatch "0.3" 344 | 345 | glob@^5.0.15: 346 | version "5.0.15" 347 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 348 | dependencies: 349 | inflight "^1.0.4" 350 | inherits "2" 351 | minimatch "2 || 3" 352 | once "^1.3.0" 353 | path-is-absolute "^1.0.0" 354 | 355 | glob@^7.0.5: 356 | version "7.1.2" 357 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 358 | dependencies: 359 | fs.realpath "^1.0.0" 360 | inflight "^1.0.4" 361 | inherits "2" 362 | minimatch "^3.0.4" 363 | once "^1.3.0" 364 | path-is-absolute "^1.0.0" 365 | 366 | gnode@^0.1.0: 367 | version "0.1.2" 368 | resolved "https://registry.yarnpkg.com/gnode/-/gnode-0.1.2.tgz#0a955a5cc222f699e14306a4559505d90080fdd9" 369 | dependencies: 370 | regenerator "~0.8.8" 371 | 372 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 373 | version "4.1.11" 374 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 375 | 376 | gray-matter@^2.0.0: 377 | version "2.1.1" 378 | resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-2.1.1.tgz#3042d9adec2a1ded6a7707a9ed2380f8a17a430e" 379 | dependencies: 380 | ansi-red "^0.1.1" 381 | coffee-script "^1.12.4" 382 | extend-shallow "^2.0.1" 383 | js-yaml "^3.8.1" 384 | toml "^2.3.2" 385 | 386 | growl@1.9.2: 387 | version "1.9.2" 388 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 389 | 390 | handlebars@*: 391 | version "4.0.10" 392 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" 393 | dependencies: 394 | async "^1.4.0" 395 | optimist "^0.6.1" 396 | source-map "^0.4.4" 397 | optionalDependencies: 398 | uglify-js "^2.6" 399 | 400 | has-ansi@^0.1.0: 401 | version "0.1.0" 402 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" 403 | dependencies: 404 | ansi-regex "^0.2.0" 405 | 406 | iconv-lite@^0.4.5: 407 | version "0.4.19" 408 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 409 | 410 | inflight@^1.0.4: 411 | version "1.0.6" 412 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 413 | dependencies: 414 | once "^1.3.0" 415 | wrappy "1" 416 | 417 | inherits@2: 418 | version "2.0.3" 419 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 420 | 421 | invert-kv@^1.0.0: 422 | version "1.0.0" 423 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 424 | 425 | is-buffer@^1.1.5: 426 | version "1.1.5" 427 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 428 | 429 | is-extendable@^0.1.0: 430 | version "0.1.1" 431 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 432 | 433 | is-utf8@^0.2.0, is-utf8@~0.2.0: 434 | version "0.2.1" 435 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 436 | 437 | is@^2.2.0: 438 | version "2.2.1" 439 | resolved "https://registry.yarnpkg.com/is/-/is-2.2.1.tgz#5b0557a3dc68089d978ecd1184cc8fc529837a04" 440 | 441 | jade@0.26.3: 442 | version "0.26.3" 443 | resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" 444 | dependencies: 445 | commander "0.6.1" 446 | mkdirp "0.3.0" 447 | 448 | js-yaml@^3.8.1: 449 | version "3.10.0" 450 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 451 | dependencies: 452 | argparse "^1.0.7" 453 | esprima "^4.0.0" 454 | 455 | jsonfile@^1.2.0: 456 | version "1.2.0" 457 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-1.2.0.tgz#5f35d6cd9f946ec97b5b18353fa9e58df1b86f6a" 458 | 459 | jsonfile@^2.0.0: 460 | version "2.4.0" 461 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 462 | optionalDependencies: 463 | graceful-fs "^4.1.6" 464 | 465 | kind-of@^3.0.2: 466 | version "3.2.2" 467 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 468 | dependencies: 469 | is-buffer "^1.1.5" 470 | 471 | lazy-cache@^1.0.3: 472 | version "1.0.4" 473 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 474 | 475 | lcid@^1.0.0: 476 | version "1.0.0" 477 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 478 | dependencies: 479 | invert-kv "^1.0.0" 480 | 481 | lodash.omit@^4.0.2: 482 | version "4.5.0" 483 | resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" 484 | 485 | longest@^1.0.1: 486 | version "1.0.1" 487 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 488 | 489 | lru-cache@2: 490 | version "2.7.3" 491 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 492 | 493 | metalsmith-layouts@1.x: 494 | version "1.8.1" 495 | resolved "https://registry.yarnpkg.com/metalsmith-layouts/-/metalsmith-layouts-1.8.1.tgz#a365d39939d9146cdfe51fadee7d875573fccbdc" 496 | dependencies: 497 | async "^1.3.0" 498 | consolidate "^0.14.0" 499 | debug "^2.2.0" 500 | extend "^3.0.0" 501 | fs-readdir-recursive "^1.0.0" 502 | is-utf8 "^0.2.0" 503 | lodash.omit "^4.0.2" 504 | multimatch "^2.0.0" 505 | 506 | metalsmith@1.x: 507 | version "1.7.0" 508 | resolved "https://registry.yarnpkg.com/metalsmith/-/metalsmith-1.7.0.tgz#cb6860d5010d8036ada27c4496d149abe2a3504d" 509 | dependencies: 510 | absolute "0.0.1" 511 | async "~0.9.0" 512 | chalk "^0.5.0" 513 | clone "^0.1.11" 514 | co-fs-extra "0.0.2" 515 | commander "^2.6.0" 516 | fs-extra "~0.10.0" 517 | gnode "^0.1.0" 518 | gray-matter "^2.0.0" 519 | is "^2.2.0" 520 | is-utf8 "~0.2.0" 521 | recursive-readdir "^1.2.1" 522 | rimraf "^2.2.8" 523 | stat-mode "^0.2.0" 524 | thunkify "^2.1.2" 525 | unyield "0.0.1" 526 | ware "^1.2.0" 527 | 528 | minimatch@0.3, minimatch@0.3.0: 529 | version "0.3.0" 530 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" 531 | dependencies: 532 | lru-cache "2" 533 | sigmund "~1.0.0" 534 | 535 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.4: 536 | version "3.0.4" 537 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 538 | dependencies: 539 | brace-expansion "^1.1.7" 540 | 541 | minimist@0.0.8: 542 | version "0.0.8" 543 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 544 | 545 | minimist@~0.0.1: 546 | version "0.0.10" 547 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 548 | 549 | mkdirp@0.3.0: 550 | version "0.3.0" 551 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" 552 | 553 | mkdirp@0.5.1, mkdirp@^0.5.0: 554 | version "0.5.1" 555 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 556 | dependencies: 557 | minimist "0.0.8" 558 | 559 | mocha@2.x: 560 | version "2.5.3" 561 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" 562 | dependencies: 563 | commander "2.3.0" 564 | debug "2.2.0" 565 | diff "1.4.0" 566 | escape-string-regexp "1.0.2" 567 | glob "3.2.11" 568 | growl "1.9.2" 569 | jade "0.26.3" 570 | mkdirp "0.5.1" 571 | supports-color "1.2.0" 572 | to-iso-string "0.0.2" 573 | 574 | moment@^2.10.3: 575 | version "2.18.1" 576 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" 577 | 578 | ms@0.7.1: 579 | version "0.7.1" 580 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 581 | 582 | ms@2.0.0: 583 | version "2.0.0" 584 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 585 | 586 | multimatch@^2.0.0: 587 | version "2.1.0" 588 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" 589 | dependencies: 590 | array-differ "^1.0.0" 591 | array-union "^1.0.1" 592 | arrify "^1.0.0" 593 | minimatch "^3.0.0" 594 | 595 | ncp@^0.5.1: 596 | version "0.5.1" 597 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.5.1.tgz#743985316e3db459281b587169e845735a05439f" 598 | 599 | ncp@^0.6.0: 600 | version "0.6.0" 601 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.6.0.tgz#df8ce021e262be21b52feb3d3e5cfaab12491f0d" 602 | 603 | once@^1.3.0: 604 | version "1.4.0" 605 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 606 | dependencies: 607 | wrappy "1" 608 | 609 | optimist@^0.6.1: 610 | version "0.6.1" 611 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 612 | dependencies: 613 | minimist "~0.0.1" 614 | wordwrap "~0.0.2" 615 | 616 | os-locale@^1.4.0: 617 | version "1.4.0" 618 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 619 | dependencies: 620 | lcid "^1.0.0" 621 | 622 | path-is-absolute@^1.0.0: 623 | version "1.0.1" 624 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 625 | 626 | private@^0.1.6, private@~0.1.5: 627 | version "0.1.7" 628 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 629 | 630 | q@^1.1.2: 631 | version "1.5.0" 632 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" 633 | 634 | recast@0.10.33: 635 | version "0.10.33" 636 | resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" 637 | dependencies: 638 | ast-types "0.8.12" 639 | esprima-fb "~15001.1001.0-dev-harmony-fb" 640 | private "~0.1.5" 641 | source-map "~0.5.0" 642 | 643 | recast@^0.11.17: 644 | version "0.11.23" 645 | resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" 646 | dependencies: 647 | ast-types "0.9.6" 648 | esprima "~3.1.0" 649 | private "~0.1.5" 650 | source-map "~0.5.0" 651 | 652 | recursive-readdir@^1.2.1: 653 | version "1.3.0" 654 | resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-1.3.0.tgz#c6e66c9ae473f4928f8e6c67a05d80e7a56528ef" 655 | dependencies: 656 | minimatch "0.3.0" 657 | 658 | regenerator-runtime@~0.9.5: 659 | version "0.9.6" 660 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" 661 | 662 | regenerator@~0.8.8: 663 | version "0.8.46" 664 | resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.46.tgz#154c327686361ed52cad69b2545efc53a3d07696" 665 | dependencies: 666 | commoner "~0.10.3" 667 | defs "~1.1.0" 668 | esprima-fb "~15001.1001.0-dev-harmony-fb" 669 | private "~0.1.5" 670 | recast "0.10.33" 671 | regenerator-runtime "~0.9.5" 672 | through "~2.3.8" 673 | 674 | repeat-string@^1.5.2: 675 | version "1.6.1" 676 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 677 | 678 | right-align@^0.1.1: 679 | version "0.1.3" 680 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 681 | dependencies: 682 | align-text "^0.1.1" 683 | 684 | rimraf@^2.2.8: 685 | version "2.6.2" 686 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 687 | dependencies: 688 | glob "^7.0.5" 689 | 690 | sigmund@~1.0.0: 691 | version "1.0.1" 692 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 693 | 694 | simple-fmt@~0.1.0: 695 | version "0.1.0" 696 | resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" 697 | 698 | simple-is@~0.2.0: 699 | version "0.2.0" 700 | resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" 701 | 702 | slug@^0.9.1: 703 | version "0.9.1" 704 | resolved "https://registry.yarnpkg.com/slug/-/slug-0.9.1.tgz#af08f608a7c11516b61778aa800dce84c518cfda" 705 | dependencies: 706 | unicode ">= 0.3.1" 707 | 708 | source-map@^0.4.4: 709 | version "0.4.4" 710 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 711 | dependencies: 712 | amdefine ">=0.0.4" 713 | 714 | source-map@~0.5.0, source-map@~0.5.1: 715 | version "0.5.7" 716 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 717 | 718 | sprintf-js@~1.0.2: 719 | version "1.0.3" 720 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 721 | 722 | stable@~0.1.3: 723 | version "0.1.6" 724 | resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" 725 | 726 | stat-mode@^0.2.0: 727 | version "0.2.2" 728 | resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" 729 | 730 | stringmap@~0.2.2: 731 | version "0.2.2" 732 | resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" 733 | 734 | stringset@~0.2.1: 735 | version "0.2.1" 736 | resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" 737 | 738 | strip-ansi@^0.3.0: 739 | version "0.3.0" 740 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" 741 | dependencies: 742 | ansi-regex "^0.2.1" 743 | 744 | supports-color@1.2.0: 745 | version "1.2.0" 746 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" 747 | 748 | supports-color@^0.2.0: 749 | version "0.2.0" 750 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" 751 | 752 | through@~2.3.8: 753 | version "2.3.8" 754 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 755 | 756 | thunkify@0.0.1: 757 | version "0.0.1" 758 | resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-0.0.1.tgz#bd5d36b1069b4078e5dcbac8fab45359bea6183d" 759 | 760 | thunkify@2.1.2, thunkify@^2.1.2: 761 | version "2.1.2" 762 | resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" 763 | 764 | to-iso-string@0.0.2: 765 | version "0.0.2" 766 | resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" 767 | 768 | toml@^2.3.2: 769 | version "2.3.3" 770 | resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb" 771 | 772 | tryor@~0.1.2: 773 | version "0.1.2" 774 | resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" 775 | 776 | uglify-js@^2.6: 777 | version "2.8.29" 778 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 779 | dependencies: 780 | source-map "~0.5.1" 781 | yargs "~3.10.0" 782 | optionalDependencies: 783 | uglify-to-browserify "~1.0.0" 784 | 785 | uglify-to-browserify@~1.0.0: 786 | version "1.0.2" 787 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 788 | 789 | "unicode@>= 0.3.1": 790 | version "10.0.0" 791 | resolved "https://registry.yarnpkg.com/unicode/-/unicode-10.0.0.tgz#e5d51c1db93b6c71a0b879e0b0c4af7e6fdf688e" 792 | 793 | unyield@0.0.1: 794 | version "0.0.1" 795 | resolved "https://registry.yarnpkg.com/unyield/-/unyield-0.0.1.tgz#150e65da42bf7742445b958a64eb9b85d1d2b180" 796 | dependencies: 797 | co "~3.1.0" 798 | 799 | ware@^1.2.0: 800 | version "1.3.0" 801 | resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" 802 | dependencies: 803 | wrap-fn "^0.1.0" 804 | 805 | window-size@0.1.0: 806 | version "0.1.0" 807 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 808 | 809 | window-size@^0.1.2: 810 | version "0.1.4" 811 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" 812 | 813 | wordwrap@0.0.2: 814 | version "0.0.2" 815 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 816 | 817 | wordwrap@~0.0.2: 818 | version "0.0.3" 819 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 820 | 821 | wrap-fn@^0.1.0: 822 | version "0.1.5" 823 | resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" 824 | dependencies: 825 | co "3.1.0" 826 | 827 | wrappy@1: 828 | version "1.0.2" 829 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 830 | 831 | y18n@^3.2.0: 832 | version "3.2.1" 833 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 834 | 835 | yargs@~3.10.0: 836 | version "3.10.0" 837 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 838 | dependencies: 839 | camelcase "^1.0.2" 840 | cliui "^2.1.0" 841 | decamelize "^1.0.0" 842 | window-size "0.1.0" 843 | 844 | yargs@~3.27.0: 845 | version "3.27.0" 846 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" 847 | dependencies: 848 | camelcase "^1.2.1" 849 | cliui "^2.1.0" 850 | decamelize "^1.0.0" 851 | os-locale "^1.4.0" 852 | window-size "^0.1.2" 853 | y18n "^3.2.0" 854 | --------------------------------------------------------------------------------