From 2a3edc709c8ae1cd951b7f43607a096134091cd2 Mon Sep 17 00:00:00 2001 From: danactive Date: Sat, 7 Jan 2017 21:51:15 -0800 Subject: [PATCH] feat(GeoJSON): Add plugin to request album as GeoJSON [#90] --- .gitignore | 1 + index.js | 4 +- package.json | 2 + plugins/album/lib/index.js | 4 +- plugins/album/lib/json.js | 7 +- plugins/editAlbum/lib/index.js | 2 +- plugins/exists/lib/{index.js => exists.js} | 0 .../test/{index.spec.js => exists.spec.js} | 2 +- plugins/gallery/lib/{index.js => gallery.js} | 0 .../test/{index.spec.js => gallery.spec.js} | 2 +- plugins/geojson/lib/index.js | 37 +++++++++ plugins/geojson/lib/json.js | 12 +++ plugins/geojson/test/.eslintrc | 8 ++ plugins/geojson/test/index.spec.js | 39 ++++++++++ plugins/geojson/test/json.spec.js | 20 +++++ plugins/home/lib/index.js | 2 +- plugins/log/lib/{index.js => log.js} | 0 .../log/test/{index.spec.js => log.spec.js} | 2 +- plugins/rename/lib/index.js | 4 +- plugins/rename/lib/rename.js | 2 +- plugins/rename/test/rename.spec.js | 2 +- plugins/resize/lib/resize.js | 2 +- plugins/utils/lib/index.js | 2 +- yarn.lock | 76 ++++++++++++++++++- 24 files changed, 212 insertions(+), 20 deletions(-) rename plugins/exists/lib/{index.js => exists.js} (100%) rename plugins/exists/test/{index.spec.js => exists.spec.js} (98%) rename plugins/gallery/lib/{index.js => gallery.js} (100%) rename plugins/gallery/test/{index.spec.js => gallery.spec.js} (91%) create mode 100644 plugins/geojson/lib/index.js create mode 100644 plugins/geojson/lib/json.js create mode 100644 plugins/geojson/test/.eslintrc create mode 100644 plugins/geojson/test/index.spec.js create mode 100644 plugins/geojson/test/json.spec.js rename plugins/log/lib/{index.js => log.js} (100%) rename plugins/log/test/{index.spec.js => log.spec.js} (97%) diff --git a/.gitignore b/.gitignore index b892d27f1..54a489a16 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ plugins/album/public/assets plugins/editAlbum/public/assets coverage.lcov .nyc_output +yarn-error.log diff --git a/index.js b/index.js index 02e22e14a..6a906f6fe 100644 --- a/index.js +++ b/index.js @@ -15,12 +15,13 @@ const config = require('./config.json'); const libAdmin = require('./plugins/admin/lib/index'); const viewAlbum = require('./plugins/album/lib/index'); const editAlbum = require('./plugins/editAlbum/lib/index'); +const libGeojson = require('./plugins/geojson/lib/index'); const libHome = require('./plugins/home/lib/index'); const libRename = require('./plugins/rename/lib/index'); const libResize = require('./plugins/resize/lib/index'); const libRoutes = require('./src/js/route.js'); const libVideo = require('./plugins/video/lib/index'); -const logMod = require('./plugins/log/lib'); +const logMod = require('./plugins/log/lib/log'); const pkg = require('./package'); require('babel-core/register')({ @@ -38,6 +39,7 @@ server.register([ { register: libAdmin, routes: { prefix: '/admin' } }, { register: viewAlbum, routes: { prefix: '/view' } }, { register: editAlbum, routes: { prefix: '/edit' } }, + { register: libGeojson, routes: { prefix: '/geojson' } }, { register: libHome }, { register: libRename, routes: { prefix: '/admin' } }, { register: libResize, routes: { prefix: '/admin' } }, diff --git a/package.json b/package.json index 011cd41ff..f37a62b8c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "clone": "^2.0.0", "dot-prop": "^4.0.0", "extend": "^3.0.0", + "geojson": "^0.4.0", "glob": "^7.0.0", "gm": "^1.23.0", "hapi": "^16.0.0", @@ -52,6 +53,7 @@ "xml2js": "^0.4.17" }, "devDependencies": { + "@mapbox/geojsonhint": "^1.2.1", "babel-preset-stage-0": "^6.16.0", "babel-tape-runner": "^2.0.1", "calipers": "^2.0.0", diff --git a/plugins/album/lib/index.js b/plugins/album/lib/index.js index bf49e96d9..25df09bb0 100644 --- a/plugins/album/lib/index.js +++ b/plugins/album/lib/index.js @@ -8,7 +8,7 @@ const handler = (request, reply) => { const raw = request.query.raw; json.getAlbum(gallery, albumStem) - .then(response => (raw ? reply(response) : reply.view('plugins/album/views/page.jsx', response))) + .then(albumData => (raw ? reply(albumData) : reply.view('plugins/album/views/page.jsx', albumData))) .catch(error => reply(error)); }; @@ -34,7 +34,6 @@ exports.register = (server, options, next) => { path: '/album/static/{path*}', config: { description: 'Static assets like JS, CSS, images files', - tags: ['v0'], handler: { directory: { path: 'plugins/album/public', @@ -51,7 +50,6 @@ exports.register = (server, options, next) => { path: '/album/static/utils.js', config: { description: 'Utility script', - tags: ['v0'], handler: { file: 'plugins/utils/public/utils.js', }, diff --git a/plugins/album/lib/json.js b/plugins/album/lib/json.js index 6231f155a..381ea2baf 100644 --- a/plugins/album/lib/json.js +++ b/plugins/album/lib/json.js @@ -81,11 +81,16 @@ function templatePrepare(result = {}) { const thumbPath = getThumbPath(item, gallery); const photoPath = utils.file.photoPath(thumbPath); const videoPath = getVideoPath(item, gallery); + // todo workaround for nested https://github.com/caseypt/GeoJSON.js/issues/27 + const geo_lat = (item.geo && item.geo.lat) || 0; // eslint-disable-line camelcase + const geo_lon = (item.geo && item.geo.lon) || 0; // eslint-disable-line camelcase const enhancements = { thumbCaption: caption(item), title: title(item), thumbPath, mediaPath: (item.type === 'video') ? videoPath : photoPath, + geo_lat, + geo_lon, }; return Object.assign(item, enhancements); @@ -131,7 +136,7 @@ module.exports.getAlbum = (gallery, albumStem) => new Promise((resolve, reject) '../../../', ensureSafePath('gallery', gallery, reject), 'xml', - ensureSafePath('albumStem', albumStem, reject), + ensureSafePath('albumStem', albumStem, reject) // eslint-disable-line comma-dangle ); fs.readFile(xmlPath, (readError, fileData) => { diff --git a/plugins/editAlbum/lib/index.js b/plugins/editAlbum/lib/index.js index dbc6da8ed..3064c90d5 100644 --- a/plugins/editAlbum/lib/index.js +++ b/plugins/editAlbum/lib/index.js @@ -1,7 +1,7 @@ /* global __dirname, require */ const joi = require('joi'); -const gallery = require('../../gallery/lib'); +const gallery = require('../../gallery/lib/gallery'); const handler = (request, reply) => { const raw = request.query.raw; diff --git a/plugins/exists/lib/index.js b/plugins/exists/lib/exists.js similarity index 100% rename from plugins/exists/lib/index.js rename to plugins/exists/lib/exists.js diff --git a/plugins/exists/test/index.spec.js b/plugins/exists/test/exists.spec.js similarity index 98% rename from plugins/exists/test/index.spec.js rename to plugins/exists/test/exists.spec.js index a76547bdb..ed21a0841 100644 --- a/plugins/exists/test/index.spec.js +++ b/plugins/exists/test/exists.spec.js @@ -3,7 +3,7 @@ const tape = require('tape-catch'); tape('Index', { skip: false }, (describe) => { const path = require('path'); - const lib = require('../lib'); + const lib = require('../lib/exists'); describe.test('* Real relative file exists', (assert) => { const testPath = './plugins/exists/test/fixtures/exists.txt'; diff --git a/plugins/gallery/lib/index.js b/plugins/gallery/lib/gallery.js similarity index 100% rename from plugins/gallery/lib/index.js rename to plugins/gallery/lib/gallery.js diff --git a/plugins/gallery/test/index.spec.js b/plugins/gallery/test/gallery.spec.js similarity index 91% rename from plugins/gallery/test/index.spec.js rename to plugins/gallery/test/gallery.spec.js index 4bd416305..b159f4d71 100644 --- a/plugins/gallery/test/index.spec.js +++ b/plugins/gallery/test/gallery.spec.js @@ -1,7 +1,7 @@ const tape = require('tape-catch'); tape('Gallery', { skip: false }, (describe) => { - const lib = require('../lib'); + const lib = require('../lib/gallery'); describe.test('* Get Galleries', { skip: false }, (assert) => { lib.getGalleries() diff --git a/plugins/geojson/lib/index.js b/plugins/geojson/lib/index.js new file mode 100644 index 000000000..c1167eb35 --- /dev/null +++ b/plugins/geojson/lib/index.js @@ -0,0 +1,37 @@ +/* global __dirname, require */ +const json = require('./json'); +const validation = require('../../../lib/validation'); + +const handler = (request, reply) => { + const albumStem = request.query.album_stem; + const gallery = request.query.gallery; + + json.dataToGeojson(gallery, albumStem) + .then(geojsonData => reply(geojsonData)) + .catch(error => reply(error)); +}; + +exports.register = (server, options, next) => { + server.route({ + method: 'GET', + path: '/', + config: { + description: 'GeoJSON for any album in any gallery', + handler, + tags: ['api', 'plugin'], + validate: { + query: { + album_stem: validation.albumStem, + gallery: validation.gallery, + }, + }, + }, + }); + + next(); +}; + +exports.register.attributes = { + name: 'history-geojson', + version: '0.1.0', +}; diff --git a/plugins/geojson/lib/json.js b/plugins/geojson/lib/json.js new file mode 100644 index 000000000..f90790d25 --- /dev/null +++ b/plugins/geojson/lib/json.js @@ -0,0 +1,12 @@ +const convertor = require('geojson'); + +const viewAlbum = require('../../album/lib/json'); + +module.exports.dataToGeojson = (gallery, albumStem) => new Promise((resolve, reject) => { + viewAlbum.getAlbum(gallery, albumStem) + .then((albumData) => { + const jsonData = convertor.parse(albumData.album.items, { Point: ['geo_lat', 'geo_lon'] }); + resolve(jsonData); + }) + .catch(error => reject(error)); +}); diff --git a/plugins/geojson/test/.eslintrc b/plugins/geojson/test/.eslintrc new file mode 100644 index 000000000..9a3fba8b1 --- /dev/null +++ b/plugins/geojson/test/.eslintrc @@ -0,0 +1,8 @@ +{ + "extends": "airbnb", + "rules": { + "max-len": [2, 150, 4], + "import/no-extraneous-dependencies": ["error", { "devDependencies": true }], + "global-require": 0 + } +} diff --git a/plugins/geojson/test/index.spec.js b/plugins/geojson/test/index.spec.js new file mode 100644 index 000000000..98ffdc213 --- /dev/null +++ b/plugins/geojson/test/index.spec.js @@ -0,0 +1,39 @@ +const tape = require('tape-catch'); + +tape('GeoJSON Index', { skip: false }, (describe) => { + const geojsonhint = require('@mapbox/geojsonhint'); + const hapi = require('hapi'); + + const lib = require('../lib'); + const utils = require('../../utils/lib'); + + const plugins = [lib]; + const port = utils.config.get('port'); + + describe.test('* Validate GeoJSON', (assert) => { + const server = new hapi.Server(); + server.connection({ port }); + server.register(plugins, (pluginError) => { + if (pluginError) { + assert.fail(pluginError); + return; + } + + const request = { + method: 'GET', + url: '/?gallery=demo&album_stem=sample', + }; + + server.inject(request, (result) => { + assert.ok(geojsonhint.hint({}).length > 0, 'Error expected'); + + assert.equal(result.statusCode, 200); + const response = result.result; + const error = geojsonhint.hint(response); + + assert.equal(error.length, 0, 'Validation passes'); + assert.end(); + }); + }); + }); +}); diff --git a/plugins/geojson/test/json.spec.js b/plugins/geojson/test/json.spec.js new file mode 100644 index 000000000..8e884f730 --- /dev/null +++ b/plugins/geojson/test/json.spec.js @@ -0,0 +1,20 @@ +const tape = require('tape-catch'); + +tape('GeoJSON JSON', { skip: false }, (describe) => { + const geojsonhint = require('@mapbox/geojsonhint'); + const lib = require('../lib/json'); + + describe.test('* Validate GeoJSON', (assert) => { + const expectedError = geojsonhint.hint({}); + + assert.ok(expectedError.length > 0, 'Error expected'); + + lib.dataToGeojson('demo', 'sample') + .then((json) => { + const error = geojsonhint.hint(json); + + assert.equal(error.length, 0, 'Validation passes'); + assert.end(); + }); + }); +}); diff --git a/plugins/home/lib/index.js b/plugins/home/lib/index.js index 28aa553d8..6edd3deec 100644 --- a/plugins/home/lib/index.js +++ b/plugins/home/lib/index.js @@ -1,6 +1,6 @@ /* global __dirname, require */ -const gallery = require('../../gallery/lib'); +const gallery = require('../../gallery/lib/gallery'); const handler = (request, reply) => { gallery.getGalleries().then(galleries => reply.view('plugins/home/views/page.jsx', { galleries })); diff --git a/plugins/log/lib/index.js b/plugins/log/lib/log.js similarity index 100% rename from plugins/log/lib/index.js rename to plugins/log/lib/log.js diff --git a/plugins/log/test/index.spec.js b/plugins/log/test/log.spec.js similarity index 97% rename from plugins/log/test/index.spec.js rename to plugins/log/test/log.spec.js index 0c4cdeaa9..e2d8df6df 100644 --- a/plugins/log/test/index.spec.js +++ b/plugins/log/test/log.spec.js @@ -1,7 +1,7 @@ const tape = require('tape-catch'); tape('Log', { skip: false }, (describe) => { - const lib = require('../lib'); + const lib = require('../lib/log'); const moduleName = 'test'; diff --git a/plugins/rename/lib/index.js b/plugins/rename/lib/index.js index f30109ad9..c079c22c9 100644 --- a/plugins/rename/lib/index.js +++ b/plugins/rename/lib/index.js @@ -2,9 +2,9 @@ const boom = require('boom'); const joi = require('joi'); -const existsMod = require('../../exists/lib'); +const existsMod = require('../../exists/lib/exists'); const filenamesMod = require('./filenames'); -// const logMod = require('../../log/lib'); +// const logMod = require('../../log/lib/log'); const renameMod = require('./rename'); const handler = (request, reply) => { diff --git a/plugins/rename/lib/rename.js b/plugins/rename/lib/rename.js index 50262df8d..8d81120ad 100644 --- a/plugins/rename/lib/rename.js +++ b/plugins/rename/lib/rename.js @@ -3,7 +3,7 @@ const boom = require('boom'); const fs = require('fs'); const path = require('path'); -const exists = require('../../exists/lib'); +const exists = require('../../exists/lib/exists'); const utils = require('../../utils/lib'); /** diff --git a/plugins/rename/test/rename.spec.js b/plugins/rename/test/rename.spec.js index 2c16971d1..7350b4c2a 100644 --- a/plugins/rename/test/rename.spec.js +++ b/plugins/rename/test/rename.spec.js @@ -5,7 +5,7 @@ tape('Verify rename library', { skip: false }, (describe) => { const appRoot = require('app-root-path'); const path = require('path'); - const exist = require('../../exists/lib/'); + const exist = require('../../exists/lib/exists'); const plugin = require('../lib/rename'); /* diff --git a/plugins/resize/lib/resize.js b/plugins/resize/lib/resize.js index 07d6514b7..921b6b59c 100644 --- a/plugins/resize/lib/resize.js +++ b/plugins/resize/lib/resize.js @@ -2,7 +2,7 @@ const boom = require('boom'); const gm = require('gm'); const path = require('path'); -const existsMod = require('../../exists/lib'); +const existsMod = require('../../exists/lib/exists'); const utils = require('../../utils/lib'); /** diff --git a/plugins/utils/lib/index.js b/plugins/utils/lib/index.js index 57ec41cbb..5ec800b0b 100644 --- a/plugins/utils/lib/index.js +++ b/plugins/utils/lib/index.js @@ -6,7 +6,7 @@ const mime = require('mime-types'); const path = require('path'); const configJson = require('../../../config.json'); -// const logMod = require('../../log/lib'); +// const logMod = require('../../log/lib/log'); const pkg = require('../../../package.json'); // const log = logMod('util'); diff --git a/yarn.lock b/yarn.lock index c33793977..be20495f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,16 @@ # yarn lockfile v1 +"@mapbox/geojsonhint@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@mapbox/geojsonhint/-/geojsonhint-1.2.1.tgz#2afe435e8d567aa51873eb1e1ba65cc4d463c7a0" + dependencies: + chalk "^1.1.0" + concat-stream "~1.4.4" + jsonlint-lines "1.7.1" + minimist "1.1.1" + text-table "^0.2.0" + JSONStream@^1.0.4: version "1.3.0" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5" @@ -9,6 +19,10 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +"JSV@>= 4.0.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + abab@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" @@ -105,6 +119,10 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" @@ -1227,6 +1245,14 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + cheerio@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" @@ -1446,6 +1472,14 @@ concat-stream@^1.4.10, concat-stream@^1.4.6: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@~1.4.4: + version "1.4.10" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.9" + typedarray "~0.0.5" + concat-with-sourcemaps@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" @@ -2701,6 +2735,10 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +geojson@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/geojson/-/geojson-0.4.0.tgz#46a7f5a9ea1b50ef644d5c3dd752e2fab511ce86" + get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -3141,6 +3179,10 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -3796,6 +3838,13 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +jsonlint-lines@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/jsonlint-lines/-/jsonlint-lines-1.7.1.tgz#507de680d3fb8c4be1641cc57d6f679f29f178ff" + dependencies: + JSV ">= 4.0.x" + nomnom ">= 1.5.x" + jsonparse@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" @@ -4344,6 +4393,10 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minimist@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.1.tgz#1bc2bc71658cdca5712475684363615b0b4f695b" + minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4491,6 +4544,13 @@ node-uuid@~1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" +"nomnom@>= 1.5.x": + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -5496,7 +5556,7 @@ req-from@^1.0.1: dependencies: resolve-from "^2.0.0" -request@2.75.0: +request@2.75.0, request@^2.55.0: version "2.75.0" resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" dependencies: @@ -5522,7 +5582,7 @@ request@2.75.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" -request@^2.55.0, request@^2.79.0: +request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -5987,6 +6047,10 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -6205,7 +6269,7 @@ text-extensions@^1.0.0: version "1.3.3" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.3.3.tgz#fef0c8ce07f5bb3b8297bcf075304531754124bf" -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6330,7 +6394,7 @@ type-is@~1.6.13: media-typer "0.3.0" mime-types "~2.1.13" -typedarray@^0.0.6: +typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -6359,6 +6423,10 @@ unc-path-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"