diff --git a/.meteor/.finished-upgraders b/.meteor/.finished-upgraders index 61ee3132..dacc2c0d 100644 --- a/.meteor/.finished-upgraders +++ b/.meteor/.finished-upgraders @@ -10,3 +10,4 @@ notices-for-facebook-graph-api-2 1.2.0-meteor-platform-split 1.2.0-cordova-changes 1.2.0-breaking-changes +1.3.0-split-minifiers-package diff --git a/.meteor/.gitignore b/.meteor/.gitignore index 40830374..c9440c05 100644 --- a/.meteor/.gitignore +++ b/.meteor/.gitignore @@ -1 +1,3 @@ +dev_bundle local +dev_bundle diff --git a/.meteor/packages b/.meteor/packages index 29814061..d00abe20 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -33,7 +33,7 @@ mdg:validated-method mdg:validation-error # routing -kadira:flow-router@2.11.0 +kadira:flow-router kadira:blaze-layout arillo:flow-router-helpers zimme:active-route @@ -54,7 +54,7 @@ mobile-experience chriswessels:hammer # production -juliancwirko:postcss@1.0.0-beta.11 +juliancwirko:postcss standard-minifier-js ddp-rate-limiter app-prod-security @@ -66,9 +66,9 @@ simple:rest # testing factory xolvio:cleaner -dispatch:mocha-phantomjs@0.1.6 +dispatch:mocha-phantomjs practicalmeteor:chai practicalmeteor:sinon -practicalmeteor:mocha@2.4.5_4 +practicalmeteor:mocha hwillson:stub-collections johanbrook:publication-collector diff --git a/.meteor/release b/.meteor/release index 4fd7a934..e5b4dc18 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.3 +METEOR@1.3.4.4 diff --git a/.meteor/versions b/.meteor/versions index 5217272d..29a89474 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,131 +1,131 @@ -accounts-base@1.2.4 -accounts-password@1.1.6 +accounts-base@1.2.8 +accounts-password@1.1.12 aldeed:collection2@2.9.1 aldeed:collection2-core@1.1.1 aldeed:schema-deny@1.0.1 aldeed:schema-index@1.0.1 aldeed:simple-schema@1.5.3 aldeed:template-extension@4.0.0 -allow-deny@1.0.2 +allow-deny@1.0.5 app-prod-security@0.0.0 -arillo:flow-router-helpers@0.4.5 -autoupdate@1.2.6 -babel-compiler@6.5.2 -babel-runtime@0.1.6 -base64@1.0.6 -binary-heap@1.0.6 -blaze@2.1.5 -blaze-html-templates@1.0.2 -blaze-tools@1.0.6 -boilerplate-generator@1.0.6 -browser-policy@1.0.7 -browser-policy-common@1.0.7 -browser-policy-content@1.0.8 -browser-policy-framing@1.0.8 -caching-compiler@1.0.2 -caching-html-compiler@1.0.4 -callback-hook@1.0.6 -cfs:http-methods@0.0.30 -check@1.1.2 +arillo:flow-router-helpers@0.5.2 +autoupdate@1.2.11 +babel-compiler@6.8.4 +babel-runtime@0.1.9_1 +base64@1.0.9 +binary-heap@1.0.9 +blaze@2.1.8 +blaze-html-templates@1.0.4 +blaze-tools@1.0.9 +boilerplate-generator@1.0.9 +browser-policy@1.0.9 +browser-policy-common@1.0.10 +browser-policy-content@1.0.11 +browser-policy-framing@1.0.11 +caching-compiler@1.0.6 +caching-html-compiler@1.0.6 +callback-hook@1.0.9 +cfs:http-methods@0.0.32 +check@1.2.3 chriswessels:hammer@4.0.2 -coffeescript@1.0.15 -crosswalk@1.6.0 +coffeescript@1.1.3 +crosswalk@1.6.2 dburles:collection-helpers@1.0.4 -ddp@1.2.3 -ddp-client@1.2.3 -ddp-common@1.2.3 -ddp-rate-limiter@1.0.2 -ddp-server@1.2.4 -deps@1.0.10 -diff-sequence@1.0.3 -dispatch:mocha-phantomjs@0.1.6 +ddp@1.2.5 +ddp-client@1.2.9 +ddp-common@1.2.6 +ddp-rate-limiter@1.0.5 +ddp-server@1.2.9 +deps@1.0.12 +diff-sequence@1.0.6 +dispatch:mocha-phantomjs@0.1.7 dispatch:phantomjs-tests@0.0.5 -ecmascript@0.4.1 -ecmascript-runtime@0.2.8 -ejson@1.0.9 -email@1.0.10 -es5-shim@4.5.8 +ecmascript@0.4.7 +ecmascript-runtime@0.2.12 +ejson@1.0.12 +email@1.0.15 +es5-shim@4.5.13 factory@1.0.0 -fastclick@1.0.9 -force-ssl@1.0.9 -geojson-utils@1.0.6 -hot-code-push@1.0.2 -html-tools@1.0.7 -htmljs@1.0.7 -http@1.1.3 -hwillson:stub-collections@1.0.0 -id-map@1.0.5 +fastclick@1.0.12 +force-ssl@1.0.12 +geojson-utils@1.0.9 +hot-code-push@1.0.4 +html-tools@1.0.10 +htmljs@1.0.10 +http@1.1.8 +hwillson:stub-collections@1.0.1 +id-map@1.0.8 johanbrook:publication-collector@1.0.0 -jquery@1.11.6 -juliancwirko:postcss@1.0.0-beta.11 +jquery@1.11.9 +juliancwirko:postcss@1.1.1 kadira:blaze-layout@2.3.0 -kadira:flow-router@2.11.0 -launch-screen@1.0.8 -less@2.5.6 -livedata@1.0.16 -localstorage@1.0.7 -logging@1.0.10 -mdg:validated-method@1.0.2 +kadira:flow-router@2.12.1 +launch-screen@1.0.12 +less@2.6.4 +livedata@1.0.18 +localstorage@1.0.11 +logging@1.0.14 +mdg:validated-method@1.1.0 mdg:validation-error@0.5.1 -meteor@1.1.12 -meteor-base@1.0.2 +meteor@1.1.16 +meteor-base@1.0.4 meteorspark:util@0.2.0 -minifier-css@1.1.9 -minifier-js@1.1.9 -minimongo@1.0.12 -mobile-experience@1.0.2 -mobile-status-bar@1.0.10 -modules@0.5.1 -modules-runtime@0.6.1 -mongo@1.1.5 -mongo-id@1.0.2 -npm-bcrypt@0.7.8_2 -npm-mongo@1.4.41 -observe-sequence@1.0.9 -ordered-dict@1.0.5 +minifier-css@1.1.13 +minifier-js@1.1.13 +minimongo@1.0.17 +mobile-experience@1.0.4 +mobile-status-bar@1.0.12 +modules@0.6.5 +modules-runtime@0.6.5 +mongo@1.1.9_1 +mongo-id@1.0.5 +npm-bcrypt@0.8.6_2 +npm-mongo@1.4.45 +observe-sequence@1.0.12 +ordered-dict@1.0.8 percolate:momentum@0.7.2 percolate:velocityjs@1.1.0 practicalmeteor:chai@2.1.0_1 practicalmeteor:loglevel@1.2.0_2 -practicalmeteor:mocha@2.4.5_4 -practicalmeteor:mocha-core@1.0.0 +practicalmeteor:mocha@2.4.5_5 +practicalmeteor:mocha-core@1.0.1 practicalmeteor:sinon@1.14.1_2 -promise@0.6.5 +promise@0.7.3 raix:eventemitter@0.1.3 -random@1.0.7 -rate-limit@1.0.2 -reactive-dict@1.1.5 -reactive-var@1.0.7 -reload@1.1.6 -retry@1.0.5 +random@1.0.10 +rate-limit@1.0.5 +reactive-dict@1.1.8 +reactive-var@1.0.10 +reload@1.1.10 +retry@1.0.8 reywood:publish-composite@1.4.2 -routepolicy@1.0.8 -service-configuration@1.0.7 -session@1.1.3 -sha@1.0.5 +routepolicy@1.0.11 +service-configuration@1.0.10 +session@1.1.6 +sha@1.0.8 simple:authenticate-user-by-token@1.0.1 simple:json-routes@2.1.0 simple:rest@1.1.1 simple:rest-accounts-password@1.1.2 simple:rest-bearer-token-parser@1.0.1 simple:rest-json-error-handler@1.0.1 -softwarerero:accounts-t9n@1.2.2 -spacebars@1.0.9 -spacebars-compiler@1.0.9 -srp@1.0.6 -standard-minifier-js@1.0.4 -tap:i18n@1.8.0 -templating@1.1.7 -templating-tools@1.0.2 +softwarerero:accounts-t9n@1.3.4 +spacebars@1.0.12 +spacebars-compiler@1.0.12 +srp@1.0.9 +standard-minifier-js@1.0.8 +tap:i18n@1.8.2 +templating@1.1.13 +templating-tools@1.0.4 tmeasday:test-reporter-helpers@0.2.1 -tracker@1.0.11 -ui@1.0.9 -underscore@1.0.6 -url@1.0.7 -useraccounts:core@1.13.1 -useraccounts:flow-routing@1.13.1 -useraccounts:unstyled@1.13.1 -webapp@1.2.6 -webapp-hashing@1.0.7 -xolvio:cleaner@0.2.0 +tracker@1.0.14 +ui@1.0.11 +underscore@1.0.9 +url@1.0.10 +useraccounts:core@1.14.2 +useraccounts:flow-routing@1.14.2 +useraccounts:unstyled@1.14.2 +webapp@1.2.10 +webapp-hashing@1.0.9 +xolvio:cleaner@0.3.1 zimme:active-route@2.3.2 diff --git a/.testing/cache_build_and_dependencies.js b/.testing/cache_build_and_dependencies.js new file mode 100755 index 00000000..8576a4b4 --- /dev/null +++ b/.testing/cache_build_and_dependencies.js @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +const path = require('path'); +const spawn = require('child_process').spawn; +const baseDir = path.resolve(__dirname, '../'); +const srcDir = baseDir; + +const cacheMeteor = function() { + console.log('Caching build & dependencies (can take a while the first time)'); + const childProcess = spawn('meteor', ['--raw-logs'], { + cwd: srcDir, + env: process.env + }); + childProcess.stdout.setEncoding('utf8'); + childProcess.stderr.setEncoding('utf8'); + childProcess.stdout.on('data', function(line) { + process.stdout.write(line); + }); + childProcess.stderr.on('data', function(line) { + process.stderr.write(line); + }); + const exitAfterBuild = function exitAfterBuild(line) { + if (line.indexOf('App running at') !== -1) { + childProcess.kill(); + console.log('Done caching build & dependencies'); + } else if ( + line.indexOf('Your application is crashing') !== -1 || + line.indexOf('Errors prevented startup') !== -1) { + childProcess.kill(); + console.error('There were issues whilst trying to cache build & dependencies'); + throw new Error(line); + } + }; + childProcess.stdout.on('data', exitAfterBuild); + childProcess.stderr.on('data', exitAfterBuild); +}; + +cacheMeteor(); diff --git a/.testing/cache_build_and_dependencies.sh b/.testing/cache_build_and_dependencies.sh new file mode 100755 index 00000000..01493b13 --- /dev/null +++ b/.testing/cache_build_and_dependencies.sh @@ -0,0 +1,3 @@ +export MONGO_URL="mongodb://localhost:27017/cache" +echo "Running meteor to cache it …" +node ./.testing/cache_build_and_dependencies.js \ No newline at end of file diff --git a/.testing/cache_meteor.sh b/.testing/cache_meteor.sh new file mode 100755 index 00000000..01f4e413 --- /dev/null +++ b/.testing/cache_meteor.sh @@ -0,0 +1,3 @@ +# Cache Meteor +if [ -d ~/.meteor ]; then sudo ln -s ~/.meteor/meteor /usr/local/bin/meteor; fi +if [ ! -e $HOME/.meteor/meteor ]; then curl https://install.meteor.com | sh; fi \ No newline at end of file diff --git a/.testing/cache_npm_dependencies.sh b/.testing/cache_npm_dependencies.sh new file mode 100755 index 00000000..8ab54567 --- /dev/null +++ b/.testing/cache_npm_dependencies.sh @@ -0,0 +1,4 @@ +# Cache npm deps +if [ ! -e /home/ubuntu/nvm/versions/node/v5.2.0/lib/node_modules/chimp/bin/chimp.js ]; then npm install -g chimp; fi +if [ ! -e /home/ubuntu/nvm/versions/node/v5.2.0/lib/node_modules/spacejam/bin/spacejam ]; then npm install -g spacejam; fi +npm install \ No newline at end of file diff --git a/.testing/chimp.js b/.testing/chimp.js new file mode 100755 index 00000000..cb997783 --- /dev/null +++ b/.testing/chimp.js @@ -0,0 +1,59 @@ +#!/usr/bin/env node +"use strict"; + +var path = require('path'); +var extend = require('util')._extend; +var baseDir = path.resolve(__dirname, '../'); +var srcDir = path.resolve(baseDir); +var source = require(srcDir + '/node_modules/shell-source'); +var processes = require('./processes.js'); +var isCi = process.argv[2] === '--ci'; + +var startTestApp = function(onStarted, options) { + return processes.start({ + name: 'Test App', + command: 'meteor --port=3100', + waitForMessage: 'App running at: http://localhost:3100', + options: { + cwd: srcDir, + env: extend(process.env, options) + } + }, function() { + console.log("Test app is running …"); + onStarted(); + }); +}; + +var startChimpWatch = function() { + processes.start({ + name: 'Chimp Watch', + command: 'chimp --ddp=http://localhost:3100 --watch --path=tests --mocha --chai --browser=chrome', + options: { cwd: baseDir } + }); +}; + +var startChimpCi = function() { + var command = 'chimp --ddp=http://localhost:3100 --path=tests --browser=chrome --mocha --chai'; + processes.start({ + name: 'Chimp CI', + command: command, + options: { cwd: baseDir } + }); +}; + +if (isCi) { + // CI mode -> run once + if (process.env.CIRCLECI) { + startTestApp(startChimpCi); + } else { + // Use a different db for local ci testing to avoid nuking of the dev db + startTestApp(startChimpCi, { + MONGO_URL: 'mongodb://localhost:3001/chimp_db' + }); + } +} else { + // DEV mode -> watch + startTestApp(startChimpWatch, { + MONGO_URL: 'mongodb://localhost:3001/chimp_db' + }); +} diff --git a/.testing/processes.js b/.testing/processes.js new file mode 100755 index 00000000..dd94f4c9 --- /dev/null +++ b/.testing/processes.js @@ -0,0 +1,45 @@ +"use strict"; +var fs = require('fs'); +var exec = require('child_process').exec; +var processes = []; + +/** + * Helper function to start a process and listen for + * specific stdout console output and invoke a callback. + * This is used in this case to listen when the normal dev + * app started its mongoDb, so we can reuse that for the test app. + */ +module.exports = { + start: function(opts, callback) { + var proc = exec( + opts.command, + opts.options + ); + if (opts.waitForMessage) { + proc.stdout.on('data', function waitForMessage(data) { + if (data.toString().match(opts.waitForMessage)) { + if (callback) { + callback(); + } + } + }); + } + if (!opts.silent) { + proc.stdout.pipe(process.stdout); + proc.stderr.pipe(process.stderr); + } + if (opts.logFile) { + var logStream = fs.createWriteStream(opts.logFile, {flags: 'a'}); + proc.stdout.pipe(logStream); + proc.stderr.pipe(logStream); + } + proc.on('close', function(code) { + console.log(opts.name, 'exited with code ' + code); + for (var i = 0; i < processes.length; i += 1) { + processes[i].kill(); + } + process.exit(code); + }); + processes.push(proc); + } +}; diff --git a/circle.yml b/circle.yml index 6dd8f0f4..f1713061 100644 --- a/circle.yml +++ b/circle.yml @@ -1,11 +1,27 @@ machine: node: - version: 0.10.40 + version: 5.2.0 dependencies: + cache_directories: + - "~/.npm" + - "~/.meteor" + - "node_modules" + - "./.meteor/local/build" + - "./.meteor/local/bundler-cache" + - "./.meteor/local/isopacks" + - "./.meteor/local/plugin-cache" + - "/home/ubuntu/nvm/versions/node/v5.2.0/bin" + - "/home/ubuntu/nvm/versions/node/v5.2.0/lib/node_modules" override: - - curl https://install.meteor.com | /bin/sh - - npm install + - ./.testing/cache_meteor.sh + - ./.testing/cache_npm_dependencies.sh + - ./.testing/cache_build_and_dependencies.sh + - chimp --path=features # Cache chimp deps by running it without any tests checkout: post: - git submodule update --init - \ No newline at end of file +test: + pre: + - mkdir -p $CIRCLE_TEST_REPORTS/cucumber + override: + - ./tests/acceptance_run \ No newline at end of file diff --git a/imports/api/generate-data.app-tests.js b/imports/api/generate-data.app-tests.js index 606587cc..8bdd8ed8 100644 --- a/imports/api/generate-data.app-tests.js +++ b/imports/api/generate-data.app-tests.js @@ -4,9 +4,10 @@ import { Meteor } from 'meteor/meteor'; import { Factory } from 'meteor/factory'; import { resetDatabase } from 'meteor/xolvio:cleaner'; import { Random } from 'meteor/random'; -import { Promise } from 'meteor/promise'; import { _ } from 'meteor/underscore'; +import { denodeify } from '../utils/denodeify'; + const createList = (userId) => { const list = Factory.create('list', { userId }); _.times(3, () => Factory.create('todo', { listId: list._id })); @@ -25,15 +26,14 @@ Meteor.methods({ }, }); -let generateData; // eslint-disable-line import/no-mutable-exports if (Meteor.isClient) { // Create a second connection to the server to use to call test data methods // We do this so there's no contention w/ the currently tested user's connection const testConnection = Meteor.connect(Meteor.absoluteUrl()); - generateData = Promise.denodeify((cb) => { + const generateData = denodeify((cb) => { testConnection.call('generateFixtures', cb); }); -} -export { generateData }; + export { generateData }; +} diff --git a/imports/api/lists/lists.tests.js b/imports/api/lists/lists.tests.js index fabb997c..0bdad0e4 100644 --- a/imports/api/lists/lists.tests.js +++ b/imports/api/lists/lists.tests.js @@ -13,8 +13,7 @@ import { _ } from 'meteor/underscore'; import { DDP } from 'meteor/ddp-client'; if (Meteor.isServer) { - // eslint-disable-next-line global-require - require('./server/publications.js'); + import './server/publications.js'; describe('lists', function () { describe('mutators', function () { diff --git a/imports/api/todos/todos.tests.js b/imports/api/todos/todos.tests.js index f3a87ae5..854f1f0d 100644 --- a/imports/api/todos/todos.tests.js +++ b/imports/api/todos/todos.tests.js @@ -11,8 +11,7 @@ import { _ } from 'meteor/underscore'; import { Todos } from './todos.js'; if (Meteor.isServer) { - // eslint-disable-next-line global-require - require('./server/publications.js'); + import './server/publications.js'; describe('todos', function () { describe('mutators', function () { diff --git a/imports/startup/client/routes.app-test.js b/imports/startup/client/routes.app-test.js index ecbffe80..e9cc932b 100644 --- a/imports/startup/client/routes.app-test.js +++ b/imports/startup/client/routes.app-test.js @@ -8,6 +8,7 @@ import { assert } from 'meteor/practicalmeteor:chai'; import { Promise } from 'meteor/promise'; import { $ } from 'meteor/jquery'; +import { denodeify } from '../../utils/denodeify'; import { generateData } from './../../api/generate-data.app-tests.js'; import { Lists } from '../../api/lists/lists.js'; import { Todos } from '../../api/todos/todos.js'; @@ -17,7 +18,7 @@ import { Todos } from '../../api/todos/todos.js'; const waitForSubscriptions = () => new Promise(resolve => { const poll = Meteor.setInterval(() => { if (DDP._allSubscriptionsReady()) { - clearInterval(poll); + Meteor.clearInterval(poll); resolve(); } }, 200); @@ -25,13 +26,16 @@ const waitForSubscriptions = () => new Promise(resolve => { // Tracker.afterFlush runs code when all consequent of a tracker based change // (such as a route change) have occured. This makes it a promise. -const afterFlushPromise = Promise.denodeify(Tracker.afterFlush); +const afterFlushPromise = denodeify(Tracker.afterFlush); if (Meteor.isClient) { describe('data available when routed', () => { // First, ensure the data that we expect is loaded on the server // Then, route the app to the homepage - beforeEach(() => generateData().then(() => FlowRouter.go('/'))); + beforeEach(() => + generateData() + .then(() => FlowRouter.go('/')) + .then(waitForSubscriptions)); describe('when logged out', () => { it('has all public lists at homepage', () => { @@ -43,11 +47,9 @@ if (Meteor.isClient) { FlowRouter.go('Lists.show', { _id: list._id }); return afterFlushPromise() + .then(waitForSubscriptions) .then(() => { assert.equal($('.title-wrapper').html(), list.name); - }) - .then(() => waitForSubscriptions()) - .then(() => { assert.equal(Todos.find({ listId: list._id }).count(), 3); }); }); diff --git a/imports/utils/denodeify.js b/imports/utils/denodeify.js new file mode 100644 index 00000000..2bac1646 --- /dev/null +++ b/imports/utils/denodeify.js @@ -0,0 +1,12 @@ +import { Promise } from 'meteor/promise'; + +// Convert an NPM-style function returning a callback to one that returns a Promise. +export const denodeify = f => (...args) => new Promise((resolve, reject) => { + f(...args, (err, val) => { + if (err) { + reject(err); + } else { + resolve(val); + } + }); +}); diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 649a35de..367fc29e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,70 +1,1097 @@ { "dependencies": { + "acorn": { + "version": "3.2.0", + "from": "acorn@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz" + }, + "acorn-jsx": { + "version": "3.0.1", + "from": "acorn-jsx@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" + }, + "amdefine": { + "version": "1.0.0", + "from": "amdefine@>=0.0.4", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + }, + "ansi-escapes": { + "version": "1.4.0", + "from": "ansi-escapes@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz" + }, + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + }, + "ansi-styles": { + "version": "2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + }, + "argparse": { + "version": "1.0.7", + "from": "argparse@>=1.0.7 <2.0.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz" + }, + "array-union": { + "version": "1.0.2", + "from": "array-union@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" + }, + "array-uniq": { + "version": "1.0.3", + "from": "array-uniq@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + }, + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + }, "autoprefixer": { - "version": "6.3.4", - "from": "autoprefixer@>=6.3.1 <7.0.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.3.4.tgz", + "version": "6.3.7", + "from": "autoprefixer@6.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.3.7.tgz" + }, + "babel-code-frame": { + "version": "6.11.0", + "from": "babel-code-frame@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz" + }, + "babel-core": { + "version": "6.10.4", + "from": "babel-core@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.10.4.tgz", "dependencies": { - "postcss-value-parser": { - "version": "3.3.0", - "from": "postcss-value-parser@>=3.2.3 <4.0.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "babel-register": { + "version": "6.9.0", + "from": "babel-register@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.9.0.tgz" }, - "normalize-range": { - "version": "0.1.2", - "from": "normalize-range@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + "babel-runtime": { + "version": "6.9.2", + "from": "babel-runtime@>=6.9.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" }, - "num2fraction": { - "version": "1.2.2", - "from": "num2fraction@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" - }, - "browserslist": { - "version": "1.3.0", - "from": "browserslist@>=1.3.0 <1.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.3.0.tgz" + "path-exists": { + "version": "1.0.0", + "from": "path-exists@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz" + } + } + }, + "babel-generator": { + "version": "6.11.0", + "from": "babel-generator@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.9.2", + "from": "babel-runtime@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + } + } + }, + "babel-helpers": { + "version": "6.8.0", + "from": "babel-helpers@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.8.0.tgz" + }, + "babel-messages": { + "version": "6.8.0", + "from": "babel-messages@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz" + }, + "babel-polyfill": { + "version": "6.9.0", + "from": "babel-polyfill@6.9.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.9.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.9.2", + "from": "babel-runtime@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + } + } + }, + "babel-regenerator-runtime": { + "version": "6.5.0", + "from": "babel-regenerator-runtime@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-regenerator-runtime/-/babel-regenerator-runtime-6.5.0.tgz" + }, + "babel-register": { + "version": "6.8.0", + "from": "babel-register@6.8.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.8.0.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, - "caniuse-db": { - "version": "1.0.30000436", - "from": "caniuse-db@>=1.0.30000435 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000436.tgz" + "path-exists": { + "version": "1.0.0", + "from": "path-exists@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz" + } + } + }, + "babel-runtime": { + "version": "6.6.1", + "from": "babel-runtime@6.6.1", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz" + }, + "babel-template": { + "version": "6.9.0", + "from": "babel-template@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.9.0.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.9.2", + "from": "babel-runtime@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + } + } + }, + "babel-traverse": { + "version": "6.10.4", + "from": "babel-traverse@>=6.10.4 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.10.4.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.9.2", + "from": "babel-runtime@>=6.9.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" }, - "postcss": { - "version": "5.0.19", - "from": "postcss@>=5.0.19 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", - "dependencies": { - "supports-color": { - "version": "3.1.2", - "from": "supports-color@>=3.1.2 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "dependencies": { - "has-flag": { - "version": "1.0.0", - "from": "has-flag@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" - } - } - }, - "source-map": { - "version": "0.5.3", - "from": "source-map@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" - }, - "js-base64": { - "version": "2.1.9", - "from": "js-base64@>=2.1.9 <3.0.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" - } - } + "globals": { + "version": "8.18.0", + "from": "globals@>=8.3.0 <9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz" } } }, + "babel-types": { + "version": "6.11.1", + "from": "babel-types@>=6.9.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", + "dependencies": { + "babel-runtime": { + "version": "6.9.2", + "from": "babel-runtime@>=6.9.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + } + } + }, + "babylon": { + "version": "6.8.3", + "from": "babylon@>=6.7.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.8.3.tgz" + }, + "balanced-match": { + "version": "0.4.1", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + }, + "bluebird": { + "version": "3.4.1", + "from": "bluebird@>=3.1.1 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.1.tgz" + }, + "brace-expansion": { + "version": "1.1.5", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz" + }, + "browserslist": { + "version": "1.3.4", + "from": "browserslist@>=1.3.4 <1.4.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.3.4.tgz" + }, + "builtin-modules": { + "version": "1.1.1", + "from": "builtin-modules@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + }, + "caller-path": { + "version": "0.1.0", + "from": "caller-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz" + }, + "callsites": { + "version": "0.2.0", + "from": "callsites@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" + }, + "caniuse-db": { + "version": "1.0.30000505", + "from": "caniuse-db@>=1.0.30000488 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000505.tgz" + }, + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + }, + "cli-cursor": { + "version": "1.0.2", + "from": "cli-cursor@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz" + }, + "cli-width": { + "version": "2.1.0", + "from": "cli-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz" + }, + "code-point-at": { + "version": "1.0.0", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "concat-stream": { + "version": "1.5.1", + "from": "concat-stream@>=1.4.6 <2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz" + }, + "contains-path": { + "version": "0.1.0", + "from": "contains-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz" + }, + "convert-source-map": { + "version": "1.2.0", + "from": "convert-source-map@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz" + }, + "core-js": { + "version": "2.4.0", + "from": "core-js@>=2.4.0 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.0.tgz" + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "d": { + "version": "0.1.1", + "from": "d@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" + }, + "damerau-levenshtein": { + "version": "1.0.0", + "from": "damerau-levenshtein@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.0.tgz" + }, + "debug": { + "version": "2.2.0", + "from": "debug@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" + }, + "deep-is": { + "version": "0.1.3", + "from": "deep-is@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" + }, + "del": { + "version": "2.2.1", + "from": "del@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.1.tgz" + }, + "detect-indent": { + "version": "3.0.1", + "from": "detect-indent@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + } + } + }, + "doctrine": { + "version": "1.2.2", + "from": "doctrine@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.2.2.tgz", + "dependencies": { + "esutils": { + "version": "1.1.6", + "from": "esutils@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz" + } + } + }, + "es5-ext": { + "version": "0.10.12", + "from": "es5-ext@>=0.10.11 <0.11.0", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz" + }, + "es6-iterator": { + "version": "2.0.0", + "from": "es6-iterator@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" + }, + "es6-map": { + "version": "0.1.4", + "from": "es6-map@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz" + }, + "es6-set": { + "version": "0.1.4", + "from": "es6-set@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz" + }, + "es6-symbol": { + "version": "3.1.0", + "from": "es6-symbol@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz" + }, + "es6-weak-map": { + "version": "2.0.1", + "from": "es6-weak-map@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz" + }, + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + }, + "escope": { + "version": "3.6.0", + "from": "escope@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz" + }, + "eslint-config-airbnb-base": { + "version": "3.0.1", + "from": "eslint-config-airbnb-base@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-3.0.1.tgz" + }, + "eslint-import-resolver-node": { + "version": "0.2.1", + "from": "eslint-import-resolver-node@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.1.tgz" + }, + "espree": { + "version": "3.1.6", + "from": "espree@>=3.1.6 <4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.6.tgz" + }, + "esprima": { + "version": "2.7.2", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" + }, + "esrecurse": { + "version": "4.1.0", + "from": "esrecurse@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", + "dependencies": { + "estraverse": { + "version": "4.1.1", + "from": "estraverse@>=4.1.0 <4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz" + } + } + }, + "estraverse": { + "version": "4.2.0", + "from": "estraverse@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + }, + "esutils": { + "version": "2.0.2", + "from": "esutils@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + }, + "event-emitter": { + "version": "0.3.4", + "from": "event-emitter@>=0.3.4 <0.4.0", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz" + }, + "exit-hook": { + "version": "1.1.1", + "from": "exit-hook@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz" + }, "faker": { "version": "3.1.0", "from": "faker@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/faker/-/faker-3.1.0.tgz" + }, + "fast-levenshtein": { + "version": "1.1.3", + "from": "fast-levenshtein@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.3.tgz" + }, + "figures": { + "version": "1.7.0", + "from": "figures@>=1.3.5 <2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz" + }, + "file-entry-cache": { + "version": "1.2.4", + "from": "file-entry-cache@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.2.4.tgz" + }, + "find-up": { + "version": "1.1.2", + "from": "find-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + }, + "flat-cache": { + "version": "1.0.10", + "from": "flat-cache@>=1.0.9 <2.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.0.10.tgz" + }, + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" + }, + "get-stdin": { + "version": "4.0.1", + "from": "get-stdin@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + }, + "glob": { + "version": "7.0.5", + "from": "glob@>=7.0.3 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz" + }, + "globals": { + "version": "9.9.0", + "from": "globals@>=9.2.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.9.0.tgz" + }, + "globby": { + "version": "5.0.0", + "from": "globby@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz" + }, + "graceful-fs": { + "version": "4.1.4", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + }, + "has-flag": { + "version": "1.0.0", + "from": "has-flag@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + }, + "home-or-tmp": { + "version": "1.0.0", + "from": "home-or-tmp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "dependencies": { + "user-home": { + "version": "1.1.1", + "from": "user-home@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" + } + } + }, + "ignore": { + "version": "3.1.3", + "from": "ignore@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.1.3.tgz" + }, + "imurmurhash": { + "version": "0.1.4", + "from": "imurmurhash@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + }, + "inflight": { + "version": "1.0.5", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "inquirer": { + "version": "0.12.0", + "from": "inquirer@>=0.12.0 <0.13.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz" + }, + "invariant": { + "version": "2.2.1", + "from": "invariant@2.2.1", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz" + }, + "is-finite": { + "version": "1.0.1", + "from": "is-finite@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + }, + "is-my-json-valid": { + "version": "2.13.1", + "from": "is-my-json-valid@>=2.10.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" + }, + "is-path-cwd": { + "version": "1.0.0", + "from": "is-path-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "from": "is-path-in-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz" + }, + "is-path-inside": { + "version": "1.0.0", + "from": "is-path-inside@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" + }, + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + }, + "is-resolvable": { + "version": "1.0.0", + "from": "is-resolvable@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz" + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "js-base64": { + "version": "2.1.9", + "from": "js-base64@>=2.1.9 <3.0.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" + }, + "js-tokens": { + "version": "2.0.0", + "from": "js-tokens@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz" + }, + "js-yaml": { + "version": "3.6.1", + "from": "js-yaml@>=3.5.1 <4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz" + }, + "json-stable-stringify": { + "version": "1.0.1", + "from": "json-stable-stringify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + }, + "json5": { + "version": "0.4.0", + "from": "json5@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz" + }, + "jsonify": { + "version": "0.0.0", + "from": "jsonify@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + }, + "jsonpointer": { + "version": "2.0.0", + "from": "jsonpointer@2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" + }, + "jsx-ast-utils": { + "version": "1.2.1", + "from": "jsx-ast-utils@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.2.1.tgz" + }, + "levn": { + "version": "0.3.0", + "from": "levn@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + }, + "lodash": { + "version": "4.13.1", + "from": "lodash@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + }, + "lodash._baseeach": { + "version": "4.1.3", + "from": "lodash._baseeach@>=4.1.0 <4.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-4.1.3.tgz" + }, + "lodash._basefind": { + "version": "3.0.0", + "from": "lodash._basefind@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/lodash._basefind/-/lodash._basefind-3.0.0.tgz" + }, + "lodash._basefindindex": { + "version": "3.6.0", + "from": "lodash._basefindindex@>=3.6.0 <3.7.0", + "resolved": "https://registry.npmjs.org/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz" + }, + "lodash._baseiteratee": { + "version": "4.7.0", + "from": "lodash._baseiteratee@>=4.7.0 <4.8.0", + "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz" + }, + "lodash._basetostring": { + "version": "4.12.0", + "from": "lodash._basetostring@>=4.12.0 <4.13.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz" + }, + "lodash._root": { + "version": "3.0.1", + "from": "lodash._root@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz" + }, + "lodash._stringtopath": { + "version": "4.8.0", + "from": "lodash._stringtopath@>=4.8.0 <4.9.0", + "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz" + }, + "lodash.assign": { + "version": "4.0.9", + "from": "lodash.assign@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz" + }, + "lodash.cond": { + "version": "4.4.0", + "from": "lodash.cond@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.4.0.tgz" + }, + "lodash.endswith": { + "version": "4.1.0", + "from": "lodash.endswith@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.1.0.tgz" + }, + "lodash.find": { + "version": "4.4.0", + "from": "lodash.find@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.4.0.tgz" + }, + "lodash.findindex": { + "version": "4.4.0", + "from": "lodash.findindex@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.4.0.tgz" + }, + "lodash.keys": { + "version": "4.0.7", + "from": "lodash.keys@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz" + }, + "lodash.keysin": { + "version": "4.1.4", + "from": "lodash.keysin@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.1.4.tgz" + }, + "lodash.memoize": { + "version": "4.1.0", + "from": "lodash.memoize@4.1.0", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.0.tgz" + }, + "lodash.pickby": { + "version": "4.4.0", + "from": "lodash.pickby@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.4.0.tgz" + }, + "lodash.rest": { + "version": "4.0.3", + "from": "lodash.rest@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz" + }, + "lodash.tostring": { + "version": "4.1.3", + "from": "lodash.tostring@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.3.tgz" + }, + "loose-envify": { + "version": "1.2.0", + "from": "loose-envify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", + "dependencies": { + "js-tokens": { + "version": "1.0.3", + "from": "js-tokens@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz" + } + } + }, + "minimatch": { + "version": "3.0.2", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + }, + "mute-stream": { + "version": "0.0.5", + "from": "mute-stream@0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" + }, + "normalize-range": { + "version": "0.1.2", + "from": "normalize-range@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + }, + "num2fraction": { + "version": "1.2.2", + "from": "num2fraction@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" + }, + "number-is-nan": { + "version": "1.0.0", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + }, + "object-assign": { + "version": "4.1.0", + "from": "object-assign@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + }, + "once": { + "version": "1.3.3", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + }, + "onetime": { + "version": "1.1.0", + "from": "onetime@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" + }, + "optionator": { + "version": "0.8.1", + "from": "optionator@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.1.tgz" + }, + "os-homedir": { + "version": "1.0.1", + "from": "os-homedir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" + }, + "os-tmpdir": { + "version": "1.0.1", + "from": "os-tmpdir@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + }, + "path-exists": { + "version": "2.1.0", + "from": "path-exists@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + }, + "path-is-inside": { + "version": "1.0.1", + "from": "path-is-inside@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz" + }, + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + }, + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + }, + "pkg-dir": { + "version": "1.0.0", + "from": "pkg-dir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + }, + "pkg-up": { + "version": "1.0.0", + "from": "pkg-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz" + }, + "pluralize": { + "version": "1.2.1", + "from": "pluralize@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz" + }, + "postcss": { + "version": "5.0.21", + "from": "postcss@>=5.0.21 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.21.tgz", + "dependencies": { + "supports-color": { + "version": "3.1.2", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "from": "postcss-value-parser@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "prelude-ls": { + "version": "1.1.2", + "from": "prelude-ls@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + }, + "private": { + "version": "0.1.6", + "from": "private@>=0.1.6 <0.2.0", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz" + }, + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + }, + "progress": { + "version": "1.1.8", + "from": "progress@>=1.1.8 <2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" + }, + "read-json-sync": { + "version": "1.1.1", + "from": "read-json-sync@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/read-json-sync/-/read-json-sync-1.1.1.tgz" + }, + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" + }, + "readline2": { + "version": "1.0.1", + "from": "readline2@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz" + }, + "regenerator-runtime": { + "version": "0.9.5", + "from": "regenerator-runtime@>=0.9.5 <0.10.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz" + }, + "repeating": { + "version": "1.1.3", + "from": "repeating@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz" + }, + "require-uncached": { + "version": "1.0.2", + "from": "require-uncached@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.2.tgz" + }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + }, + "resolve-from": { + "version": "1.0.1", + "from": "resolve-from@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" + }, + "restore-cursor": { + "version": "1.0.1", + "from": "restore-cursor@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" + }, + "rimraf": { + "version": "2.5.3", + "from": "rimraf@>=2.2.8 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz" + }, + "run-async": { + "version": "0.1.0", + "from": "run-async@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz" + }, + "rx-lite": { + "version": "3.1.2", + "from": "rx-lite@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" + }, + "shebang-regex": { + "version": "1.0.0", + "from": "shebang-regex@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + }, + "shelljs": { + "version": "0.6.0", + "from": "shelljs@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.0.tgz" + }, + "slash": { + "version": "1.0.0", + "from": "slash@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" + }, + "slice-ansi": { + "version": "0.0.4", + "from": "slice-ansi@0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz" + }, + "source-map": { + "version": "0.5.6", + "from": "source-map@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + }, + "source-map-support": { + "version": "0.2.10", + "from": "source-map-support@>=0.2.10 <0.3.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "dependencies": { + "source-map": { + "version": "0.1.32", + "from": "source-map@0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "from": "sprintf-js@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + }, + "string-width": { + "version": "1.0.1", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "strip-json-comments": { + "version": "1.0.4", + "from": "strip-json-comments@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" + }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "table": { + "version": "3.7.8", + "from": "table@>=3.7.8 <4.0.0", + "resolved": "https://registry.npmjs.org/table/-/table-3.7.8.tgz" + }, + "text-table": { + "version": "0.2.0", + "from": "text-table@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + }, + "through": { + "version": "2.3.8", + "from": "through@>=2.3.6 <3.0.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "to-fast-properties": { + "version": "1.0.2", + "from": "to-fast-properties@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz" + }, + "tryit": { + "version": "1.0.2", + "from": "tryit@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.2.tgz" + }, + "tv4": { + "version": "1.2.7", + "from": "tv4@>=1.2.7 <2.0.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.2.7.tgz" + }, + "type-check": { + "version": "0.3.2", + "from": "type-check@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + }, + "typedarray": { + "version": "0.0.6", + "from": "typedarray@>=0.0.5 <0.1.0", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + }, + "user-home": { + "version": "2.0.0", + "from": "user-home@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "wordwrap": { + "version": "1.0.0", + "from": "wordwrap@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + }, + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + }, + "write": { + "version": "0.2.1", + "from": "write@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" + }, + "xregexp": { + "version": "3.1.1", + "from": "xregexp@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-3.1.1.tgz" + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } } diff --git a/package.json b/package.json index 848fbd97..0b97d896 100644 --- a/package.json +++ b/package.json @@ -8,23 +8,28 @@ "test-app-watch": "meteor test --full-app --driver-package practicalmeteor:mocha", "test-watch-terminal": "TEST_WATCH=1 meteor test --driver-package dispatch:mocha-phantomjs", "test-app-watch-terminal": "TEST_WATCH=1 meteor test --full-app --driver-package dispatch:mocha-phantomjs", - "lint": "eslint .", - "chimp-watch": "chimp --ddp=http://localhost:3000 --watch --mocha --path=tests" + "lint": "eslint ." }, "dependencies": { - "autoprefixer": "^6.3.1", + "autoprefixer": "^6.3.7", "faker": "^3.0.1" }, "devDependencies": { + "babel-eslint": "^6.1.0", "eslint": "^2.13.1", "eslint-config-airbnb": "^9.0.1", "eslint-import-resolver-meteor": "^0.2.4", - "eslint-plugin-import": "^1.10.0", + "eslint-plugin-import": "^1.10.3", "eslint-plugin-jsx-a11y": "^1.5.3", "eslint-plugin-meteor": "^3.6.0", - "eslint-plugin-react": "^5.2.2" + "eslint-plugin-react": "^5.2.2", + "shell-source": "^1.1.0" }, "eslintConfig": { + "parser": "babel-eslint", + "parserOptions": { + "allowImportExportEverywhere": true + }, "plugins": [ "meteor" ], @@ -58,4 +63,4 @@ } } } -} +} \ No newline at end of file diff --git a/tests/acceptance_run b/tests/acceptance_run new file mode 100755 index 00000000..bd178a93 --- /dev/null +++ b/tests/acceptance_run @@ -0,0 +1,2 @@ +#!/bin/sh +node ./.testing/chimp.js --ci \ No newline at end of file diff --git a/tests/acceptance_watch b/tests/acceptance_watch new file mode 100644 index 00000000..ad679636 --- /dev/null +++ b/tests/acceptance_watch @@ -0,0 +1,2 @@ +#!/bin/sh +node ./.testing/chimp.js \ No newline at end of file diff --git a/tests/lists.js b/tests/lists.js index 25b55c09..91a54eb7 100644 --- a/tests/lists.js +++ b/tests/lists.js @@ -3,14 +3,14 @@ /* globals browser assert */ const countLists = () => { - browser.waitForExist('.list-todo'); + browser.waitForVisible('.list-todo', 5000); const elements = browser.elements('.list-todo'); return elements.value.length; }; describe('list ui', () => { beforeEach(() => { - browser.url('http://localhost:3000'); + browser.url('http://localhost:3100'); }); it('can create a list @watch', () => {