├── 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 |
3 | - 07/02/2014 test page 2
4 |
--------------------------------------------------------------------------------
/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 |
3 | - 07/02/2014 test page 2
4 |
--------------------------------------------------------------------------------
/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 |
3 | - 07/02/2014 test page 2
4 |
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 |
3 | - 07/02/2014 test page 2
4 |
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 |
3 | - 07/02/2014 test page 2
4 |
Next
--------------------------------------------------------------------------------
/test/fixtures/expected/pagination/topics/skol/2/index.html:
--------------------------------------------------------------------------------
1 | Posts for skol
2 |
3 | - 07/01/2014 test json
4 |
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 |
3 | - 07/01/2014 test json
4 |
PreviousNext
--------------------------------------------------------------------------------
/test/fixtures/expected/pagination/topics/hello/2/index.html:
--------------------------------------------------------------------------------
1 | Posts for hello
2 |
3 | - 07/01/2014 test json
4 |
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 |
3 | - 07/02/2014 test page 2
4 |
5 | - 07/01/2014 test json
6 |
7 | - 02/03/2014 test
8 |
--------------------------------------------------------------------------------
/test/fixtures/expected/no-pagination/topics/skol.html:
--------------------------------------------------------------------------------
1 | Posts for skol
2 |
3 | - 07/02/2014 test page 2
4 |
5 | - 07/01/2014 test json
6 |
7 | - 02/03/2014 test
8 |
9 | - 02/02/2014 about
10 |
--------------------------------------------------------------------------------
/test/fixtures/expected/no-pagination/topics/hello.html:
--------------------------------------------------------------------------------
1 | Posts for hello
2 |
3 | - 07/02/2014 test page 2
4 |
5 | - 07/01/2014 test json
6 |
7 | - 02/03/2014 test
8 |
9 | - 02/02/2014 about
10 |
--------------------------------------------------------------------------------
/test/fixtures/tag.hbt:
--------------------------------------------------------------------------------
1 | Posts for {{tag}}
2 | {{#each pagination.files}}
3 | - {{dateFormat date "DD/MM/YYYY"}} {{title}}
4 | {{/each}}
{{#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 |
--------------------------------------------------------------------------------