diff --git a/.circleci/bin/docker-tags b/.circleci/bin/docker-tags index ad0ca39da..6560cfaab 100755 --- a/.circleci/bin/docker-tags +++ b/.circleci/bin/docker-tags @@ -33,11 +33,18 @@ if [[ "$BRANCH" == "master" ]]; then | grep "^${SHA1}" \ | sed -e 's,.* refs/tags/,,' -e 's/\^{}//' \ | grep "^v[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+$" \ + | sed 's/v//g' \ | sort \ ) # Find the highest tagged version number - HIGHEST_TAG=$(git --no-pager tag | grep "^v[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+$" | sort -r | head -n 1) + HIGHEST_TAG=$( \ + git --no-pager tag \ + | grep "^v[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+$" \ + | sed 's/v//g' \ + | sort -r --version-sort \ + | head -n 1 \ + ) # We tag :latest only if # 1. We have a current tag @@ -47,4 +54,4 @@ if [[ "$BRANCH" == "master" ]]; then echo "latest" fi fi -fi \ No newline at end of file +fi diff --git a/.circleci/config.yml b/.circleci/config.yml index ea423dbf6..300d93a8f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -201,7 +201,7 @@ jobs: dockerfile-lint: <<: *defaults docker: - - image: hadolint/hadolint + - image: hadolint/hadolint:v1.6.6-6-g254b4ff steps: - checkout - setup_remote_docker @@ -223,8 +223,25 @@ jobs: - run: name: Snyk Test command: | - PATH=$PATH:$CIRCLE_WORKING_DIRECTORY/node_modules/.bin && \ - snyk test + CIRCLE_PR_NUMBER="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}" # Determine PR number from pull request link + if [ -n ${CIRCLE_PR_NUMBER} ]; then + url="https://api.github.com/repos/${DOCKER_REPOSITORY}/pulls/$CIRCLE_PR_NUMBER" # Get PR from github API + TARGET_BRANCH=$(curl "$url" | jq '.base.ref' | tr -d '"') # Determine target/base branch from API response + fi + # If target branch does not exist or is master, run snyk tests + if [ ${TARGET_BRANCH} == "master" ] || [ -z "${TARGET_BRANCH/[ ]*\n/}" ]; then + PATH=$PATH:$CIRCLE_WORKING_DIRECTORY/node_modules/.bin && \ + snyk test + else + # If package.json is different from the base branch, run snyk + if git diff origin/$CIRCLE_BRANCH..origin/$TARGET_BRANCH package.json | grep diff; then + echo "package.json different. Running Snyk." + PATH=$PATH:$CIRCLE_WORKING_DIRECTORY/node_modules/.bin && \ + snyk test + else + echo "package.json identical to target branch. Skipping Snyk." + fi + fi workflows: version: 2 diff --git a/.meteor/.finished-upgraders b/.meteor/.finished-upgraders index 2a56593d3..8f397c7da 100644 --- a/.meteor/.finished-upgraders +++ b/.meteor/.finished-upgraders @@ -16,3 +16,4 @@ notices-for-facebook-graph-api-2 1.4.1-add-shell-server-package 1.4.3-split-account-service-packages 1.5-add-dynamic-import-package +1.7-split-underscore-from-meteor-base diff --git a/.meteor/packages b/.meteor/packages index 9cf7356e7..ff7150bb0 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -7,36 +7,36 @@ # Core Meteor Packages ### -meteor-base@1.3.0 # Packages every Meteor app needs to have +meteor-base@1.4.0 # Packages every Meteor app needs to have mobile-experience@1.0.5 # Packages for a great mobile UX blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views -es5-shim@4.7.0 # ECMAScript 5 compatibility for older browsers. -ecmascript@0.10.0 # Enable ECMAScript2015+ syntax in app code +es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers. +ecmascript@0.11.0 # Enable ECMAScript2015+ syntax in app code audit-argument-checks@1.0.7 # ensure meteor method argument validation browser-policy@1.1.0 # security-related policies enforced by newer browsers juliancwirko:postcss@1.3.0 # CSS post-processing plugin (replaces standard-minifier-css) session@1.1.7 # ReactiveDict whose contents are preserved across Hot Code Push -tracker@1.1.3 # Meteor transparent reactive programming library -mongo@1.4.2 +tracker@1.2.0 # Meteor transparent reactive programming library +mongo@1.5.0 reactive-var@1.0.11 reactive-dict@1.2.0 -check@1.3.0 -http@1.4.0 +check@1.3.1 +http@1.4.1 ddp-rate-limiter@1.0.7 underscore@1.0.10 -logging@1.1.19 +logging@1.1.20 reload@1.2.0 ejson@1.1.0 -less@2.7.11 +less@2.7.12 service-configuration@1.0.11 mdg:validated-method shell-server@0.3.1 -dynamic-import@0.3.0 -standard-minifier-js@2.3.1 +dynamic-import@0.4.0 +standard-minifier-js@2.3.4 # Meteor Auth Packages accounts-base@1.4.2 -accounts-password@1.5.0 +accounts-password@1.5.1 accounts-facebook@1.3.1 accounts-google@1.3.1 accounts-twitter@1.4.1 diff --git a/.meteor/release b/.meteor/release index d502dc0d9..7f956de29 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.6.1 +METEOR@1.7.0.1 diff --git a/.meteor/versions b/.meteor/versions index 289c8bcb0..03d8433cd 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -2,7 +2,7 @@ accounts-base@1.4.2 accounts-facebook@1.3.1 accounts-google@1.3.1 accounts-oauth@1.1.15 -accounts-password@1.5.0 +accounts-password@1.5.1 accounts-twitter@1.4.1 alanning:roles@1.2.16 aldeed:autoform@6.2.0 @@ -12,43 +12,43 @@ aldeed:template-extension@4.1.0 allow-deny@1.1.0 audit-argument-checks@1.0.7 autoupdate@1.4.0 -babel-compiler@7.0.4 +babel-compiler@7.1.0 babel-runtime@1.2.2 base64@1.0.11 binary-heap@1.0.10 blaze@2.3.2 blaze-html-templates@1.1.2 blaze-tools@1.0.10 -boilerplate-generator@1.4.0 +boilerplate-generator@1.5.0 bozhao:accounts-instagram@0.2.2 browser-policy@1.1.0 browser-policy-common@1.0.11 browser-policy-content@1.1.0 browser-policy-framing@1.1.0 -caching-compiler@1.1.11 +caching-compiler@1.1.12 caching-html-compiler@1.1.2 callback-hook@1.1.0 -check@1.3.0 +check@1.3.1 coffeescript@1.0.17 dburles:factory@1.1.0 ddp@1.4.0 -ddp-client@2.3.1 +ddp-client@2.3.2 ddp-common@1.4.0 ddp-rate-limiter@1.0.7 -ddp-server@2.1.2 +ddp-server@2.2.0 deps@1.0.12 diff-sequence@1.1.0 dispatch:run-as-user@1.1.1 -dynamic-import@0.3.0 -ecmascript@0.10.4 -ecmascript-runtime@0.5.0 -ecmascript-runtime-client@0.6.2 -ecmascript-runtime-server@0.5.0 +dynamic-import@0.4.0 +ecmascript@0.11.0 +ecmascript-runtime@0.7.0 +ecmascript-runtime-client@0.7.1 +ecmascript-runtime-server@0.7.0 ejson@1.1.0 email@1.2.3 -es5-shim@4.7.3 +es5-shim@4.8.0 facebook-config-ui@1.0.1 -facebook-oauth@1.4.0 +facebook-oauth@1.5.0 gadicc:blaze-react-component@1.4.0 geojson-utils@1.0.10 google-config-ui@1.0.0 @@ -56,7 +56,7 @@ google-oauth@1.2.5 hot-code-push@1.0.4 html-tools@1.0.11 htmljs@1.0.11 -http@1.4.0 +http@1.4.1 id-map@1.1.0 johanbrook:publication-collector@1.1.0 jquery@1.11.11 @@ -65,28 +65,29 @@ launch-screen@1.1.1 less@2.7.12 livedata@1.0.18 localstorage@1.2.0 -logging@1.1.19 +logging@1.1.20 mdg:validated-method@1.1.0 -meteor@1.8.2 -meteor-base@1.3.0 +meteor@1.9.0 +meteor-base@1.4.0 meteorhacks:ssr@2.2.0 meteorhacks:subs-manager@1.6.4 meteortesting:browser-tests@0.1.2 meteortesting:mocha@0.5.0 minifier-css@1.3.1 -minifier-js@2.3.2 -minimongo@1.4.3 +minifier-js@2.3.5 +minimongo@1.4.4 mobile-experience@1.0.5 mobile-status-bar@1.0.14 -modules@0.11.4 -modules-runtime@0.9.2 +modern-browsers@0.1.1 +modules@0.12.0 +modules-runtime@0.10.0 momentjs:moment@2.19.4 -mongo@1.4.3 +mongo@1.5.0 mongo-dev-server@1.1.0 -mongo-id@1.0.6 +mongo-id@1.0.7 npm-bcrypt@0.9.3 -npm-mongo@2.2.34 -oauth@1.2.1 +npm-mongo@3.0.7 +oauth@1.2.3 oauth-encryption@1.3.0 oauth1@1.2.0 oauth2@1.2.0 @@ -97,7 +98,7 @@ percolate:migrations@0.9.8 practicalmeteor:chai@2.1.0_1 practicalmeteor:mocha-core@1.0.1 practicalmeteor:sinon@1.14.1_2 -promise@0.10.2 +promise@0.11.1 raix:eventemitter@0.1.3 random@1.1.0 rate-limit@1.0.9 @@ -105,29 +106,27 @@ reactive-dict@1.2.0 reactive-var@1.0.11 reload@1.2.0 retry@1.1.0 -routepolicy@1.0.12 -server-render@0.3.0 +routepolicy@1.0.13 service-configuration@1.0.11 session@1.1.7 sha@1.0.9 shell-server@0.3.1 -shim-common@0.1.0 -socket-stream-client@0.1.0 +socket-stream-client@0.2.1 spacebars@1.0.15 spacebars-compiler@1.1.3 srp@1.0.10 -standard-minifier-js@2.3.2 +standard-minifier-js@2.3.4 templating@1.3.2 templating-compiler@1.3.3 templating-runtime@1.3.2 templating-tools@1.1.2 tmeasday:check-npm-versions@0.3.2 tmeasday:publish-counts@0.8.0 -tracker@1.1.3 +tracker@1.2.0 twitter-config-ui@1.0.0 twitter-oauth@1.2.0 ui@1.0.13 underscore@1.0.10 url@1.2.0 -webapp@1.5.0 +webapp@1.6.0 webapp-hashing@1.0.9 diff --git a/.snyk b/.snyk index 63dc80f76..baa35c79f 100644 --- a/.snyk +++ b/.snyk @@ -5,11 +5,7 @@ ignore: 'npm:hoek:20180212': - '*': reason: 'Possible false positive, waiting on requestjs to updated hawk version' - expires: 2018-06-20T00:00:00.000Z - 'npm:shelljs:20140723': - - eslint-config-react-tools > eslint-plugin-class-property > eslint > shelljs: - reason: no patch available - expires: '2018-03-22T04:22:44.834Z' + expires: 2018-06-30T00:00:00.000Z 'npm:bootstrap:20160627': - bootstrap: reason: We're not going to update to Bootstrap 4 any time soon @@ -17,7 +13,7 @@ ignore: 'npm:lodash:20180130': - '*': reason: no patch - expires: 2018-06-20T00:00:00.000Z + expires: 2018-06-30T00:00:00.000Z 'npm:tunnel-agent:20170305': - '*': reason: No patch and we do not use this optional package @@ -29,13 +25,13 @@ ignore: 'npm:stringstream:20180511': - '*': reason: Awaiting dependency updates of request 2.83.0 to gte 2.86 - expires: 2018-06-20T00:00:00.000Z + expires: 2018-06-30T00:00:00.000Z 'npm:deep-extend:20180409': - '*': reason: No patch available https://github.com/unclechu/node-deep-extend/issues/41 - expires: 2018-06-20T00:00:00.000Z + expires: 2018-06-30T00:00:00.000Z 'npm:base64url:20180511': - '*': reason: Twillio and nexmo will be removed soon, file-collections isn't using any google-cloud stuff so this vuln doesn't apply - expires: 2018-06-20T00:00:00.000Z + expires: 2018-06-30T00:00:00.000Z patch: {} diff --git a/CHANGELOG.md b/CHANGELOG.md index 82f07ee5d..1e54dffbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,85 @@ +# v1.13.0 + +## Removal of Legacy Product Revision Control system +The major change in this release is that we've removed the existing revision control system in favor of publishing Products to the Catalog. The existing revision control system contained some powerful ideas, but was complex and intertwined into many areas of the app that were not directly related to Product. By removing the old revision control system, we've paved the way to substantially improve product grid performance, especially for Operators and we've simplified the product publication logic. + +This removes all code, hooks, collections, and packages related to revision control. + +**Breaking changes:** + - Any custom packages that depend on the `Revision` control system. + - Operators will no longer be able to "undo" changes to a product. Instead products are published through the catalog + - Any _unpublished_ changes to products will be lost when upgrading to `1.13.0`. In this release, it's possible that if you were to downgrade that you would see the unpublished changes again, but that may cause unexpected behavior. We recommend either publishing or discarding any changes to your products before upgrading to this release. + - Similarly, any products that have been created but not published will demonstrate unexpected behavior. To avoid this undesirable behavior, publish any newly created, unpublished products prior to upgrading to this release. + + - **All plugin authors** will need to update your `package.json` with a change to the babel config similar to what was done [here](https://github.com/reaction-contrib/meteor-authorize-net/commit/f19a5cf7591a17f426e67bd3737af5a4d1c7a64a) + + +## Update to Meteor 1.7 +This update brings some enormous improvements to the amount of time it takes to rebuild the application in development after making a file change. In some (less than perfectly scientific) tests that I ran testing file changes between 1.7 and 1.6.1 I saw 50%-90% improvements in the reload time. Your experience may vary depending on how much you've customized Reaction, your computer specs, and your specific development setup, but I fully expect this to be a noticeable improvement for anyone working with Reaction. + +There are some [early](https://github.com/meteor/meteor/issues/9949) [reports](https://github.com/meteor/meteor/issues/9945) that the included update to the MongoDB driver may have [some kinks](https://github.com/meteor/meteor/issues/9944) to work out, so I'd follow those issues on Meteor's repo if that's a cause for concern for you. These reports are all coming from a single person, and we haven't experienced any of these issues in particular yet, but we'll be keeping an eye on them. + +## +We ran into a few issues with `npm install` that we resolved in #4317. One product that came out of this investigation was some documentation for how to properly clean up and rebuild docker images in Reaction. + +To stop and clean up your images +```sh + docker-compose down -v --rmi local --remove-orphans +``` + +To rebuild your Reaction images +```sh + docker-compose up --build --force-recreate --renew-anon-volumes +``` + +If you only want to run Reaction and not the GraphQL DevServer +```sh + docker-compose up --build --force-recreate --renew-anon-volumes reaction +``` + +If you only want to run the DevServer and not the Meteor app +```sh + docker-compose up --build --force-recreate --renew-anon-volumes devserver +``` + +## Meteor App +### Performance + - perf: remove revision control (#4238) + - perf: update to Meteor 1.7 (#4265) + +### Bug Fixes + - fix: Use catalog collection for PDP (#4324) + - fix: Import fixture data only if collections empty (#4327) .. Resolves #4326 + - fix: Invalid class name: .variant-list-item-{variant._id} (#4217) + - fix: NPM build issue in Docker build (#4317) + - fix: add getAutoValues: false to discounts/codes/remove (#4288) + - fix: hadolint image version (#4306) + - fix: CI step failure to tag Docker image with latest release version (#4304) + - fix: admin products publication slowness (#4260) + - fix: remove inventoryPolicy check on low inventory (#4298) + +### Refactors + - refactor: non meteor schemas (#4266) .. Resolves #4263 + +### Tests + - test: new mocks factory (#4276) .. Resolves #4246 + - test: run snyk when package.json has changed or base is master (#4285) + +### Docs + - docs(jsdoc): document all Meteor Template helpers in 1 @namespace (#3841) .. Resolves #3840 + +## GraphQL Dev Server +### Features + - feat: add Media to Tag Schema and GraphQL query (#4270) + +### Chore + - chore: update default GraphQL query limit values (#4297) + +## Contributors +Thanks to @mikeumus for contributing to this release. 🎉 + + + # v1.12.1 ## Bug Fixes - fix: handle products without positions obj .. Resolves #4299 @@ -14,7 +96,6 @@ The issue was releated to a type error that was thrown during a migration: 0|reaction | at items.forEach (imports/plugins/core/versions/server/migrations/25_update_catalog_schema.js:28:12) ``` - # v1.12.0 ## Breaking changes diff --git a/Dockerfile b/Dockerfile index 1b1109e08..2ea21a112 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ ############################################################################## # meteor-dev stage - builds image for dev and used with docker-compose.yml ############################################################################## -FROM reactioncommerce/base:v4.0.2 as meteor-dev +FROM reactioncommerce/base:meteor-1.7.0.1 as meteor-dev LABEL maintainer="Reaction Commerce " @@ -15,7 +15,11 @@ COPY --chown=node package.json $APP_SOURCE_DIR/ # Without this NPM cannot write packages into node_modules later, when running in a container. RUN mkdir "$APP_SOURCE_DIR/node_modules" && chown node "$APP_SOURCE_DIR/node_modules" -RUN meteor npm install +# Due to an async race condition issue when installing packages with the NPM version (v5.10.0) +# in Meteor 1.7, we are switching to using the NPM version installed in the base image (v5.6.0). +# This prevents the "write after end" errors seen with this command. This will be reverted when +# Meteor updates to an NPM version without this issue. +RUN npm install COPY --chown=node . $APP_SOURCE_DIR @@ -32,13 +36,14 @@ RUN printf "\\n[-] Building Meteor application...\\n" \ WORKDIR $APP_BUNDLE_DIR/bundle/programs/server/ -RUN meteor npm install --production +# TODO: Revert to Meteor NPM. See comment above about Meteor1.7 NPM version issue +RUN npm install --production ############################################################################## # final build stage - create the final production image ############################################################################## -FROM node:8.9.4-slim +FROM node:8.11.2-slim # Default environment variables ENV ROOT_URL "http://localhost" diff --git a/Dockerfile-devserver b/Dockerfile-devserver index 4740ca9e7..3415a8ae6 100644 --- a/Dockerfile-devserver +++ b/Dockerfile-devserver @@ -1,5 +1,5 @@ # Builds a GraphQL development server without Meteor runtime dependencies. -FROM node:8.9.4 +FROM node:8.11.2 LABEL maintainer="Reaction Commerce " @@ -15,6 +15,7 @@ COPY --chown=node package-lock.json . # Without this NPM cannot write packages into node_modules later, when running in a container. RUN mkdir /app/node_modules && chown node /app/node_modules +RUN npm -v RUN npm install COPY --chown=node . . diff --git a/client/modules/core/helpers/apps.js b/client/modules/core/helpers/apps.js index 2b6e82332..6f25f861d 100644 --- a/client/modules/core/helpers/apps.js +++ b/client/modules/core/helpers/apps.js @@ -6,45 +6,20 @@ import { Reaction } from "/client/api"; import { Packages, Shops } from "/lib/collections"; /** - * - * reactionApps - * provides="" - * enabled=true - * context= true filter templates to current route - * returns matching package registry objects - * @example {{#each reactionApps provides="settings" name=packageName container=container}} - * @example {{#each reactionApps provides="userAccountDropdown" enabled=true}} - * @example - * {{#each reactionApps provides="social" name="reaction-social"}} - * {{> Template.dynamic template=template data=customSocialSettings }} - * {{/each}} - * - * @typedef optionHash - * @type {object} - * @property {string} name - name of a package. - * @property {string} provides -purpose of this package as identified to the registry - * @property {string} container - filter registry entries for matching container. - * @property {string} shopId - filter to only display results matching shopId, not returned - * @property {string} template - filter registry entries for matching template - * @type {optionHash} - * - * @return {optionHash} returns an array of filtered, structure reactionApps - * ``` - * [{ - * enabled: true - * label: "Stripe" - * name: "reaction-stripe" - * packageId: "QqkGsQCDRhg2LSn8J" - * priority: 1 - * provides: "paymentMethod" - * template: "stripePaymentForm" - * etc: "additional properties as defined in Packages.registry" - * ... - * }] - * ``` - * @ignore + * @typedef optionHash + * @type {Object} + * @property {String} name - name of a package. + * @property {String} provides -purpose of this package as identified to the registry + * @property {String} container - filter registry entries for matching container. + * @property {String} shopId - filter to only display results matching shopId, not returned + * @property {String} template - filter registry entries for matching template */ +/** + * @method Apps + * @param {optionHash} optionHash Option hash + * @return {Object[]} returns an array of filtered, structure reactionApps + */ export function Apps(optionHash) { const filter = {}; const registryFilter = {}; @@ -173,5 +148,25 @@ export function Apps(optionHash) { return reactionApps.sort((a, b) => a.priority - b.priority).slice(); } -// Register global template helper +/** + * + * @name reactionApps + * @memberof BlazeTemplateHelpers + * @summary Return an array of filtered, structured `reactionApps` as a Template Helper + * @example {{#each reactionApps provides="settings" name=packageName container=container}} + * @example {{#each reactionApps provides="userAccountDropdown" enabled=true}} + * @param {optionHash} optionHash Option hash + * @return {Object[]} returns an array of filtered, structure reactionApps + * ```[{ + * enabled: true + * label: "Stripe" + * name: "reaction-stripe" + * packageId: "QqkGsQCDRhg2LSn8J" + * priority: 1 + * provides: "paymentMethod" + * template: "stripePaymentForm" + * etc: "additional properties as defined in Packages.registry" + * ... + * }]``` + */ Template.registerHelper("reactionApps", (optionHash) => Reaction.Apps(optionHash)); diff --git a/client/modules/core/helpers/layout.js b/client/modules/core/helpers/layout.js index 4ffde08b0..12044cc65 100644 --- a/client/modules/core/helpers/layout.js +++ b/client/modules/core/helpers/layout.js @@ -6,12 +6,12 @@ import Logger from "/client/modules/logger"; import * as Collections from "/lib/collections"; /** - * reactionTemplate helper - * use the reactionTemplate helper when you are using templates defined - * as workflow templates in the package registery.Layout + * @name reactionTemplate + * @summary use the reactionTemplate helper when you are using templates defined + * as workflow templates in the package registry.Layout * use "collection" on the layout to indicate a workflow source - * - * @summary reactionTemplate provides templates as defined in ReactionRegistry.Layout + * @memberof BlazeTemplateHelpers + * @description reactionTemplate provides templates as defined in ReactionRegistry.Layout * @param {Object} options - workflow defaults to "coreLayout/coreWorkflow" * @returns {Array} returns an array with labels, templates that match workflow */ diff --git a/client/modules/core/helpers/permissions.js b/client/modules/core/helpers/permissions.js index f10de0abe..6bc203c94 100644 --- a/client/modules/core/helpers/permissions.js +++ b/client/modules/core/helpers/permissions.js @@ -2,16 +2,11 @@ import { Meteor } from "meteor/meteor"; import { Template } from "meteor/templating"; import { Reaction } from "/client/api"; -/* - * Methods for the reaction permissions - * helpers for roles, uses alanning:meteor-roles - * see: http://alanning.github.io/meteor-roles/classes/Roles.html - * use: {{hasPermission admin userId}} - */ - /** - * hasPermission template helper - * @summary check current user hasPermission + * @method hasPermission + * @memberof BlazeTemplateHelpers + * @summary check current user hasPermission, uses [alanning:meteor-roles](http://alanning.github.io/meteor-roles/classes/Roles.html) + * @example {{hasPermission admin userId}} * @param {String|Array} "permissions" * @param {String} checkUserId - optional Meteor.userId, default to current * @return {Boolean} @@ -33,29 +28,33 @@ Template.registerHelper("hasPermission", (permissions, options) => { }); /** - * hasOwnerAccess template helper - * @summary check if user has owner access + * @method hasOwnerAccess + * @memberof BlazeTemplateHelpers + * @summary check if user has owner access, uses [alanning:meteor-roles](http://alanning.github.io/meteor-roles/classes/Roles.html) * @return {Boolean} return true if owner */ Template.registerHelper("hasOwnerAccess", () => Reaction.hasOwnerAccess()); /** - * hasAdminAccess template helper - * @summary check if user has admin access + * @method hasAdminAccess + * @memberof BlazeTemplateHelpers + * @summary check if user has admin access, uses [alanning:meteor-roles](http://alanning.github.io/meteor-roles/classes/Roles.html) * @return {Boolean} return true if admin */ Template.registerHelper("hasAdminAccess", () => Reaction.hasAdminAccess()); /** - * hasDashboardAccess template helper - * @summary check if user has dashboard access + * @method hasDashboardAccess + * @memberof BlazeTemplateHelpers + * @summary check if user has dashboard access, uses [alanning:meteor-roles](http://alanning.github.io/meteor-roles/classes/Roles.html) * @return {Boolean} return true if user has dashboard permission */ Template.registerHelper("hasDashboardAccess", () => Reaction.hasDashboardAccess()); /** - * allowGuestCheckout template helper - * @summary check if guest users are allowed to checkout + * @method allowGuestCheckout + * @memberof BlazeTemplateHelpers + * @summary check if guest users are allowed to checkout, uses [alanning:meteor-roles](http://alanning.github.io/meteor-roles/classes/Roles.html) * @return {Boolean} return true if shop has guest checkout enabled */ Template.registerHelper("allowGuestCheckout", () => Reaction.allowGuestCheckout()); diff --git a/client/modules/core/helpers/templates.js b/client/modules/core/helpers/templates.js index 66f7c013f..cbf9cacf5 100644 --- a/client/modules/core/helpers/templates.js +++ b/client/modules/core/helpers/templates.js @@ -11,7 +11,13 @@ import * as Collections from "/lib/collections"; import * as Schemas from "/lib/collections/schemas"; import { toCamelCase } from "/lib/api"; -// Lazyload moment-timezone.months +/** + * @file Meteor Blaze Template helper methods - Use these helpers in Meteor Blaze templates with `{{ }}` + * Read more about Meteor Blaze helpers in the [Blaze Documentation](blazejs.org/api/templates.html#Template-registerHelper). + * @namespace BlazeTemplateHelpers + */ + +// Lazily load moment-timezone.months const monthOptionsVar = new ReactiveVar([]); async function lazyLoadMonths() { if (monthOptionsVar.get().length) return; @@ -47,11 +53,11 @@ Template.registerHelper("Collections", () => Collections); Template.registerHelper("Schemas", () => Schemas); /** - * currentUser + * @method currentUser + * @memberof BlazeTemplateHelpers * @summary overrides Meteor Package.blaze currentUser method * @return {Boolean} returns true/null if user has registered */ - Template.registerHelper("currentUser", () => { if (typeof Reaction === "object") { const shopId = Reaction.getShopId(); @@ -67,11 +73,17 @@ Template.registerHelper("currentUser", () => { return null; }); - +/** + * @method monthOptions + * @memberof BlazeTemplateHelpers + * @summary Get monthOptionsVar ReactiveVar + * @param {Boolean} [showDefaultOption] + * @return {Array} returns array of months + */ Template.registerHelper("monthOptions", (showDefaultOption = true) => { const label = i18next.t("app.monthOptions", "Choose month"); - // Call to get monthOptinosVar ReactiveVar + // Call to get monthOptionsVar ReactiveVar lazyLoadMonths(); let monthOptions = []; @@ -88,8 +100,10 @@ Template.registerHelper("monthOptions", (showDefaultOption = true) => { }); /** - * yearOptions + * @method yearOptions + * @memberof BlazeTemplateHelpers * @summary formats moment.js next 9 years into array for autoform selector + * @param {Boolean} [showDefaultOption] * @return {Array} returns array of years [value:, label:] */ Template.registerHelper("yearOptions", (showDefaultOption = true) => { @@ -115,7 +129,7 @@ Template.registerHelper("yearOptions", (showDefaultOption = true) => { }); /** - * camelToSpace + * @method camelToSpace * @summary convert a camelcased string to spaces * @param {String} str - camelcased string * @return {String} returns space formatted string @@ -126,7 +140,8 @@ Template.registerHelper("camelToSpace", (str) => { }); /** - * toLowerCase + * @method toLowerCase + * @memberof BlazeTemplateHelpers * @summary convert a string to lower case * @param {String} str - string * @return {String} returns lowercased string @@ -134,7 +149,8 @@ Template.registerHelper("camelToSpace", (str) => { Template.registerHelper("toLowerCase", (str) => str.toLowerCase()); /** - * toUpperCase + * @method toUpperCase + * @memberof BlazeTemplateHelpers * @summary convert a string to upper case * @param {String} str - string * @return {String} returns uppercased string @@ -142,7 +158,8 @@ Template.registerHelper("toLowerCase", (str) => str.toLowerCase()); Template.registerHelper("toUpperCase", (str) => str.toUpperCase()); /** - * capitalize + * @method capitalize + * @memberof BlazeTemplateHelpers * @summary capitalize first character of string * @param {String} str - string * @return {String} returns string with first letter capitalized @@ -150,7 +167,8 @@ Template.registerHelper("toUpperCase", (str) => str.toUpperCase()); Template.registerHelper("capitalize", (str) => str.charAt(0).toUpperCase() + str.slice(1)); /** - * toCamelCase + * @method toCamelCase + * @memberof BlazeTemplateHelpers * @summary camelCases a string * @param {String} str - string * @return {String|undefined} returns camelCased string @@ -159,8 +177,10 @@ Template.registerHelper("toCamelCase", (str) => !!str && toCamelCase(str)); /** - * siteName + * @method siteName + * @memberof BlazeTemplateHelpers * @summary get the shop name + * @example {{siteName}} * @return {String} returns site name */ Template.registerHelper("siteName", () => { @@ -168,14 +188,11 @@ Template.registerHelper("siteName", () => { return typeof shop === "object" && shop.name ? shop.name : ""; }); -/* - * General helpers for template functionality - */ - /** - * condition + * @method condition * @summary conditional string comparison template helper * @example {{#if condition status "eq" ../value}} + * @memberof BlazeTemplateHelpers * @param {String} v1 - first variable to compare * @param {String} operator - eq,neq,ideq,or,lt,gt comparision operator * @param {String} v2 - second variable to compare @@ -219,8 +236,13 @@ Template.registerHelper("condition", (v1, operator, v2) => { }); /** - * orElse + * @method orElse * @summary if this is true, or else this + * @memberof BlazeTemplateHelpers + * @example {{#if showCartIconWarning}} +
!
+ {{/if}} +
{{orElse cartCount 0}}
* @param {String} v1 - variable one * @param {String} v2 - variable two * @return {String} returns v1 || v2 @@ -228,8 +250,9 @@ Template.registerHelper("condition", (v1, operator, v2) => { Template.registerHelper("orElse", (v1, v2) => v1 || v2); /** - * key_value + * @method key_value * @summary template helper pushing object key/value into array + * @memberof BlazeTemplateHelpers * @param {Object} context - object to parse into key / value * @return {Array} returns array[key:,value:] */ @@ -243,9 +266,10 @@ Template.registerHelper("key_value", (context) => { }); /** - * nl2br + * @method nl2br * @summary template helper nl2br - Converts new line (\n\r) to
* from http://phpjs.org/functions/nl2br:480 + * @memberof BlazeTemplateHelpers * @param {String} text - text * @returns {String} returns formatted Spacebars.SafeString */ @@ -255,9 +279,10 @@ Template.registerHelper("nl2br", (text) => { }); /** - * pluralize + * @method pluralize * @summary general helper for plurization of strings - * @example {{plurize "1 thing"}} + * @memberof BlazeTemplateHelpers + * @example {{pluralize "1 thing"}} * @param {String} nCount - number, ie "1 " * @param {String} pString - plural string ie " thing" * @todo adapt to, and use i18next diff --git a/client/modules/i18n/helpers.js b/client/modules/i18n/helpers.js index 5d5096753..f53751770 100644 --- a/client/modules/i18n/helpers.js +++ b/client/modules/i18n/helpers.js @@ -10,7 +10,7 @@ import { formatPriceString } from "./currency"; * @name i18n * @see http://i18next.com/ * @summary Pass the translation key as the first argument and the default message as the second argument - * @memberof i18n + * @memberof BlazeTemplateHelpers * @method * @param {String} i18nKey - i18nKey * @param {String} i18nMessage - message text @@ -33,9 +33,9 @@ Template.registerHelper("i18n", (i18nKey, i18nMessage) => { /** * @name currencySymbol - * @memberof i18n + * @memberof BlazeTemplateHelpers * @method - * @summary Eeturn shop /locale specific currency format (ie: $) + * @summary Return shop /locale specific currency format (ie: $) * @returns {String} return current locale currency symbol */ Template.registerHelper("currencySymbol", () => { @@ -55,7 +55,7 @@ Template.registerHelper("currencySymbol", () => { /** * @name formatPrice - * @memberof i18n + * @memberof BlazeTemplateHelpers * @method * @summary Return shop /locale specific formatted price. Also accepts a range formatted with " - " * @example {{formatPrice displayPrice}} diff --git a/client/modules/router/helpers.js b/client/modules/router/helpers.js index 66bbe95f5..95e097b1c 100644 --- a/client/modules/router/helpers.js +++ b/client/modules/router/helpers.js @@ -2,16 +2,26 @@ import { Template } from "meteor/templating"; import { Meteor } from "meteor/meteor"; import Router from "./main"; -// -// pathFor -// template helper to return path -// +/** + * @method pathFor + * @memberof BlazeTemplateHelpers + * @summary template helper to return path + * @return {String} username + */ Template.registerHelper("pathFor", Router.pathFor); -// -// urlFor -// template helper to return absolute + path -// +/** + * @method urlFor + * @memberof BlazeTemplateHelpers + * @summary template helper to return absolute + path + * @return {String} username + */ Template.registerHelper("urlFor", (path, params) => Meteor.absoluteUrl(Router.pathFor(path, params).substr(1))); +/** + * @method active + * @memberof BlazeTemplateHelpers + * @summary template helper for `Router.isActiveClassName` + * @return {String} username + */ Template.registerHelper("active", Router.isActiveClassName); diff --git a/docker-compose-demo.yml b/docker-compose-demo.yml index e21302fbc..dde1a8430 100644 --- a/docker-compose-demo.yml +++ b/docker-compose-demo.yml @@ -11,7 +11,7 @@ services: ports: - "3000:3000" environment: - ROOT_URL: "http://localhost" + ROOT_URL: "http://localhost:3000" MONGO_URL: "mongodb://mongo:27017/reaction" mongo: diff --git a/docker-compose.yml b/docker-compose.yml index a0c18ed30..0da548508 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,7 +35,7 @@ services: build: context: . target: meteor-dev - command: bash -c "meteor npm install && reaction" + command: bash -c "npm install && reaction" #TODO; Revert to Meteor NPM. See comment in Dockerfile about Meteor1.7 NPM version issue. depends_on: - mongo environment: @@ -53,7 +53,7 @@ services: - reaction_node_modules:/opt/reaction/src/node_modules # do not link node_modules in, and persist it between dc up runs mongo: - image: mongo:3.4 + image: mongo:3.6.3 command: mongod --storageEngine=wiredTiger ports: - "27017:27017" diff --git a/imports/collections/defineCollections.js b/imports/collections/defineCollections.js index 30f0436b9..0ac3982a0 100644 --- a/imports/collections/defineCollections.js +++ b/imports/collections/defineCollections.js @@ -22,7 +22,6 @@ export default function defineCollections(db, collections) { Orders: db.collection("Orders"), Packages: db.collection("Packages"), Products: db.collection("Products"), - Revisions: db.collection("Revisions"), roles: db.collection("roles"), SellerShops: db.collection("SellerShops"), Shipping: db.collection("Shipping"), diff --git a/lib/collections/schemas/accounts.js b/imports/collections/schemas/accounts.js similarity index 92% rename from lib/collections/schemas/accounts.js rename to imports/collections/schemas/accounts.js index e148719da..0f4be0803 100644 --- a/lib/collections/schemas/accounts.js +++ b/imports/collections/schemas/accounts.js @@ -1,8 +1,6 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { createdAtAutoValue, shopIdAutoValue, updatedAtAutoValue } from "./helpers"; +import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; import { Address } from "./address"; import { Metafield } from "./metafield"; @@ -22,7 +20,7 @@ const TaxSettings = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("TaxSettings", TaxSettings); @@ -78,7 +76,7 @@ export const Profile = new SimpleSchema({ blackbox: true, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Profile", Profile); @@ -105,7 +103,7 @@ export const Email = new SimpleSchema({ defaultValue: false, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Email", Email); @@ -146,7 +144,6 @@ export const Accounts = new SimpleSchema({ }, "shopId": { type: String, - autoValue: shopIdAutoValue, regEx: SimpleSchema.RegEx.Id, index: 1 }, @@ -211,6 +208,6 @@ export const Accounts = new SimpleSchema({ autoValue: updatedAtAutoValue, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Accounts", Accounts); diff --git a/lib/collections/schemas/address.js b/imports/collections/schemas/address.js similarity index 96% rename from lib/collections/schemas/address.js rename to imports/collections/schemas/address.js index e5f34cd20..bcd44985f 100644 --- a/lib/collections/schemas/address.js +++ b/imports/collections/schemas/address.js @@ -1,7 +1,5 @@ import Random from "@reactioncommerce/random"; import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { Metafield } from "./metafield"; @@ -112,6 +110,6 @@ export const Address = new SimpleSchema({ "metafields.$": { type: Metafield } -}, { check, tracker: Tracker }); +}); registerSchema("Address", Address); diff --git a/lib/collections/schemas/assets.js b/imports/collections/schemas/assets.js similarity index 86% rename from lib/collections/schemas/assets.js rename to imports/collections/schemas/assets.js index 04cd8c151..b4093a27b 100644 --- a/lib/collections/schemas/assets.js +++ b/imports/collections/schemas/assets.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -33,6 +31,6 @@ export const Assets = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Assets", Assets); diff --git a/lib/collections/schemas/cart.js b/imports/collections/schemas/cart.js similarity index 93% rename from lib/collections/schemas/cart.js rename to imports/collections/schemas/cart.js index 55f95e14e..7f8d117bf 100644 --- a/lib/collections/schemas/cart.js +++ b/imports/collections/schemas/cart.js @@ -1,8 +1,6 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { createdAtAutoValue, shopIdAutoValueForCart, updatedAtAutoValue } from "./helpers"; +import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; import { Payment } from "./payments"; import { Product, ProductVariant } from "./products"; import { Shipment, ShippingParcel } from "./shipping"; @@ -39,7 +37,6 @@ export const CartItem = new SimpleSchema({ }, "shopId": { type: String, - autoValue: shopIdAutoValueForCart, index: 1, label: "Cart Item shopId", optional: true @@ -98,7 +95,7 @@ export const CartItem = new SimpleSchema({ optional: true, blackbox: true // @todo Revert this to schema at some point } -}, { check, tracker: Tracker }); +}); registerSchema("CartItem", CartItem); @@ -117,7 +114,7 @@ export const CartItems = new SimpleSchema({ "items.$": { type: CartItem } -}, { check, tracker: Tracker }); +}); registerSchema("CartItems", CartItems); @@ -148,7 +145,6 @@ export const Cart = new SimpleSchema({ }, "shopId": { type: String, - autoValue: shopIdAutoValueForCart, index: 1, label: "Cart ShopId" }, @@ -241,6 +237,6 @@ export const Cart = new SimpleSchema({ autoValue: updatedAtAutoValue, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Cart", Cart); diff --git a/lib/collections/schemas/catalog.js b/imports/collections/schemas/catalog.js similarity index 100% rename from lib/collections/schemas/catalog.js rename to imports/collections/schemas/catalog.js diff --git a/lib/collections/schemas/emails.js b/imports/collections/schemas/emails.js similarity index 91% rename from lib/collections/schemas/emails.js rename to imports/collections/schemas/emails.js index df36a249f..f8e7da2a7 100644 --- a/lib/collections/schemas/emails.js +++ b/imports/collections/schemas/emails.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; @@ -54,6 +52,6 @@ export const Emails = new SimpleSchema({ autoValue: updatedAtAutoValue, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Emails", Emails); diff --git a/lib/collections/schemas/event.js b/imports/collections/schemas/event.js similarity index 90% rename from lib/collections/schemas/event.js rename to imports/collections/schemas/event.js index a3881e3f5..23fbfb4f6 100644 --- a/lib/collections/schemas/event.js +++ b/imports/collections/schemas/event.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -42,6 +40,6 @@ export const Event = new SimpleSchema({ type: Date, label: "Created At" } -}, { check, tracker: Tracker }); +}); registerSchema("Event", Event); diff --git a/lib/collections/schemas/groups.js b/imports/collections/schemas/groups.js similarity index 91% rename from lib/collections/schemas/groups.js rename to imports/collections/schemas/groups.js index 2173c1f47..c60d97648 100644 --- a/lib/collections/schemas/groups.js +++ b/imports/collections/schemas/groups.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; @@ -55,6 +53,6 @@ export const Groups = new SimpleSchema({ type: Date, autoValue: updatedAtAutoValue } -}, { check, tracker: Tracker }); +}); registerSchema("Groups", Groups); diff --git a/imports/collections/schemas/helpers.js b/imports/collections/schemas/helpers.js new file mode 100644 index 000000000..5c9cec355 --- /dev/null +++ b/imports/collections/schemas/helpers.js @@ -0,0 +1,53 @@ +import Random from "@reactioncommerce/random"; +import { Meteor } from "meteor/meteor"; + +/** + * @name createdAtAutoValue + * @memberof Schemas + * @method + * @summary Helper method used for schema injection autoValue + * @example autoValue: createdAtAutoValue + * @return {Date} Date representing now if it's an insert + */ +export function createdAtAutoValue() { + // We don't want to unset or overwrite a createdAt in a nested + // document, for example, in a product being added to cart items + if (this.closestSubschemaFieldName) return; + + if (this.isInsert) return new Date(); + if (this.isUpsert) return { $setOnInsert: new Date() }; + this.unset(); +} + +/** + * @name updatedAtAutoValue + * @memberof Schemas + * @method + * @summary Helper method used for schema injection autoValue + * @example autoValue: updatedAtAutoValue + * @return {Date} Date representing now + */ +export function updatedAtAutoValue() { + // We don't want to overwrite an updatedAt in a nested + // document, for example, in a product being added to cart items + if (this.closestSubschemaFieldName) return; + + return new Date(); +} + +/** + * @name schemaIdAutoValue + * @memberof Schemas + * @method + * @summary Helper method used for schema injection autoValue + * @example autoValue: schemaIdAutoValue + * @return {String} randomId + */ +export function schemaIdAutoValue() { + if (this.isSet && Meteor.isServer) { + return this.value; + } else if ((Meteor.isServer && this.operator !== "$pull") || (Meteor.isClient && this.isInsert)) { + return Random.id(); + } + return this.unset(); +} diff --git a/imports/collections/schemas/index.js b/imports/collections/schemas/index.js new file mode 100644 index 000000000..889486a1e --- /dev/null +++ b/imports/collections/schemas/index.js @@ -0,0 +1,40 @@ +/** + * Reaction uses {@link https://github.com/aldeed/simple-schema-js SimpleSchema} to apply basic content and structure validation to Collections. + * See {@link https://docs.reactioncommerce.com/reaction-docs/master/simple-schema full documentation}. + * @typedef {SimpleSchema} SimpleSchema + * @summary SimpleSchema for Collections + * @namespace Schemas + */ + +/** + * Reaction uses {@link https://github.com/aldeed/simple-schema-js SimpleSchema} to apply basic content and structure validation to Collections. + * See {@link https://docs.reactioncommerce.com/reaction-docs/master/simple-schema full documentation}. + * @namespace Schemas + */ + +import "./schemaIndex"; + +export * from "./accounts"; +export * from "./address"; +export * from "./assets"; +export * from "./catalog"; +export * from "./cart"; +export * from "./emails"; +export * from "./inventory"; +export * from "./layouts"; +export * from "./logs"; +export * from "./metafield"; +export * from "./notifications"; +export * from "./orders"; +export * from "./payments"; +export * from "./products"; +export * from "./registry"; +export * from "./shipping"; +export * from "./shops"; +export * from "./groups"; +export * from "./sms"; +export * from "./social"; +export * from "./tags"; +export * from "./templates"; +export * from "./translations"; +export * from "./workflow"; diff --git a/lib/collections/schemas/inventory.js b/imports/collections/schemas/inventory.js similarity index 89% rename from lib/collections/schemas/inventory.js rename to imports/collections/schemas/inventory.js index 800cc952b..4c65aa203 100644 --- a/lib/collections/schemas/inventory.js +++ b/imports/collections/schemas/inventory.js @@ -1,8 +1,6 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { createdAtAutoValue, shopIdAutoValue, updatedAtAutoValue } from "./helpers"; +import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; import { Document, Notes } from "./orders"; import { Metafield } from "./metafield"; import { Workflow } from "./workflow"; @@ -31,7 +29,6 @@ export const Inventory = new SimpleSchema({ }, "shopId": { type: String, - autoValue: shopIdAutoValue, index: 1, label: "Inventory ShopId" }, @@ -89,6 +86,6 @@ export const Inventory = new SimpleSchema({ autoValue: updatedAtAutoValue, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Inventory", Inventory); diff --git a/lib/collections/schemas/layouts.js b/imports/collections/schemas/layouts.js similarity index 95% rename from lib/collections/schemas/layouts.js rename to imports/collections/schemas/layouts.js index e0180011a..9747272ca 100644 --- a/lib/collections/schemas/layouts.js +++ b/imports/collections/schemas/layouts.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -61,7 +59,7 @@ export const LayoutStructure = new SimpleSchema({ optional: true, index: true } -}, { check, tracker: Tracker }); +}); registerSchema("LayoutStructure", LayoutStructure); @@ -144,6 +142,6 @@ export const Layout = new SimpleSchema({ optional: true, defaultValue: 1 } -}, { check, tracker: Tracker }); +}); registerSchema("Layout", Layout); diff --git a/lib/collections/schemas/logs.js b/imports/collections/schemas/logs.js similarity index 91% rename from lib/collections/schemas/logs.js rename to imports/collections/schemas/logs.js index f272a8208..cb528d76b 100644 --- a/lib/collections/schemas/logs.js +++ b/imports/collections/schemas/logs.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -46,6 +44,6 @@ export const Logs = new SimpleSchema({ autoValue() { return new Date(); }, label: "Date" } -}, { check, tracker: Tracker }); +}); registerSchema("Logs", Logs); diff --git a/lib/collections/schemas/metafield.js b/imports/collections/schemas/metafield.js similarity index 88% rename from lib/collections/schemas/metafield.js rename to imports/collections/schemas/metafield.js index 3e75b2968..d2da5f621 100644 --- a/lib/collections/schemas/metafield.js +++ b/imports/collections/schemas/metafield.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -41,6 +39,6 @@ export const Metafield = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Metafield", Metafield); diff --git a/lib/collections/schemas/notifications.js b/imports/collections/schemas/notifications.js similarity index 93% rename from lib/collections/schemas/notifications.js rename to imports/collections/schemas/notifications.js index 9b601ae1e..e6f6f4ec0 100644 --- a/lib/collections/schemas/notifications.js +++ b/imports/collections/schemas/notifications.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -65,6 +63,6 @@ export const Notification = new SimpleSchema({ this.unset(); } } -}, { check, tracker: Tracker }); +}); registerSchema("Notification", Notification); diff --git a/lib/collections/schemas/orders.js b/imports/collections/schemas/orders.js similarity index 94% rename from lib/collections/schemas/orders.js rename to imports/collections/schemas/orders.js index 117ac32f6..e6364b095 100644 --- a/lib/collections/schemas/orders.js +++ b/imports/collections/schemas/orders.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { createdAtAutoValue } from "./helpers"; import { Cart, CartItem } from "./cart"; @@ -21,7 +19,7 @@ export const Document = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Document", Document); @@ -47,7 +45,7 @@ export const History = new SimpleSchema({ updatedAt: { type: Date } -}, { check, tracker: Tracker }); +}); registerSchema("History", History); @@ -100,7 +98,7 @@ export const Notes = new SimpleSchema({ updatedAt: { type: Date } -}, { check, tracker: Tracker }); +}); registerSchema("Notes", Notes); @@ -138,7 +136,7 @@ export const OrderItem = new SimpleSchema({ "documents.$": { type: Document } -}, { check, tracker: Tracker }); +}); registerSchema("OrderItem", OrderItem); @@ -174,7 +172,7 @@ export const OrderTransaction = new SimpleSchema({ type: Date, autoValue: createdAtAutoValue } -}, { check, tracker: Tracker }); +}); registerSchema("OrderTransaction", OrderTransaction); @@ -244,7 +242,7 @@ export const Order = new SimpleSchema({ optional: true }, "exportHistory.$": ExportHistory -}, { check, tracker: Tracker }); +}); registerSchema("Order", Order); diff --git a/lib/collections/schemas/payments.js b/imports/collections/schemas/payments.js similarity index 95% rename from lib/collections/schemas/payments.js rename to imports/collections/schemas/payments.js index 9f3ec4c76..034ba037a 100644 --- a/lib/collections/schemas/payments.js +++ b/imports/collections/schemas/payments.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { createdAtAutoValue, schemaIdAutoValue } from "./helpers"; import { Address } from "./address"; @@ -43,7 +41,7 @@ export const PaymentItem = new SimpleSchema({ variantId: { type: String } -}, { check, tracker: Tracker }); +}); registerSchema("PaymentItem", PaymentItem); @@ -154,7 +152,7 @@ export const PaymentMethod = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("PaymentMethod", PaymentMethod); @@ -202,7 +200,7 @@ export const Invoice = new SimpleSchema({ total: { type: Number } -}, { check, tracker: Tracker }); +}); registerSchema("Invoice", Invoice); @@ -223,7 +221,7 @@ export const CurrencyExchangeRate = new SimpleSchema({ type: Number, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("CurrencyExchangeRate", CurrencyExchangeRate); @@ -266,7 +264,7 @@ export const Payment = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Payment", Payment); @@ -298,6 +296,6 @@ export const Refund = new SimpleSchema({ optional: true, blackbox: true } -}, { check, tracker: Tracker }); +}); registerSchema("Refund", Refund); diff --git a/lib/collections/schemas/products.js b/imports/collections/schemas/products.js similarity index 91% rename from lib/collections/schemas/products.js rename to imports/collections/schemas/products.js index c6b5e481c..ee445a232 100644 --- a/lib/collections/schemas/products.js +++ b/imports/collections/schemas/products.js @@ -1,11 +1,7 @@ -import Random from "@reactioncommerce/random"; import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; import { Meteor } from "meteor/meteor"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { ReactionProduct, getSlug } from "/lib/api"; -import { createdAtAutoValue, shopIdAutoValue, shopDefaultCountry, updatedAtAutoValue } from "./helpers"; +import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; import { Event } from "./event"; import { Metafield } from "./metafield"; import { ShippingParcel } from "./shipping"; @@ -45,7 +41,7 @@ export const VariantMedia = new SimpleSchema({ type: Date, autoValue: createdAtAutoValue } -}, { check, tracker: Tracker }); +}); registerSchema("VariantMedia", VariantMedia); @@ -82,7 +78,7 @@ export const ProductPosition = new SimpleSchema({ updatedAt: { type: Date } -}, { check, tracker: Tracker }); +}); registerSchema("ProductPosition", ProductPosition); @@ -246,16 +242,7 @@ export const ProductVariant = new SimpleSchema({ type: SimpleSchema.Integer, label: "Quantity", optional: true, - defaultValue: 0, - custom() { - if (Meteor.isClient) { - if (this.siblingField("type").value !== "inventory") { - if (ReactionProduct.checkChildVariants(this.docId) === 0 && !this.value) { - return SimpleSchema.ErrorTypes.REQUIRED; - } - } - } - } + defaultValue: 0 }, "minOrderQuantity": { label: "Minimum order quantity", @@ -281,7 +268,6 @@ export const ProductVariant = new SimpleSchema({ }, "shopId": { type: String, - autoValue: shopIdAutoValue, index: 1, label: "Variant ShopId" }, @@ -386,10 +372,9 @@ export const ProductVariant = new SimpleSchema({ }, "originCountry": { type: String, - optional: true, - autoValue: shopDefaultCountry + optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ProductVariant", ProductVariant); @@ -416,7 +401,7 @@ export const PriceRange = new SimpleSchema({ defaultValue: 0, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("PriceRange", PriceRange); @@ -465,14 +450,14 @@ export const Product = new SimpleSchema({ }, "ancestors": { type: Array, - defaultValue: [] + defaultValue: [], + index: 1 }, "ancestors.$": { type: String }, "shopId": { type: String, - autoValue: shopIdAutoValue, index: 1, label: "Product ShopId" }, @@ -495,8 +480,7 @@ export const Product = new SimpleSchema({ }, "originCountry": { type: String, - optional: true, - autoValue: shopDefaultCountry + optional: true }, "type": { label: "Type", @@ -584,23 +568,7 @@ export const Product = new SimpleSchema({ "handle": { type: String, optional: true, - index: 1, - autoValue() { - let slug = getSlug(this.value); - - if (!slug && this.siblingField("title").value) { - slug = getSlug(this.siblingField("title").value); - } else if (!slug) { - slug = this.siblingField("_id").value || Random.id(); - } - if (this.isInsert) { - return slug; - } else if (this.isUpsert) { - return { - $setOnInsert: slug - }; - } - } + index: 1 }, "changedHandleWas": { type: String, @@ -623,7 +591,8 @@ export const Product = new SimpleSchema({ }, "createdAt": { type: Date, - autoValue: createdAtAutoValue + autoValue: createdAtAutoValue, + index: 1 }, "updatedAt": { type: Date, @@ -643,6 +612,6 @@ export const Product = new SimpleSchema({ optional: true, defaultValue: {} } -}, { check, tracker: Tracker }); +}); registerSchema("Product", Product); diff --git a/lib/collections/schemas/registry.js b/imports/collections/schemas/registry.js similarity index 96% rename from lib/collections/schemas/registry.js rename to imports/collections/schemas/registry.js index 357247987..3af2fd16d 100644 --- a/lib/collections/schemas/registry.js +++ b/imports/collections/schemas/registry.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { Layout } from "./layouts"; @@ -20,7 +18,7 @@ export const Permissions = new SimpleSchema({ label: { type: String } -}, { check, tracker: Tracker }); +}); registerSchema("Permissions", Permissions); @@ -168,7 +166,7 @@ export const Registry = new SimpleSchema({ "hideForShopTypes.$": { type: String } -}, { check, tracker: Tracker }); +}); registerSchema("Registry", Registry); @@ -190,8 +188,6 @@ export const PackageConfig = new SimpleSchema({ "shopId": { type: String, index: 1, - // see: https://github.com/reactioncommerce/reaction/issues/646#issuecomment-169351842 - // autoValue: shopIdAutoValue, label: "PackageConfig ShopId", optional: true }, @@ -227,7 +223,7 @@ export const PackageConfig = new SimpleSchema({ "layout.$": { type: Layout } -}, { check, tracker: Tracker }); +}); registerSchema("PackageConfig", PackageConfig); diff --git a/imports/collections/schemas/schemaIndex.js b/imports/collections/schemas/schemaIndex.js new file mode 100644 index 000000000..aaf3a660e --- /dev/null +++ b/imports/collections/schemas/schemaIndex.js @@ -0,0 +1,9 @@ +import SimpleSchema from "simpl-schema"; + +// These options are added by the `aldeed:schema-index` Meteor package, but because that +// is a Meteor package and we also load the schemas in a non-Meteor Node app, we need to do it here. +SimpleSchema.extendOptions([ + "index", // one of Number, String, Boolean + "unique", // Boolean + "sparse" // Boolean +]); diff --git a/lib/collections/schemas/shipping.js b/imports/collections/schemas/shipping.js similarity index 96% rename from lib/collections/schemas/shipping.js rename to imports/collections/schemas/shipping.js index c0170c681..318bd2c77 100644 --- a/lib/collections/schemas/shipping.js +++ b/imports/collections/schemas/shipping.js @@ -1,8 +1,6 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { shopIdAutoValue, schemaIdAutoValue } from "./helpers"; +import { schemaIdAutoValue } from "./helpers"; import { Address } from "./address"; import { Invoice } from "./payments"; import { PackageConfig } from "./registry"; @@ -27,7 +25,7 @@ export const ShippoShippingMethod = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShippoShippingMethod", ShippoShippingMethod); @@ -155,7 +153,7 @@ export const ShippingMethod = new SimpleSchema({ type: ShippoShippingMethod, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShippingMethod", ShippingMethod); @@ -182,7 +180,7 @@ export const ShipmentQuote = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShipmentQuote", ShipmentQuote); @@ -222,7 +220,7 @@ export const ShipmentItem = new SimpleSchema({ variantId: { type: String } -}, { check, tracker: Tracker }); +}); registerSchema("ShipmentItem", ShipmentItem); @@ -257,7 +255,7 @@ export const ShippingParcel = new SimpleSchema({ type: Number, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShippingParcel", ShippingParcel); @@ -283,7 +281,7 @@ export const ShippoShipment = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShippoShipment", ShippoShipment); @@ -318,7 +316,7 @@ export const ShipmentQuotesQueryStatus = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShipmentQuotesQueryStatus", ShipmentQuotesQueryStatus); @@ -425,7 +423,7 @@ export const Shipment = new SimpleSchema({ type: ShippoShipment, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Shipment", Shipment); @@ -443,7 +441,7 @@ export const ShippoShippingProvider = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShippoShippingProvider", ShippoShippingProvider); @@ -499,7 +497,7 @@ export const ShippingProvider = new SimpleSchema({ type: ShippoShippingProvider, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShippingProvider", ShippingProvider); @@ -523,7 +521,6 @@ export const Shipping = new SimpleSchema({ "shopId": { type: String, index: 1, - autoValue: shopIdAutoValue, label: "Shipping ShopId" }, "name": { @@ -552,7 +549,7 @@ export const Shipping = new SimpleSchema({ "shipmentQuotes.$": { type: ShipmentQuote } -}, { check, tracker: Tracker }); +}); registerSchema("Shipping", Shipping); diff --git a/lib/collections/schemas/shops.js b/imports/collections/schemas/shops.js similarity index 93% rename from lib/collections/schemas/shops.js rename to imports/collections/schemas/shops.js index d21b5e6ce..7cf364f1b 100644 --- a/lib/collections/schemas/shops.js +++ b/imports/collections/schemas/shops.js @@ -1,8 +1,5 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { getSlug } from "/lib/api"; import { Email } from "./accounts"; import { Address } from "./address"; import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; @@ -41,7 +38,7 @@ export const CustomEmailSettings = new SimpleSchema({ type: SimpleSchema.Integer, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("CustomEmailSettings", CustomEmailSettings); @@ -84,7 +81,7 @@ export const Currency = new SimpleSchema({ type: Number, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Currency", Currency); @@ -104,7 +101,7 @@ export const Locale = new SimpleSchema({ type: Object, blackbox: true } -}, { check, tracker: Tracker }); +}); registerSchema("Locale", Locale); @@ -127,7 +124,7 @@ export const Languages = new SimpleSchema({ type: Boolean, defaultValue: true } -}, { check, tracker: Tracker }); +}); registerSchema("Languages", Languages); @@ -146,7 +143,7 @@ export const ShopTheme = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("ShopTheme", ShopTheme); @@ -166,7 +163,7 @@ export const BrandAsset = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("BrandAsset", BrandAsset); @@ -191,7 +188,7 @@ const MerchantShop = new SimpleSchema({ type: String, label: "Shop Name" } -}, { check, tracker: Tracker }); +}); registerSchema("MerchantShop", MerchantShop); @@ -248,21 +245,7 @@ export const Shop = new SimpleSchema({ "slug": { type: String, optional: true, - unique: true, - autoValue() { - let slug = getSlug(this.value); - - if (!slug && this.siblingField("name").value) { - slug = getSlug(this.siblingField("name").value); - } - if (this.isInsert) { - return slug; - } else if (this.isUpsert) { - return { - $setOnInsert: slug - }; - } - } + unique: true }, "merchantShops": { type: Array, @@ -484,6 +467,6 @@ export const Shop = new SimpleSchema({ optional: true, defaultValue: {} } -}, { check, tracker: Tracker }); +}); registerSchema("Shop", Shop); diff --git a/lib/collections/schemas/sms.js b/imports/collections/schemas/sms.js similarity index 86% rename from lib/collections/schemas/sms.js rename to imports/collections/schemas/sms.js index 18eb05960..cde633fff 100644 --- a/lib/collections/schemas/sms.js +++ b/imports/collections/schemas/sms.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -34,6 +32,6 @@ export const Sms = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Sms", Sms); diff --git a/lib/collections/schemas/social.js b/imports/collections/schemas/social.js similarity index 96% rename from lib/collections/schemas/social.js rename to imports/collections/schemas/social.js index c7fc5e87a..0f3489591 100644 --- a/lib/collections/schemas/social.js +++ b/imports/collections/schemas/social.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { PackageConfig } from "./registry"; @@ -24,7 +22,7 @@ export const SocialProvider = new SimpleSchema({ defaultValue: false, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("SocialProvider", SocialProvider); diff --git a/lib/collections/schemas/tags.js b/imports/collections/schemas/tags.js similarity index 89% rename from lib/collections/schemas/tags.js rename to imports/collections/schemas/tags.js index 1ef727f7e..1e93a0044 100644 --- a/lib/collections/schemas/tags.js +++ b/imports/collections/schemas/tags.js @@ -1,8 +1,6 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; -import { createdAtAutoValue, shopIdAutoValue } from "./helpers"; +import { createdAtAutoValue } from "./helpers"; import { Metafield } from "./metafield"; /** @@ -71,7 +69,6 @@ export const Tag = new SimpleSchema({ "shopId": { type: String, index: 1, - autoValue: shopIdAutoValue, label: "Tag shopId" }, "createdAt": { @@ -83,7 +80,11 @@ export const Tag = new SimpleSchema({ autoValue() { return new Date(); } + }, + "heroMediaUrl": { + type: String, + optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Tag", Tag); diff --git a/lib/collections/schemas/templates.js b/imports/collections/schemas/templates.js similarity index 95% rename from lib/collections/schemas/templates.js rename to imports/collections/schemas/templates.js index 95e1507c5..307853c81 100644 --- a/lib/collections/schemas/templates.js +++ b/imports/collections/schemas/templates.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { shopIdAutoValue } from "./helpers"; @@ -97,7 +95,7 @@ export const ReactLayout = new SimpleSchema({ type: Object, blackbox: true } -}, { check, tracker: Tracker }); +}); registerSchema("ReactLayout", ReactLayout); @@ -125,6 +123,6 @@ export const Template = new SimpleSchema({ type: String, optional: true } -}, { check, tracker: Tracker }); +}); registerSchema("Template", Template); diff --git a/lib/collections/schemas/translations.js b/imports/collections/schemas/translations.js similarity index 88% rename from lib/collections/schemas/translations.js rename to imports/collections/schemas/translations.js index ce697ae2d..081a55231 100644 --- a/lib/collections/schemas/translations.js +++ b/imports/collections/schemas/translations.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; import { shopIdAutoValue } from "./helpers"; @@ -37,6 +35,6 @@ export const Translation = new SimpleSchema({ type: Object, blackbox: true } -}, { check, tracker: Tracker }); +}); registerSchema("Translation", Translation); diff --git a/lib/collections/schemas/workflow.js b/imports/collections/schemas/workflow.js similarity index 84% rename from lib/collections/schemas/workflow.js rename to imports/collections/schemas/workflow.js index 4efbcce38..ffdc24389 100644 --- a/lib/collections/schemas/workflow.js +++ b/imports/collections/schemas/workflow.js @@ -1,6 +1,4 @@ import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -23,6 +21,6 @@ export const Workflow = new SimpleSchema({ optional: true }, "workflow.$": String -}, { check, tracker: Tracker }); +}); registerSchema("Workflow", Workflow); diff --git a/imports/plugins/core/accounts/client/helpers/templates.js b/imports/plugins/core/accounts/client/helpers/templates.js index 0eb578a93..43c4f44a5 100644 --- a/imports/plugins/core/accounts/client/helpers/templates.js +++ b/imports/plugins/core/accounts/client/helpers/templates.js @@ -4,8 +4,11 @@ import { Roles } from "meteor/alanning:roles"; import { Reaction, i18next, i18nextDep } from "/client/api"; import * as Collections from "/lib/collections"; -/* - * registerHelper displayName +/** + * @method displayName + * @memberof BlazeTemplateHelpers + * @summary Return a registered and logged in user's name or Guest + * @return {String} username */ Template.registerHelper("displayName", (displayUser) => { i18nextDep.depend(); diff --git a/imports/plugins/core/accounts/client/templates/dropdown/helpers/templates.js b/imports/plugins/core/accounts/client/templates/dropdown/helpers/templates.js index 98f6f033e..f1ca39fb8 100644 --- a/imports/plugins/core/accounts/client/templates/dropdown/helpers/templates.js +++ b/imports/plugins/core/accounts/client/templates/dropdown/helpers/templates.js @@ -4,7 +4,10 @@ import { Roles } from "meteor/alanning:roles"; import { Reaction, i18next, i18nextDep } from "/client/api"; /** - * registerHelper displayName + * @method displayName + * @memberof BlazeTemplateHelpers + * @summary Return a registered and logged in user's name or Guest + * @return {String} username */ Template.registerHelper("displayName", (displayUser) => { i18nextDep.depend(); diff --git a/imports/plugins/core/revisions/client/components/publishControls.js b/imports/plugins/core/catalog/client/components/publishControls.js similarity index 78% rename from imports/plugins/core/revisions/client/components/publishControls.js rename to imports/plugins/core/catalog/client/components/publishControls.js index 111f17b25..faa6c5c6b 100644 --- a/imports/plugins/core/revisions/client/components/publishControls.js +++ b/imports/plugins/core/catalog/client/components/publishControls.js @@ -4,14 +4,9 @@ import { Components } from "@reactioncommerce/reaction-components"; import { Button, FlatButton, - IconButton, - Divider, - DropDownMenu, - MenuItem, Switch, Icon } from "/imports/plugins/core/ui/client/components"; -import SimpleDiff from "./simpleDiff"; import { Translatable } from "/imports/plugins/core/ui/client/providers"; /** TMP **/ @@ -176,19 +171,6 @@ class PublishControls extends Component { return false; } - renderChanges() { - if (this.showDiffs) { - const diffs = this.props.revisions.map((revision) => ); - - return ( -
- {diffs} -
- ); - } - return null; - } - renderDeletionStatus() { if (this.hasChanges) { if (this.primaryRevision && this.primaryRevision.documentData.isDeleted) { @@ -232,48 +214,6 @@ class PublishControls extends Component { ); } - renderMoreOptionsButton() { - return ( - } - handleMenuItemChange={this.handleAction} - > - - - - - - - - - - - ); - } - renderViewControls() { if (this.props.showViewAsControls) { let tooltip = "Private"; @@ -304,19 +244,6 @@ class PublishControls extends Component { return null; } - renderUndoButton() { - return ( - - ); - } - renderArchiveButton() { return ( - {this.renderDeletionStatus()} - {this.renderUndoButton()} - {this.renderArchiveButton()} - {this.renderViewControls()} - {this.renderPublishButton()} - {/* this.renderMoreOptionsButton() */} - - ); - } - - return null; + return ( + + {this.renderDeletionStatus()} + {this.renderArchiveButton()} + {this.renderViewControls()} + {this.renderPublishButton()} + + ); } } diff --git a/imports/plugins/core/catalog/client/containers/publishContainer.js b/imports/plugins/core/catalog/client/containers/publishContainer.js new file mode 100644 index 000000000..e47255c44 --- /dev/null +++ b/imports/plugins/core/catalog/client/containers/publishContainer.js @@ -0,0 +1,83 @@ +import React, { Component } from "react"; +import PropTypes from "prop-types"; +import { Meteor } from "meteor/meteor"; +import { composeWithTracker } from "@reactioncommerce/reaction-components"; +import { Reaction, i18next } from "/client/api"; +import TranslationProvider from "/imports/plugins/core/ui/client/providers/translationProvider"; +import PublishControls from "../components/publishControls"; + +/* + * PublishContainer is a container component connected to Meteor data source. + */ +class PublishContainer extends Component { + publishToCatalog(collection, documentIds) { + Meteor.call(`catalog/publish/${collection}`, documentIds, (error, result) => { + if (result) { + Alerts.toast(i18next.t("admin.catalogProductPublishSuccess", { defaultValue: "Product published to catalog" }), "success"); + } else if (error) { + Alerts.toast(error.message, "error"); + } + }); + } + + handlePublishClick = () => { + const productIds = this.props.documents + .filter((doc) => doc.type === "simple") + .map((doc) => doc._id); + + this.publishToCatalog("products", productIds); + } + + handlePublishActions = (event, action) => { + if (action === "archive" && this.props.onAction) { + this.props.onAction(event, action, this.props.documentIds); + } + } + + render() { + return ( + + + + ); + } +} + +PublishContainer.propTypes = { + documentIds: PropTypes.arrayOf(PropTypes.string), + documents: PropTypes.arrayOf(PropTypes.object), + isEnabled: PropTypes.bool, + isPreview: PropTypes.bool, + onAction: PropTypes.func, + onPublishSuccess: PropTypes.func, + onVisibilityChange: PropTypes.func, + product: PropTypes.object +}; + +function composer(props, onData) { + const viewAs = Reaction.getUserPreferences("reaction-dashboard", "viewAs", "administrator"); + + if (Array.isArray(props.documentIds) && props.documentIds.length) { + onData(null, { + documentIds: props.documentIds, + documents: props.documents, + isPreview: viewAs === "customer" + }); + + return; + } + + onData(null, { + isPreview: viewAs === "customer" + }); +} + +export default composeWithTracker(composer)(PublishContainer); diff --git a/imports/plugins/core/catalog/server/methods/catalog.app-test.js b/imports/plugins/core/catalog/server/methods/catalog.app-test.js index f55b860ed..85597cce9 100644 --- a/imports/plugins/core/catalog/server/methods/catalog.app-test.js +++ b/imports/plugins/core/catalog/server/methods/catalog.app-test.js @@ -6,13 +6,12 @@ import { Meteor } from "meteor/meteor"; import { check, Match } from "meteor/check"; import { Factory } from "meteor/dburles:factory"; import { Reaction } from "/server/api"; -import { Products, Revisions, Tags } from "/lib/collections"; +import { Products, Tags } from "/lib/collections"; import { expect } from "meteor/practicalmeteor:chai"; import { sinon } from "meteor/practicalmeteor:sinon"; import { Roles } from "meteor/alanning:roles"; import { addProduct, addProductSingleVariant } from "/server/imports/fixtures/products"; import Fixtures from "/server/imports/fixtures"; -import { RevisionApi } from "/imports/plugins/core/revisions/lib/api/revisions"; Fixtures(); @@ -43,8 +42,6 @@ describe("core product methods", function () { beforeEach(function () { sandbox = sinon.sandbox.create(); - sandbox.stub(RevisionApi, "isRevisionControlEnabled", () => true); - Revisions.remove({}); }); afterEach(function () { @@ -162,7 +159,7 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - it("should not update individual variant by admin passing in full object", function () { + it("should update individual variant by admin passing in full object", function (done) { sandbox.stub(Reaction, "hasPermission", () => true); const product = addProduct(); let variant = Products.findOne({ ancestors: [product._id] }); @@ -170,50 +167,10 @@ describe("core product methods", function () { variant["price"] = 7; Meteor.call("products/updateVariant", variant); variant = Products.findOne({ ancestors: [product._id] }); - expect(variant.price).to.not.equal(7); - expect(variant.title).to.not.equal("Updated Title"); - }); - - it("should update individual variant revision by admin passing in full object", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const variant = Products.find({ ancestors: [product._id] }).fetch()[0]; - variant["title"] = "Updated Title"; - variant["price"] = 7; - Meteor.call("products/updateVariant", variant); - const variantRevision = Revisions.find({ documentId: variant._id }).fetch()[0]; - expect(variantRevision.documentData.price).to.equal(7); - expect(variantRevision.documentData.title).to.equal("Updated Title"); - }); - - it("should not update individual variant by admin passing in partial object", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const variant = Products.findOne({ ancestors: [product._id] }); - Meteor.call("products/updateVariant", { - _id: variant._id, - title: "Updated Title", - price: 7 - }); - const updatedVariant = Products.findOne(variant._id); - expect(updatedVariant.price).to.not.equal(7); - expect(updatedVariant.title).to.not.equal("Updated Title"); - expect(updatedVariant.optionTitle).to.equal(variant.optionTitle); - }); + expect(variant.price).to.equal(7); + expect(variant.title).to.equal("Updated Title"); - it("should update individual variant revision by admin passing in partial object", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const variant = Products.find({ ancestors: [product._id] }).fetch()[0]; - Meteor.call("products/updateVariant", { - _id: variant._id, - title: "Updated Title", - price: 7 - }); - const updatedVariantRevision = Revisions.findOne({ documentId: variant._id }); - expect(updatedVariantRevision.documentData.price).to.equal(7); - expect(updatedVariantRevision.documentData.title).to.equal("Updated Title"); - expect(updatedVariantRevision.documentData.optionTitle).to.equal(variant.optionTitle); + return done(); }); }); @@ -227,38 +184,16 @@ describe("core product methods", function () { expect(removeProductSpy).to.not.have.been.called; }); - it("should not mark top-level variant as deleted", function () { + it("should mark top-level variant as deleted", function () { sandbox.stub(Reaction, "hasPermission", () => true); const product = addProduct(); let variant = Products.findOne({ ancestors: [product._id] }); expect(variant.isDeleted).to.equal(false); Meteor.call("products/deleteVariant", variant._id); variant = Products.findOne(variant._id); - expect(variant.isDeleted).to.not.equal(true); - }); - - it("should mark top-level variant revision as deleted", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const variant = Products.findOne({ ancestors: [product._id] }); - expect(variant.isDeleted).to.equal(false); - Meteor.call("products/deleteVariant", variant._id); - const variantRevision = Revisions.findOne({ documentId: variant._id }); - expect(variantRevision.documentData.isDeleted).to.equal(true); + expect(variant.isDeleted).to.equal(true); }); - it("should publish top-level variant as deleted", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const variant = Products.findOne({ ancestors: [product._id] }); - expect(variant.isDeleted).to.equal(false); - Meteor.call("products/deleteVariant", variant._id); - Meteor.call("revisions/publish", variant._id); - const publishedProduct = Products.findOne(variant._id); - expect(publishedProduct.isDeleted).to.equal(true); - }); - - it("should mark all child variants (options) as deleted if top-level variant deleted", function () { sandbox.stub(Reaction, "hasPermission", () => true); const product = addProduct(); @@ -420,28 +355,11 @@ describe("core product methods", function () { expect(removeProductSpy).to.not.have.been.called; }); - it("should not mark product as deleted by admin", function () { + it("should mark product as deleted by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); Meteor.call("products/archiveProduct", product._id); product = Products.findOne(product._id); - expect(product.isDeleted).to.equal(false); - }); - - it("should mark product revision as deleted by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - Meteor.call("products/archiveProduct", product._id); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.isDeleted).to.equal(true); - }); - - it("should publish product revision marked as deleted by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/archiveProduct", product._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); expect(product.isDeleted).to.equal(true); }); }); @@ -458,56 +376,20 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - it("should not update product field by admin", function () { + it("should update product field by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); Meteor.call("products/updateProductField", product._id, "title", "Updated Title"); product = Products.findOne(product._id); - expect(product.title).to.not.equal("Updated Title"); - }); - - it("should update product revision field by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "Updated Title"); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.title).to.equal("Updated Title"); - }); - - it("should publish changes to product field by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "Updated Title"); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); expect(product.title).to.equal("Updated Title"); }); - it("should not update variant fields", function () { + it("should update variant fields", function () { sandbox.stub(Reaction, "hasPermission", () => true); const product = addProduct(); let variant = Products.findOne({ ancestors: [product._id] }); Meteor.call("products/updateProductField", variant._id, "title", "Updated Title"); variant = Products.findOne(variant._id); - expect(variant.title).to.not.equal("Updated Title"); - }); - - it("should update variant revision fields", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const variant = Products.findOne({ ancestors: [product._id] }); - Meteor.call("products/updateProductField", variant._id, "title", "Updated Title"); - const variantRevision = Revisions.findOne({ documentId: variant._id }); - expect(variantRevision.documentData.title).to.equal("Updated Title"); - }); - - it("should publish update for variant fields", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - let variant = Products.findOne({ ancestors: [product._id] }); - Meteor.call("products/updateProductField", variant._id, "title", "Updated Title"); - Meteor.call("revisions/publish", product._id); - variant = Products.findOne(variant._id); expect(variant.title).to.equal("Updated Title"); }); }); @@ -527,7 +409,7 @@ describe("core product methods", function () { expect(insertTagsSpy).to.not.have.been.called; }); - it("should not new tag when passed tag name and null ID by admin", function () { + it("should create new tag when passed tag name and null ID by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); const tagName = "Product Tag"; @@ -536,59 +418,10 @@ describe("core product methods", function () { const tag = Tags.findOne({ name: tagName }); expect(tag.slug).to.equal(Reaction.getSlug(tagName)); product = Products.findOne(product._id); - expect(product.hashtags).to.not.contain(tag._id); - }); - - it("should add new tag to product revision when passed tag name and null ID by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const tagName = "Product Tag"; - expect(Tags.findOne({ name: tagName })).to.be.undefined; - Meteor.call("products/updateProductTags", product._id, tagName, null); - const tag = Tags.findOne({ name: tagName }); - expect(tag.slug).to.equal(Reaction.getSlug(tagName)); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.hashtags).to.contain(tag._id); - }); - - it("should publish new product tag when passed tag name and null ID by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - const tagName = "Product Tag"; - expect(Tags.findOne({ name: tagName })).to.be.undefined; - Meteor.call("products/updateProductTags", product._id, tagName, null); - const tag = Tags.findOne({ name: tagName }); - expect(tag.slug).to.equal(Reaction.getSlug(tagName)); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); expect(product.hashtags).to.contain(tag._id); }); - it("should not add existing tag when passed existing tag and tag._id by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - const tag = Factory.create("tag"); - expect(Tags.find().count()).to.equal(1); - expect(product.hashtags).to.not.contain(tag._id); - Meteor.call("products/updateProductTags", product._id, tag.name, tag._id); - expect(Tags.find().count()).to.equal(1); - product = Products.findOne(product._id); - expect(product.hashtags).to.not.contain(tag._id); - }); - - it("should add existing tag to product revision when passed existing tag and tag._id by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const tag = Factory.create("tag"); - expect(Tags.find().count()).to.equal(1); - expect(product.hashtags).to.not.contain(tag._id); - Meteor.call("products/updateProductTags", product._id, tag.name, tag._id); - expect(Tags.find().count()).to.equal(1); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.hashtags).to.contain(tag._id); - }); - - it("should publish existing tag for product when passed existing tag and tag._id by admin", function () { + it("should add existing tag when passed existing tag and tag._id by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); const tag = Factory.create("tag"); @@ -596,7 +429,6 @@ describe("core product methods", function () { expect(product.hashtags).to.not.contain(tag._id); Meteor.call("products/updateProductTags", product._id, tag.name, tag._id); expect(Tags.find().count()).to.equal(1); - Meteor.call("revisions/publish", product._id); product = Products.findOne(product._id); expect(product.hashtags).to.contain(tag._id); }); @@ -618,70 +450,21 @@ describe("core product methods", function () { expect(removeTagsSpy).to.not.have.been.called; }); - it("should not remove product tag by admin", function () { + it("should remove product tag by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); const tag = Factory.create("tag"); - // Update product tags and publish so the original prodcut will have the tags + // Update product tags and publish so the original product will have the tags Meteor.call("products/updateProductTags", product._id, tag.name, tag._id); - Meteor.call("revisions/publish", product._id); product = Products.findOne(product._id); expect(product.hashtags).to.contain(tag._id); expect(Tags.find().count()).to.equal(1); - // Remove the tag from the published prouct and ensure it didn't succeed. - // Revision control should stop the published product from being changed. + // Remove the tag from the published product and ensure it succeed. Meteor.call("products/removeProductTag", product._id, tag._id); product = Products.findOne(product._id); - expect(product.hashtags).to.contain(tag._id); - expect(Tags.find().count()).to.equal(1); - }); - - it("should remove tag in product revision by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - const tag = Factory.create("tag"); - - // Update product tags and publish so the original prodcut will have the tags - Meteor.call("products/updateProductTags", product._id, tag.name, tag._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.hashtags).to.contain(tag._id); - expect(Tags.find().count()).to.equal(1); - - // Remove the tag from the published prouct and ensure it changed in the revision. - Meteor.call("products/removeProductTag", product._id, tag._id); - const productRevision = Revisions.findOne({ - "documentId": product._id, - "workflow.status": { $nin: ["revision/published"] } - }); - expect(productRevision.documentData.hashtags).to.not.contain(tag._id); - expect(Tags.find().count()).to.equal(1); - }); - - it("should publish remove product tag by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - - // Update product tags and publish so the original prodcut will have the tags - const tag = Factory.create("tag"); - Meteor.call("products/updateProductTags", product._id, tag.name, tag._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.hashtags).to.contain(tag._id); - expect(Tags.find().count()).to.equal(1); - - // Remove the tag from the published prouct which should create a revision. - // Then publish that revision and ensure that it published product changed. - Meteor.call("products/removeProductTag", product._id, tag._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - const tags = Tags.find(); expect(product.hashtags).to.not.contain(tag._id); - expect(tags.count()).to.equal(1); - // Tag should not be deleted, it should just be removed from the product - expect(tags.fetch()[0].isDeleted).to.equal(false); }); }); @@ -696,70 +479,13 @@ describe("core product methods", function () { expect(productUpdateSpy).to.not.have.been.called; }); - it("should not set handle for product by admin", function () { + it("should set handle for product by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); - const productHandle = product.handle; Meteor.call("products/updateProductField", product._id, "title", "new product name"); Meteor.call("products/setHandle", product._id); product = Products.findOne(product._id); - expect(product.handle).to.equal(productHandle); - }); - - it("should set handle correctly on product revision", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "new second product name"); - Meteor.call("products/setHandle", product._id); - const revision = Revisions.findOne({ documentId: product._id }); - expect(revision.documentData.handle).to.not.equal("new-second-product-name"); - }); - - it("should not set handle on published product", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "new second product name"); - Meteor.call("products/setHandle", product._id); - product = Products.findOne(product._id); - expect(product.handle).to.not.equal("new-second-product-name"); - }); - - it("should publish handle correctly", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "new second product name"); - Meteor.call("products/setHandle", product._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.handle).to.not.equal("new-second-product-name"); - }); - - it("unpublished products with the same title should not receive correct handle", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "new second product name"); - Meteor.call("products/setHandle", product._id); - product = Products.findOne(product._id); - expect(product.handle).to.not.equal("new-second-product-name-copy"); - }); - - it("products with the same title should receive correct handle on revision", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "new second product name"); - Meteor.call("products/setHandle", product._id); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.handle).to.not.equal("new-second-product-name-copy"); - }); - - it("products with the same title should receive correct handle when published", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/updateProductField", product._id, "title", "new second product name"); - Meteor.call("products/setHandle", product._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.handle).to.not.equal("new-second-product-name-copy"); + expect(product.handle).to.equal("new-product-name"); }); }); @@ -779,31 +505,12 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - it("should not set handle tag for product by admin", function () { + it("should set handle tag for product by admin", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); const tag = Factory.create("tag"); Meteor.call("products/setHandleTag", product._id, tag._id); product = Products.findOne(product._id); - expect(product.handle).to.not.equal(tag.slug); - }); - - it("should set handle tag for product revision by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - const tag = Factory.create("tag"); - Meteor.call("products/setHandleTag", product._id, tag._id); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.handle).to.equal(tag.slug); - }); - - it("should publish set handle tag for product by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - const tag = Factory.create("tag"); - Meteor.call("products/setHandleTag", product._id, tag._id); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); expect(product.handle).to.equal(tag.slug); }); }); @@ -831,10 +538,7 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - // this test appears to be the inverse of above. where the test above - // rejects non-admins, this one does not. I _think_ this check is covered - // by the tests below - it("should not update product position by admin", function () { + it("should update product position by admin", function (done) { sandbox.stub(Reaction, "hasPermission", () => true); const position = { position: 0, @@ -843,41 +547,12 @@ describe("core product methods", function () { }; expect(() => Meteor.call( "products/updateProductPosition", - product._id, position, tag._id + product._id, position, tag.slug )).to.not.throw(Meteor.Error, /Access Denied/); const updatedProduct = Products.findOne(product._id); - expect(updatedProduct.positions).to.be.undefined; - }); + expect(updatedProduct.positions).to.be.defined; - it("should update product revision position by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const position = { - position: 0, - weight: 0, - updatedAt: new Date() - }; - expect(() => Meteor.call( - "products/updateProductPosition", - product._id, position, tag._id - )).to.not.throw(Meteor.Error, /Access Denied/); - const updatedProductRevision = Revisions.findOne({ documentId: product._id }); - expect(updatedProductRevision.documentData.positions[tag._id].position).to.equal(0); - }); - - it("should publish product position by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const position = { - position: 0, - weight: 0, - updatedAt: new Date() - }; - expect(() => Meteor.call( - "products/updateProductPosition", - product._id, position, tag._id - )).to.not.throw(Meteor.Error, /Access Denied/); - Meteor.call("revisions/publish", product._id); - const updatedProduct = Products.findOne(product._id); - expect(updatedProduct.positions[tag._id].position).to.equal(0); + return done(); }); }); @@ -892,7 +567,7 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - it("should not update variants' position", function () { + it("should update variants' position", function () { sandbox.stub(Reaction, "hasPermission", () => true); const { variant: variant1 } = addProductSingleVariant(); const { variant: variant2 } = addProductSingleVariant(); @@ -908,54 +583,9 @@ describe("core product methods", function () { const modifiedVariant1 = Products.findOne(variant1._id); const modifiedVariant2 = Products.findOne(variant2._id); const modifiedVariant3 = Products.findOne(variant3._id); - expect(modifiedVariant1.index).to.be.undefined; - expect(modifiedVariant2.index).to.be.undefined; - expect(modifiedVariant3.index).to.be.undefined; - }); - - it("should update variants' revision position", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const { variant: variant1 } = addProductSingleVariant(); - const { variant: variant2 } = addProductSingleVariant(); - const { variant: variant3 } = addProductSingleVariant(); - - expect(variant1.index).to.be.undefined; - expect(variant2.index).to.be.undefined; - expect(variant3.index).to.be.undefined; - - Meteor.call("products/updateVariantsPosition", [ - variant2._id, variant3._id, variant1._id - ]); - const modifiedVariantRevision1 = Revisions.findOne({ documentId: variant1._id }); - const modifiedVariantRevision2 = Revisions.findOne({ documentId: variant2._id }); - const modifiedVariantRevision3 = Revisions.findOne({ documentId: variant3._id }); - expect(modifiedVariantRevision1.documentData.index).to.equal(2); - expect(modifiedVariantRevision2.documentData.index).to.equal(0); - expect(modifiedVariantRevision3.documentData.index).to.equal(1); - }); - - it("should publish variants' revision position", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const { variant: variant1 } = addProductSingleVariant(); - const { variant: variant2 } = addProductSingleVariant(); - const { variant: variant3 } = addProductSingleVariant(); - - expect(variant1.index).to.be.undefined; - expect(variant2.index).to.be.undefined; - expect(variant3.index).to.be.undefined; - - Meteor.call("products/updateVariantsPosition", [ - variant2._id, variant3._id, variant1._id - ]); - Meteor.call("revisions/publish", [ - variant1._id, variant2._id, variant3._id - ]); - const modifiedVariant1 = Products.findOne(variant1._id); - const modifiedVariant2 = Products.findOne(variant2._id); - const modifiedVariant3 = Products.findOne(variant3._id); - expect(modifiedVariant1.index).to.equal(2); - expect(modifiedVariant2.index).to.equal(0); - expect(modifiedVariant3.index).to.equal(1); + expect(modifiedVariant1.index).to.be.equal(2); + expect(modifiedVariant2.index).to.be.equal(0); + expect(modifiedVariant3.index).to.be.equal(1); }); }); @@ -971,7 +601,7 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - it("should not add meta fields by admin", function () { + it("should add meta fields by admin", function (done) { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); Meteor.call("products/updateMetaFields", product._id, { @@ -979,32 +609,9 @@ describe("core product methods", function () { value: "Spandex" }); product = Products.findOne(product._id); - expect(product.metafields.length).to.be.equal(0); - }); - - it("should add meta fields to product revision by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - Meteor.call("products/updateMetaFields", product._id, { - key: "Material", - value: "Spandex" - }); - const productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.metafields[0].key).to.equal("Material"); - expect(productRevision.documentData.metafields[0].value).to.equal("Spandex"); - }); + expect(product.metafields.length).to.be.equal(1); - it("should publish add meta fields by admin", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - Meteor.call("products/updateMetaFields", product._id, { - key: "Material", - value: "Spandex" - }); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.metafields[0].key).to.equal("Material"); - expect(product.metafields[0].value).to.equal("Spandex"); + return done(); }); }); @@ -1017,60 +624,15 @@ describe("core product methods", function () { expect(updateProductSpy).to.not.have.been.called; }); - it("should let admin publish product changes", function () { + it("should let admin toggle product visibility", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); const { isVisible } = product; expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Access Denied/); - Meteor.call("revisions/publish", product._id); product = Products.findOne(product._id); - // We switch the visible state in `products/publishProdct` for revisions expect(product.isVisible).to.equal(!isVisible); }); - it("should not let admin toggle product visibility", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - const { isVisible } = product; - expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Access Denied/); - product = Products.findOne(product._id); - expect(product.isVisible).to.equal(isVisible); - expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Bad Request/); - product = Products.findOne(product._id); - expect(product.isVisible).to.equal(isVisible); - }); - - it("should let admin toggle product revision visibility", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - const product = addProduct(); - let productRevision = Revisions.findOne({ documentId: product._id }); - const { isVisible } = productRevision.documentData; - expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Access Denied/); - productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.isVisible).to.equal(!isVisible); - expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Bad Request/); - productRevision = Revisions.findOne({ documentId: product._id }); - expect(productRevision.documentData.isVisible).to.equal(!isVisible); - }); - - it("should publish admin toggle product visibility", function () { - sandbox.stub(Reaction, "hasPermission", () => true); - let product = addProduct(); - const { isVisible } = product; // false - - // Toggle visible - expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Access Denied/); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.isVisible).to.equal(!isVisible); - - // Toggle not visible - expect(() => Meteor.call("products/publishProduct", product._id)).to.not.throw(Meteor.Error, /Bad Request/); - Meteor.call("revisions/publish", product._id); - product = Products.findOne(product._id); - expect(product.isVisible).to.equal(isVisible); - }); - it("should not publish product when missing title", function () { sandbox.stub(Reaction, "hasPermission", () => true); let product = addProduct(); diff --git a/imports/plugins/core/catalog/server/methods/catalog.js b/imports/plugins/core/catalog/server/methods/catalog.js index 21b7bd930..0b59d19f1 100644 --- a/imports/plugins/core/catalog/server/methods/catalog.js +++ b/imports/plugins/core/catalog/server/methods/catalog.js @@ -5,11 +5,12 @@ import { EJSON } from "meteor/ejson"; import { Meteor } from "meteor/meteor"; import { ReactionProduct } from "/lib/api"; import { Hooks, Logger, Reaction } from "/server/api"; -import { MediaRecords, Products, Revisions, Tags } from "/lib/collections"; +import { MediaRecords, Products, Tags } from "/lib/collections"; import { Media } from "/imports/plugins/core/files/server"; import rawCollections from "/imports/collections/rawCollections"; -import getProductPriceRange from "/imports/plugins/core/revisions/server/no-meteor/utils/getProductPriceRange"; -import getVariants from "/imports/plugins/core/revisions/server/no-meteor/utils/getVariants"; +import getProductPriceRange from "../no-meteor/utils/getProductPriceRange"; +import getVariants from "../no-meteor/utils/getVariants"; +import hasChildVariant from "../no-meteor/utils/hasChildVariant"; import isSoldOut from "../no-meteor/utils/isSoldOut"; import isLowQuantity from "../no-meteor/utils/isLowQuantity"; import isBackorder from "../no-meteor/utils/isBackorder"; @@ -188,7 +189,7 @@ function copyMedia(newId, variantOldId, variantNewId) { "metadata.variantId": variantOldId }) .then((fileRecords) => { - // Copy File and insert directly, bypassing revision control + // Copy File and insert const promises = fileRecords.map((fileRecord) => ( fileRecord.fullClone({ productId: newId, @@ -256,7 +257,6 @@ function denormalize(id, field) { } } - // TODO: Determine if product revision needs to be updated as well. Products.update( id, { @@ -315,10 +315,20 @@ function flushQuantity(id) { * @return {Object} product - new product */ function createProduct(props = null) { + const finalProps = props || {}; + if (finalProps.type !== "variant" && !finalProps.handle) { + if (typeof finalProps.title === "string" && finalProps.title.length) { + finalProps.handle = Reaction.getSlug(finalProps.title); + } else { + finalProps.handle = Random.id(); + } + } + const _id = Products.insert( { + shopId: Reaction.getShopId(), type: "simple", - ...props + ...finalProps }, { validate: false @@ -335,9 +345,7 @@ function createProduct(props = null) { /** * @function * @name updateCatalogProduct - * @summary Updates a product's revision and conditionally updates - * the underlying product. - * + * @summary Updates a product document. * @param {String} userId - currently logged in user * @param {Object} selector - selector for product to update * @param {Object} modifier - Object describing what parts of the document to update. @@ -347,23 +355,17 @@ function createProduct(props = null) { function updateCatalogProduct(userId, selector, modifier, validation) { const product = Products.findOne(selector); - const shouldUpdateProduct = Hooks.Events.run("beforeUpdateCatalogProduct", product, { + Hooks.Events.run("beforeUpdateCatalogProduct", product, { userId, modifier, validation }); - if (shouldUpdateProduct) { - const result = Products.update(selector, modifier, validation); - - Hooks.Events.run("afterUpdateCatalogProduct", product, { modifier }); + const result = Products.update(selector, modifier, validation); - return result; - } - - Logger.debug(`beforeUpdateCatalogProduct hook returned falsy, not updating catalog product`); + Hooks.Events.run("afterUpdateCatalogProduct", product, { modifier }); - return false; + return result; } Meteor.methods({ @@ -393,8 +395,7 @@ Meteor.methods({ } // Verify that this variant and any ancestors are not deleted. - // Child variants cannot be added if a parent product or product revision - // is marked as `{ isDeleted: true }` + // Child variants cannot be added if a parent product is marked as `{ isDeleted: true }` if (ReactionProduct.isAncestorDeleted(variant, true)) { throw new Meteor.Error("server-error", "Unable to create product variant"); } @@ -469,7 +470,6 @@ Meteor.methods({ let newId; try { - Hooks.Events.run("beforeInsertCatalogProductInsertRevision", clone); newId = Products.insert(clone, { validate: false }); const newProduct = Products.findOne(newId); Hooks.Events.run("afterInsertCatalogProduct", newProduct); @@ -512,8 +512,7 @@ Meteor.methods({ const { ancestors } = product; // Verify that the parent variant and any ancestors are not deleted. - // Child variants cannot be added if a parent product or product revision - // is marked as `{ isDeleted: true }` + // Child variants cannot be added if a parent product is marked as `{ isDeleted: true }` if (ReactionProduct.isAncestorDeleted(product, true)) { throw new Meteor.Error("server-error", "Unable to create product variant"); } @@ -522,6 +521,7 @@ Meteor.methods({ const assembledVariant = Object.assign(newVariant || {}, { _id: newVariantId, ancestors, + shopId: product.shopId, type: "variant" }); @@ -540,11 +540,9 @@ Meteor.methods({ } Hooks.Events.run("beforeInsertCatalogProduct", assembledVariant); - const _id = Products.insert(assembledVariant); + Products.insert(assembledVariant); Hooks.Events.run("afterInsertCatalogProduct", assembledVariant); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", Products.findOne({ _id })); - Logger.debug(`products/createVariant: created variant: ${newVariantId} for ${parentId}`); return newVariantId; @@ -646,9 +644,17 @@ Meteor.methods({ // out if nothing to delete if (!Array.isArray(toDelete) || toDelete.length === 0) return false; - // Flag the variant and all its children as deleted in Revisions collection. + // Flag the variant and all its children as deleted. toDelete.forEach((product) => { Hooks.Events.run("beforeRemoveCatalogProduct", product, { userId: this.userId }); + Products.update({ + _id: product._id, + type: product.type + }, { + $set: { + isDeleted: true + } + }); Hooks.Events.run("afterRemoveCatalogProduct", this.userId, product); }); @@ -757,7 +763,6 @@ Meteor.methods({ newProduct.title = createTitle(newProduct.title, newProduct._id); newProduct.handle = createHandle(Reaction.getSlug(newProduct.title), newProduct._id); } - Hooks.Events.run("beforeInsertCatalogProductInsertRevision", newProduct); result = Products.insert(newProduct, { validate: false }); Hooks.Events.run("afterInsertCatalogProduct", newProduct); results.push(result); @@ -786,7 +791,6 @@ Meteor.methods({ delete newVariant.createdAt; delete newVariant.publishedAt; // TODO can variant have this param? - Hooks.Events.run("beforeInsertCatalogProductInsertRevision", newVariant); result = Products.insert(newVariant, { validate: false }); Hooks.Events.run("afterInsertCatalogProduct", newVariant); copyMedia(productNewId, variant._id, variantNewId); @@ -819,27 +823,20 @@ Meteor.methods({ throw new Meteor.Error("invalid-parameter", "Product should have a valid shopId"); } - // Create product revision - Hooks.Events.run("beforeInsertCatalogProductInsertRevision", product); - return Products.insert(product); } + // Create a product const newSimpleProduct = createProduct(); - // Create simple product revision - Hooks.Events.run("afterInsertCatalogProductInsertRevision", newSimpleProduct); - - const newVariant = createProduct({ + // Create a product variant + createProduct({ ancestors: [newSimpleProduct._id], price: 0.0, title: "", type: "variant" // needed for multi-schema }); - // Create variant revision - Hooks.Events.run("afterInsertCatalogProductInsertRevision", newVariant); - return newSimpleProduct._id; }, @@ -899,18 +896,25 @@ Meteor.methods({ return ids; }); - // Flag the product and all its variants as deleted in the Revisions collection. + // Flag the product and all of it's variants as deleted. productsWithVariants.forEach((toArchiveProduct) => { Hooks.Events.run("beforeRemoveCatalogProduct", toArchiveProduct, { userId: this.userId }); - + Products.update({ + _id: toArchiveProduct._id, + type: toArchiveProduct.type + }, { + $set: { + isDeleted: true + } + }); Hooks.Events.run("afterRemoveCatalogProduct", this.userId, toArchiveProduct); }); - const numFlaggedAsDeleted = Revisions.find({ - "documentId": { + const numFlaggedAsDeleted = Products.find({ + _id: { $in: ids }, - "documentData.isDeleted": true + isDeleted: true }).count(); if (numFlaggedAsDeleted > 0) { @@ -969,6 +973,12 @@ Meteor.methods({ throw new Meteor.Error("access-denied", "Access Denied"); } + if (field === "inventoryQuantity" && value === "") { + if (!Promise.await(hasChildVariant(_id, rawCollections))) { + throw new Meteor.Error("invalid", "Inventory Quantity is required when no child variants"); + } + } + const { type } = doc; let update; // handle booleans with correct typing @@ -979,7 +989,7 @@ Meteor.methods({ update = { // TODO: write function to ensure new handle is unique. // Should be a call similar to the line below. - [field]: createHandle(value, _id) // handle should be unique + [field]: createHandle(Reaction.getSlug(value), _id) // handle should be unique }; } else if (field === "title" && doc.handle === doc._id) { // update handle once title is set @@ -995,7 +1005,6 @@ Meteor.methods({ // we need to use sync mode here, to return correct error and result to UI let result; - try { result = updateCatalogProduct( this.userId, @@ -1014,7 +1023,6 @@ Meteor.methods({ } // If we get a result from the product update, - // meaning the update went past revision control, // denormalize and attach results to top-level product if (result === 1) { if (type === "variant" && toDenormalize.indexOf(field) >= 0) { diff --git a/imports/plugins/core/catalog/server/no-meteor/queries/tag.js b/imports/plugins/core/catalog/server/no-meteor/queries/tag.js new file mode 100644 index 000000000..832d6e667 --- /dev/null +++ b/imports/plugins/core/catalog/server/no-meteor/queries/tag.js @@ -0,0 +1,22 @@ +/** + * @name tag + * @method + * @memberof Catalog/NoMeteorQueries + * @summary query the Tags collection and return a tag by tag ID or slug + * @param {Object} context - an object containing the per-request state + * @param {String} slugOrId - ID or slug of tag to query + * @return {Object} - A Tag document if one was found + */ +export default async function tag(context, slugOrId) { + const { collections } = context; + + const { Tags } = collections; + const query = { + $or: [ + { _id: slugOrId }, + { slug: slugOrId } + ] + }; + + return Tags.findOne(query); +} diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getProductPriceRange.js b/imports/plugins/core/catalog/server/no-meteor/utils/getProductPriceRange.js similarity index 91% rename from imports/plugins/core/revisions/server/no-meteor/utils/getProductPriceRange.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getProductPriceRange.js index 7107ce9a4..b92229840 100644 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getProductPriceRange.js +++ b/imports/plugins/core/catalog/server/no-meteor/utils/getProductPriceRange.js @@ -1,4 +1,4 @@ -import getPriceRange from "/imports/plugins/core/catalog/server/no-meteor/utils/getPriceRange"; +import getPriceRange from "./getPriceRange"; import getVariants from "./getVariants"; import getVariantPriceRange from "./getVariantPriceRange"; diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getProductPriceRange.test.js b/imports/plugins/core/catalog/server/no-meteor/utils/getProductPriceRange.test.js similarity index 100% rename from imports/plugins/core/revisions/server/no-meteor/utils/getProductPriceRange.test.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getProductPriceRange.test.js diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getVariantPriceRange.js b/imports/plugins/core/catalog/server/no-meteor/utils/getVariantPriceRange.js similarity index 83% rename from imports/plugins/core/revisions/server/no-meteor/utils/getVariantPriceRange.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getVariantPriceRange.js index 843ad196f..8a1411993 100644 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getVariantPriceRange.js +++ b/imports/plugins/core/catalog/server/no-meteor/utils/getVariantPriceRange.js @@ -1,5 +1,4 @@ -import getPriceRange from "/imports/plugins/core/catalog/server/no-meteor/utils/getPriceRange"; -import getProduct from "./getProduct"; +import getPriceRange from "./getPriceRange"; import getVariants from "./getVariants"; /** @@ -12,11 +11,12 @@ import getVariants from "./getVariants"; * @return {Promise} Product PriceRange object */ export default async function getVariantPriceRange(variantId, collections) { + const { Products } = collections; const options = await getVariants(variantId, collections); const visibleOptions = options.filter((option) => option.isVisible && !option.isDeleted); if (visibleOptions.length === 0) { - const topVariant = await getProduct(variantId, collections); + const topVariant = await Products.findOne({ _id: variantId }); // topVariant could be undefined when we removing last top variant return topVariant && getPriceRange([topVariant.price]); } diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getVariantPriceRange.test.js b/imports/plugins/core/catalog/server/no-meteor/utils/getVariantPriceRange.test.js similarity index 93% rename from imports/plugins/core/revisions/server/no-meteor/utils/getVariantPriceRange.test.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getVariantPriceRange.test.js index 10fb69d61..7a92df815 100644 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getVariantPriceRange.test.js +++ b/imports/plugins/core/catalog/server/no-meteor/utils/getVariantPriceRange.test.js @@ -1,10 +1,8 @@ import mockContext from "/imports/test-utils/helpers/mockContext"; -import { rewire as rewire$getProduct, restore as restore$getProduct } from "./getProduct"; import { rewire as rewire$getVariants, restore as restore$getVariants } from "./getVariants"; import getVariantPriceRange from "./getVariantPriceRange"; const mockCollections = { ...mockContext.collections }; -const mockGetProduct = jest.fn().mockName("getProducts"); const mockGetVariants = jest.fn().mockName("getVariants"); const internalShopId = "123"; @@ -96,19 +94,17 @@ const mockVariants = [ ]; beforeAll(() => { - rewire$getProduct(mockGetProduct); rewire$getVariants(mockGetVariants); }); afterAll(() => { - restore$getProduct(); restore$getVariants(); }); // expect topVariant price if no children test("expect topVariants price string if no child variants", async () => { mockGetVariants.mockReturnValueOnce(Promise.resolve([{ isDeleted: true }])); - mockGetProduct.mockReturnValueOnce(Promise.resolve(mockVariants[0])); + mockCollections.Products.findOne.mockReturnValueOnce(Promise.resolve(mockVariants[0])); const spec = await getVariantPriceRange(internalVariantIds[0], mockCollections); const success = { range: "2.99", diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getVariantQuantity.js b/imports/plugins/core/catalog/server/no-meteor/utils/getVariantQuantity.js similarity index 100% rename from imports/plugins/core/revisions/server/no-meteor/utils/getVariantQuantity.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getVariantQuantity.js diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getVariantQuantity.test.js b/imports/plugins/core/catalog/server/no-meteor/utils/getVariantQuantity.test.js similarity index 100% rename from imports/plugins/core/revisions/server/no-meteor/utils/getVariantQuantity.test.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getVariantQuantity.test.js diff --git a/imports/plugins/core/catalog/server/no-meteor/utils/getVariants.js b/imports/plugins/core/catalog/server/no-meteor/utils/getVariants.js new file mode 100644 index 000000000..abcca793f --- /dev/null +++ b/imports/plugins/core/catalog/server/no-meteor/utils/getVariants.js @@ -0,0 +1,19 @@ +/** + * + * @method getVariants + * @summary Get all of a Product's Variants or only a Product's top level Variants. + * @param {string} productOrVariantId - A Product or top level Product Variant ID. + * @param {Object} collections - Raw mongo collections. + * @param {boolean} topOnly - True to return only a products top level variants. + * @return {Promise} Array of Product Variant objects. + */ +export default async function getVariants(productOrVariantId, collections, topOnly) { + const { Products } = collections; + + return Products.find({ + ancestors: topOnly ? [productOrVariantId] : productOrVariantId, + type: "variant", + isVisible: true, + isDeleted: { $ne: true } + }).toArray(); +} diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getVariants.test.js b/imports/plugins/core/catalog/server/no-meteor/utils/getVariants.test.js similarity index 70% rename from imports/plugins/core/revisions/server/no-meteor/utils/getVariants.test.js rename to imports/plugins/core/catalog/server/no-meteor/utils/getVariants.test.js index 852638031..0eec0acc5 100644 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getVariants.test.js +++ b/imports/plugins/core/catalog/server/no-meteor/utils/getVariants.test.js @@ -92,37 +92,11 @@ const mockVariants = [ } ]; -const mockRevision = { - _id: "333", - documentId: internalVariantIds[0], - documentData: { - _id: internalVariantIds[0], - isRevision: internalVariantIds[0], - isVisible: true - }, - workflow: { - status: "revision/published" - }, - documentType: "product", - createdAt, - updatedAt, - diff: [] -}; - // pass in product id return all variants -test("expect an array of product top level variants from revisions", async () => { +test("expect an array of product top level variants", async () => { mockCollections.Products.toArray.mockReturnValueOnce(Promise.resolve([mockVariants[0]])); - mockCollections.Revisions.findOne.mockReturnValueOnce(Promise.resolve(mockRevision)); const spec = await getVariants(internalProductId, mockCollections, true); - const success = [mockRevision.documentData]; + const success = [mockVariants[0]]; expect(spec).toEqual(success); }); -// pass a variant id return all child options -test("expect an array of product variant options, one from revisions the other from products", async () => { - mockCollections.Products.toArray.mockReturnValueOnce(Promise.resolve(mockVariants)); - mockCollections.Revisions.findOne.mockReturnValueOnce(Promise.resolve(mockRevision)); - const spec = await getVariants(internalProductId, mockCollections); - const success = [mockRevision.documentData, mockVariants[1]]; - expect(spec).toEqual(success); -}); diff --git a/imports/plugins/core/catalog/server/no-meteor/utils/hasChildVariant.js b/imports/plugins/core/catalog/server/no-meteor/utils/hasChildVariant.js new file mode 100644 index 000000000..1c18f1626 --- /dev/null +++ b/imports/plugins/core/catalog/server/no-meteor/utils/hasChildVariant.js @@ -0,0 +1,18 @@ +/** + * + * @method hasChildVariant + * @summary Return true if a Product or Variant has at least 1 child Product that is visible and not deleted. + * @param {string} productOrVariantId - A Product or Product Variant ID. + * @param {Object} collections - Raw mongo collections. + * @return {Promise} True if Product has a child. + */ +export default async function hasChildVariant(productOrVariantId, collections) { + const { Products } = collections; + const child = await Products.findOne({ + ancestors: productOrVariantId, + type: "variant", + isVisible: true, + isDeleted: { $ne: true } + }); + return !!child; +} diff --git a/imports/plugins/core/catalog/server/no-meteor/utils/hasChildVariant.test.js b/imports/plugins/core/catalog/server/no-meteor/utils/hasChildVariant.test.js new file mode 100644 index 000000000..c82b311bb --- /dev/null +++ b/imports/plugins/core/catalog/server/no-meteor/utils/hasChildVariant.test.js @@ -0,0 +1,105 @@ +import mockContext from "/imports/test-utils/helpers/mockContext"; +import hasChildVariant from "./hasChildVariant"; + +const mockCollections = { ...mockContext.collections }; + +const internalShopId = "123"; +const internalCatalogProductId = "999"; +const internalProductId = "999"; +const internalVariantIds = ["875", "874"]; + +const createdAt = new Date("2018-04-16T15:34:28.043Z"); +const updatedAt = new Date("2018-04-17T15:34:28.043Z"); + +const mockVariants = [ + { + _id: internalVariantIds[0], + ancestors: [internalCatalogProductId], + barcode: "barcode", + createdAt, + height: 0, + index: 0, + inventoryManagement: true, + inventoryPolicy: false, + isLowQuantity: true, + isSoldOut: false, + isDeleted: false, + isVisible: true, + length: 0, + lowInventoryWarningThreshold: 0, + metafields: [ + { + value: "value", + namespace: "namespace", + description: "description", + valueType: "valueType", + scope: "scope", + key: "key" + } + ], + minOrderQuantity: 0, + optionTitle: "Untitled Option", + originCountry: "US", + price: 0, + shopId: internalShopId, + sku: "sku", + taxable: true, + taxCode: "0000", + taxDescription: "taxDescription", + title: "Small Concrete Pizza", + updatedAt, + variantId: internalVariantIds[0], + weight: 0, + width: 0 + }, + { + _id: internalVariantIds[1], + ancestors: [internalCatalogProductId, internalVariantIds[0]], + barcode: "barcode", + height: 2, + index: 0, + inventoryManagement: true, + inventoryPolicy: true, + isLowQuantity: true, + isSoldOut: false, + isDeleted: false, + isVisible: true, + length: 2, + lowInventoryWarningThreshold: 0, + metafields: [ + { + value: "value", + namespace: "namespace", + description: "description", + valueType: "valueType", + scope: "scope", + key: "key" + } + ], + minOrderQuantity: 0, + optionTitle: "Awesome Soft Bike", + originCountry: "US", + price: 992.0, + shopId: internalShopId, + sku: "sku", + taxable: true, + taxCode: "0000", + taxDescription: "taxDescription", + title: "One pound bag", + variantId: internalVariantIds[1], + weight: 2, + width: 2 + } +]; + +test("expect true when product has a child", async () => { + mockCollections.Products.findOne.mockReturnValueOnce(Promise.resolve(mockVariants[0])); + const spec = await hasChildVariant(internalProductId, mockCollections); + expect(spec).toBe(true); +}); + +test("expect false when product does not a child", async () => { + mockCollections.Products.findOne.mockReturnValueOnce(Promise.resolve(null)); + const spec = await hasChildVariant(internalVariantIds[1], mockCollections); + expect(spec).toBe(false); +}); diff --git a/imports/plugins/core/catalog/server/no-meteor/utils/isLowQuantity.js b/imports/plugins/core/catalog/server/no-meteor/utils/isLowQuantity.js index b682dbb36..49bdcdd5a 100644 --- a/imports/plugins/core/catalog/server/no-meteor/utils/isLowQuantity.js +++ b/imports/plugins/core/catalog/server/no-meteor/utils/isLowQuantity.js @@ -11,7 +11,7 @@ export default function isLowQuantity(variants) { const threshold = variants && variants.length && variants[0].lowInventoryWarningThreshold; const results = variants.map((variant) => { const quantity = getProductQuantity(variant, variants); - if (variant.inventoryManagement && variant.inventoryPolicy && quantity) { + if (variant.inventoryManagement && quantity) { return quantity <= threshold; } return false; diff --git a/imports/plugins/core/checkout/client/helpers/cart.js b/imports/plugins/core/checkout/client/helpers/cart.js index bd083de0d..02eff55f9 100644 --- a/imports/plugins/core/checkout/client/helpers/cart.js +++ b/imports/plugins/core/checkout/client/helpers/cart.js @@ -1,20 +1,14 @@ import { Cart } from "/lib/collections"; import { Template } from "meteor/templating"; -/* - * Template helpers for cart - * - */ - /** - * cart template helper - * @description - * methods to return cart calculated values - * cartCount, cartSubTotal, cartShipping, cartTaxes, cartTotal + * @method cart + * @summary methods to return cart calculated values + * cartCount, cartSubTotal, cartShipping, cartTaxes, `cartTotal` * are calculated by a transformation on the collection * and are available to use in template as cart.xxx - * in template: {{cart.getCount}} - * in code: Cart.findOne().getTotal() + * @example {{cart.getCount}} + * @memberof BlazeTemplateHelpers * @return {Object} returns inventory helpers */ Template.registerHelper("cart", () => { @@ -67,8 +61,10 @@ Template.registerHelper("cart", () => { }); /** - * cartPayerName + * @method cartPayerName + * @memberof BlazeTemplateHelpers * @summary gets current cart billing address / payment name + * @example {{>afFieldInput name="payerName" value=cartPayerName}} * @return {String} returns cart.billing[0].fullName */ Template.registerHelper("cartPayerName", () => { diff --git a/imports/plugins/core/dashboard/client/components/toolbar.js b/imports/plugins/core/dashboard/client/components/toolbar.js index b4a00fa65..efa3513e2 100644 --- a/imports/plugins/core/dashboard/client/components/toolbar.js +++ b/imports/plugins/core/dashboard/client/components/toolbar.js @@ -35,7 +35,8 @@ class PublishControls extends Component { } static defaultProps = { - showViewAsControls: true + showViewAsControls: true, + isEnabled: true } componentDidMount() { diff --git a/imports/plugins/core/dashboard/client/containers/toolbarContainer.js b/imports/plugins/core/dashboard/client/containers/toolbarContainer.js index 72d5b12b4..4e89ce0e2 100644 --- a/imports/plugins/core/dashboard/client/containers/toolbarContainer.js +++ b/imports/plugins/core/dashboard/client/containers/toolbarContainer.js @@ -5,7 +5,6 @@ import { composeWithTracker } from "@reactioncommerce/reaction-components"; import { Reaction, i18next } from "/client/api"; import { Tags, Shops } from "/lib/collections"; import { AdminContextProvider } from "/imports/plugins/core/ui/client/providers"; -import { isRevisionControlEnabled } from "/imports/plugins/core/revisions/lib/api"; const handleAddProduct = () => { Reaction.setUserPreferences("reaction-dashboard", "viewAs", "administrator"); @@ -81,7 +80,6 @@ function composer(props, onData) { packageButtons, dashboardHeaderTemplate: props.data.dashboardHeader, isPreview: Reaction.isPreview(), - isEnabled: isRevisionControlEnabled(), isActionViewAtRootView: Reaction.isActionViewAtRootView(), actionViewIsOpen: Reaction.isActionViewOpen(), hasCreateProductAccess: Reaction.hasPermission("createProduct", Meteor.userId(), Reaction.getShopId()), diff --git a/imports/plugins/core/discounts/lib/collections/schemas/config.js b/imports/plugins/core/discounts/lib/collections/schemas/config.js index adeb5c67c..d3b983c26 100644 --- a/imports/plugins/core/discounts/lib/collections/schemas/config.js +++ b/imports/plugins/core/discounts/lib/collections/schemas/config.js @@ -1,5 +1,5 @@ import { registerSchema } from "@reactioncommerce/schemas"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { Discounts } from "./discounts"; /** diff --git a/imports/plugins/core/discounts/lib/collections/schemas/discounts.js b/imports/plugins/core/discounts/lib/collections/schemas/discounts.js index 07f5fef89..e65446bf5 100644 --- a/imports/plugins/core/discounts/lib/collections/schemas/discounts.js +++ b/imports/plugins/core/discounts/lib/collections/schemas/discounts.js @@ -1,7 +1,6 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { shopIdAutoValue } from "/lib/collections/schemas/helpers"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -38,7 +37,6 @@ registerSchema("Transactions", Transactions); export const Discounts = new SimpleSchema({ "shopId": { type: String, - autoValue: shopIdAutoValue, index: 1, label: "Discounts shopId" }, diff --git a/imports/plugins/core/files/server/methods.js b/imports/plugins/core/files/server/methods.js index 52d54cb37..0dbd6b62c 100644 --- a/imports/plugins/core/files/server/methods.js +++ b/imports/plugins/core/files/server/methods.js @@ -1,9 +1,7 @@ import { Meteor } from "meteor/meteor"; import { check } from "meteor/check"; -import { Hooks, Reaction } from "/server/api"; -import { MediaRecords, Revisions } from "/lib/collections"; -import { Media } from "/imports/plugins/core/files/server"; -import { RevisionApi } from "/imports/plugins/core/revisions/lib/api"; +import { Reaction } from "/server/api"; +import { MediaRecords } from "/lib/collections"; /** * Media-related Meteor methods @@ -13,7 +11,7 @@ import { RevisionApi } from "/imports/plugins/core/revisions/lib/api"; /** * @method updateMediaMetadata * @memberof Media/Methods - * @summary updates media record in revision control. + * @summary Updates a media record. * @param {String} fileRecordId - _id of updated file record. * @param {Object} metadata - metadata from updated media file. * @return {Boolean} @@ -22,95 +20,35 @@ import { RevisionApi } from "/imports/plugins/core/revisions/lib/api"; async function updateMediaMetadata(fileRecordId, metadata) { check(fileRecordId, String); check(metadata, Object); - if (RevisionApi.isRevisionControlEnabled()) { - if (metadata.productId) { - const existingRevision = Revisions.findOne({ - "documentId": fileRecordId, - "workflow.status": { - $nin: [ - "revision/published" - ] - } - }); - if (existingRevision) { - const updatedMetadata = Object.assign({}, existingRevision.documentData, metadata); - // Special case where if we have both added and reordered images before publishing we don't want to overwrite - // the workflow status since it would be "unpublished" - if (existingRevision.documentData.workflow === "published" || existingRevision.changeType === "insert") { - updatedMetadata.workflow = "published"; - } - Revisions.update({ _id: existingRevision._id }, { - $set: { - documentData: updatedMetadata - } - }); - Hooks.Events.run("afterRevisionsUpdate", Meteor.userId(), { - ...existingRevision, - documentData: updatedMetadata - }); - } else { - Revisions.insert({ - documentId: fileRecordId, - documentData: metadata, - documentType: "image", - parentDocument: metadata.productId, - changeType: "update", - workflow: { - status: "revision/update" - } - }); - } - return false; + const result = MediaRecords.update({ + _id: fileRecordId + }, { + $set: { + metadata } - } - // for non-product images, just ignore and keep on moving - return true; + }); + + return result === 1; } /** * @name media/insert * @method * @memberof Media/Methods - * @summary insert a new media record and add it to revision control. + * @summary Insert a new media record. * @param {Object} fileRecord - document from file collection upload. * @return {String} - _id of the new inserted media record. */ export async function insertMedia(fileRecord) { check(fileRecord, Object); - const mediaRecordId = await MediaRecords.insert(fileRecord); - - if (RevisionApi.isRevisionControlEnabled() && fileRecord.metadata.workflow !== "published") { - if (fileRecord.metadata.productId) { - const revisionMetadata = Object.assign({}, fileRecord.metadata); - revisionMetadata.workflow = "published"; - Revisions.insert({ - documentId: mediaRecordId, - documentData: revisionMetadata, - documentType: "image", - parentDocument: fileRecord.metadata.productId, - changeType: "insert", - workflow: { - status: "revision/update" - } - }); - MediaRecords.update({ - _id: mediaRecordId - }, { - $set: { - "metadata.workflow": "unpublished" - } - }); - } else { - MediaRecords.update({ - _id: mediaRecordId - }, { - $set: { - "metadata.workflow": "published" - } - }); + const mediaRecordId = await MediaRecords.insert({ + ...fileRecord, + metadata: { + ...fileRecord.metadata, + workflow: "published" } - } + }); return mediaRecordId; } @@ -119,33 +57,22 @@ export async function insertMedia(fileRecord) { * @name media/remove * @method * @memberof Media/Methods - * @summary removes media file and updates record in revision control. + * @summary Unpublish a media record by updating it's workflow * @param {String} fileRecordId - _id of file record to be deleted. * @return {Boolean} */ export async function removeMedia(fileRecordId) { check(fileRecordId, String); - const { metadata } = MediaRecords.findOne({ _id: fileRecordId }); - if (RevisionApi.isRevisionControlEnabled() && metadata.workflow && metadata.workflow === "unpublished") { - Revisions.remove({ - documentId: fileRecordId - }); - Media.remove(fileRecordId); - return true; - } else if (metadata.productId) { - Revisions.insert({ - documentId: fileRecordId, - documentData: metadata, - documentType: "image", - parentDocument: metadata.productId, - changeType: "remove", - workflow: { - status: "revision/update" - } - }); - return true; - } - return false; + + const result = MediaRecords.update({ + _id: fileRecordId + }, { + $set: { + "metadata.workflow": "archived" + } + }); + + return result === 1; } /** diff --git a/imports/plugins/core/graphql/server/queries.js b/imports/plugins/core/graphql/server/queries.js index b79a7dd6c..e66790d64 100644 --- a/imports/plugins/core/graphql/server/queries.js +++ b/imports/plugins/core/graphql/server/queries.js @@ -4,6 +4,7 @@ import { groupQuery, groupsQuery } from "/imports/plugins/core/accounts/server/m import { rolesQuery } from "/imports/plugins/core/accounts/server/methods/rolesQuery"; import catalogItems from "/imports/plugins/core/catalog/server/no-meteor/queries/catalogItems"; import catalogItemProduct from "/imports/plugins/core/catalog/server/no-meteor/queries/catalogItemProduct"; +import tag from "/imports/plugins/core/catalog/server/no-meteor/queries/tag"; import tags from "/imports/plugins/core/catalog/server/no-meteor/queries/tags"; import tagsByIds from "/imports/plugins/core/catalog/server/no-meteor/queries/tagsByIds"; import getShopIdByDomain from "/imports/plugins/core/accounts/server/no-meteor/getShopIdByDomain"; @@ -17,6 +18,7 @@ export default { roles: rolesQuery, shopAdministrators: shopAdministratorsQuery, shopById: (context, _id) => context.collections.Shops.findOne({ _id }), + tag, tags, tagsByIds, userAccount: userAccountQuery diff --git a/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.js b/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.js index 2044ab92c..059cc209a 100644 --- a/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.js +++ b/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.js @@ -1,7 +1,7 @@ import { GraphQLScalarType } from "graphql"; import { Kind } from "graphql/language"; -const MAX_LIMIT = 50; +const MAX_LIMIT = 200; /** * Adjusts value to be between 1 and MAX_LIMIT, inclusive diff --git a/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.test.js b/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.test.js index 70e6dc23d..c5d7acbaf 100644 --- a/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.test.js +++ b/imports/plugins/core/graphql/server/resolvers/scalar/ConnectionLimitInt.test.js @@ -11,22 +11,24 @@ describe("serialization", () => { expect(ConnectionLimitInt.serialize(null)).toBe(null); expect(ConnectionLimitInt.serialize(1)).toBe(1); expect(ConnectionLimitInt.serialize(100)).toBe(100); + expect(ConnectionLimitInt.serialize(200)).toBe(200); }); }); describe("value parsing", () => { - test("returns what is given if it's a number between 1 and 50, inclusive, or undefined", () => { + test("returns what is given if it's a number between 1 and 200, inclusive, or undefined", () => { expect(ConnectionLimitInt.parseValue(1)).toBe(1); expect(ConnectionLimitInt.parseValue(2)).toBe(2); expect(ConnectionLimitInt.parseValue(10)).toBe(10); expect(ConnectionLimitInt.parseValue(50)).toBe(50); + expect(ConnectionLimitInt.parseValue(200)).toBe(200); expect(ConnectionLimitInt.parseValue(undefined)).toBe(undefined); }); - test("returns 50 if over 50", () => { - expect(ConnectionLimitInt.parseValue(null)).toBe(50); - expect(ConnectionLimitInt.parseValue(51)).toBe(50); - expect(ConnectionLimitInt.parseValue(100)).toBe(50); + test("returns 200 if over 200", () => { + expect(ConnectionLimitInt.parseValue(null)).toBe(200); + expect(ConnectionLimitInt.parseValue(201)).toBe(200); + expect(ConnectionLimitInt.parseValue(500)).toBe(200); }); test("returns 1 if under 1", () => { @@ -42,16 +44,17 @@ describe("value parsing", () => { const getLiteralForInt = (value) => ({ kind: Kind.INT, value }); describe("literal parsing", () => { - test("returns what is given if it's a number between 1 and 50, inclusive", () => { + test("returns what is given if it's a number between 1 and 200, inclusive", () => { expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(1))).toBe(1); expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(2))).toBe(2); expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(10))).toBe(10); expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(50))).toBe(50); + expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(200))).toBe(200); }); - test("returns 50 if over 50", () => { - expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(51))).toBe(50); - expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(100))).toBe(50); + test("returns 200 if over 200", () => { + expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(201))).toBe(200); + expect(ConnectionLimitInt.parseLiteral(getLiteralForInt(500))).toBe(200); }); test("returns 1 if under 1", () => { diff --git a/imports/plugins/core/graphql/server/resolvers/tag/Query/index.js b/imports/plugins/core/graphql/server/resolvers/tag/Query/index.js index c465dbc45..e9ee02977 100644 --- a/imports/plugins/core/graphql/server/resolvers/tag/Query/index.js +++ b/imports/plugins/core/graphql/server/resolvers/tag/Query/index.js @@ -1,5 +1,7 @@ +import tag from "./tag"; import tags from "./tags"; export default { + tag, tags }; diff --git a/imports/plugins/core/graphql/server/resolvers/tag/Query/tag.js b/imports/plugins/core/graphql/server/resolvers/tag/Query/tag.js new file mode 100644 index 000000000..0d57cf1a8 --- /dev/null +++ b/imports/plugins/core/graphql/server/resolvers/tag/Query/tag.js @@ -0,0 +1,23 @@ +import { decodeTagOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/tag"; + +/** + * @name "Query.tag" + * @method + * @memberof Tag/GraphQL + * @summary Returns a tag for a shop, based on tag slug or ID + * @param {Object} _ - unused + * @param {Object} args - arguments sent by the client {@link ConnectionArgs|See default connection arguments} + * @param {Object} context - an object containing the per-request state + * @return {Promise} Promise that resolves with array of Tag objects + */ +export default async function tag(_, { slugOrId }, context) { + let dbTagId; + + try { + dbTagId = decodeTagOpaqueId(slugOrId); + } catch (e) { + dbTagId = slugOrId; + } + + return context.queries.tag(context, dbTagId); +} diff --git a/imports/plugins/core/graphql/server/resolvers/tag/Query/tags.test.js b/imports/plugins/core/graphql/server/resolvers/tag/Query/tags.test.js index ae09b4663..1392dd2aa 100644 --- a/imports/plugins/core/graphql/server/resolvers/tag/Query/tags.test.js +++ b/imports/plugins/core/graphql/server/resolvers/tag/Query/tags.test.js @@ -1,30 +1,32 @@ import tagsResolver from "./tags"; import getFakeMongoCursor from "/imports/test-utils/helpers/getFakeMongoCursor"; +import Factory from "/imports/test-utils/helpers/factory"; const base64ID = "cmVhY3Rpb24vc2hvcDoxMjM="; // reaction/shop:123 - -const mockTags = [ - { _id: "a1", name: "Men" }, - { _id: "b2", name: "Women" }, - { _id: "c3", name: "Children" } -]; - +const mockTags = Factory.Tag.makeMany(3, { _id: (i) => (i + 100).toString() }); const mockTagsQuery = getFakeMongoCursor("Tags", mockTags); test("calls queries.tags and returns a partial connection", async () => { - const tags = jest.fn().mockName("queries.tags").mockReturnValueOnce(Promise.resolve(mockTagsQuery)); + const tags = jest + .fn() + .mockName("queries.tags") + .mockReturnValueOnce(Promise.resolve(mockTagsQuery)); - const result = await tagsResolver({}, { shopId: base64ID }, { - queries: { tags } - }); + const result = await tagsResolver( + {}, + { shopId: base64ID }, + { + queries: { tags } + } + ); expect(result).toEqual({ nodes: mockTags, pageInfo: { - endCursor: "c3", + endCursor: "102", hasNextPage: false, hasPreviousPage: false, - startCursor: "a1" + startCursor: "100" }, totalCount: 3 }); diff --git a/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.js b/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.js index b16f6ff0d..93bd6e1be 100644 --- a/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.js +++ b/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.js @@ -1,3 +1,5 @@ +const DEFAULT_LIMIT = 20; + /** * Inspired by https://www.reindex.io/blog/relay-graphql-pagination-with-mongodb/ * @name applyPaginationToMongoCursor @@ -13,8 +15,8 @@ export default async function applyPaginationToMongoCursor(cursor, { first, last } = {}, totalCount) { if (first && last) throw new Error("Request either `first` or `last` but not both"); - // Enforce a `first: 50` limit if no user-supplied limit - const limit = first || last || 50; + // Enforce a `first: 20` limit if no user-supplied limit, using the DEFAULT_LIMIT + const limit = first || last || DEFAULT_LIMIT; let skip = 0; if (last && totalCount > last) skip = totalCount - last; diff --git a/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.test.js b/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.test.js index 7a7919da1..0bbc3ddb0 100644 --- a/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.test.js +++ b/imports/plugins/core/graphql/server/resolvers/util/applyPaginationToMongoCursor.test.js @@ -6,14 +6,14 @@ beforeEach(() => { mockCursor = getFakeMongoCursor("Test", new Array(100)); }); -test("with neither first nor last limits to first 50", async () => { - mockCursor.count.mockReturnValueOnce(Promise.resolve(51)); +test("with neither first nor last limits to first 20", async () => { + mockCursor.count.mockReturnValueOnce(Promise.resolve(21)); const result = await applyPaginationToMongoCursor(mockCursor, undefined, 100); expect(result).toEqual({ hasNextPage: true, hasPreviousPage: null }); - expect(mockCursor.limit.mock.calls).toEqual([[51], [50]]); + expect(mockCursor.limit.mock.calls).toEqual([[21], [20]]); expect(mockCursor.skip).not.toHaveBeenCalled(); }); diff --git a/imports/plugins/core/graphql/server/schemas/tag.graphql b/imports/plugins/core/graphql/server/schemas/tag.graphql index cec0892e8..1295143c2 100644 --- a/imports/plugins/core/graphql/server/schemas/tag.graphql +++ b/imports/plugins/core/graphql/server/schemas/tag.graphql @@ -38,6 +38,9 @@ type Tag implements Node & Deletable { "The date and time at which this tag was last updated" updatedAt: DateTime! + + "A string containing the hero image url for a tag landing page" + heroMediaUrl: String } "The fields by which you are allowed to sort any query that returns a `TagConnection`" @@ -64,6 +67,9 @@ type TagConnection implements NodeConnection { } extend type Query { + "Returns a tag from a provided tag ID or slug" + tag(slugOrId: String): Tag + "Returns a paged list of tags for a shop. You must include a shopId when querying." tags( "Only tags associated with this shop will be returned" diff --git a/imports/plugins/core/i18n/client/components/localizationSettings.js b/imports/plugins/core/i18n/client/components/localizationSettings.js index a2764dacf..56bd05673 100644 --- a/imports/plugins/core/i18n/client/components/localizationSettings.js +++ b/imports/plugins/core/i18n/client/components/localizationSettings.js @@ -1,7 +1,7 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import { Components } from "@reactioncommerce/reaction-components"; -import { Shop as ShopSchema } from "/lib/collections/schemas/shops"; +import { Shop as ShopSchema } from "/lib/collections/schemas"; const PACKAGE_NAME = "reaction-i18n"; diff --git a/imports/plugins/core/job-collection/lib/jobCollection.app-test.js b/imports/plugins/core/job-collection/lib/jobCollection.app-test.js index 0e824f018..8013822c5 100644 --- a/imports/plugins/core/job-collection/lib/jobCollection.app-test.js +++ b/imports/plugins/core/job-collection/lib/jobCollection.app-test.js @@ -19,6 +19,7 @@ const validJobDoc = (d) => Match.test(d, defaultColl.jobDocPattern); describe("JobCollection default constructor", function () { it("should be an instance of JobCollection", function () { + this.timeout(15000); expect(defaultColl, "JobCollection constructor failed").to.be.an.instanceOf(JobCollection); expect(defaultColl.root, "default root isn't 'queue'").to.equal("queue"); @@ -63,10 +64,12 @@ describe("JobCollection", function () { }); it("should set permissions to allow admin on ClientTest", function () { + this.timeout(15000); expect(clientTestColl.allows.admin[0]()).to.equal(true); }); it("should set polling interval", function () { + this.timeout(15000); let { interval } = clientTestColl; clientTestColl.promote(250); expect(interval, "clientTestColl interval not updated").to.not.equal(clientTestColl.interval); @@ -77,6 +80,7 @@ describe("JobCollection", function () { }); it("should run startJobServer on new job collection", function (done) { + this.timeout(15000); testColl.startJobServer(function (err, res) { if (err) { done(err); } expect(res, "startJobServer failed in callback result").to.equal(true); @@ -89,6 +93,7 @@ describe("JobCollection", function () { if (Meteor.isServer) { it("should create a server-side job and see that it is added to the collection and runs", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }); assert.ok(validJobDoc(job.doc)); @@ -112,6 +117,7 @@ describe("JobCollection", function () { } it("should create a job and see that it is added to the collection and runs", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }); assert.ok(validJobDoc(job.doc)); @@ -130,6 +136,7 @@ describe("JobCollection", function () { }); it("should create an invalid job and see that errors correctly propagate", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }); @@ -166,6 +173,7 @@ describe("JobCollection", function () { }); it("should create a job and then make a new doc with its document", function (done) { + this.timeout(15000); let job; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job2 = new Job(testColl, jobType, { some: "data" }); @@ -193,6 +201,7 @@ describe("JobCollection", function () { }); it("should should create a repeating job that returns the _id of the next job", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }).repeat({ repeats: 1, wait: 250 }); @@ -231,6 +240,7 @@ describe("JobCollection", function () { }); it("should have dependent jobs run in the correct order", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -258,6 +268,7 @@ describe("JobCollection", function () { if (Meteor.isServer) { it("should dry run of dependency check returns status object", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -292,6 +303,7 @@ describe("JobCollection", function () { } it("should have dependent job saved after completion of antecedent still runs", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -318,6 +330,7 @@ describe("JobCollection", function () { }); it("should have dependent job saved after failure of antecedent is cancelled", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -341,6 +354,7 @@ describe("JobCollection", function () { }); it("should have dependent job saved after cancelled antecedent is also cancelled", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -361,6 +375,7 @@ describe("JobCollection", function () { }); it("should have dependent job saved after removed antecedent is cancelled", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -385,6 +400,7 @@ describe("JobCollection", function () { }); it("should cancel succeeds for job without deps, with using option dependents: false", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, {}); job.save(function (err2, res2) { @@ -399,6 +415,7 @@ describe("JobCollection", function () { }); it("should have dependent job with delayDeps is delayed", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -425,9 +442,10 @@ describe("JobCollection", function () { }); }); }); - }).timeout(4000); + }); it("should be dependent job with delayDeps is delayed", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { order: 1 }); const job2 = new Job(testColl, jobType, { order: 2 }); @@ -454,9 +472,10 @@ describe("JobCollection", function () { }); }); }); - }).timeout(4000); + }); it("Job priority is respected", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const jobs = []; @@ -488,6 +507,7 @@ describe("JobCollection", function () { }); it("Job priority is respected", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const jobs = []; @@ -519,6 +539,7 @@ describe("JobCollection", function () { }); it("A forever retrying job can be scheduled and run", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }).retry({ retries: testColl.forever, wait: 0 }); @@ -541,6 +562,7 @@ describe("JobCollection", function () { }); it("Retrying job with exponential backoff", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }).retry({ retries: 2, wait: 200, backoff: "exponential" }); @@ -563,6 +585,7 @@ describe("JobCollection", function () { }); it("should have a forever retrying job with 'until'", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }).retry({ until: new Date(new Date().valueOf() + 1500), wait: 500 }); job.save(function (err, res) { @@ -582,9 +605,10 @@ describe("JobCollection", function () { 2500 ); }); - }).timeout(5000); + }); it("should autofail and retry a job", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }).retry({ retries: 2, wait: 0 }); @@ -610,10 +634,11 @@ describe("JobCollection", function () { 2500 ); }); - }).timeout(5000); + }); if (Meteor.isServer) { it("should save, cancel, restart, refresh: retries are correct.", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const j = new Job(testColl, jobType, { foo: "bar" }); j.save(); @@ -625,6 +650,7 @@ describe("JobCollection", function () { }); it("should add, cancel and remove a large number of jobs", function (done) { + this.timeout(15000); const count = 500; let c = count; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; @@ -658,9 +684,10 @@ describe("JobCollection", function () { } return result; })(); - }).timeout(5000); + }); it("should have a forever repeating job with 'schedule' and 'until'", function (done) { + this.timeout(15000); let counter = 0; const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(testColl, jobType, { some: "data" }) @@ -697,10 +724,11 @@ describe("JobCollection", function () { ev = testColl.events.on("jobDone", listener); return ev; }); - }).timeout(4000); + }); } it("should run shutdownJobServer on the job collection", function (done) { + this.timeout(15000); testColl.shutdownJobServer({ timeout: 1 }, function (err, res) { if (err) { done(err); } expect(res, true, "shutdownJobServer failed in callback result"); @@ -713,6 +741,7 @@ describe("JobCollection", function () { if (Meteor.isClient) { it("should run startJobServer on remote job collection", function (done) { + this.timeout(15000); remoteServerTestColl.startJobServer(function (err, res) { if (err) { done(err); } expect(res, "startJobServer failed in callback result").to.equal(true); @@ -721,6 +750,7 @@ describe("JobCollection", function () { }); it("should create a job and see that it is added to a remote server collection and runs", function (done) { + this.timeout(15000); const jobType = `TestJob_${Math.round(Math.random() * 1000000000)}`; const job = new Job(remoteServerTestColl, jobType, { some: "data" }); assert.ok(validJobDoc(job.doc)); @@ -737,6 +767,7 @@ describe("JobCollection", function () { }); it("should run shutdownJobServer on remote job collection", function (done) { + this.timeout(15000); remoteServerTestColl.shutdownJobServer({ timeout: 1 }, function (err, res) { if (err) { done(err); } expect(res, "shutdownJobServer failed in callback result").to.equal(true); diff --git a/imports/plugins/core/revisions/client/components/settings.js b/imports/plugins/core/revisions/client/components/settings.js deleted file mode 100644 index 16829354f..000000000 --- a/imports/plugins/core/revisions/client/components/settings.js +++ /dev/null @@ -1,45 +0,0 @@ -import React, { Component } from "react"; -import PropTypes from "prop-types"; -import { Translation } from "/imports/plugins/core/ui/client/components"; - - -class RevisionControlSettings extends Component { - get settings() { - return this.props.settings; - } - - render() { - let message; - - if (this.settings.general.enabled) { - message = ( - - ); - } else { - message = ( - - ); - } - - return ( -
-

{message}

-
- ); - } -} - -RevisionControlSettings.propTypes = { - checked: PropTypes.bool, // eslint-disable-line react/boolean-prop-naming - label: PropTypes.string, - onUpdateSettings: PropTypes.func, - settings: PropTypes.object -}; - -export default RevisionControlSettings; diff --git a/imports/plugins/core/revisions/client/components/simpleDiff.js b/imports/plugins/core/revisions/client/components/simpleDiff.js deleted file mode 100644 index d4d2275a5..000000000 --- a/imports/plugins/core/revisions/client/components/simpleDiff.js +++ /dev/null @@ -1,86 +0,0 @@ -import React, { Component } from "react"; -import PropTypes from "prop-types"; - -class SimpleDiff extends Component { - renderDiff() { - const { diff } = this.props; - - return diff.map((change, index) => { - const rightHandSide = change.rhs && change.rhs.toString(); - const leftHandSide = change.lhs && change.lhs.toString(); - - switch (change.kind) { - // Array change - case "A": - return ( - - - {leftHandSide} - {rightHandSide} - - ); - - // Added property / element - case "N": - return ( - - - {leftHandSide} - {rightHandSide} - - ); - - // Edited property or element - case "E": - return ( - - - {leftHandSide} - {rightHandSide} - - ); - - // Removed property / element - case "D": - return ( - - - {leftHandSide} - {rightHandSide} - - ); - default: - return null; - } - }); - } - - render() { - return ( -
- - - - - - - - - {this.renderDiff()} - -
- {"Current"}{"Change"}
-
- ); - } -} - -SimpleDiff.defaultProps = { - diff: [] -}; - -SimpleDiff.propTypes = { - diff: PropTypes.arrayOf(PropTypes.object) -}; - -export default SimpleDiff; diff --git a/imports/plugins/core/revisions/client/containers/publishContainer.js b/imports/plugins/core/revisions/client/containers/publishContainer.js deleted file mode 100644 index e5c456b9f..000000000 --- a/imports/plugins/core/revisions/client/containers/publishContainer.js +++ /dev/null @@ -1,171 +0,0 @@ -import React, { Component } from "react"; -import PropTypes from "prop-types"; -import { composeWithTracker } from "@reactioncommerce/reaction-components"; -import PublishControls from "../components/publishControls"; -import { Revisions } from "/lib/collections"; -import { Meteor } from "meteor/meteor"; -import TranslationProvider from "/imports/plugins/core/ui/client/providers/translationProvider"; -import { isRevisionControlEnabled } from "../../lib/api"; -import { Reaction, i18next } from "/client/api"; - -/* - * PublishContainer is a container component connected to Meteor data source. - */ -class PublishContainer extends Component { - publishToCatalog(collection, documentIds) { - Meteor.call(`catalog/publish/${collection}`, documentIds, (error, result) => { - if (result) { - Alerts.toast(i18next.t("admin.catalogProductPublishSuccess", { defaultValue: "Product published to catalog" }), "success"); - } else if (error) { - Alerts.toast(error.message, "error"); - } - }); - } - - handlePublishClick = (revisions) => { - const productIds = this.props.documents - .filter((doc) => doc.type === "simple") - .map((doc) => doc._id); - - if (Array.isArray(revisions) && revisions.length) { - let documentIds = revisions.map((revision) => { - if (revision.parentDocument && revision.documentType !== "product") { - return revision.parentDocument; - } - return revision.documentId; - }); - - const documentIdsSet = new Set(documentIds); // ensures they are unique - documentIds = Array.from(documentIdsSet); - Meteor.call("revisions/publish", documentIds, (error, result) => { - if (result && result.status === "success") { - const message = i18next.t("revisions.changedPublished", { - defaultValue: "Changes published successfully" - }); - Alerts.toast(message, "success"); - - if (this.props.onPublishSuccess) { - this.props.onPublishSuccess(result); - } - - // Publish to catalog after revisions have been published - this.publishToCatalog("products", productIds); - } else { - Alerts.toast((error && error.message) || (result && result.status) || i18next.t("app.error"), "error"); - } - }); - } else { - // Publish to catalog immediately if there are no revisions to publish beforehand - this.publishToCatalog("products", productIds); - } - } - - handlePublishActions = (event, action, documentIds) => { - switch (action) { - case "archive": - if (this.props.onAction) { - this.props.onAction(event, action, this.props.documentIds); - } - break; - case "discard": - Meteor.call("revisions/discard", documentIds, (error, result) => { - if (result === true) { - const message = i18next.t("revisions.changesDiscarded", { - defaultValue: "Changes discarded successfully" - }); - - Alerts.toast(message, "success"); - } else { - const message = i18next.t("revisions.noChangesDiscarded", { - defaultValue: "There are no changes to discard" - }); - - Alerts.toast(message, "warning"); - } - }); - break; - default: - } - } - - render() { - return ( - - - - ); - } -} - -PublishContainer.propTypes = { - documentIds: PropTypes.arrayOf(PropTypes.string), - documents: PropTypes.arrayOf(PropTypes.object), - isEnabled: PropTypes.bool, - isPreview: PropTypes.bool, - onAction: PropTypes.func, - onPublishSuccess: PropTypes.func, - onVisibilityChange: PropTypes.func, - product: PropTypes.object, - revisions: PropTypes.arrayOf(PropTypes.object) -}; - -function composer(props, onData) { - const viewAs = Reaction.getUserPreferences("reaction-dashboard", "viewAs", "administrator"); - - if (Array.isArray(props.documentIds) && props.documentIds.length) { - const subscription = Meteor.subscribe("ProductRevisions", props.documentIds); - - if (subscription.ready()) { - const revisions = Revisions.find({ - "$or": [ - { - documentId: { - $in: props.documentIds - } - }, - { - "documentData.ancestors": { - $in: props.documentIds - } - }, - { - parentDocument: { - $in: props.documentIds - } - } - ], - "workflow.status": { - $nin: [ - "revision/published" - ] - } - }).fetch(); - - onData(null, { - isEnabled: isRevisionControlEnabled(), - documentIds: props.documentIds, - documents: props.documents, - revisions, - isPreview: viewAs === "customer" - }); - - return; - } - } - - onData(null, { - isEnabled: isRevisionControlEnabled(), - isPreview: viewAs === "customer" - }); -} - -export default composeWithTracker(composer)(PublishContainer); diff --git a/imports/plugins/core/revisions/client/containers/settingsContainer.js b/imports/plugins/core/revisions/client/containers/settingsContainer.js deleted file mode 100644 index 01a393872..000000000 --- a/imports/plugins/core/revisions/client/containers/settingsContainer.js +++ /dev/null @@ -1,70 +0,0 @@ -import React, { Component } from "react"; -import PropTypes from "prop-types"; -import { composeWithTracker } from "@reactioncommerce/reaction-components"; -import { Meteor } from "meteor/meteor"; -import SettingsComponent from "../components/settings"; -import { Packages } from "/lib/collections"; - -class RevisionSettingsContainer extends Component { - constructor(props) { - super(props); - - this.state = { - settings: this.props.packageInfo.settings - }; - } - - componentWillReceiveProps(nextProps) { - this.setState({ - settings: nextProps.packageInfo.settings - }); - } - - get settings() { - return this.state.settings; - } - - handleUpdateSettings = (settings) => { - this.setState({ settings }, () => { - Meteor.call("revisions/settings/update", settings); - }); - } - - /** - * Publish container is a stateless container component connected to Meteor data source. - * @return {PropTypes.node} react node - */ - render() { - return ( -
- -
- ); - } -} - -RevisionSettingsContainer.propTypes = { - packageInfo: PropTypes.object -}; - -export function handlePublishClick(revisions) { - if (Array.isArray(revisions)) { - const documentIds = revisions.map((revision) => revision.documentId); - Meteor.call("revisions/publish", documentIds); - } -} - -function composer(props, onData) { - const packageInfo = Packages.findOne({ - name: "reaction-revisions" - }); - - onData(null, { - packageInfo - }); -} - -export default composeWithTracker(composer)(RevisionSettingsContainer); diff --git a/imports/plugins/core/revisions/client/index.js b/imports/plugins/core/revisions/client/index.js deleted file mode 100644 index de2ea1373..000000000 --- a/imports/plugins/core/revisions/client/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import "./templates/settings.html"; -import "./templates/settings.js"; diff --git a/imports/plugins/core/revisions/client/templates/settings.html b/imports/plugins/core/revisions/client/templates/settings.html deleted file mode 100644 index 03253ad97..000000000 --- a/imports/plugins/core/revisions/client/templates/settings.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/imports/plugins/core/revisions/client/templates/settings.js b/imports/plugins/core/revisions/client/templates/settings.js deleted file mode 100644 index b12d8df52..000000000 --- a/imports/plugins/core/revisions/client/templates/settings.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Template } from "meteor/templating"; -import SearchContainer from "../containers/settingsContainer.js"; - -Template.revisionControlSettings.helpers({ - SearchContainerComponent() { - return { - component: SearchContainer - }; - } -}); diff --git a/imports/plugins/core/revisions/index.js b/imports/plugins/core/revisions/index.js deleted file mode 100644 index d0eb62211..000000000 --- a/imports/plugins/core/revisions/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as PublishContainer } from "./client/containers/publishContainer"; diff --git a/imports/plugins/core/revisions/lib/api/index.js b/imports/plugins/core/revisions/lib/api/index.js deleted file mode 100644 index 4442f1f0b..000000000 --- a/imports/plugins/core/revisions/lib/api/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./revisions"; diff --git a/imports/plugins/core/revisions/lib/api/revisions.js b/imports/plugins/core/revisions/lib/api/revisions.js deleted file mode 100644 index b72ddb46a..000000000 --- a/imports/plugins/core/revisions/lib/api/revisions.js +++ /dev/null @@ -1,32 +0,0 @@ -import { Packages } from "/lib/collections"; -import { Reaction } from "/lib/api"; - -export function getPackageSettings() { - const shopId = Reaction.getPrimaryShopId(); - - const packageInfo = Packages.findOne({ - name: "reaction-revisions", - shopId - }); - - if (packageInfo && packageInfo.enabled && packageInfo.settings) { - return packageInfo.settings; - } - - return null; -} - -export function isRevisionControlEnabled() { - const settings = getPackageSettings(); - - if (settings && settings.general && typeof settings.general.enabled === "boolean") { - return settings.general.enabled; - } - - return false; -} - -export const RevisionApi = { - isRevisionControlEnabled, - getPackageSettings -}; diff --git a/imports/plugins/core/revisions/register.js b/imports/plugins/core/revisions/register.js deleted file mode 100644 index fa545f380..000000000 --- a/imports/plugins/core/revisions/register.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Reaction } from "/server/api"; - -Reaction.registerPackage({ - label: "Revisions", - name: "reaction-revisions", - autoEnable: true, - settings: { - general: { - enabled: true - } - }, - registry: [ - // Settings Panel in Catalog - { - label: "Product Revisions", - name: "catalog/settings/revisions/general", - provides: ["catalogSettings"], - template: "revisionControlSettings" - } - ] -}); diff --git a/imports/plugins/core/revisions/server/functions.js b/imports/plugins/core/revisions/server/functions.js deleted file mode 100644 index 693c481d5..000000000 --- a/imports/plugins/core/revisions/server/functions.js +++ /dev/null @@ -1,473 +0,0 @@ -import _ from "lodash"; -import { Meteor } from "meteor/meteor"; -import { Products, Revisions, Tags } from "/lib/collections"; -import { Hooks, Logger } from "/server/api"; -import { RevisionApi } from "../lib/api"; -import { getSlug } from "/lib/api"; -import rawCollections from "/imports/collections/rawCollections"; - -import getProductPriceRange from "./no-meteor/utils/getProductPriceRange"; - -/** - * @name insertRevision - * @method - * @summary Inserts a new revision for a given product - * @param {Object} product - * @returns {undefined} - * @private - */ -export function insertRevision(product) { - if (RevisionApi.isRevisionControlEnabled() === false) { - return true; - } - - if ( - product.workflow && - Array.isArray(product.workflow.workflow) && - product.workflow.workflow.indexOf("imported") !== -1 - ) { - // Mark imported products as published by default. - return true; - } - - const productRevision = Revisions.findOne({ - "documentId": product._id, - "workflow.status": { - $nin: ["revision/published"] - } - }); - - // Prevent this product from being created if a parent product / variant ancestor is deleted. - // - // This will prevent cases where a parent variant has been deleted and a user tries to create a - // child variant. You cannot create the child variant because the parent will no longer exist when - // changes have been published; resulting in a broken inheritance and UI - const productHasAncestors = Array.isArray(product.ancestors); - - if (productHasAncestors) { - // Verify there are no deleted ancestors, - // Variants cannot be restored if their parent product / variant is deleted - const archivedCount = Revisions.find({ - "documentId": { $in: product.ancestors }, - "documentData.isDeleted": true, - "workflow.status": { - $nin: ["revision/published"] - } - }).count(); - - if (archivedCount > 0) { - Logger.debug(`Cannot create product ${ - product._id - } as a product/variant higher in it's ancestors tree is marked as 'isDeleted'.`); - throw new Meteor.Error("unable-to-create-variant", "Unable to create product variant"); - } - } - - if (!productRevision) { - Logger.debug(`No revision found for product ${product._id}. Creating new revision`); - - Revisions.insert({ - documentId: product._id, - documentData: product - }); - } -} - -/** - * @name updateRevision - * @method - * @summary Update a product's revision - * @param {String} userId - * @param {Object} product - Product to update - * @param {Object} options - Options include userId, modifier and validation properties - * @returns {Boolean} true if underlying product should be updated, otherwise false. - * @private - */ -export function updateRevision(product, options = {}) { - if (RevisionApi.isRevisionControlEnabled() === false) { - return true; - } - - const { userId, modifier } = options; - - let productRevision = Revisions.findOne({ - "documentId": product._id, - "workflow.status": { - $nin: ["revision/published"] - } - }); - - // Prevent this product revision from being restored from isDeleted state if a product / variant - // ancestor is also deleted. - // - // This will prevent cases where a parent variant has been deleted and a user tries to restore a - // child variant. You cannot restore the child variant, because the parent will no longer exist when - // changes have been published; resulting in a broken inheritance and UI - const revisionHasAncestors = - productRevision && productRevision.documentData && Array.isArray(productRevision.documentData.ancestors); - const modifierContainsIsDeleted = modifier.$set && modifier.$set.isDeleted === false; - - if (revisionHasAncestors && modifierContainsIsDeleted) { - // Verify there are no deleted ancestors, - // Variants cannot be restored if their parent product / variant is deleted - const archivedCount = Revisions.find({ - "documentId": { $in: productRevision.documentData.ancestors }, - "documentData.isDeleted": true, - "workflow.status": { - $nin: ["revision/published"] - } - }).count(); - - if (archivedCount > 0) { - Logger.debug(`Cannot restore product ${ - product._id - } as a product/variant higher in it's ancestors tree is marked as 'isDeleted'.`); - throw new Meteor.Error("unable-to-delete-variant", "Unable to delete product variant"); - } - } - - if (!productRevision) { - Logger.debug(`No revision found for product ${product._id}. Creating new revision`); - - // Create a new revision - Revisions.insert({ - documentId: product._id, - documentData: product - }); - - // Fetch newly created revision - productRevision = Revisions.findOne({ - documentId: product._id - }); - } - - // Create a new selector for the revision - // - // This is especially important since we may need to update some fields - // like metadata, and the selector is very important to that. - const revisionSelector = { - "documentId": product._id, - "workflow.status": { - $nin: ["revision/published"] - } - }; - - // Create a new modifier for the revision - const revisionModifier = { - $set: { - "workflow.status": "revision/update" - } - }; - - let publish = false; - if (Object.prototype.hasOwnProperty.call(options, "publish")) { - ({ publish } = options); - } - - if (publish === true || (product.workflow && product.workflow.status === "product/publish")) { - // Maybe mark the revision as published - - Logger.debug(`Publishing revision for product ${product._id}.`); - Revisions.update(revisionSelector, { - $set: { - "workflow.status": "revision/published" - } - }); - Hooks.Events.run("afterRevisionsUpdate", userId, { - ...productRevision, - workflow: { ...productRevision.workflow, status: "revisions/published" } - }); - return true; - } - - const hasAncestors = Array.isArray(product.ancestors) && product.ancestors.length > 0; - - for (const operation in modifier) { - if (Object.hasOwnProperty.call(modifier, operation)) { - if (!revisionModifier[operation]) { - revisionModifier[operation] = {}; - } - - for (const property in modifier[operation]) { - if ({}.hasOwnProperty.call(modifier[operation], property)) { - if (operation === "$set" && property === "metafields.$") { - // Special handling for meta fields with $ operator - // We need to update the selector otherwise the operation would completely fail. - // - // This does NOT apply to metafield.0, metafield.1, metafield.n operations - // where 0, 1, n represent an array index. - - // const originalSelector = options.selector; - revisionSelector["documentData.metafields"] = options.metafields; - revisionModifier.$set[`documentData.${property}`] = modifier.$set[property]; - } else if (operation === "$push" && property === "hashtags") { - if (!revisionModifier.$addToSet) { - revisionModifier.$addToSet = {}; - } - revisionModifier.$addToSet[`documentData.${property}`] = modifier.$push[property]; - } else if (operation === "$set" && property === "price" && hasAncestors) { - Revisions.update(revisionSelector, { - $set: { - "documentData.price": modifier.$set.price - } - }); - Hooks.Events.run("afterRevisionsUpdate", userId, { - ...productRevision, - documentData: { ...productRevision.documentData, price: modifier.$set.price } - }); - - const updateId = product.ancestors[0] || product._id; - const priceRange = Promise.await(getProductPriceRange(updateId, rawCollections)); - - Meteor.call("products/updateProductField", updateId, "price", priceRange); - } else if (operation === "$set" && property === "isVisible" && hasAncestors) { - Revisions.update(revisionSelector, { - $set: { - "documentData.isVisible": modifier.$set.isVisible - } - }); - Hooks.Events.run("afterRevisionsUpdate", userId, { - ...productRevision, - documentData: { ...productRevision.documentData, isVisible: modifier.$set.isVisible } - }); - - const updateId = product.ancestors[0] || product._id; - const priceRange = Promise.await(getProductPriceRange(updateId, rawCollections)); - - Meteor.call("products/updateProductField", updateId, "price", priceRange); - } else if ( - operation === "$set" && - (property === "title" || property === "handle") && - hasAncestors === false - ) { - // Special handling for product title and handle - // - // Summary: - // When a user updates the product title, if the handle matches the product id, - // then update the handle to be a slugified version of the title - // - // This block ensures that the handle is either a custom slug, slug of the title, or - // the _id of the product, but is never blank - - // New data - const newValue = modifier.$set[property]; - const newTitle = modifier.$set.title; - const newHandle = modifier.$set.handle; - - // Current revision data - const { documentId } = productRevision; - const slugDocId = getSlug(documentId); - const revisionTitle = productRevision.documentData.title; - const revisionHandle = productRevision.documentData.handle; - - // Checks - const hasNewHandle = _.isEmpty(newHandle) === false; - const hasExistingTitle = _.isEmpty(revisionTitle) === false; - const hasNewTitle = _.isEmpty(newTitle) === false; - const hasHandle = _.isEmpty(revisionHandle) === false; - const handleMatchesId = - revisionHandle === documentId || - revisionHandle === slugDocId || - newValue === documentId || - newValue === slugDocId; - - // Continue to set the title / handle as originally requested - // Handle will get changed if conditions are met in the below if block - revisionModifier.$set[`documentData.${property}`] = newValue; - - if ( - (handleMatchesId || hasHandle === false) && - (hasExistingTitle || hasNewTitle) && - hasNewHandle === false - ) { - // Set the handle to be the slug of the product.title - // when documentId (product._id) matches the handle, then handle is empty, and a title exists - revisionModifier.$set["documentData.handle"] = getSlug(newTitle || revisionTitle); - } else if (hasHandle === false && hasExistingTitle === false && hasNewHandle === false) { - // If the handle & title is empty, the handle becomes the product id - revisionModifier.$set["documentData.handle"] = documentId; - } else if (hasNewHandle === false && property === "handle") { - // If the handle is empty, the handle becomes the slugified product title, or document id if title does not exist. - // const newTitle = modifier.$set["title"]; - revisionModifier.$set["documentData.handle"] = hasExistingTitle - ? getSlug(newTitle || revisionTitle) - : documentId; - } - } else if (operation === "$unset" && property === "handle" && hasAncestors === false) { - // Special handling for product handle when it is going to be unset - // - // Summary: - // When a user updates the handle to a black string e.g. deletes all text in field in UI and saves, - // the handle will be adjusted so it will not be blank - const newValue = modifier.$unset[property]; - const revisionTitle = productRevision.documentData.title; - const hasExistingTitle = _.isEmpty(revisionTitle) === false; - - // If the new handle is going to be empty, the handle becomes the slugified product title, or document id if title does not exist. - if (_.isEmpty(newValue)) { - revisionModifier.$set["documentData.handle"] = hasExistingTitle - ? getSlug(revisionTitle) - : productRevision.documentId; - } - } else { - // Let everything else through - revisionModifier[operation][`documentData.${property}`] = modifier[operation][property]; - } - } - } - } - } - - Revisions.update(revisionSelector, revisionModifier); - const updatedRevision = Revisions.findOne({ documentId: product._id }); - Hooks.Events.run("afterRevisionsUpdate", userId, updatedRevision); - - Logger.debug(`Revision updated for product ${product._id}.`); - - if (modifier.$pull && modifier.$pull.hashtags) { - const tagId = modifier.$pull.hashtags; - - const productCount = Products.find({ - hashtags: tagId - }).count(); - - const relatedTagsCount = Tags.find({ - relatedTagIds: tagId - }).count(); - - if (productCount === 0 && relatedTagsCount === 0) { - // Mark tag as deleted - Tags.update( - { - _id: tagId - }, - { - $set: { - isDeleted: true - } - } - ); - } else { - Tags.update( - { - _id: tagId - }, - { - $set: { - isDeleted: false - } - } - ); - } - } - - // If we are using $set or $inc, and the fields are one of the ignoredFields, - // allow product to be updated without going through revision control - if ((modifier.$set || modifier.$inc) && !modifier.$pull && !modifier.$push) { - const newSet = {}; - const newInc = {}; - let hasIgnoredFields = false; - const ignoredFields = ["isLowQuantity", "isSoldOut", "inventoryQuantity"]; - - for (const field of ignoredFields) { - if ( - modifier.$set && - (typeof modifier.$set[field] === "number" || - typeof modifier.$set[field] === "boolean" || - typeof modifier.$set[field] === "string") - ) { - newSet[field] = modifier.$set[field]; - hasIgnoredFields = true; - } - - if ( - modifier.$inc && - (typeof modifier.$inc[field] === "number" || - typeof modifier.$inc[field] === "boolean" || - typeof modifier.$set[field] === "string") - ) { - newInc[field] = modifier.$inc[field]; - hasIgnoredFields = true; - } - } - if (_.isEmpty(newSet) === false) { - modifier.$set = newSet; - } - - if (_.isEmpty(newInc) === false) { - modifier.$inc = newInc; - } - - return hasIgnoredFields === true; - } - - // prevent the underlying document from being modified as it is in draft mode - return false; -} -/** - * @name markRevisionAsDeleted - * @method - * @summary Flag a product's revision as deleted - * @param {Object} product - The product whose revision will be flagged as deleted. - * @param {Object} options - Contains userId - * @returns {undefined} - * @private - */ -export function markRevisionAsDeleted(product, options) { - if (RevisionApi.isRevisionControlEnabled() === false) { - return true; - } - - const { userId } = options; - - let productRevision = Revisions.findOne({ - documentId: product._id - }); - - if (!productRevision) { - Logger.debug(`No revision found for product ${product._id}. Creating new revision`); - - Revisions.insert({ - documentId: product._id, - documentData: product - }); - productRevision = Revisions.findOne({ - documentId: product._id - }); - } - - // Set the revision as deleted "isDeleted: true" - Revisions.update( - { - documentId: product._id - }, - { - $set: { - "documentData.isDeleted": true, - "workflow.status": "revision/remove" - } - } - ); - Hooks.Events.run("afterRevisionsUpdate", userId, { - ...productRevision, - documentData: { ...productRevision.documentData, isDeleted: true }, - workflow: { ...productRevision.workflow, workflow: "revision/remove" } - }); - - Logger.debug(`Revision updated for product ${product._id}.`); - Logger.debug(`Product ${product._id} is now marked as deleted.`); - - // If the original product is deleted, and the user is trying to delete it again, - // then actually remove it completely. - // - // This acts like a trash. Where the product is sent to trash before it can actually - // be deleted permanently. - if (product.isDeleted === true) { - Logger.debug(`Allowing write to product ${product._id} for Collection.remove().`); - - return true; - } - - Logger.debug(`Preventing write to product ${product._id} for Collection.remove().`); - return false; -} diff --git a/imports/plugins/core/revisions/server/hooks.js b/imports/plugins/core/revisions/server/hooks.js deleted file mode 100644 index ad77ef877..000000000 --- a/imports/plugins/core/revisions/server/hooks.js +++ /dev/null @@ -1,92 +0,0 @@ -// import _ from "lodash"; -import { diff } from "deep-diff"; -import { RevisionApi } from "../lib/api"; -import { insertRevision, updateRevision, markRevisionAsDeleted } from "./functions"; -import { Products, Revisions } from "/lib/collections"; -import { Hooks } from "/server/api"; -import { Media } from "/imports/plugins/core/files/server"; - -/** - * @summary Executes the provided function when beforeInsertCatalogProductInsertRevision - * hook is ran. The hook is ran before a product is inserted, and it will insert a - * corresponding revision for the provided product. - * @param {Function} Callback to execute - * @return {Object} product - the product in which the callback was called on. - * @private - */ -Hooks.Events.add("beforeInsertCatalogProductInsertRevision", (product) => { - insertRevision(product); - - return product; -}); - -/** - * @summary Executes the provided function when beforeInsertCatalogProductInsertRevision - * hook is ran. The hook is ran after a product is inserted, and it will insert a - * corresponding revision for the provided product. - * @param {Function} Callback to execute - * @return {Object} product - the product in which the callback was called on. - * @private - */ -Hooks.Events.add("afterInsertCatalogProductInsertRevision", (product) => { - insertRevision(product); - - return product; -}); - -/** - * @summary Executes the provided function when beforeUpdateCatalogProduct - * hook is ran. The hook is ran before a product is updated, and it will updated the - * corresponding revisions for the provided product. - * @param {Function} Callback to execute - * @return {Boolean} true|false - Used to determine whether the underlying product should be updated. - * @private - */ -Hooks.Events.add("beforeUpdateCatalogProduct", (product, options) => updateRevision(product, options)); - -/** - * @summary Executes the provided function when beforeRemoveCatalogProduct - * hook is ran. The hook is ran before a product or variant is archived, and it will updated the - * corresponding revisions for the provided product or variant. - * @param {Function} Callback to execute - * @return {Boolean} true|false - Used to determine whether the underlying product should be updated. - * @private - */ -Hooks.Events.add("beforeRemoveCatalogProduct", (product, options) => markRevisionAsDeleted(product, options)); - -Hooks.Events.add( - "afterRevisionsUpdate", - (userId, revision) => { - if (RevisionApi.isRevisionControlEnabled() === false) { - return true; - } - let differences; - - if (!revision.documentType || revision.documentType === "product") { - // Make diff - const product = Products.findOne({ - _id: revision.documentId - }); - differences = diff(product, revision.documentData); - } - - if (revision.documentType && revision.documentType === "image") { - const image = Promise.await(Media.findOne(revision.documentId, { raw: true })); - differences = image && diff(image.metadata, revision.documentData); - } - - Revisions.update( - { - _id: revision._id - }, - { - $set: { - diff: differences && differences.map((d) => Object.assign({}, d)) - } - } - ); - }, - { - fetchPrevious: false - } -); diff --git a/imports/plugins/core/revisions/server/i18n/ar.json b/imports/plugins/core/revisions/server/i18n/ar.json deleted file mode 100644 index fa66d8c3a..000000000 --- a/imports/plugins/core/revisions/server/i18n/ar.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "ar", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "معاينة", - "revisionsLabel": "التنقيحات", - "revisionsTitle": "التنقيحات", - "revisionsDescription": "مراجعة مراقبة" - }, - "catalogSettings": { - "productRevisionsLabel": "مراجعات المنتج" - }, - "toolbar": { - "publishAll": "نشر جميع" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/bg.json b/imports/plugins/core/revisions/server/i18n/bg.json deleted file mode 100644 index 9e0fbcf8c..000000000 --- a/imports/plugins/core/revisions/server/i18n/bg.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "bg", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "предварителен преглед", - "revisionsLabel": "ревизии", - "revisionsTitle": "ревизии", - "revisionsDescription": "контрол на контрол" - }, - "catalogSettings": { - "productRevisionsLabel": "ревизии на продукта" - }, - "toolbar": { - "publishAll": "публикува всички" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/cs.json b/imports/plugins/core/revisions/server/i18n/cs.json deleted file mode 100644 index 72230d99c..000000000 --- a/imports/plugins/core/revisions/server/i18n/cs.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "cs", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Náhled", - "revisionsLabel": "revize", - "revisionsTitle": "revize", - "revisionsDescription": "ovládání revize" - }, - "catalogSettings": { - "productRevisionsLabel": "Revize produktu" - }, - "toolbar": { - "publishAll": "publikovat vše" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/de.json b/imports/plugins/core/revisions/server/i18n/de.json deleted file mode 100644 index 777ea5115..000000000 --- a/imports/plugins/core/revisions/server/i18n/de.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "de", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Vorschau", - "revisionsLabel": "Revisionen", - "revisionsTitle": "Revisionen", - "revisionsDescription": "Revisionskontrolle" - }, - "catalogSettings": { - "productRevisionsLabel": "Produkt Revisions" - }, - "toolbar": { - "publishAll": "veröffentlichen Alle" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/el.json b/imports/plugins/core/revisions/server/i18n/el.json deleted file mode 100644 index 016cffe5f..000000000 --- a/imports/plugins/core/revisions/server/i18n/el.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "el", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Πρεμιέρα", - "revisionsLabel": "αναθεωρήσεις", - "revisionsTitle": "αναθεωρήσεις", - "revisionsDescription": "έλεγχο αναθεώρηση" - }, - "catalogSettings": { - "productRevisionsLabel": "αναθεωρήσεις του προϊόντος" - }, - "toolbar": { - "publishAll": "Δημοσιεύστε Όλα" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/en.json b/imports/plugins/core/revisions/server/i18n/en.json deleted file mode 100644 index 4d97abd47..000000000 --- a/imports/plugins/core/revisions/server/i18n/en.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "en", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Preview", - "revisionsLabel": "Revisions", - "revisionsTitle": "Revisions", - "revisionsDescription": "Revision control" - }, - "catalogSettings": { - "productRevisionsLabel": "Product Revisions" - }, - "toolbar": { - "publishAll": "Publish All" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/es.json b/imports/plugins/core/revisions/server/i18n/es.json deleted file mode 100644 index 87b73d9a0..000000000 --- a/imports/plugins/core/revisions/server/i18n/es.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "es", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Preestreno", - "revisionsLabel": "Las revisiones", - "revisionsTitle": "Las revisiones", - "revisionsDescription": "Control de revisión" - }, - "catalogSettings": { - "productRevisionsLabel": "Las revisiones del producto" - }, - "toolbar": { - "publishAll": "publicar todo" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/fr.json b/imports/plugins/core/revisions/server/i18n/fr.json deleted file mode 100644 index 61f4afef4..000000000 --- a/imports/plugins/core/revisions/server/i18n/fr.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "fr", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Aperçu", - "revisionsLabel": "Versions", - "revisionsTitle": "Versions", - "revisionsDescription": "Gestion de versions" - }, - "catalogSettings": { - "productRevisionsLabel": "Gestion de versions des produits" - }, - "toolbar": { - "publishAll": "Tout publier" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/he.json b/imports/plugins/core/revisions/server/i18n/he.json deleted file mode 100644 index 7a2cc9d0e..000000000 --- a/imports/plugins/core/revisions/server/i18n/he.json +++ /dev/null @@ -1,5 +0,0 @@ -[{ - "i18n": "he", - "ns": "reaction-revisions", - "translation": { } -}] diff --git a/imports/plugins/core/revisions/server/i18n/hr.json b/imports/plugins/core/revisions/server/i18n/hr.json deleted file mode 100644 index ce55ba260..000000000 --- a/imports/plugins/core/revisions/server/i18n/hr.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "hr", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "pregled", - "revisionsLabel": "Izmjene", - "revisionsTitle": "Izmjene", - "revisionsDescription": "kontrola Revizija" - }, - "catalogSettings": { - "productRevisionsLabel": "Izmjene proizvoda" - }, - "toolbar": { - "publishAll": "objaviti sve" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/hu.json b/imports/plugins/core/revisions/server/i18n/hu.json deleted file mode 100644 index 1357f81f0..000000000 --- a/imports/plugins/core/revisions/server/i18n/hu.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "hu", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Előnézet", - "revisionsLabel": "Változatok", - "revisionsTitle": "Változatok", - "revisionsDescription": "Revision szabályozás" - }, - "catalogSettings": { - "productRevisionsLabel": "termék Változatok" - }, - "toolbar": { - "publishAll": "közzétenni minden" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/index.js b/imports/plugins/core/revisions/server/i18n/index.js deleted file mode 100644 index 3f6a8d87f..000000000 --- a/imports/plugins/core/revisions/server/i18n/index.js +++ /dev/null @@ -1,32 +0,0 @@ -import { loadTranslations } from "/server/startup/i18n"; - -// import ar from "./ar.json"; -// import bg from "./bg.json"; -// import de from "./de.json"; -// import el from "./el.json"; -import en from "./en.json"; -// import es from "./es.json"; -// import fr from "./fr.json"; -// import he from "./he.json"; -// import hr from "./hr.json"; -// import it from "./it.json"; -// import my from "./my.json"; -// import nb from "./nb.json"; -// import nl from "./nl.json"; -// import pl from "./pl.json"; -// import pt from "./pt.json"; -// import ro from "./ro.json"; -// import ru from "./ru.json"; -// import sl from "./sl.json"; -// import sv from "./sv.json"; -// import tr from "./tr.json"; -// import vi from "./vi.json"; -// import zh from "./zh.json"; - -// -// we want all the files in individual -// imports for easier handling by -// automated translation software -// -loadTranslations([en]); -// loadTranslations([ar, bg, de, el, en, es, fr, he, hr, it, my, nb, nl, pl, pt, ro, ru, sl, sv, tr, vi, zh]); diff --git a/imports/plugins/core/revisions/server/i18n/it.json b/imports/plugins/core/revisions/server/i18n/it.json deleted file mode 100644 index f3e540553..000000000 --- a/imports/plugins/core/revisions/server/i18n/it.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "it", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Anteprima", - "revisionsLabel": "revisioni", - "revisionsTitle": "revisioni", - "revisionsDescription": "controllo di revisione" - }, - "catalogSettings": { - "productRevisionsLabel": "Le revisioni del prodotto" - }, - "toolbar": { - "publishAll": "pubblicare Tutto" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/my.json b/imports/plugins/core/revisions/server/i18n/my.json deleted file mode 100644 index b67ca31ef..000000000 --- a/imports/plugins/core/revisions/server/i18n/my.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "my", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "ကို preview", - "revisionsLabel": "တည်းဖြတ်မူများကို", - "revisionsTitle": "တည်းဖြတ်မူများကို", - "revisionsDescription": "တည်းဖြတ်မူထိန်းချုပ်မှု" - }, - "catalogSettings": { - "productRevisionsLabel": "ကုန်ပစ္စည်းပြင်ဆင်ချက်များကို" - }, - "toolbar": { - "publishAll": "အားလုံး Publish" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/nb.json b/imports/plugins/core/revisions/server/i18n/nb.json deleted file mode 100644 index 80dd19ca6..000000000 --- a/imports/plugins/core/revisions/server/i18n/nb.json +++ /dev/null @@ -1,5 +0,0 @@ -[{ - "i18n": "nb", - "ns": "reaction-revisions", - "translation": { } -}] diff --git a/imports/plugins/core/revisions/server/i18n/nl.json b/imports/plugins/core/revisions/server/i18n/nl.json deleted file mode 100644 index be3191b74..000000000 --- a/imports/plugins/core/revisions/server/i18n/nl.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "nl", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Voorbeeld", - "revisionsLabel": "herzieningen", - "revisionsTitle": "herzieningen", - "revisionsDescription": "controle Revision" - }, - "catalogSettings": { - "productRevisionsLabel": "product revisies" - }, - "toolbar": { - "publishAll": "Alle publiceren" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/pl.json b/imports/plugins/core/revisions/server/i18n/pl.json deleted file mode 100644 index b0fadff88..000000000 --- a/imports/plugins/core/revisions/server/i18n/pl.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "pl", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Zapowiedź", - "revisionsLabel": "rewizje", - "revisionsTitle": "rewizje", - "revisionsDescription": "kontroli wersji" - }, - "catalogSettings": { - "productRevisionsLabel": "Wersje produktu" - }, - "toolbar": { - "publishAll": "publikuje wszystkie" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/pt.json b/imports/plugins/core/revisions/server/i18n/pt.json deleted file mode 100644 index 50d772356..000000000 --- a/imports/plugins/core/revisions/server/i18n/pt.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "pt", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "visualização", - "revisionsLabel": "revisões", - "revisionsTitle": "revisões", - "revisionsDescription": "controle de revisão" - }, - "catalogSettings": { - "productRevisionsLabel": "As revisões de produtos" - }, - "toolbar": { - "publishAll": "publicar todos" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/ro.json b/imports/plugins/core/revisions/server/i18n/ro.json deleted file mode 100644 index 3f3be9ba3..000000000 --- a/imports/plugins/core/revisions/server/i18n/ro.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "ro", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "previzualizare", - "revisionsLabel": "reviziile", - "revisionsTitle": "reviziile", - "revisionsDescription": "controlul revizuirii" - }, - "catalogSettings": { - "productRevisionsLabel": "Revizuiri produsului" - }, - "toolbar": { - "publishAll": "publicaţi toate" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/ru.json b/imports/plugins/core/revisions/server/i18n/ru.json deleted file mode 100644 index 6242c1d6d..000000000 --- a/imports/plugins/core/revisions/server/i18n/ru.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "ru", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Предварительный просмотр", - "revisionsLabel": "Ревизии", - "revisionsTitle": "Ревизии", - "revisionsDescription": "контроль версий" - }, - "catalogSettings": { - "productRevisionsLabel": "Ревизии продукта" - }, - "toolbar": { - "publishAll": "Опубликовать все" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/sl.json b/imports/plugins/core/revisions/server/i18n/sl.json deleted file mode 100644 index c2ec0e0e7..000000000 --- a/imports/plugins/core/revisions/server/i18n/sl.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "sl", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "predogled", - "revisionsLabel": "Revizije", - "revisionsTitle": "Revizije", - "revisionsDescription": "nadzor revizija" - }, - "catalogSettings": { - "productRevisionsLabel": "Revizije izdelka" - }, - "toolbar": { - "publishAll": "objavi Vse" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/sv.json b/imports/plugins/core/revisions/server/i18n/sv.json deleted file mode 100644 index 7bb54c470..000000000 --- a/imports/plugins/core/revisions/server/i18n/sv.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "sv", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Förhandsvisning", - "revisionsLabel": "revideringar", - "revisionsTitle": "revideringar", - "revisionsDescription": "revisionskontroll" - }, - "catalogSettings": { - "productRevisionsLabel": "produkt~~POS=TRUNC Revideringar" - }, - "toolbar": { - "publishAll": "publicera All" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/tr.json b/imports/plugins/core/revisions/server/i18n/tr.json deleted file mode 100644 index e08af4a70..000000000 --- a/imports/plugins/core/revisions/server/i18n/tr.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "tr", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Önizleme", - "revisionsLabel": "Düzeltmeler", - "revisionsTitle": "Düzeltmeler", - "revisionsDescription": "Revizyon kontrolü" - }, - "catalogSettings": { - "productRevisionsLabel": "Ürün Düzeltmeler" - }, - "toolbar": { - "publishAll": "Tümünü Yayınla" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/vi.json b/imports/plugins/core/revisions/server/i18n/vi.json deleted file mode 100644 index 62efd5cb6..000000000 --- a/imports/plugins/core/revisions/server/i18n/vi.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "vi", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "Xem trước", - "revisionsLabel": "Revisions", - "revisionsTitle": "Revisions", - "revisionsDescription": "kiểm soát sửa đổi" - }, - "catalogSettings": { - "productRevisionsLabel": "Sửa đổi sản phẩm" - }, - "toolbar": { - "publishAll": "Xuất bản Tất cả" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/i18n/zh.json b/imports/plugins/core/revisions/server/i18n/zh.json deleted file mode 100644 index 9cc0052a7..000000000 --- a/imports/plugins/core/revisions/server/i18n/zh.json +++ /dev/null @@ -1,22 +0,0 @@ -[{ - "i18n": "zh", - "ns": "reaction-revisions", - "translation": { - "reaction-revisions": { - "admin": { - "dashboard": { - "preview": "预习", - "revisionsLabel": "修订", - "revisionsTitle": "修订", - "revisionsDescription": "版本控制" - }, - "catalogSettings": { - "productRevisionsLabel": "产品修订" - }, - "toolbar": { - "publishAll": "所有发布" - } - } - } - } -}] diff --git a/imports/plugins/core/revisions/server/index.js b/imports/plugins/core/revisions/server/index.js deleted file mode 100644 index 62d4d4637..000000000 --- a/imports/plugins/core/revisions/server/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import "./hooks"; -import "./methods"; -import "./i18n"; -import "./publications"; diff --git a/imports/plugins/core/revisions/server/methods.js b/imports/plugins/core/revisions/server/methods.js deleted file mode 100644 index 10d3f53ca..000000000 --- a/imports/plugins/core/revisions/server/methods.js +++ /dev/null @@ -1,216 +0,0 @@ -import { Meteor } from "meteor/meteor"; -import { check, Match } from "meteor/check"; -import { Products, MediaRecords, Revisions, Packages } from "/lib/collections"; -import { Hooks, Logger } from "/server/api"; - -function handleImageRevision(revision) { - let result = 0; - if (revision.changeType === "insert") { - result = MediaRecords.update({ - _id: revision.documentId - }, { - $set: { - metadata: { ...revision.documentData, workflow: "published" } - } - }); - } else if (revision.changeType === "remove") { - result = MediaRecords.update({ - _id: revision.documentId - }, { - $set: { - "metadata.workflow": "archived" - } - }); - } else if (revision.changeType === "update") { - result = MediaRecords.update({ - _id: revision.documentId - }, { - $set: { - metadata: { ...revision.documentData, workflow: "published" } - } - }); - Logger.debug(`setting metadata for ${revision.documentId} to ${JSON.stringify(revision.documentData, null, 4)}`); - } - // mark revision published whether we are publishing the image or not - Revisions.update({ - _id: revision._id - }, { - $set: { - "workflow.status": "revision/published" - } - }); - - return result; -} - -export function updateSettings(settings) { - check(settings, Object); - - Packages.update({ - name: "reaction-revisions" - }, { - $set: { - settings - } - }); -} - -/** - * @name publishCatalogProduct - * @method - * @summary Updates revision and publishes a product. - * - * @param {String} userId - currently logged in user - * @param {Object} selector - selector for product to update - * @param {Object} modifier - Object describing what parts of the document to update. - * @param {Object} validation - simple schema validation - * @return {String} _id of updated document - * @private - */ -function publishCatalogProduct(userId, selector, modifier, validation) { - const product = Products.findOne(selector); - const options = { - userId, - modifier, - validation, - publish: true - }; - - Hooks.Events.run("beforeUpdateCatalogProduct", product, options); - - const result = Products.update(selector, modifier, validation); - - Hooks.Events.run("afterUpdateCatalogProduct", product, options); - - // Records are not remove from the Products collection, they are only flagged as deleted. - // Run Hook to remove search record, if a product is being published as deleted - // Which is the equivalent to removing a product. - if (modifier.$set.isDeleted === true) { - Hooks.Events.run("afterRemoveProduct", product); - } - - return result; -} - -export function discardDrafts(documentIds) { - check(documentIds, Match.OneOf(String, Array)); - - let documentIdArray; - - if (Array.isArray(documentIds)) { - documentIdArray = documentIds; - } else { - documentIdArray = [documentIds]; - } - - const selector = { - "workflow.status": { - $nin: [ - "revision/published" - ] - }, - "$or": [ - { - documentId: { - $in: documentIdArray - } - }, - { - "documentData.ancestors": { - $in: documentIdArray - } - }, - { - parentDocument: { - $in: documentIds - } - } - ] - }; - - const result = Revisions.remove(selector); - - return result > 0; -} - -Meteor.methods({ - "revisions/settings/update": updateSettings, - "revisions/discard": discardDrafts, - "revisions/publish"(documentIds) { - check(documentIds, Match.OneOf(String, Array)); - - // Also publish variants if they have a draft - let revisions; - - if (Array.isArray(documentIds)) { - revisions = Revisions.find({ - "workflow.status": { - $nin: [ - "revision/published" - ] - }, - "$or": [ - { - documentId: { - $in: documentIds - } - }, - { - "documentData.ancestors": { - $in: documentIds - } - }, - { - parentDocument: { - $in: documentIds - } - } - ] - }).fetch(); - } else { - revisions = Revisions.find({ - "workflow.status": { - $nin: [ - "revision/published" - ] - }, - "$or": [ - { documentId: documentIds }, - { - "documentData.ancestors": { - $in: [documentIds] - } - } - ] - }).fetch(); - } - - let updatedDocuments = 0; - if (revisions) { - for (const revision of revisions) { - if (!revision.documentType || revision.documentType === "product") { - const res = publishCatalogProduct( - this.userId, - { - _id: revision.documentId - }, - { - $set: revision.documentData - } - ); - updatedDocuments += res; - } else if (revision.documentType === "image") { - updatedDocuments += handleImageRevision(revision); - } - } - } - - if (updatedDocuments > 0) { - return { - status: "success" - }; - } - - return false; - } -}); diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getProduct.js b/imports/plugins/core/revisions/server/no-meteor/utils/getProduct.js deleted file mode 100644 index 461b4adab..000000000 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getProduct.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * - * @method getProduct - * @summary Get a Product object by variant ID. - * This function will return an UNPUBLISHED Product Revision. - * @todo: Revisit why this function is returning unpublished product revision. - * @param {string} variantId - A product variant ID. - * @param {Object} collections - Raw mongo collections - * @return {Promise} Product object - */ -export default async function getProduct(variantId, collections) { - const { Products, Revisions } = collections; - const revision = await Revisions.findOne({ - "documentId": variantId, - "workflow.status": { - $nin: ["revision/published"] - } - }); - - if (revision && revision.documentData) { - return revision.documentData; - } - - const product = await Products.findOne({ _id: variantId }); - return product; -} diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getProduct.test.js b/imports/plugins/core/revisions/server/no-meteor/utils/getProduct.test.js deleted file mode 100644 index 7e847814a..000000000 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getProduct.test.js +++ /dev/null @@ -1,217 +0,0 @@ -import mockContext from "/imports/test-utils/helpers/mockContext"; -import getProduct from "./getProduct"; - -const mockCollections = { ...mockContext.collections }; - -const internalShopId = "123"; -const opaqueShopId = "cmVhY3Rpb24vc2hvcDoxMjM="; // reaction/shop:123 -const internalCatalogItemId = "999"; -const internalCatalogProductId = "999"; -const internalProductId = "999"; -const internalTagIds = ["923", "924"]; -const internalVariantIds = ["875", "874"]; - -const productSlug = "fake-product"; - -const createdAt = new Date("2018-04-16T15:34:28.043Z"); -const updatedAt = new Date("2018-04-17T15:34:28.043Z"); -const positionUpdatedAt = new Date("2018-04-15T15:34:28.043Z"); - -const mockVariants = [ - { - _id: internalVariantIds[0], - ancestors: [internalCatalogProductId], - barcode: "barcode", - createdAt, - height: 0, - index: 0, - inventoryManagement: true, - inventoryPolicy: false, - isLowQuantity: true, - isSoldOut: false, - isDeleted: false, - isVisible: true, - length: 0, - lowInventoryWarningThreshold: 0, - metafields: [ - { - value: "value", - namespace: "namespace", - description: "description", - valueType: "valueType", - scope: "scope", - key: "key" - } - ], - minOrderQuantity: 0, - optionTitle: "Untitled Option", - originCountry: "US", - price: 0, - shopId: internalShopId, - sku: "sku", - taxable: true, - taxCode: "0000", - taxDescription: "taxDescription", - title: "Small Concrete Pizza", - updatedAt, - variantId: internalVariantIds[0], - weight: 0, - width: 0 - }, - { - _id: internalVariantIds[1], - ancestors: [internalCatalogProductId, internalVariantIds[0]], - barcode: "barcode", - height: 2, - index: 0, - inventoryManagement: true, - inventoryPolicy: true, - isLowQuantity: true, - isSoldOut: false, - isDeleted: false, - isVisible: true, - length: 2, - lowInventoryWarningThreshold: 0, - metafields: [ - { - value: "value", - namespace: "namespace", - description: "description", - valueType: "valueType", - scope: "scope", - key: "key" - } - ], - minOrderQuantity: 0, - optionTitle: "Awesome Soft Bike", - originCountry: "US", - price: 992.0, - shopId: internalShopId, - sku: "sku", - taxable: true, - taxCode: "0000", - taxDescription: "taxDescription", - title: "One pound bag", - variantId: internalVariantIds[1], - weight: 2, - width: 2 - } -]; - -const mockProduct = { - _id: internalCatalogItemId, - shopId: internalShopId, - barcode: "barcode", - createdAt, - description: "description", - facebookMsg: "facebookMessage", - fulfillmentService: "fulfillmentService", - googleplusMsg: "googlePlusMessage", - height: 11.23, - isBackorder: false, - isLowQuantity: false, - isSoldOut: false, - length: 5.67, - lowInventoryWarningThreshold: 2, - metafields: [ - { - value: "value", - namespace: "namespace", - description: "description", - valueType: "valueType", - scope: "scope", - key: "key" - } - ], - metaDescription: "metaDescription", - minOrderQuantity: 5, - originCountry: "originCountry", - pageTitle: "pageTitle", - parcel: { - containers: "containers", - length: 4.44, - width: 5.55, - height: 6.66, - weight: 7.77 - }, - pinterestMsg: "pinterestMessage", - positions: { - _default: { - weight: 1, - position: 1, - pinned: true, - updatedAt: positionUpdatedAt.toISOString() - } - }, - price: { - max: 5.99, - min: 2.99, - range: "2.99 - 5.99" - }, - media: [ - { - metadata: { - toGrid: 1, - priority: 1, - productId: internalProductId, - variantId: null - }, - thumbnail: "http://localhost/thumbnail", - small: "http://localhost/small", - medium: "http://localhost/medium", - large: "http://localhost/large", - image: "http://localhost/original" - } - ], - productId: internalProductId, - productType: "productType", - requiresShipping: true, - shop: { - _id: opaqueShopId - }, - sku: "ABC123", - handle: productSlug, - hashtags: internalTagIds, - taxCode: "taxCode", - taxDescription: "taxDescription", - taxable: false, - title: "Fake Product Title", - twitterMsg: "twitterMessage", - type: "product-simple", - updatedAt, - mockVariants, - vendor: "vendor", - weight: 15.6, - width: 8.4 -}; - -const mockRevision = { - _id: "333", - documentId: internalProductId, - documentData: { - _id: internalProductId - }, - workflow: { - status: "revision/published" - }, - documentType: "product", - createdAt, - updatedAt, - diff: [] -}; - -// expect to return revision object if one exist -test("expect to return a product revision object if one exist", async () => { - mockCollections.Products.findOne.mockReturnValueOnce(Promise.resolve(mockProduct)); - mockCollections.Revisions.findOne.mockReturnValueOnce(Promise.resolve(mockRevision)); - const spec = await getProduct(internalVariantIds[0], mockCollections); - expect(spec).toEqual(mockRevision.documentData); -}); - -// expect to return a product object if no revision exist -test("expect to return a product object if no revision exist", async () => { - mockCollections.Products.findOne.mockReturnValueOnce(Promise.resolve(mockProduct)); - mockCollections.Revisions.findOne.mockReturnValueOnce(Promise.resolve(undefined)); - const spec = await getProduct(internalVariantIds[0], mockCollections); - expect(spec).toEqual(mockProduct); -}); diff --git a/imports/plugins/core/revisions/server/no-meteor/utils/getVariants.js b/imports/plugins/core/revisions/server/no-meteor/utils/getVariants.js deleted file mode 100644 index ef74c4e7f..000000000 --- a/imports/plugins/core/revisions/server/no-meteor/utils/getVariants.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * @method getVariants - * @summary Get all of a Product's Variants or only a Product's top level Variants. - * This function will return UNPUBLISHED variant Revisions. - * @todo: Revisit why this function is returning unpublished variant revisions. - * @param {string} productOrVariantId - A Product or top level Product Variant ID. - * @param {Object} collections - Raw mongo collections. - * @param {boolean} topOnly - True to return only a products top level variants. - * @return {Promise} Array of Product Variant objects. - */ -export default async function getVariants(productOrVariantId, collections, topOnly) { - const { Products, Revisions } = collections; - const variants = []; - - const productVariants = await Products.find({ - ancestors: topOnly ? [productOrVariantId] : productOrVariantId, - type: "variant", - isDeleted: { $ne: true } - }).toArray(); - - await Promise.all(productVariants.map(async (variant) => { - const revision = await Revisions.findOne({ - "documentId": variant._id, - "workflow.status": { - $nin: ["revision/published"] - } - }); - - if (revision && revision.documentData.isVisible) { - variants.push(revision.documentData); - } else if (!revision && variant.isVisible) { - variants.push(variant); - } - })); - - return variants; -} diff --git a/imports/plugins/core/revisions/server/publications.js b/imports/plugins/core/revisions/server/publications.js deleted file mode 100644 index 920769bf5..000000000 --- a/imports/plugins/core/revisions/server/publications.js +++ /dev/null @@ -1,47 +0,0 @@ -import { Meteor } from "meteor/meteor"; -import { check } from "meteor/check"; -import { Roles } from "meteor/alanning:roles"; -import { Revisions } from "/lib/collections"; -import { Reaction } from "/server/api"; - -/** - * products publication - * @param {Number} productScrollLimit - optional, defaults to 24 - * @param {Array} shops - array of shopId to retrieve product from. - * @return {Object} return product cursor - */ -Meteor.publish("ProductRevisions", function (productIds) { - check(productIds, Array); - - const shop = Reaction.getShopId(); - // Authorized content curators fo the shop get special publication of the product - // all all relevant revisions all is one package - if (Roles.userIsInRole(this.userId, ["owner", "admin", "createProduct"], shop._id)) { - return Revisions.find({ - "$or": [ - { - documentId: { - $in: productIds - } - }, - { - "documentData.ancestors": { - $in: productIds - } - }, - { - parentDocument: { - $in: productIds - } - } - ], - "workflow.status": { - $nin: [ - "revision/published" - ] - } - }); - } - - return this.ready(); -}); diff --git a/imports/plugins/core/taxes/lib/collections/schemas/config.js b/imports/plugins/core/taxes/lib/collections/schemas/config.js index 4606382f8..6a8d5fdad 100644 --- a/imports/plugins/core/taxes/lib/collections/schemas/config.js +++ b/imports/plugins/core/taxes/lib/collections/schemas/config.js @@ -1,5 +1,5 @@ import { registerSchema } from "@reactioncommerce/schemas"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { Taxes } from "./taxes"; /** diff --git a/imports/plugins/core/taxes/lib/collections/schemas/taxes.js b/imports/plugins/core/taxes/lib/collections/schemas/taxes.js index a4de41639..0618fdf91 100644 --- a/imports/plugins/core/taxes/lib/collections/schemas/taxes.js +++ b/imports/plugins/core/taxes/lib/collections/schemas/taxes.js @@ -1,7 +1,6 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { shopIdAutoValue } from "/lib/collections/schemas/helpers"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -13,7 +12,6 @@ import { registerSchema } from "@reactioncommerce/schemas"; export const Taxes = new SimpleSchema({ "shopId": { type: String, - autoValue: shopIdAutoValue, index: 1, label: "Taxes shopId" }, diff --git a/imports/plugins/core/taxes/server/methods/methods.js b/imports/plugins/core/taxes/server/methods/methods.js index 41487fb24..8d4a970e0 100644 --- a/imports/plugins/core/taxes/server/methods/methods.js +++ b/imports/plugins/core/taxes/server/methods/methods.js @@ -47,6 +47,7 @@ export const methods = { if (docId) return Meteor.call("taxes/editRate", { _id: docId, modifier: doc }); if (!Reaction.hasPermission("taxes")) throw new Meteor.Error("access-denied", "Access Denied"); + doc.shopId = Reaction.getShopId(); return Taxes.insert(doc); }, diff --git a/imports/plugins/core/templates/lib/collections/schemas/emailtemplates.js b/imports/plugins/core/templates/lib/collections/schemas/emailtemplates.js index 97cc29177..662cfd32d 100644 --- a/imports/plugins/core/templates/lib/collections/schemas/emailtemplates.js +++ b/imports/plugins/core/templates/lib/collections/schemas/emailtemplates.js @@ -2,7 +2,6 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; import { Templates } from "/lib/collections"; -import { shopIdAutoValue } from "/lib/collections/schemas/helpers"; import { registerSchema } from "@reactioncommerce/schemas"; /** @@ -15,7 +14,6 @@ export const EmailTemplates = new SimpleSchema({ "shopId": { type: String, index: 1, - autoValue: shopIdAutoValue, label: "Template ShopId" }, "name": { diff --git a/imports/plugins/core/ui-tagnav/client/helpers/tags.js b/imports/plugins/core/ui-tagnav/client/helpers/tags.js index 1d4d4b970..f1fb516c0 100644 --- a/imports/plugins/core/ui-tagnav/client/helpers/tags.js +++ b/imports/plugins/core/ui-tagnav/client/helpers/tags.js @@ -188,4 +188,11 @@ export const TagHelpers = { } }; +/** + * @method reactionSubTags + * @summary Template method to return subTags + * @param parentTag {Object} Tag + * @return {Array} Array of subtags or empty Array + * @memberof BlazeTemplateHelpers + */ Template.registerHelper("reactionSubTags", TagHelpers.subTags); diff --git a/imports/plugins/core/ui/client/containers/edit.js b/imports/plugins/core/ui/client/containers/edit.js index 0d46f4577..ff6df2e65 100644 --- a/imports/plugins/core/ui/client/containers/edit.js +++ b/imports/plugins/core/ui/client/containers/edit.js @@ -65,47 +65,8 @@ class EditContainer extends Component { renderEditButton() { let status; let tooltip; - let hasChange = false; - - if (this.props.data.__draft && this.props.field) { - const draft = this.props.data.__draft; - - if (Array.isArray(draft.diff)) { - for (const diff of draft.diff) { - let hasChangedField = false; - - if (Array.isArray(this.props.field)) { - if (this.props.field.indexOf(diff.path[0]) >= 0) { - hasChangedField = true; - } - } else if (typeof this.props.field === "string" && this.props.field === diff.path[0]) { - hasChangedField = true; - } - - if (hasChangedField) { - status = "warning"; - - tooltip = ( - - - - ); - - hasChange = true; - } - } - } - } else if (this.props.data.__draft) { - status = "warning"; - - tooltip = ( - - - - ); - } - if (this.props.autoHideEditButton && hasChange === false) { + if (this.props.autoHideEditButton) { return null; } diff --git a/imports/plugins/core/ui/client/containers/inventoryBadge.js b/imports/plugins/core/ui/client/containers/inventoryBadge.js index 3134cdc3b..8c6afe5f1 100644 --- a/imports/plugins/core/ui/client/containers/inventoryBadge.js +++ b/imports/plugins/core/ui/client/containers/inventoryBadge.js @@ -1,25 +1,52 @@ import { registerComponent, composeWithTracker } from "@reactioncommerce/reaction-components"; import { InventoryBadge } from "../components/badge"; +import { Reaction } from "/client/api"; import { ReactionProduct } from "/lib/api"; const composer = (props, onData) => { const { variant, soldOut } = props; - const { inventoryManagement, inventoryPolicy, lowInventoryWarningThreshold } = variant; - const inventoryQuantity = ReactionProduct.getVariantQuantity(variant); + const { + inventoryManagement, + inventoryPolicy, + lowInventoryWarningThreshold, + isSoldOut, + isBackorder, + isLowQuantity + } = variant; let label = null; let i18nKeyLabel = null; let status = null; - // TODO: update this to use Catalog API. - if (inventoryManagement && !inventoryPolicy && inventoryQuantity === 0) { - status = "info"; - label = "Backorder"; - i18nKeyLabel = "productDetail.backOrder"; - } else if (soldOut) { - status = "danger"; - label = "Sold Out!"; - i18nKeyLabel = "productDetail.soldOut"; - } else if (inventoryManagement) { - if (lowInventoryWarningThreshold >= inventoryQuantity) { + + // Admins pull variants from the Products collection + if (Reaction.hasPermission(["createProduct"], Reaction.getShopId())) { + const inventoryQuantity = ReactionProduct.getVariantQuantity(variant); + // Product collection variant + if (inventoryManagement && !inventoryPolicy && inventoryQuantity === 0) { + status = "info"; + label = "Backorder"; + i18nKeyLabel = "productDetail.backOrder"; + } else if (soldOut) { + status = "danger"; + label = "Sold Out!"; + i18nKeyLabel = "productDetail.soldOut"; + } else if (inventoryManagement) { + if (lowInventoryWarningThreshold >= inventoryQuantity) { + status = "warning"; + label = "Limited Supply"; + i18nKeyLabel = "productDetail.limitedSupply"; + } + } + } else if (inventoryManagement) { // Customers pull variants from the Catalog collection + // Catalog item variant + if (isBackorder) { + status = "info"; + label = "Backorder"; + i18nKeyLabel = "productDetail.backOrder"; + } else if (isSoldOut) { + status = "danger"; + label = "Sold Out!"; + i18nKeyLabel = "productDetail.soldOut"; + } else if (isLowQuantity) { status = "warning"; label = "Limited Supply"; i18nKeyLabel = "productDetail.limitedSupply"; diff --git a/imports/plugins/core/ui/client/containers/mediaGallery.js b/imports/plugins/core/ui/client/containers/mediaGallery.js index c6c4429be..49200aef6 100644 --- a/imports/plugins/core/ui/client/containers/mediaGallery.js +++ b/imports/plugins/core/ui/client/containers/mediaGallery.js @@ -10,8 +10,6 @@ import { Meteor } from "meteor/meteor"; import MediaGallery from "../components/media/mediaGallery"; import { Logger, Reaction } from "/client/api"; import { ReactionProduct } from "/lib/api"; -import { Revisions } from "/lib/collections"; -import { isRevisionControlEnabled } from "/imports/plugins/core/revisions/lib/api"; import { Media } from "/imports/plugins/core/files/client"; const wrapComponent = (Comp) => ( @@ -214,18 +212,6 @@ const wrapComponent = (Comp) => ( } ); -function fetchMediaRevisions() { - const productId = ReactionProduct.selectedProductId(); - const mediaRevisions = Revisions.find({ - "parentDocument": productId, - "documentType": "image", - "workflow.status": { - $nin: ["revision/published"] - } - }).fetch(); - return mediaRevisions; -} - // resort the media in function sortMedia(media) { const sortedMedia = _.sortBy(media, (m) => { @@ -238,35 +224,10 @@ function sortMedia(media) { return sortedMedia; } -// Search through revisions and if we find one for the image, stick it on the object -function appendRevisionsToMedia(props, media) { - if (!isRevisionControlEnabled() || !Reaction.hasPermission(props.permission || ["createProduct"])) { - return media; - } - const mediaRevisions = fetchMediaRevisions(); - const newMedia = []; - for (const image of media) { - image.revision = undefined; - for (const revision of mediaRevisions) { - if (revision.documentId === image._id) { - image.revision = revision; - image.metadata.priority = revision.documentData.priority; - } - } - newMedia.push(image); - } - return sortMedia(newMedia); -} - function composer(props, onData) { - let media; let editable; const viewAs = Reaction.getUserPreferences("reaction-dashboard", "viewAs", "administrator"); - if (props.media) { - media = appendRevisionsToMedia(props, props.media); - } - if (viewAs === "customer") { editable = false; } else { @@ -275,7 +236,7 @@ function composer(props, onData) { onData(null, { editable, - media + media: sortMedia(props.media) }); } diff --git a/imports/plugins/core/versions/server/migrations/26_remove_revision_control.js b/imports/plugins/core/versions/server/migrations/26_remove_revision_control.js new file mode 100644 index 000000000..7ab0e9cae --- /dev/null +++ b/imports/plugins/core/versions/server/migrations/26_remove_revision_control.js @@ -0,0 +1,12 @@ +import { Migrations } from "meteor/percolate:migrations"; +import { Packages } from "/lib/collections"; + +// Migration file created for removing the revision control package registry entry from all shops +Migrations.add({ + version: 26, + up() { + Packages.remove({ + name: "reaction-revisions" + }); + } +}); diff --git a/imports/plugins/core/versions/server/migrations/index.js b/imports/plugins/core/versions/server/migrations/index.js index cc4502f80..f00a9ee42 100644 --- a/imports/plugins/core/versions/server/migrations/index.js +++ b/imports/plugins/core/versions/server/migrations/index.js @@ -23,3 +23,4 @@ import "./22_register_verify_account"; import "./23_drop_tempstore_collections"; import "./24_publish_all_existing_visible_products"; import "./25_update_catalog_schema.js"; +import "./26_remove_revision_control"; diff --git a/imports/plugins/included/connectors-shopify/lib/collections/schemas/shopifyConnect.js b/imports/plugins/included/connectors-shopify/lib/collections/schemas/shopifyConnect.js index 2b0056ca8..dc86cdd7e 100644 --- a/imports/plugins/included/connectors-shopify/lib/collections/schemas/shopifyConnect.js +++ b/imports/plugins/included/connectors-shopify/lib/collections/schemas/shopifyConnect.js @@ -1,7 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/discount-codes/server/methods/methods.js b/imports/plugins/included/discount-codes/server/methods/methods.js index 5117291c0..9e571348e 100644 --- a/imports/plugins/included/discount-codes/server/methods/methods.js +++ b/imports/plugins/included/discount-codes/server/methods/methods.js @@ -128,6 +128,7 @@ export const methods = { if (docId) return Meteor.call("discounts/editCode", { _id: docId, modifier: doc }); if (!Reaction.hasPermission("discount-codes")) throw new Meteor.Error("access-denied", "Access Denied"); + doc.shopId = Reaction.getShopId(); return Discounts.insert(doc); }, @@ -191,10 +192,13 @@ export const methods = { Collection.update(selector, update); } // TODO: update a history record of transaction + // The Payment schema's currency defaultValue is adding {} to the $pull condition. + // If this issue is eventually fixed, autoValues can be re-enabled here + // See https://github.com/aldeed/simple-schema-js/issues/272 const result = Collection.update( { _id: id }, { $set: { discount: currentDiscount }, $pull: { billing: { _id: codeId } } }, - { multi: true } + { multi: true, getAutoValues: false } ); // calculate discounts diff --git a/imports/plugins/included/discount-rates/server/methods/methods.js b/imports/plugins/included/discount-rates/server/methods/methods.js index f6c7899e5..4ab221b39 100644 --- a/imports/plugins/included/discount-rates/server/methods/methods.js +++ b/imports/plugins/included/discount-rates/server/methods/methods.js @@ -54,6 +54,7 @@ export const methods = { if (docId) return Meteor.call("discounts/editRate", { _id: docId, modifier: doc }); if (!Reaction.hasPermission("discount-rates")) throw new Meteor.Error("access-denied", "Access Denied"); + doc.shopId = Reaction.getShopId(); return Discounts.insert(doc); }, diff --git a/imports/plugins/included/inventory/server/methods/inventory.app-test.js b/imports/plugins/included/inventory/server/methods/inventory.app-test.js index 91f56bdb3..98cdde81a 100644 --- a/imports/plugins/included/inventory/server/methods/inventory.app-test.js +++ b/imports/plugins/included/inventory/server/methods/inventory.app-test.js @@ -8,7 +8,6 @@ import { expect } from "meteor/practicalmeteor:chai"; import { sinon } from "meteor/practicalmeteor:sinon"; import { addProduct } from "/server/imports/fixtures/products"; import Fixtures from "/server/imports/fixtures"; -import { RevisionApi } from "/imports/plugins/core/revisions/lib/api/revisions"; Fixtures(); @@ -41,7 +40,6 @@ describe("inventory method", function () { beforeEach(function () { sandbox = sinon.sandbox.create(); - sandbox.stub(RevisionApi, "isRevisionControlEnabled", () => true); // again hack. w/o this we can't remove products from previous spec. Inventory.remove({}); // Empty Inventory }); diff --git a/imports/plugins/included/inventory/server/methods/inventory.js b/imports/plugins/included/inventory/server/methods/inventory.js index 8c41e7209..bc049e059 100644 --- a/imports/plugins/included/inventory/server/methods/inventory.js +++ b/imports/plugins/included/inventory/server/methods/inventory.js @@ -2,7 +2,7 @@ import { Meteor } from "meteor/meteor"; import { Inventory, Products } from "/lib/collections"; import { Logger, Reaction } from "/server/api"; import rawCollections from "/imports/collections/rawCollections"; -import getVariants from "/imports/plugins/core/revisions/server/no-meteor/utils/getVariants"; +import getVariants from "/imports/plugins/core/catalog/server/no-meteor/utils/getVariants"; /** * @namespace Inventory/Methods diff --git a/imports/plugins/included/marketplace/lib/collections/schemas/marketplace.js b/imports/plugins/included/marketplace/lib/collections/schemas/marketplace.js index 504776ddf..76ce10424 100644 --- a/imports/plugins/included/marketplace/lib/collections/schemas/marketplace.js +++ b/imports/plugins/included/marketplace/lib/collections/schemas/marketplace.js @@ -1,8 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; -import { Shop } from "/lib/collections/schemas/shops.js"; +import { PackageConfig, Shop } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/payments-authnet/lib/collections/schemas/authnet.js b/imports/plugins/included/payments-authnet/lib/collections/schemas/authnet.js index c0dd32867..249649f8f 100644 --- a/imports/plugins/included/payments-authnet/lib/collections/schemas/authnet.js +++ b/imports/plugins/included/payments-authnet/lib/collections/schemas/authnet.js @@ -1,7 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/payments-braintree/lib/collections/schemas/braintree.js b/imports/plugins/included/payments-braintree/lib/collections/schemas/braintree.js index 3b030de8b..cbc5b914a 100644 --- a/imports/plugins/included/payments-braintree/lib/collections/schemas/braintree.js +++ b/imports/plugins/included/payments-braintree/lib/collections/schemas/braintree.js @@ -1,7 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/payments-example/lib/collections/schemas/example.js b/imports/plugins/included/payments-example/lib/collections/schemas/example.js index 2fd1702e8..e563b7075 100644 --- a/imports/plugins/included/payments-example/lib/collections/schemas/example.js +++ b/imports/plugins/included/payments-example/lib/collections/schemas/example.js @@ -1,7 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/payments-paypal/lib/collections/schemas/paypal.js b/imports/plugins/included/payments-paypal/lib/collections/schemas/paypal.js index a44b410a5..8c3166bc3 100644 --- a/imports/plugins/included/payments-paypal/lib/collections/schemas/paypal.js +++ b/imports/plugins/included/payments-paypal/lib/collections/schemas/paypal.js @@ -1,7 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/payments-stripe/lib/collections/schemas/stripe.js b/imports/plugins/included/payments-stripe/lib/collections/schemas/stripe.js index 6431d4cf6..4ef7e2f42 100644 --- a/imports/plugins/included/payments-stripe/lib/collections/schemas/stripe.js +++ b/imports/plugins/included/payments-stripe/lib/collections/schemas/stripe.js @@ -1,7 +1,7 @@ import SimpleSchema from "simpl-schema"; import { check } from "meteor/check"; import { Tracker } from "meteor/tracker"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/product-admin/client/containers/productAdmin.js b/imports/plugins/included/product-admin/client/containers/productAdmin.js index f6c40b868..eab597c0b 100644 --- a/imports/plugins/included/product-admin/client/containers/productAdmin.js +++ b/imports/plugins/included/product-admin/client/containers/productAdmin.js @@ -37,12 +37,7 @@ const wrapComponent = (Comp) => ( } handleProductFieldSave = (productId, fieldName, value) => { - let updateValue = value; - // special case, slugify handles. - if (fieldName === "handle") { - updateValue = Reaction.getSlug(value); - } - Meteor.call("products/updateProductField", productId, fieldName, updateValue, (error) => { + Meteor.call("products/updateProductField", productId, fieldName, value, (error) => { if (error) { Alerts.toast(error.message, "error"); this.forceUpdate(); diff --git a/imports/plugins/included/product-detail-simple/client/components/childVariant.js b/imports/plugins/included/product-detail-simple/client/components/childVariant.js index 6ab484ec9..bd6f82f8b 100644 --- a/imports/plugins/included/product-detail-simple/client/components/childVariant.js +++ b/imports/plugins/included/product-detail-simple/client/components/childVariant.js @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import classnames from "classnames"; import { Components, registerComponent } from "@reactioncommerce/reaction-components"; import { Validation } from "@reactioncommerce/schemas"; -import { ProductVariant } from "/lib/collections/schemas/products"; +import { ProductVariant } from "/lib/collections/schemas"; class ChildVariant extends Component { @@ -17,7 +17,7 @@ class ChildVariant extends Component { }; } - componentWillMount() { + componentDidMount() { this.variantValidation(); } @@ -94,7 +94,9 @@ class ChildVariant extends Component { // http://stackoverflow.com/questions/30580638/pass-parent-prop-to-children-reactjs?rq=1 renderValidationButton = () => { - if (this.state.invalidVariant === true) { + if (this.props.isEditable === false) { + return null; + } else if (this.state.invalidVariant === true) { return ( ); } + + return null; } // checks whether the product variant is validated @@ -157,6 +161,7 @@ class ChildVariant extends Component { ChildVariant.propTypes = { editButton: PropTypes.node, + isEditable: PropTypes.bool, isSelected: PropTypes.bool, media: PropTypes.arrayOf(PropTypes.object), onClick: PropTypes.func.isRequired, diff --git a/imports/plugins/included/product-detail-simple/client/components/variant.js b/imports/plugins/included/product-detail-simple/client/components/variant.js index e9ce9033f..cf516413d 100644 --- a/imports/plugins/included/product-detail-simple/client/components/variant.js +++ b/imports/plugins/included/product-detail-simple/client/components/variant.js @@ -21,7 +21,7 @@ class Variant extends Component { }; } - componentWillMount() { + componentDidMount() { this.variantValidation(); } @@ -56,7 +56,9 @@ class Variant extends Component { } renderValidationButton = () => { - if (this.state.selfValidation.isValid === false) { + if (this.props.editable === false) { + return null; + } else if (this.state.selfValidation.isValid === false) { return ( ); - } - if (this.state.invalidVariant.length) { + } else if (this.state.invalidVariant.length) { return ( ); } + + return null; } variantValidation = () => { @@ -122,7 +125,7 @@ class Variant extends Component { const variantElement = (
  • { diff --git a/imports/plugins/included/product-variant/client/templates/products/productSettings/productSettings.js b/imports/plugins/included/product-variant/client/templates/products/productSettings/productSettings.js index 013dd3c69..0abc5284d 100644 --- a/imports/plugins/included/product-variant/client/templates/products/productSettings/productSettings.js +++ b/imports/plugins/included/product-variant/client/templates/products/productSettings/productSettings.js @@ -6,8 +6,6 @@ import { Reaction } from "/client/api"; import Logger from "/client/modules/logger"; import { Catalog, getPrimaryMediaForItem, ReactionProduct } from "/lib/api"; import { Products } from "/lib/collections"; -import { isRevisionControlEnabled } from "/imports/plugins/core/revisions/lib/api"; -import { applyProductRevision } from "/lib/api/products"; function updateVariantProductField(variants, field, value) { return variants.map((variant) => Meteor.call("products/updateProductField", variant._id, field, value)); @@ -30,7 +28,7 @@ Template.productSettings.onCreated(function () { _id: { $in: productIds } - }).map((product) => applyProductRevision(product)); + }).fetch(); this.state.set("productIds", productIds); this.state.set("products", products); @@ -122,28 +120,18 @@ Template.productSettings.events({ const instance = Template.instance(); const products = instance.state.get("products") || []; - if (isRevisionControlEnabled()) { - for (const product of products) { - // Update the visibility using the first selected product to determine the proper - // visibility toggle. This is to ensure that all selected products will become visible or not visible - // at the same time so it's not confusing. - Meteor.call("products/updateProductField", product._id, "isVisible", !products[0].isVisible); - // update the variants visibility - const variants = Products.find({ - ancestors: { - $in: [product._id] - } - }); - updateVariantProductField(variants, "isVisible", !products[0].isVisible); - } - } else { - // The legacy behavior will bulk toggle visibilty of each product seperatly. - // - // Example: - // If you selected 10 products, and 5 were visible and 5 were not visible, and then - // clicked the visibility button, 5 products would switched from not visible to visible, and the other 5 - // would be swiched from visible to not visible. - ReactionProduct.publishProduct(products); + for (const product of products) { + // Update the visibility using the first selected product to determine the proper + // visibility toggle. This is to ensure that all selected products will become visible or not visible + // at the same time so it's not confusing. + Meteor.call("products/updateProductField", product._id, "isVisible", !products[0].isVisible); + // update the variants visibility + const variants = Products.find({ + ancestors: { + $in: [product._id] + } + }); + updateVariantProductField(variants, "isVisible", !products[0].isVisible); } }, "click [data-event-action=cloneProduct]"() { diff --git a/imports/plugins/included/product-variant/components/variantForm.js b/imports/plugins/included/product-variant/components/variantForm.js index 4e46afa9e..b1f1bf924 100644 --- a/imports/plugins/included/product-variant/components/variantForm.js +++ b/imports/plugins/included/product-variant/components/variantForm.js @@ -173,13 +173,13 @@ class VariantForm extends Component { const inverseValue = !value; this.setState(({ variant }) => ({ + inventoryPolicy: inverseValue, variant: { ...variant, [field]: inverseValue } })); - this.handleFieldBlur(event, inverseValue, field); } diff --git a/imports/plugins/included/product-variant/containers/gridItemControlsContainer.js b/imports/plugins/included/product-variant/containers/gridItemControlsContainer.js index 99b29e26e..78399986e 100644 --- a/imports/plugins/included/product-variant/containers/gridItemControlsContainer.js +++ b/imports/plugins/included/product-variant/containers/gridItemControlsContainer.js @@ -7,7 +7,7 @@ import { Validation } from "@reactioncommerce/schemas"; import { Reaction } from "/client/api"; import GridItemControls from "../components/gridItemControls"; import { ReactionProduct } from "/lib/api"; -import { ProductVariant } from "/lib/collections/schemas/products"; +import { ProductVariant } from "/lib/collections/schemas"; const wrapComponent = (Comp) => ( class GridItemControlsContainer extends Component { diff --git a/imports/plugins/included/product-variant/containers/gridPublishContainer.js b/imports/plugins/included/product-variant/containers/gridPublishContainer.js index 52df62f84..d18c46c21 100644 --- a/imports/plugins/included/product-variant/containers/gridPublishContainer.js +++ b/imports/plugins/included/product-variant/containers/gridPublishContainer.js @@ -5,7 +5,7 @@ import { Meteor } from "meteor/meteor"; import { Session } from "meteor/session"; import { ReactionProduct } from "/lib/api"; import { Products } from "/lib/collections"; -import PublishContainer from "/imports/plugins/core/revisions/client/containers/publishContainer"; +import PublishContainer from "/imports/plugins/core/catalog/client/containers/publishContainer"; class GridProductPublishContainer extends Component { static propTypes = { diff --git a/imports/plugins/included/product-variant/containers/productsContainerAdmin.js b/imports/plugins/included/product-variant/containers/productsContainerAdmin.js index 285ffceb9..e4c4768fc 100644 --- a/imports/plugins/included/product-variant/containers/productsContainerAdmin.js +++ b/imports/plugins/included/product-variant/containers/productsContainerAdmin.js @@ -9,7 +9,6 @@ import { Tracker } from "meteor/tracker"; import { Reaction } from "/client/api"; import { ITEMS_INCREMENT } from "/client/config/defaults"; import { ReactionProduct } from "/lib/api"; -import { applyProductRevision, resubscribeAfterCloning } from "/lib/api/products"; import { Products, Tags, Shops } from "/lib/collections"; import ProductsComponent from "../components/products"; @@ -157,10 +156,6 @@ function composer(props, onData) { const queryParams = Object.assign({}, tags, Reaction.Router.current().query, shopIds); const productsSubscription = Meteor.subscribe("Products", scrollLimit, queryParams, sort, editMode); - if (resubscribeAfterCloning.get()) { - resubscribeAfterCloning.set(false); - productsSubscription.stop(); - } if (productsSubscription.ready()) { window.prerenderReady = true; @@ -179,12 +174,8 @@ function composer(props, onData) { shopId: { $in: activeShopsIds } }); - const productIds = []; - const products = productCursor.map((product) => { - productIds.push(product._id); - - return applyProductRevision(product); - }); + const products = productCursor.fetch(); + const productIds = productCursor.map((product) => product._id); const sortedProducts = ReactionProduct.sortProducts(products, currentTagId); Session.set("productGrid/products", sortedProducts); diff --git a/imports/plugins/included/product-variant/containers/variantEditContainer.js b/imports/plugins/included/product-variant/containers/variantEditContainer.js index 6480ed5dd..ea27e327c 100644 --- a/imports/plugins/included/product-variant/containers/variantEditContainer.js +++ b/imports/plugins/included/product-variant/containers/variantEditContainer.js @@ -7,7 +7,6 @@ import { ReactionProduct } from "/lib/api"; import { Products } from "/lib/collections"; import { Countries } from "/client/collections"; import { Reaction, i18next } from "/client/api"; -import { applyProductRevision } from "/lib/api/products"; import VariantEdit from "../components/variantEdit"; @@ -72,14 +71,13 @@ function composer(props, onData) { _id: ReactionProduct.selectedTopVariant()._id }); - const revisedVariant = applyProductRevision(variant); - const childVariants = ReactionProduct.getVariants(revisedVariant._id); + const childVariants = ReactionProduct.getVariants(variant._id); onData(null, { countries: Countries.find({}).fetch(), editFocus: Reaction.state.get("edit/focus"), childVariants, - variant: revisedVariant + variant }); } else { onData(null, { diff --git a/imports/plugins/included/product-variant/containers/variantFormContainer.js b/imports/plugins/included/product-variant/containers/variantFormContainer.js index b012cd400..9477df5dc 100644 --- a/imports/plugins/included/product-variant/containers/variantFormContainer.js +++ b/imports/plugins/included/product-variant/containers/variantFormContainer.js @@ -9,7 +9,7 @@ import { ReactionProduct } from "/lib/api"; import { Packages } from "/lib/collections"; import { Reaction, i18next } from "/client/api"; import { TaxCodes } from "/imports/plugins/core/taxes/lib/collections"; -import { ProductVariant } from "/lib/collections/schemas/products"; +import { ProductVariant } from "/lib/collections/schemas"; import VariantForm from "../components/variantForm"; const wrapComponent = (Comp) => ( diff --git a/imports/plugins/included/search-mongo/lib/collections/schemas/search.js b/imports/plugins/included/search-mongo/lib/collections/schemas/search.js index d5c7f2eda..c39ed004c 100644 --- a/imports/plugins/included/search-mongo/lib/collections/schemas/search.js +++ b/imports/plugins/included/search-mongo/lib/collections/schemas/search.js @@ -1,5 +1,5 @@ import SimpleSchema from "simpl-schema"; -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/search-mongo/server/methods/searchcollections.js b/imports/plugins/included/search-mongo/server/methods/searchcollections.js index 2ac5f68ca..4d45d6b28 100644 --- a/imports/plugins/included/search-mongo/server/methods/searchcollections.js +++ b/imports/plugins/included/search-mongo/server/methods/searchcollections.js @@ -128,7 +128,9 @@ export function buildProductSearch(cb) { const rawProductSearchCollection = ProductSearch.rawCollection(); rawProductSearchCollection.dropIndexes().catch(handleIndexUpdateFailures); - rawProductSearchCollection.createIndex(indexObject, weightObject, getSearchLanguage()).catch(handleIndexUpdateFailures); + const options = getSearchLanguage(); + options.weights = weightObject; + rawProductSearchCollection.createIndex(indexObject, options).catch(handleIndexUpdateFailures); if (cb) { cb(); } @@ -143,7 +145,9 @@ export function buildEmptyProductSearch() { } const rawProductSearchCollection = ProductSearch.rawCollection(); rawProductSearchCollection.dropIndexes().catch(handleIndexUpdateFailures); - rawProductSearchCollection.createIndex(indexObject, weightObject, getSearchLanguage()).catch(handleIndexUpdateFailures); + const options = getSearchLanguage(); + options.weights = weightObject; + rawProductSearchCollection.createIndex(indexObject, options).catch(handleIndexUpdateFailures); } export function rebuildProductSearchIndex(cb) { @@ -155,7 +159,9 @@ export function rebuildProductSearchIndex(cb) { } const rawProductSearchCollection = ProductSearch.rawCollection(); rawProductSearchCollection.dropIndexes().catch(handleIndexUpdateFailures); - rawProductSearchCollection.createIndex(indexObject, weightObject, getSearchLanguage()).catch(handleIndexUpdateFailures); + const options = getSearchLanguage(); + options.weights = weightObject; + rawProductSearchCollection.createIndex(indexObject, options).catch(handleIndexUpdateFailures); if (cb) { cb(); } @@ -169,7 +175,9 @@ export function ensureProductSearchIndex() { indexObject[field] = "text"; } const rawProductSearchCollection = ProductSearch.rawCollection(); - rawProductSearchCollection.createIndex(indexObject, weightObject, getSearchLanguage()).catch(handleIndexUpdateFailures); + const options = getSearchLanguage(); + options.weights = weightObject; + rawProductSearchCollection.createIndex(indexObject, options).catch(handleIndexUpdateFailures); } export function buildOrderSearchRecord(orderId) { diff --git a/imports/plugins/included/search-mongo/server/publications/searchresults.app-test.js b/imports/plugins/included/search-mongo/server/publications/searchresults.app-test.js index d94c32ff8..7c53b99fc 100644 --- a/imports/plugins/included/search-mongo/server/publications/searchresults.app-test.js +++ b/imports/plugins/included/search-mongo/server/publications/searchresults.app-test.js @@ -165,6 +165,10 @@ describe("Order Search results", function () { }); }); + after(function () { + OrderSearch.remove({}); + }); + describe("order search", function () { it("should match orders when searching by email", function () { const roleStub = sinon.stub(Reaction, "hasPermission", () => true); diff --git a/imports/plugins/included/shipping-rates/server/methods/rates.js b/imports/plugins/included/shipping-rates/server/methods/rates.js index 226f6bc0a..9079d9a65 100644 --- a/imports/plugins/included/shipping-rates/server/methods/rates.js +++ b/imports/plugins/included/shipping-rates/server/methods/rates.js @@ -37,6 +37,7 @@ export const methods = { } else if (!Shipping.find({}).count()) { // There is no default provider, so add it const defaultProvider = Shipping.insert({ name: "Default Shipping Provider", + shopId: Reaction.getShopId(), provider: { name: "flatRates", label: "Flat Rate" diff --git a/imports/plugins/included/shipping-shippo/lib/collections/schemas/shippo.js b/imports/plugins/included/shipping-shippo/lib/collections/schemas/shippo.js index 071b5c639..89a145818 100644 --- a/imports/plugins/included/shipping-shippo/lib/collections/schemas/shippo.js +++ b/imports/plugins/included/shipping-shippo/lib/collections/schemas/shippo.js @@ -1,4 +1,4 @@ -import { PackageConfig } from "/lib/collections/schemas/registry"; +import { PackageConfig } from "/lib/collections/schemas"; import { registerSchema } from "@reactioncommerce/schemas"; /** diff --git a/imports/plugins/included/social/client/components/settings.js b/imports/plugins/included/social/client/components/settings.js index 82b646d30..cc90eb09e 100644 --- a/imports/plugins/included/social/client/components/settings.js +++ b/imports/plugins/included/social/client/components/settings.js @@ -5,7 +5,7 @@ import { SettingsCard, Form } from "/imports/plugins/core/ui/client/components"; -import { SocialPackageConfig } from "/lib/collections/schemas/social"; +import { SocialPackageConfig } from "/lib/collections/schemas"; const socialProviders = [ { diff --git a/imports/plugins/included/taxes-avalara/client/components/avalaraSettingsForm.js b/imports/plugins/included/taxes-avalara/client/components/avalaraSettingsForm.js index bad5c23ad..ef72b5a9a 100644 --- a/imports/plugins/included/taxes-avalara/client/components/avalaraSettingsForm.js +++ b/imports/plugins/included/taxes-avalara/client/components/avalaraSettingsForm.js @@ -6,7 +6,7 @@ import { Form, Loading } from "/imports/plugins/core/ui/client/components"; import { Components } from "@reactioncommerce/reaction-components"; import { AvalaraPackageConfig } from "../../lib/collections/schemas"; import { Logs } from "/lib/collections"; -import { Logs as LogSchema } from "/lib/collections/schemas/logs"; +import { Logs as LogSchema } from "/lib/collections/schemas"; import { i18next } from "/client/api"; /** diff --git a/imports/plugins/included/taxes-avalara/client/containers/avalaraSettingsFormContainer.js b/imports/plugins/included/taxes-avalara/client/containers/avalaraSettingsFormContainer.js index cddd7fd70..2b6550311 100644 --- a/imports/plugins/included/taxes-avalara/client/containers/avalaraSettingsFormContainer.js +++ b/imports/plugins/included/taxes-avalara/client/containers/avalaraSettingsFormContainer.js @@ -4,7 +4,7 @@ import { Reaction } from "/client/api"; import { compose, withProps } from "recompose"; import { AvalaraPackageConfig } from "../../lib/collections/schemas"; import { AvalaraSettingsForm } from "../components"; -import { Logs as LogSchema } from "/lib/collections/schemas/logs"; +import { Logs as LogSchema } from "/lib/collections/schemas"; import { Countries } from "/client/collections"; /** diff --git a/imports/test-utils/helpers/factory.js b/imports/test-utils/helpers/factory.js new file mode 100644 index 000000000..bfe7910ab --- /dev/null +++ b/imports/test-utils/helpers/factory.js @@ -0,0 +1,8 @@ +import { createFactoryForSchema, Factory } from "@reactioncommerce/data-factory"; +import * as schemas from "imports/collections/schemas"; + +Object.keys(schemas).forEach((key) => { + createFactoryForSchema(key, schemas[key]); +}); + +export default Factory; diff --git a/lib/api/catalog.js b/lib/api/catalog.js index 29e359151..30e2d0b12 100644 --- a/lib/api/catalog.js +++ b/lib/api/catalog.js @@ -1,7 +1,6 @@ import _ from "lodash"; import { Products } from "/lib/collections"; import { ReactionProduct } from "/lib/api"; -import { applyProductRevision } from "/lib/api/products"; /** * @file Catalog methods @@ -43,7 +42,7 @@ export default { * @return {Object} range, min, max */ getProductPriceRange(productId) { - const product = applyProductRevision(Products.findOne(productId)); + const product = Products.findOne(productId); if (!product) { return { range: "0", @@ -115,7 +114,7 @@ export default { switch (visibleChildren.length) { case 0: { - const topVariant = applyProductRevision(Products.findOne(variantId)); + const topVariant = Products.findOne(variantId); // topVariant could be undefined when we removing last top variant return topVariant && topVariant.price; } @@ -162,14 +161,15 @@ export default { }, /** - * @method getPublishedOrRevision - * @memberof Catalog - * @description return top product revision if available - * @param {Object} product product or variant document - * @return {Object} product document - */ - getPublishedOrRevision(product) { - return applyProductRevision(product); + * @method getProduct + * @method + * @memberof ReactionProduct + * @summary Get product object. Could be useful for products and for top level variants + * @param {String} [id] - product _id + * @return {Object} Product data + */ + getProduct(id) { + return Products.findOne(id); }, /** @@ -185,7 +185,7 @@ export default { return Products.find({ ancestors: { $in: [id] }, type: type || "variant" - }).map(this.getPublishedOrRevision); + }).fetch(); }, /** @@ -197,11 +197,10 @@ export default { * @return {Array} Parent variant or empty */ getVariantParent(variant) { - const parent = Products.findOne({ + return Products.findOne({ _id: { $in: variant.ancestors }, type: "variant" }); - return this.getPublishedOrRevision(parent); }, /** @@ -218,7 +217,7 @@ export default { return Products.find({ ancestors: variant.ancestors, type: type || "variant" - }).map(this.getPublishedOrRevision); + }).fetch(); }, /** @@ -232,6 +231,6 @@ export default { return Products.find({ ancestors: [id], type: "variant" - }).map(this.getPublishedOrRevision); + }).fetch(); } }; diff --git a/lib/api/products.js b/lib/api/products.js index 941e0a23a..f7e05967f 100644 --- a/lib/api/products.js +++ b/lib/api/products.js @@ -5,7 +5,7 @@ import { Meteor } from "meteor/meteor"; import { ReactiveDict } from "meteor/reactive-dict"; import { ReactiveVar } from "meteor/reactive-var"; import { Router } from "/imports/plugins/core/router/lib"; -import { Products, Revisions, Tags } from "/lib/collections"; +import { Products, Tags } from "/lib/collections"; import Catalog from "./catalog"; import { MetaData } from "/lib/api/router/metadata"; @@ -32,44 +32,6 @@ import { MetaData } from "/lib/api/router/metadata"; */ const ReactionProduct = new ReactiveDict("currentProduct"); -/** - * @name applyProductRevision - * @method - * @memberof ReactionProduct - * @summary Apply revision to product - * @example applyProductRevision(product) - * @param {Object} product product - * @return {Object|null} product or null, if no product found - */ -export function applyProductRevision(product) { - if (product) { - if (product.__revisions && product.__revisions.length) { - const cleanProduct = Object.assign({}, product); - delete cleanProduct.__revisions; - let revisedProduct; - // check for product revisions and set that as the current product - for (const revision of product.__revisions) { - if (!revision.parentDocument) { - revisedProduct = product.__revisions[0].documentData; - } - } - - // if there are no revision to product (image and/or tag only) just set the original product as the product - if (!revisedProduct) { - revisedProduct = cleanProduct; - } - - return Object.assign({}, revisedProduct, { - __published: cleanProduct, - __draft: product.__revisions[0] - }); - } - return product; - } - - return null; -} - /** * @name variantIsSelected * @method @@ -149,6 +111,8 @@ ReactionProduct.setProduct = (currentProductId, currentVariantId) => { $or: [ { handle: productId.toLowerCase() }, // Try the handle (slug) lowercased { handle: productId }, // Otherwise try the handle (slug) untouched + { slug: productId.toLowerCase() }, // Try the slug lowercased + { slug: productId }, // Otherwise try the slug untouched { _id: productId }, // try the product id { changedHandleWas: productId } // Last attempt: the permalink may have changed. ] @@ -196,7 +160,7 @@ ReactionProduct.setProduct = (currentProductId, currentVariantId) => { // Update the meta data when a product is selected MetaData.init(Router.current()); - return applyProductRevision(product); + return product; }; /** @@ -241,7 +205,7 @@ ReactionProduct.selectedVariantId = () => { ReactionProduct.selectedVariant = function () { const id = ReactionProduct.selectedVariantId(); if (typeof id === "string") { - return applyProductRevision(Products.findOne(id)); + return Products.findOne(id); } return []; }; @@ -270,7 +234,7 @@ ReactionProduct.selectedTopVariant = function () { ReactionProduct.selectedProduct = function () { const id = ReactionProduct.selectedProductId(); if (typeof id === "string") { - return applyProductRevision(Products.findOne(id)); + return Products.findOne(id); } return undefined; }; @@ -633,14 +597,11 @@ ReactionProduct.isAncestorDeleted = function (product, includeSelf) { productIds.push(product._id); } - // Verify there are no deleted ancestors, + // Verify there are no deleted ancestors // Variants cannot be restored if their parent product / variant is deleted - const archivedCount = Revisions.find({ - "documentId": { $in: productIds }, - "documentData.isDeleted": true, - "workflow.status": { - $nin: ["revision/published"] - } + const archivedCount = Products.find({ + _id: { $in: productIds }, + isDeleted: true }).count(); if (archivedCount > 0) { diff --git a/lib/collections/collections.js b/lib/collections/collections.js index 3a7f2ae83..af4c8a0de 100644 --- a/lib/collections/collections.js +++ b/lib/collections/collections.js @@ -141,15 +141,6 @@ export const Products = new Mongo.Collection("Products"); Products.attachSchema(Schemas.Product, { selector: { type: "simple" } }); Products.attachSchema(Schemas.ProductVariant, { selector: { type: "variant" } }); -/** - * @name Revisions - * @memberof Collections - * @type {MongoCollection} - */ -export const Revisions = new Mongo.Collection("Revisions"); - -Revisions.attachSchema(Schemas.Revisions); - /** * @name Shipping * @memberof Collections diff --git a/lib/collections/schemas/helpers.js b/lib/collections/schemas/helpers.js deleted file mode 100644 index e8d452872..000000000 --- a/lib/collections/schemas/helpers.js +++ /dev/null @@ -1,133 +0,0 @@ -import Random from "@reactioncommerce/random"; -import { Meteor } from "meteor/meteor"; -import { Reaction } from "/lib/api"; -import { Shops } from "/lib/collections"; - -/** - * @name createdAtAutoValue - * @memberof Schemas - * @method - * @summary Helper method used for schema injection autoValue - * @example autoValue: createdAtAutoValue - * @return {Date} Date representing now if it's an insert - */ -export function createdAtAutoValue() { - // We don't want to unset or overwrite a createdAt in a nested - // document, for example, in a product being added to cart items - if (this.closestSubschemaFieldName) return; - - if (this.isInsert) return new Date(); - if (this.isUpsert) return { $setOnInsert: new Date() }; - this.unset(); -} - -/** - * @name updatedAtAutoValue - * @memberof Schemas - * @method - * @summary Helper method used for schema injection autoValue - * @example autoValue: updatedAtAutoValue - * @return {Date} Date representing now - */ -export function updatedAtAutoValue() { - // We don't want to overwrite an updatedAt in a nested - // document, for example, in a product being added to cart items - if (this.closestSubschemaFieldName) return; - - return new Date(); -} - -/** - * @name shopIdAutoValue - * @memberof Schemas - * @method - * @summary Helper method used for schema injection autoValue - * @example autoValue: shopIdAutoValue - * @return {String} current shopId - */ -export function shopIdAutoValue() { - // we should always have a shopId - if (this.isSet && Meteor.isServer) { - return this.value; - } else if ((Meteor.isServer && !this.isUpdate) || (Meteor.isClient && this.isInsert)) { - return Reaction.getShopId(); - } - return this.unset(); -} - -/** - * @name shopIdAutoValueForCart - * @memberof Schemas - * @method - * @summary Helper method copy of shopIdAutoValue with modification for Cart - * @example autoValue: shopIdAutoValue - * @return {String} shopId - */ -export function shopIdAutoValueForCart() { - // we should always have a shopId - if (this.isSet && Meteor.isServer) { - return this.value; - } else if ((Meteor.isServer && !this.isUpdate) || (Meteor.isClient && this.isInsert)) { - let shopId = Reaction.getPrimaryShopId(); - const marketplaceSettings = Reaction.getMarketplaceSettings(); - - if (marketplaceSettings && marketplaceSettings.public && marketplaceSettings.public.merchantCart === true) { - shopId = Reaction.getShopId(); - } - return shopId; - } - return this.unset(); -} - -/** - * @name schemaIdAutoValue - * @memberof Schemas - * @method - * @summary Helper method used for schema injection autoValue - * @example autoValue: schemaIdAutoValue - * @return {String} randomId - */ -export function schemaIdAutoValue() { - if (this.isSet && Meteor.isServer) { - return this.value; - } else if ((Meteor.isServer && this.operator !== "$pull") || - (Meteor.isClient && this.isInsert)) { - return Random.id(); - } - return this.unset(); -} - -/** - * @name shopDefaultCountry - * @memberof Schemas - * @method - * @summary Helper method used for schema injection autoValue - * @example autoValue: shopDefaultCountry - * @return {String} country value from default shop - */ -export function shopDefaultCountry() { - try { - // Check to see if this is client or server, and the type of update being performed - if (this.isSet && Meteor.isServer) { - return this.value; - } else if ((Meteor.isServer && !this.isUpdate) || (Meteor.isClient && this.isInsert)) { - // Find the current shop - const shop = Shops.findOne({ - _id: Reaction.getShopId() - }); - - // Find the current shops primary shipping address - if (shop && shop.addressBook) { - const defaultShippingAddress = shop.addressBook.find((address) => address.isShippingDefault === true); - - // return the shops country to auto-populate the Country of Origin field in the scheme - return defaultShippingAddress.country; - } - - return this.value; - } - return this.unset(); - } catch (e) { - return this.value; - } -} diff --git a/lib/collections/schemas/index.js b/lib/collections/schemas/index.js index 160941ba5..233df9d0c 100644 --- a/lib/collections/schemas/index.js +++ b/lib/collections/schemas/index.js @@ -1,39 +1,10 @@ -/** - * Reaction uses {@link https://github.com/aldeed/simple-schema-js SimpleSchema} to apply basic content and structure validation to Collections. - * See {@link https://docs.reactioncommerce.com/reaction-docs/master/simple-schema full documentation}. - * @typedef {SimpleSchema} SimpleSchema - * @summary SimpleSchema for Collections - * @namespace Schemas - */ +import { check } from "meteor/check"; +import { Tracker } from "meteor/tracker"; +import * as schemas from "imports/collections/schemas"; -/** - * Reaction uses {@link https://github.com/aldeed/simple-schema-js SimpleSchema} to apply basic content and structure validation to Collections. - * See {@link https://docs.reactioncommerce.com/reaction-docs/master/simple-schema full documentation}. - * @namespace Schemas - */ +Object.values(schemas).forEach((schema) => { + schema._constructorOptions.check = check; + schema._constructorOptions.tracker = Tracker; +}); -export * from "./accounts"; -export * from "./address"; -export * from "./assets"; -export * from "./catalog"; -export * from "./cart"; -export * from "./emails"; -export * from "./inventory"; -export * from "./layouts"; -export * from "./logs"; -export * from "./metafield"; -export * from "./notifications"; -export * from "./orders"; -export * from "./payments"; -export * from "./products"; -export * from "./registry"; -export * from "./revisions"; -export * from "./shipping"; -export * from "./shops"; -export * from "./groups"; -export * from "./sms"; -export * from "./social"; -export * from "./tags"; -export * from "./templates"; -export * from "./translations"; -export * from "./workflow"; +module.exports = schemas; diff --git a/lib/collections/schemas/revisions.js b/lib/collections/schemas/revisions.js deleted file mode 100644 index db2498564..000000000 --- a/lib/collections/schemas/revisions.js +++ /dev/null @@ -1,80 +0,0 @@ -import SimpleSchema from "simpl-schema"; -import { check } from "meteor/check"; -import { Tracker } from "meteor/tracker"; -import { registerSchema } from "@reactioncommerce/schemas"; -import { createdAtAutoValue, updatedAtAutoValue } from "./helpers"; -import { Workflow } from "./workflow"; - -/** - * @name Revisions - * @memberof Schemas - * @type {SimpleSchema} - * @property {String} _id Revision Id - * @property {Workflow} workflow required - * @property {String} documentId Reference Document Id - * @property {String} documentType Document Type, default value: `product`, allowed values: `product`, `image`, `tag` - * @property {String} parentDocument optional - * @property {"object"} documentData blackbox object - * @property {String} changeType optional, allowed values: `insert`, `update`, `remove` - * @property {Object[]} diff optional, blackbox - * @property {Date} createdAt required - * @property {Date} updatedAt optional - * @property {Date} publishAt optional - */ -export const Revisions = new SimpleSchema({ - "_id": { - type: String, - label: "Revision Id" - }, - "workflow": { - type: Workflow, - optional: false, - defaultValue: {} - }, - "documentId": { - type: String, - label: "Reference Document Id" - }, - "documentType": { - type: String, - label: "Document Type", - defaultValue: "product", - allowedValues: ["product", "image", "tag"] - }, - "parentDocument": { - type: String, - optional: true - }, - "documentData": { - type: "object", - blackbox: true - }, - "changeType": { - type: String, - optional: true, - allowedValues: ["insert", "update", "remove"] - }, - "diff": { - type: Array, - optional: true - }, - "diff.$": { - type: Object, - blackbox: true - }, - "createdAt": { - type: Date, - autoValue: createdAtAutoValue - }, - "updatedAt": { - type: Date, - autoValue: updatedAtAutoValue, - optional: true - }, - "publishAt": { - type: Date, - optional: true - } -}, { check, tracker: Tracker }); - -registerSchema("Revisions", Revisions); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..cec52b7fb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15418 @@ +{ + "name": "reaction", + "version": "1.13.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "42-cent-base": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/42-cent-base/-/42-cent-base-0.8.0.tgz", + "integrity": "sha1-ZXKom0enKvGcZ8NAG1wd0wqpuLs=", + "requires": { + "bluebird": "2.11.0", + "lodash": "2.4.2" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + } + } + }, + "42-cent-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/42-cent-util/-/42-cent-util-1.0.0.tgz", + "integrity": "sha1-dytxZQwGp3kxhA6AiAy4l4U3jug=" + }, + "@babel/cli": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.0.0-beta.49.tgz", + "integrity": "sha1-yMMTX3vEhChDb69ePydCJ6me8qg=", + "dev": true, + "requires": { + "chokidar": "2.0.3", + "commander": "2.14.1", + "convert-source-map": "1.5.1", + "fs-readdir-recursive": "1.1.0", + "glob": "7.1.2", + "lodash": "4.17.10", + "output-file-sync": "2.0.1", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz", + "integrity": "sha512-JNHofQND7Iiuy3f6RXSillN1uBe87DAp+1ktsBfSxfL3xWeGFyJC9jH5zu2zs7eqVGp2qXWvJZFiJIwOYnaCQw==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/core": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.49.tgz", + "integrity": "sha1-c94ggd1lJIlInwy0qpeCmhEzMU4=", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.49", + "@babel/generator": "7.0.0-beta.49", + "@babel/helpers": "7.0.0-beta.49", + "@babel/parser": "7.0.0-beta.49", + "@babel/template": "7.0.0-beta.49", + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49", + "convert-source-map": "1.5.1", + "debug": "3.1.0", + "json5": "0.5.1", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "resolve": "1.5.0", + "semver": "5.4.1", + "source-map": "0.5.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz", + "integrity": "sha1-vs2AVIJzREDJ0TfkbXc0DmTX9Rs=", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.49" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.49.tgz", + "integrity": "sha1-6c/9qROZaszseTu8JauRvBnQv3o=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49", + "jsesc": "2.5.1", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.49.tgz", + "integrity": "sha1-fZAF1U/nrWy4dnkCUedVdUGRhuk=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.49.tgz", + "integrity": "sha1-xi3VBCtUpZDV5x5gIMRrkdbGyHU=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0-beta.49.tgz", + "integrity": "sha1-5sNfjIjpAJMTn6ezAn0FzOtH9D0=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49", + "esutils": "2.0.2" + } + }, + "@babel/helper-call-delegate": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.49.tgz", + "integrity": "sha1-S11BeCpoPV3GSXg0oyMQqNAqOvk=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "7.0.0-beta.49", + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-define-map": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.49.tgz", + "integrity": "sha1-TqBnqnIJNyQN85XNBzwk/K2cKzs=", + "dev": true, + "requires": { + "@babel/helper-function-name": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49", + "lodash": "4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.49.tgz", + "integrity": "sha1-K/uV337BMHNb9lXkSiF6cNOxPpM=", + "dev": true, + "requires": { + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.49.tgz", + "integrity": "sha1-olwRGbnwNSeGcBJuAiXAMEHI3jI=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.49", + "@babel/template": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.49.tgz", + "integrity": "sha1-z1Aj8y0q2S0Ic3STnOwJUby1FEE=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.49.tgz", + "integrity": "sha1-2XQGUck7tPp5wba6xjQFH8TQP/U=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.49.tgz", + "integrity": "sha1-L2QrAD1FFV4KnnpK0OaI2Ru8FYM=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.49.tgz", + "integrity": "sha1-QdfVmJEBbEk0MqRvdGREZVKJDHU=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49", + "lodash": "4.17.10" + } + }, + "@babel/helper-module-transforms": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.49.tgz", + "integrity": "sha1-/GYL2p1kl0EuGHdqca7ZqeLl960=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.49", + "@babel/helper-simple-access": "7.0.0-beta.49", + "@babel/helper-split-export-declaration": "7.0.0-beta.49", + "@babel/template": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49", + "lodash": "4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.49.tgz", + "integrity": "sha1-qYtDw6bFS+9I+HsQ3EVo3sC0G/c=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.49.tgz", + "integrity": "sha1-Dp/LuDT4eLs2XSqOqQ7uIbo8zSM=", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.49.tgz", + "integrity": "sha1-/yRPGcKi8Wf/SzFlpjawj9ZBgWs=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.49.tgz", + "integrity": "sha1-s/2qtBJ4TX6GV7rKsoaSPvyUmLg=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "7.0.0-beta.49", + "@babel/helper-wrap-function": "7.0.0-beta.49", + "@babel/template": "7.0.0-beta.49", + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-replace-supers": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.49.tgz", + "integrity": "sha1-50RMcYBX9qCjZFyvjnj7VG/7DZ8=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "7.0.0-beta.49", + "@babel/helper-optimise-call-expression": "7.0.0-beta.49", + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-simple-access": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.49.tgz", + "integrity": "sha1-l6QeJ4mpv4psMFNqJYt550RMXYI=", + "dev": true, + "requires": { + "@babel/template": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49", + "lodash": "4.17.10" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.49.tgz", + "integrity": "sha1-QNeO2glo0BGxxShm5XRs+yPldUg=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helper-wrap-function": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.49.tgz", + "integrity": "sha1-OFWRRgtNk++W7jgZU5wM3Ju9R1g=", + "dev": true, + "requires": { + "@babel/helper-function-name": "7.0.0-beta.49", + "@babel/template": "7.0.0-beta.49", + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/helpers": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.49.tgz", + "integrity": "sha1-BU2EAy1OlChqgFhlAAaOQQBaUdA=", + "dev": true, + "requires": { + "@babel/template": "7.0.0-beta.49", + "@babel/traverse": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.49.tgz", + "integrity": "sha1-lr3GtD4TSCASumaRsQGEktOWIsw=", + "dev": true, + "requires": { + "chalk": "2.3.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/node": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.0.0-beta.49.tgz", + "integrity": "sha1-lbbHhfG1NQg4xpMzRwF69RQQiTA=", + "dev": true, + "requires": { + "@babel/polyfill": "7.0.0-beta.49", + "@babel/register": "7.0.0-beta.49", + "commander": "2.14.1", + "fs-readdir-recursive": "1.1.0", + "lodash": "4.17.10", + "output-file-sync": "2.0.1", + "v8flags": "3.1.1" + } + }, + "@babel/parser": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.49.tgz", + "integrity": "sha1-lE0MW6KBK7FZ7b0iZ0Ov0mUXm9w=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.49.tgz", + "integrity": "sha1-h2Gl4ti1JR5w3yj00KpkqiillrE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-remap-async-to-generator": "7.0.0-beta.49", + "@babel/plugin-syntax-async-generators": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-beta.49.tgz", + "integrity": "sha1-Un6Qr3XSP9XjuuGiGNwKbZI2tfE=", + "dev": true, + "requires": { + "@babel/helper-function-name": "7.0.0-beta.49", + "@babel/helper-member-expression-to-functions": "7.0.0-beta.49", + "@babel/helper-optimise-call-expression": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-replace-supers": "7.0.0-beta.49", + "@babel/plugin-syntax-class-properties": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.0.0-beta.49.tgz", + "integrity": "sha1-V2CraDF05grWcNycXvOfHX00nHs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-decorators": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.0.0-beta.49.tgz", + "integrity": "sha1-bzWxKRAqYEbTyT1F+X2ErJfH/oo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-export-namespace-from": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-function-sent": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.0.0-beta.49.tgz", + "integrity": "sha1-RYmXgnz2n4RgvTE40ZuRfCXrnsc=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-wrap-function": "7.0.0-beta.49", + "@babel/plugin-syntax-function-sent": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0-beta.49.tgz", + "integrity": "sha1-5FSz1BTTlxnOp6btbCYdhw+rULA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-json-strings": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.0.0-beta.49.tgz", + "integrity": "sha1-1qrnGuut5wGV0VSl1zg2BSmy8ZM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-numeric-separator": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.49.tgz", + "integrity": "sha1-bQzWD3p718REo3HE6UcL/wL1d3w=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.49.tgz", + "integrity": "sha1-H1PTZ4UQHV60tV1laGqis5+iHEs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-optional-catch-binding": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-throw-expressions": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.0.0-beta.49.tgz", + "integrity": "sha1-dp5ub2QYxwJWjPOb6b3xg6tiQZk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-throw-expressions": "7.0.0-beta.49" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.49.tgz", + "integrity": "sha1-DvX7mr2pgM0Vhe9Mjo9oC2MmPHI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-regex": "7.0.0-beta.49", + "regexpu-core": "4.1.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.49.tgz", + "integrity": "sha1-UO6UMAKu3JqzqNEikr013Z7bHfg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-beta.49.tgz", + "integrity": "sha1-ahT6R86qMrU+FOZkgyblLaswaQQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.0.0-beta.49.tgz", + "integrity": "sha1-F3PpCJpGcIaLLp4qpVBFoT+L1JQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0-beta.49.tgz", + "integrity": "sha1-8K96xrU2dqSWCT1KbiouxlXAe3g=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.0.0-beta.49.tgz", + "integrity": "sha1-4+/l6FYn0o7IODWnXPnCepVNcEU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.49.tgz", + "integrity": "sha1-Wz8LZcqWYFNFNWQ7glMPsdWOY+4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-function-sent": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.0.0-beta.49.tgz", + "integrity": "sha1-6pF9kQ53NYTJpBp/06H/LkmUgio=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.0.0-beta.49.tgz", + "integrity": "sha1-x6zIpTZlgxP2JPT1lc8JFHrIQmw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0-beta.49.tgz", + "integrity": "sha1-yS/ni5/y2SxYs9GLnO6py8BKUZo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0-beta.49.tgz", + "integrity": "sha1-FbgyUEtJ8Rb5xITo5ApeF8VC7RM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.0.0-beta.49.tgz", + "integrity": "sha1-ADMb/O2+ASTrUyVeZn/liisynKk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.49.tgz", + "integrity": "sha1-R4SziAgj/xLnQsJrQemFf3AdY54=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.49.tgz", + "integrity": "sha1-Ph3T1drrQnDk7khjZB1Pqga7zRE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-syntax-throw-expressions": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.0.0-beta.49.tgz", + "integrity": "sha1-4VcAlQV5QL+16oSz7cX7Vzezq+U=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.49.tgz", + "integrity": "sha1-3ThFtjxoPRh9UYbuDogsQEbE8OM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.49.tgz", + "integrity": "sha1-kRpA65MEAYbOtpMQXKdt73/pfQM=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-remap-async-to-generator": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.49.tgz", + "integrity": "sha1-eqn0b9+HO3IRqqLrDTfEw3Ghq9I=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.49.tgz", + "integrity": "sha1-3Vqd3ZhndciyDPW2EGWvs92eqsk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "lodash": "4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.49.tgz", + "integrity": "sha1-U0JHHS5qMzczLqJGtGwL3fX8VE0=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "7.0.0-beta.49", + "@babel/helper-define-map": "7.0.0-beta.49", + "@babel/helper-function-name": "7.0.0-beta.49", + "@babel/helper-optimise-call-expression": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-replace-supers": "7.0.0-beta.49", + "@babel/helper-split-export-declaration": "7.0.0-beta.49", + "globals": "11.3.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.49.tgz", + "integrity": "sha1-uCWdF0vwerS1ZWZWK0buZSDD39I=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.49.tgz", + "integrity": "sha1-Q2Y5LJyC0SMQVsHQApQ4pg02K4I=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.49.tgz", + "integrity": "sha1-Na4rwYe+51LQ93hdJwTlK4c3c2k=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-regex": "7.0.0-beta.49", + "regexpu-core": "4.1.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.49.tgz", + "integrity": "sha1-+sJEgJ3ey/CV43VVjMtxbaEEIxY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.49.tgz", + "integrity": "sha1-RXstCQBHlGhKpuGwQBUIC4CgihQ=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.49.tgz", + "integrity": "sha1-8ComUo6UssHRHZVztj7leC1PKvk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-flow": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.49.tgz", + "integrity": "sha1-PscnJr8diaDU1RG+epVJBm9Xqt4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.49.tgz", + "integrity": "sha1-rzn2Dnrvzpsl60rc7dBNUIZs4hg=", + "dev": true, + "requires": { + "@babel/helper-function-name": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-instanceof": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.49.tgz", + "integrity": "sha1-4yX5x3Gx+fsm35U9d4AhC7WHq/g=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.49.tgz", + "integrity": "sha1-B8g4JU1l5oZ+hlE+sPItXyawpWo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.49.tgz", + "integrity": "sha1-FtB0gJVLBBXqcPHsPtvQWXvT3f4=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.49.tgz", + "integrity": "sha1-Cfs0XVknwro72J582xOlUGftOaA=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-simple-access": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.49.tgz", + "integrity": "sha1-aCJaOuExJ3G8Wjb3H/ENAsEkPZ8=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.49.tgz", + "integrity": "sha1-cEjKWncYlwb0s+luS5luswWQ3WM=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.49.tgz", + "integrity": "sha1-wv/vHruvckqeWN3hFOV+Pmhkpec=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.49.tgz", + "integrity": "sha1-swL1VwKEc0PBD/T7hDXMNXR1X+M=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-replace-supers": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.49.tgz", + "integrity": "sha1-HK1xoqMygeXvuxpGI6lkwHPOmi0=", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "7.0.0-beta.49", + "@babel/helper-get-function-arity": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.0.0-beta.49.tgz", + "integrity": "sha1-pUUlZaVTmcLfTn/WsylFOK4rtSg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0-beta.49.tgz", + "integrity": "sha1-JCoAa/QSKpOyc/ad/mw5Sg/Oxjg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0-beta.49.tgz", + "integrity": "sha1-DyeJ/eMFw8FBUYSPhRSirxRBr1g=", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-jsx": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0-beta.49.tgz", + "integrity": "sha1-oRgoujgDXBqpP9RAmbmJcBn6VGw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-jsx": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0-beta.49.tgz", + "integrity": "sha1-Bbt0KbbdRMvcppWFSBNHqAnKqMo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-syntax-jsx": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.49.tgz", + "integrity": "sha1-1O15ZwM/T1tJNjwgNQOJm4NXyuI=", + "dev": true, + "requires": { + "regenerator-transform": "0.12.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.49.tgz", + "integrity": "sha1-SfE0295PZVg0whUk6eYaWNTheQA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.49.tgz", + "integrity": "sha1-arqwX8DMqCmq+eKoUES3l2Pmgco=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.49.tgz", + "integrity": "sha1-CMxbZM9qWUKoe92bSkgY1MuhLfM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-regex": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.49.tgz", + "integrity": "sha1-5gmu1rj8x+HrzKzyITimRyApQKI=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.49.tgz", + "integrity": "sha1-NlFBujVb9znu/Wwrud8cO3FG5FA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.49.tgz", + "integrity": "sha1-w3XbVwl1diFSPUGstiqavw1DdLg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/helper-regex": "7.0.0-beta.49", + "regexpu-core": "4.1.5" + } + }, + "@babel/polyfill": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0-beta.49.tgz", + "integrity": "sha1-YY+MZ3wwUEsT8ciBLGUyL7GsSAM=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.0.0-beta.49.tgz", + "integrity": "sha1-SoqLkhOfUfovkPv28frXWXUyrrw=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.49", + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.49", + "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.49", + "@babel/plugin-proposal-optional-catch-binding": "7.0.0-beta.49", + "@babel/plugin-proposal-unicode-property-regex": "7.0.0-beta.49", + "@babel/plugin-syntax-async-generators": "7.0.0-beta.49", + "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.49", + "@babel/plugin-syntax-optional-catch-binding": "7.0.0-beta.49", + "@babel/plugin-transform-arrow-functions": "7.0.0-beta.49", + "@babel/plugin-transform-async-to-generator": "7.0.0-beta.49", + "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.49", + "@babel/plugin-transform-block-scoping": "7.0.0-beta.49", + "@babel/plugin-transform-classes": "7.0.0-beta.49", + "@babel/plugin-transform-computed-properties": "7.0.0-beta.49", + "@babel/plugin-transform-destructuring": "7.0.0-beta.49", + "@babel/plugin-transform-dotall-regex": "7.0.0-beta.49", + "@babel/plugin-transform-duplicate-keys": "7.0.0-beta.49", + "@babel/plugin-transform-exponentiation-operator": "7.0.0-beta.49", + "@babel/plugin-transform-for-of": "7.0.0-beta.49", + "@babel/plugin-transform-function-name": "7.0.0-beta.49", + "@babel/plugin-transform-literals": "7.0.0-beta.49", + "@babel/plugin-transform-modules-amd": "7.0.0-beta.49", + "@babel/plugin-transform-modules-commonjs": "7.0.0-beta.49", + "@babel/plugin-transform-modules-systemjs": "7.0.0-beta.49", + "@babel/plugin-transform-modules-umd": "7.0.0-beta.49", + "@babel/plugin-transform-new-target": "7.0.0-beta.49", + "@babel/plugin-transform-object-super": "7.0.0-beta.49", + "@babel/plugin-transform-parameters": "7.0.0-beta.49", + "@babel/plugin-transform-regenerator": "7.0.0-beta.49", + "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.49", + "@babel/plugin-transform-spread": "7.0.0-beta.49", + "@babel/plugin-transform-sticky-regex": "7.0.0-beta.49", + "@babel/plugin-transform-template-literals": "7.0.0-beta.49", + "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.49", + "@babel/plugin-transform-unicode-regex": "7.0.0-beta.49", + "browserslist": "3.2.8", + "invariant": "2.2.2", + "semver": "5.4.1" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000849", + "electron-to-chromium": "1.3.48" + } + }, + "caniuse-lite": { + "version": "1.0.30000849", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000849.tgz", + "integrity": "sha512-hlkWpyGJTDjjim2m+nvvHiEqt2PZuPdB9yYRbys5P/T179Aq7YgMF6tnM489voTfqMLtJhqmOZNfghxWjjT8jg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.48", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", + "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=", + "dev": true + } + } + }, + "@babel/preset-es2015": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/preset-es2015/-/preset-es2015-7.0.0-beta.49.tgz", + "integrity": "sha1-F6HYENQuhOcGnIapEs18fFhTd3E=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-transform-arrow-functions": "7.0.0-beta.49", + "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.49", + "@babel/plugin-transform-block-scoping": "7.0.0-beta.49", + "@babel/plugin-transform-classes": "7.0.0-beta.49", + "@babel/plugin-transform-computed-properties": "7.0.0-beta.49", + "@babel/plugin-transform-destructuring": "7.0.0-beta.49", + "@babel/plugin-transform-duplicate-keys": "7.0.0-beta.49", + "@babel/plugin-transform-for-of": "7.0.0-beta.49", + "@babel/plugin-transform-function-name": "7.0.0-beta.49", + "@babel/plugin-transform-instanceof": "7.0.0-beta.49", + "@babel/plugin-transform-literals": "7.0.0-beta.49", + "@babel/plugin-transform-modules-amd": "7.0.0-beta.49", + "@babel/plugin-transform-modules-commonjs": "7.0.0-beta.49", + "@babel/plugin-transform-modules-systemjs": "7.0.0-beta.49", + "@babel/plugin-transform-modules-umd": "7.0.0-beta.49", + "@babel/plugin-transform-object-super": "7.0.0-beta.49", + "@babel/plugin-transform-parameters": "7.0.0-beta.49", + "@babel/plugin-transform-regenerator": "7.0.0-beta.49", + "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.49", + "@babel/plugin-transform-spread": "7.0.0-beta.49", + "@babel/plugin-transform-sticky-regex": "7.0.0-beta.49", + "@babel/plugin-transform-template-literals": "7.0.0-beta.49", + "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.49", + "@babel/plugin-transform-unicode-regex": "7.0.0-beta.49" + } + }, + "@babel/preset-react": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0-beta.49.tgz", + "integrity": "sha1-DIZ3D254pJr2+GlC9ZgL61/rdsU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-transform-react-display-name": "7.0.0-beta.49", + "@babel/plugin-transform-react-jsx": "7.0.0-beta.49", + "@babel/plugin-transform-react-jsx-self": "7.0.0-beta.49", + "@babel/plugin-transform-react-jsx-source": "7.0.0-beta.49" + } + }, + "@babel/preset-stage-2": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/preset-stage-2/-/preset-stage-2-7.0.0-beta.49.tgz", + "integrity": "sha1-ojr36KvcyoRilcL45M8zg6OxgO0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-proposal-decorators": "7.0.0-beta.49", + "@babel/plugin-proposal-export-namespace-from": "7.0.0-beta.49", + "@babel/plugin-proposal-function-sent": "7.0.0-beta.49", + "@babel/plugin-proposal-numeric-separator": "7.0.0-beta.49", + "@babel/plugin-proposal-throw-expressions": "7.0.0-beta.49", + "@babel/preset-stage-3": "7.0.0-beta.49" + } + }, + "@babel/preset-stage-3": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/preset-stage-3/-/preset-stage-3-7.0.0-beta.49.tgz", + "integrity": "sha1-OwEjErgdSD23pnXUrLqGaP1G9cM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.49", + "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.49", + "@babel/plugin-proposal-class-properties": "7.0.0-beta.49", + "@babel/plugin-proposal-json-strings": "7.0.0-beta.49", + "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.49", + "@babel/plugin-proposal-optional-catch-binding": "7.0.0-beta.49", + "@babel/plugin-proposal-unicode-property-regex": "7.0.0-beta.49", + "@babel/plugin-syntax-dynamic-import": "7.0.0-beta.49", + "@babel/plugin-syntax-import-meta": "7.0.0-beta.49" + } + }, + "@babel/register": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.0.0-beta.49.tgz", + "integrity": "sha1-V+gjpQYuPd0lVIOY6fUHfBeZHwg=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "find-cache-dir": "1.0.0", + "home-or-tmp": "3.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "pirates": "3.0.2", + "source-map-support": "0.4.18" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "home-or-tmp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-3.0.0.tgz", + "integrity": "sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + } + } + }, + "@babel/runtime": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.49.tgz", + "integrity": "sha1-A7O/B+uYIHLI6FHdLd1RECguYb8=", + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.49.tgz", + "integrity": "sha1-44q+ghfLl5P0YaUwbXrXRdg+HSc=", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.49", + "@babel/parser": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49", + "lodash": "4.17.10" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz", + "integrity": "sha1-vs2AVIJzREDJ0TfkbXc0DmTX9Rs=", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.49" + } + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.49.tgz", + "integrity": "sha1-TypzaCoYM07WYl0QCo0nMZ98LWg=", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.49", + "@babel/generator": "7.0.0-beta.49", + "@babel/helper-function-name": "7.0.0-beta.49", + "@babel/helper-split-export-declaration": "7.0.0-beta.49", + "@babel/parser": "7.0.0-beta.49", + "@babel/types": "7.0.0-beta.49", + "debug": "3.1.0", + "globals": "11.3.0", + "invariant": "2.2.2", + "lodash": "4.17.10" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz", + "integrity": "sha1-vs2AVIJzREDJ0TfkbXc0DmTX9Rs=", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.49" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.49.tgz", + "integrity": "sha1-t+Oxw/TUz+Eb34yJ8e/V4WF7h6Y=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@braintree/wrap-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@braintree/wrap-promise/-/wrap-promise-1.1.1.tgz", + "integrity": "sha1-0ix2hV5tS0ASYQBgQh+uGjfskLA=" + }, + "@google-cloud/common": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", + "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", + "requires": { + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "concat-stream": "1.6.0", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "ent": "2.2.0", + "extend": "3.0.1", + "google-auto-auth": "0.7.2", + "is": "3.2.1", + "log-driver": "1.2.7", + "methmeth": "1.1.0", + "modelo": "4.2.3", + "request": "2.83.0", + "retry-request": "3.3.1", + "split-array-stream": "1.0.3", + "stream-events": "1.0.4", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + }, + "dependencies": { + "google-auto-auth": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", + "integrity": "sha512-ux2n2AE2g3+vcLXwL4dP/M12SFMRX5dzCzBfhAEkTeAB7dpyGdOIEj7nmUx0BHKaCcUQrRWg9kT63X/Mmtk1+A==", + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.3.1", + "google-auth-library": "0.10.0", + "request": "2.83.0" + } + } + } + }, + "@google-cloud/storage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.1.1.tgz", + "integrity": "sha1-ZZC1zm53lVbJzHBDvWRJ1rwHgd4=", + "requires": { + "@google-cloud/common": "0.13.6", + "arrify": "1.0.1", + "async": "2.6.0", + "concat-stream": "1.6.0", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "extend": "3.0.1", + "gcs-resumable-upload": "0.7.7", + "hash-stream-validation": "0.2.1", + "is": "3.2.1", + "mime-types": "2.1.17", + "once": "1.4.0", + "pumpify": "1.4.0", + "stream-events": "1.0.4", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "@reactioncommerce/data-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@reactioncommerce/data-factory/-/data-factory-1.0.0.tgz", + "integrity": "sha512-i8+n1ES5AwAt3hPdISJxjyJYfL6E9Xefc7MTfKMuW/mTnIEtykNS3pp/PDPdSQG5z25sZgYX4xn83o9qPsUfsg==", + "requires": { + "faker": "4.1.0", + "lodash.get": "4.4.2", + "lodash.set": "4.3.2", + "simpl-schema": "1.5.0" + } + }, + "@reactioncommerce/eslint-config": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@reactioncommerce/eslint-config/-/eslint-config-1.8.0.tgz", + "integrity": "sha512-8zVQ00A9uo+GJsCKoSeBKYr2qucoQG9ygIDpvNbLVEWujJubR3gb/RDZvd9QYNzqnA0b0/vB77ehLRdR7WJXTA==", + "dev": true + }, + "@reactioncommerce/file-collections": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@reactioncommerce/file-collections/-/file-collections-0.5.0.tgz", + "integrity": "sha512-92983/xIT6xAnHR0+4XKVY9jUp0vpobLhG0wCyegvX/dkSRO5srL4tz1ZN/77pxe7d1MfEEYo6MLQ/YmluIw6A==", + "requires": { + "babel-runtime": "6.26.0", + "content-disposition": "0.5.2", + "debug": "3.1.0", + "path-parser": "4.0.4", + "query-string": "5.1.0", + "tus-js-client": "1.5.1", + "tus-node-server": "0.2.11" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@reactioncommerce/file-collections-sa-base": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@reactioncommerce/file-collections-sa-base/-/file-collections-sa-base-0.0.2.tgz", + "integrity": "sha512-yUIot7kvA8qNaowk4FJJMxJ2+lME74zjTBJxGXjauS3USeBw27NjlckpW3F8LwizPzW8L5J3BmYRHGqXIVGykQ==", + "requires": { + "babel-runtime": "6.26.0", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@reactioncommerce/file-collections-sa-gridfs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@reactioncommerce/file-collections-sa-gridfs/-/file-collections-sa-gridfs-0.0.2.tgz", + "integrity": "sha512-taswRPu3iIq+OsO5Q1Ohn/uealYRHKZSss0/DFdahaWYW7hcZualruvysqbzbtN42VWmZ9Yv+sVCtkVIxiwN2w==", + "requires": { + "@reactioncommerce/file-collections-sa-base": "0.0.2", + "babel-runtime": "6.26.0", + "debug": "3.1.0", + "gridfs-stream": "1.1.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@reactioncommerce/hooks": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@reactioncommerce/hooks/-/hooks-1.0.2.tgz", + "integrity": "sha512-YINoM2alXOJZD6X9KbD6n2tsUgvGhk2QG4Hkc71Pp9ah+JXi+CC2wbZLfxr3qHoqwNHG9Ovny7OVucqnXzLl9w==", + "requires": { + "lodash": "4.17.10" + } + }, + "@reactioncommerce/job-queue": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@reactioncommerce/job-queue/-/job-queue-1.0.4.tgz", + "integrity": "sha512-nav+E2H0+OxnOrSejZJi4tXCE1Zp81dEFcxa4JWqN4Y3o6/1QH7Hf5jR0FBtUIzsDoMeyh0TigRLBCbJddoMeA==", + "requires": { + "later": "1.2.0" + } + }, + "@reactioncommerce/logger": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@reactioncommerce/logger/-/logger-1.1.1.tgz", + "integrity": "sha512-gsoM8QEcZwFvJLLX2NAzJgj1eI+5TigvmOPqYp3zCX3ZZdEy4imihKof7mtnUH7WQFpqsDvW90XJXNUeb/NCfw==", + "requires": { + "bunyan": "1.8.12", + "bunyan-format": "0.2.1", + "node-loggly-bulk": "2.2.2" + }, + "dependencies": { + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "requires": { + "dtrace-provider": "0.8.5", + "moment": "2.20.1", + "mv": "2.1.1", + "safe-json-stringify": "1.0.4" + } + }, + "node-loggly-bulk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-2.2.2.tgz", + "integrity": "sha512-1mjTyyiNID8WXpN1afvsuK4Qp7JX/JsKdnO5xMJpRfEo8ePleCBvWVyaDpJgWuypxZ4BGHcH2MKMe4TClbb5dA==", + "requires": { + "json-stringify-safe": "5.0.1", + "moment": "2.20.1", + "request": "2.83.0" + } + } + } + }, + "@reactioncommerce/nodemailer": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@reactioncommerce/nodemailer/-/nodemailer-5.0.5.tgz", + "integrity": "sha512-u4ontTETlROmLglkMDyouMXlX62NXOGfOUAd75Ilk3W4tcsRjRXX+g5C5B4mBCCcJB0wHn1yh/a4pOYkn81vUQ==" + }, + "@reactioncommerce/random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@reactioncommerce/random/-/random-1.0.1.tgz", + "integrity": "sha512-US/4MO6DvmzoEVhSrGQe36z1TlHkpt2ds1ej08nNEAC2n3ZPLp7UumqD77b/uVlst8FzSDgNWZBeNQY84OqD5w==" + }, + "@reactioncommerce/schemas": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@reactioncommerce/schemas/-/schemas-1.1.0.tgz", + "integrity": "sha512-XDLfN1MjNwFb5b3fwze3pzorZCdDSIdWZVSaaHv0KDvXdcww+/Hl45AUS+9i4Z3eWujhMFV+GC1TkjwdPTH6bg==" + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "@types/node": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz", + "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==" + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + } + } + }, + "accounting-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/accounting-js/-/accounting-js-1.1.1.tgz", + "integrity": "sha1-f+Sz9wwB6+C4XALF8QfxOTuIDJ4=", + "requires": { + "is-string": "1.0.4", + "object-assign": "4.1.1" + } + }, + "acorn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", + "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "dev": true + }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, + "requires": { + "acorn": "5.3.0" + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "agent-base": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", + "dev": true, + "requires": { + "es6-promisify": "5.0.0" + } + }, + "airbnb-prop-types": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.8.1.tgz", + "integrity": "sha512-z7pAKmUyAsp/2SqLCTf9hzFc2JLspijB9t+I9D/i0NnYkkjUoV16+W00U6r7+HBM6Q3VqXSjYuUsLX1L71aciw==", + "requires": { + "array.prototype.find": "2.0.4", + "function.prototype.name": "1.1.0", + "has": "1.0.1", + "is-regex": "1.0.4", + "object.assign": "4.1.0", + "object.entries": "1.0.4", + "prop-types": "15.6.0", + "prop-types-exact": "1.1.2" + } + }, + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "aphrodite": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/aphrodite/-/aphrodite-1.2.5.tgz", + "integrity": "sha1-g1jDbIC7A67puXFlqqcBhiJbSYM=", + "requires": { + "asap": "2.0.6", + "inline-style-prefixer": "3.0.8", + "string-hash": "1.1.3" + }, + "dependencies": { + "inline-style-prefixer": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", + "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", + "requires": { + "bowser": "1.9.2", + "css-in-js-utils": "2.0.0" + } + } + } + }, + "apollo-cache-control": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.0.9.tgz", + "integrity": "sha512-bspKyM9gBDxv2nnKPSErzzZiSOdvRXnHwS/3gwBucZG1Dz5U4H6xyPtCx754/YfRto1yT9bUMc7vW85jJ/acOA==", + "requires": { + "graphql-extensions": "0.0.8" + } + }, + "apollo-link": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.1.tgz", + "integrity": "sha512-6Ghf+j3cQLCIvjXd2dJrLw+16HZbWbwmB1qlTc41BviB2hv+rK1nJr17Y9dWK0UD4p3i9Hfddx3tthpMKrueHg==", + "requires": { + "@types/node": "9.4.6", + "apollo-utilities": "1.0.10", + "zen-observable-ts": "0.8.8" + } + }, + "apollo-server-core": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-1.3.2.tgz", + "integrity": "sha1-82hVo+vcLXe4ucRUOAvx1wYQX/w=", + "requires": { + "apollo-cache-control": "0.0.9", + "apollo-tracing": "0.1.3", + "graphql-extensions": "0.0.8" + } + }, + "apollo-server-express": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-1.3.2.tgz", + "integrity": "sha1-D/ggHAvzYoBKFR4TmXZ9rmq34wk=", + "requires": { + "apollo-server-core": "1.3.2", + "apollo-server-module-graphiql": "1.3.2" + } + }, + "apollo-server-module-graphiql": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.3.2.tgz", + "integrity": "sha1-Cp5MSN7OOvkE/uMz+V97mBczXKc=" + }, + "apollo-tracing": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.1.3.tgz", + "integrity": "sha512-LZhSDL4oe9iNkedzJk6tQ6zLXmw/lwCvB0HDZyJjdp8rqrW+RN0Fk6MmZtNq9Z0olwOUh8EN3vIpzLwR3CJTrw==", + "requires": { + "graphql-extensions": "0.0.8" + } + }, + "apollo-utilities": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.10.tgz", + "integrity": "sha512-m3cjHeCWFevkDMDARWD7ZdiW3oWFX6e0/tCLykvcIgNRf62I1nqHfJohRKGPu58/QUY8c4IZSAj5NS/Foh82qQ==" + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "aria-query": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", + "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "2.14.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0" + } + }, + "array.prototype.flatten": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatten/-/array.prototype.flatten-1.2.1.tgz", + "integrity": "sha512-3GhsA78XgK//wQKbhUe6L93kknekGlTRY0kvYcpuSi0aa9rVrMr/okeIIv/XSpN8fZ5iUM+bWifhf2/7CYKtIg==", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0", + "function-bind": "1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + } + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.10" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "attr-accept": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.2.tgz", + "integrity": "sha512-NUj0itVSnpFkUYCj3XKSRCZ7N9gPwWcyX/tF7HosqyDBPMSygALivvJIGI8VvlPcunns5khMkpxoNshvmhy/ZQ==", + "requires": { + "core-js": "2.5.3" + } + }, + "authorize-net": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/authorize-net/-/authorize-net-1.1.1.tgz", + "integrity": "sha512-i1xAX1Ba01lehno84ipjUF1lVwFCyX7089Bp/SzrP1YsKl08Hz0D1wi6L8+l8R2a6UQah7Bm+v7DaHSzDyLWsw==", + "requires": { + "42-cent-base": "0.8.0", + "42-cent-util": "1.0.0", + "bluebird": "2.11.0", + "request": "2.83.0", + "xml2js": "0.4.19" + } + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "requires": { + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000813", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.19", + "postcss-value-parser": "3.3.0" + } + }, + "autosize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.0.tgz", + "integrity": "sha1-egWZsbqE1zvXWJsNnaOHAVLGkjc=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "axobject-query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true + }, + "babel-eslint": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.3.tgz", + "integrity": "sha512-0HeSTtaXg/Em7FCUWxwOT+KeFSO1O7LuRuzhk7g+1BjwdlQGlHq4OyMi3GqGxrNfEq8jEi6Hmt5ylEQUhurgiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "2.5.1", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "4.17.10" + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "3.1.0", + "globals": "11.3.0", + "invariant": "2.2.2", + "lodash": "4.17.10" + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "2.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-module-imports": { + "version": "7.0.0-beta.3", + "resolved": "https://registry.npmjs.org/babel-helper-module-imports/-/babel-helper-module-imports-7.0.0-beta.3.tgz", + "integrity": "sha512-bdPrIXbUTYfREhRhjbN8SstwQaj0S4+rW4PKi1f2Wc5fizSh0hGYkfXUdiSSOgyTydm956tAyz4FrG61bqdQyw==", + "dev": true, + "requires": { + "babel-types": "7.0.0-beta.3", + "lodash": "4.17.10" + }, + "dependencies": { + "babel-types": { + "version": "7.0.0-beta.3", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz", + "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "4.1.5", + "babel-preset-jest": "22.4.4" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0" + } + }, + "babel-plugin-inline-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-import/-/babel-plugin-inline-import-3.0.0.tgz", + "integrity": "sha512-thnykl4FMb8QjMjVCuZoUmAM7r2mnTn5qJwrryCvDv6rugbJlTHZMctdjDtEgD0WBAXJOLJSGXN3loooEwx7UQ==", + "dev": true, + "requires": { + "require-resolve": "0.0.2" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", + "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.9.2", + "test-exclude": "4.2.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-plugin-lodash": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.2.tgz", + "integrity": "sha512-lNsptTRfc0FTdW56O087EiKEADVEjJo2frDQ97olMjCKbRZfZPu7MvdyxnZLOoDpuTCtavN8/4Zk65x4gT+C3Q==", + "dev": true, + "requires": { + "babel-helper-module-imports": "7.0.0-beta.3", + "babel-types": "6.26.0", + "glob": "7.1.2", + "lodash": "4.17.10", + "require-package-name": "2.0.1" + } + }, + "babel-plugin-module-resolver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz", + "integrity": "sha512-1Q77Al4ydp6nYApJ7sQ2fmgz30WuQgJZegIYuyOdbdpxenB/bSezQ3hDPsumIXGlUS4vUIv+EwFjzzXZNWtARw==", + "dev": true, + "requires": { + "find-babel-config": "1.1.0", + "glob": "7.1.2", + "pkg-up": "2.0.0", + "reselect": "3.0.1", + "resolve": "1.5.0" + } + }, + "babel-plugin-rewire-exports": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-rewire-exports/-/babel-plugin-rewire-exports-0.3.0.tgz", + "integrity": "sha512-mqPQnNKIwP1lGYRSgF+fXDfXYScCDNStfp48ZtLLI3wAm7hbijQrQR41qkK7F5mb8R5G+DG2D61dKSgi/fG9qw==", + "dev": true, + "requires": { + "babel-template": "6.26.0" + } + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "22.4.4", + "babel-plugin-syntax-object-rest-spread": "6.13.0" + } + }, + "babel-preset-meteor": { + "version": "7.0.0-beta.49", + "resolved": "https://registry.npmjs.org/babel-preset-meteor/-/babel-preset-meteor-7.0.0-beta.49.tgz", + "integrity": "sha512-368L/WxKj/13vYRVa/C2Ku5oRNNln6kZAZyePGXuzfRyZ64eJf3eGdkMjx/VZhnfQmSgvTyx8tc5IYnCQ4uahg==", + "dev": true, + "requires": { + "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.49", + "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.49", + "@babel/plugin-syntax-async-generators": "7.0.0-beta.49", + "@babel/plugin-syntax-flow": "7.0.0-beta.49", + "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.49", + "@babel/plugin-transform-arrow-functions": "7.0.0-beta.49", + "@babel/plugin-transform-async-to-generator": "7.0.0-beta.49", + "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.49", + "@babel/plugin-transform-block-scoping": "7.0.0-beta.49", + "@babel/plugin-transform-classes": "7.0.0-beta.49", + "@babel/plugin-transform-computed-properties": "7.0.0-beta.49", + "@babel/plugin-transform-destructuring": "7.0.0-beta.49", + "@babel/plugin-transform-exponentiation-operator": "7.0.0-beta.49", + "@babel/plugin-transform-flow-strip-types": "7.0.0-beta.49", + "@babel/plugin-transform-for-of": "7.0.0-beta.49", + "@babel/plugin-transform-literals": "7.0.0-beta.49", + "@babel/plugin-transform-object-super": "7.0.0-beta.49", + "@babel/plugin-transform-parameters": "7.0.0-beta.49", + "@babel/plugin-transform-property-literals": "7.0.0-beta.49", + "@babel/plugin-transform-regenerator": "7.0.0-beta.49", + "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.49", + "@babel/plugin-transform-spread": "7.0.0-beta.49", + "@babel/plugin-transform-sticky-regex": "7.0.0-beta.49", + "@babel/plugin-transform-template-literals": "7.0.0-beta.49", + "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.49", + "@babel/plugin-transform-unicode-regex": "7.0.0-beta.49" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + }, + "dependencies": { + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.10" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base64-js": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", + "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=", + "dev": true + }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "bootstrap": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", + "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + }, + "bops": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bops/-/bops-0.1.1.tgz", + "integrity": "sha1-Bi4CqNqoAfoQ8uXb5nQM/4Af4X4=", + "dev": true, + "requires": { + "base64-js": "0.0.2", + "to-utf8": "0.0.1" + } + }, + "bowser": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.2.tgz", + "integrity": "sha512-fuiANC1Bqbqa/S4gmvfCt7bGBmNELMsGZj4Wg3PrP6esP66Ttoj1JSlzFlXtHyduMv07kDNmDsX6VsMWT/MLGg==" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "braintree": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/braintree/-/braintree-2.7.0.tgz", + "integrity": "sha1-IK0kFxybYLgUa3t+ObL01cAdriM=", + "requires": { + "@braintree/wrap-promise": "1.1.1", + "dateformat": "1.0.1-1.2.3", + "depd": "1.1.2", + "readable-stream": "1.1.10", + "semver": "5.1.0", + "underscore": "1.8.3", + "xml2js": "0.1.13" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.10.tgz", + "integrity": "sha1-1NwuUxnpyQ0eccaTkO9izZCCf2U=", + "requires": { + "core-util-is": "1.0.2", + "debuglog": "0.0.2", + "string_decoder": "0.10.31" + } + }, + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "xml2js": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.1.13.tgz", + "integrity": "sha1-Q4/zsdhaUa1ln/wuvoNAPhDJhyI=", + "requires": { + "sax": "1.2.4" + } + } + } + }, + "brcast": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-2.0.2.tgz", + "integrity": "sha512-Tfn5JSE7hrUlFcOoaLzVvkbgIemIorMIyoMr3TgvszWW7jFt2C9PdeMLtysYD9RU0MmU17b69+XJG1eRY2OBRg==" + }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "requires": { + "caniuse-lite": "1.0.30000813", + "electron-to-chromium": "1.3.36" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "0.4.0" + } + }, + "bson": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", + "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "dev": true, + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.11", + "isarray": "1.0.0" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "dev": true + } + } + }, + "buffer-alloc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz", + "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "0.1.1", + "buffer-fill": "0.1.1" + } + }, + "buffer-alloc-unsafe": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz", + "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-fill": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz", + "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==", + "dev": true + }, + "buffer-from": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", + "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "bunyan-format": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/bunyan-format/-/bunyan-format-0.2.1.tgz", + "integrity": "sha1-pLOw2ABwqGUnlBcmnj8A/wL7y0c=", + "requires": { + "ansicolors": "0.2.1", + "ansistyles": "0.1.3", + "xtend": "2.1.2" + }, + "dependencies": { + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" + } + } + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "caniuse-lite": { + "version": "1.0.30000813", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz", + "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "catharsis": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", + "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "dev": true, + "requires": { + "underscore-contrib": "0.3.0" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + }, + "dependencies": { + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.3" + } + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + } + } + }, + "chain-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", + "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "parse5": "3.0.3" + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "ci-info": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", + "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-deep": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", + "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "3.2.2", + "shallow-clone": "0.1.2" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz", + "integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==", + "requires": { + "color-convert": "1.9.1", + "color-string": "1.5.2" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", + "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } + }, + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "1.3.2", + "utils-merge": "1.0.1" + } + }, + "connect-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/connect-query/-/connect-query-1.0.0.tgz", + "integrity": "sha1-3kT1dyCdokBNH8BGktGkEY5YIRk=", + "requires": { + "qs": "6.4.0" + }, + "dependencies": { + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } + } + }, + "connect-route": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/connect-route/-/connect-route-0.1.5.tgz", + "integrity": "sha1-48IYMZ0uiKiprgsOD+Cacpw5dEo=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "consolidated-events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-1.1.1.tgz", + "integrity": "sha1-JTlUZbNeUxOVQYt7vsteyvGY0Xk=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-to-clipboard": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz", + "integrity": "sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw==", + "requires": { + "toggle-selection": "1.0.6" + } + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + } + }, + "country-data": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/country-data/-/country-data-0.0.31.tgz", + "integrity": "sha1-gJZrjh0Uf6bWpYnTKTP4eTd0lW0=", + "requires": { + "currency-symbol-map": "2.2.0", + "underscore": "1.8.3" + }, + "dependencies": { + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + } + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "crypto-rand": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypto-rand/-/crypto-rand-0.0.2.tgz", + "integrity": "sha1-Hn3CMQLhiRo+6zQPtwrElYCzLt0=" + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css-in-js-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz", + "integrity": "sha512-yuWmPMD9FLi50Xf3k8W8oO3WM1eVnxEGCldCLyfusQ+CgivFk0s23yst4ooW6tfxMuSa03S6uUEga9UhX6GRrA==", + "requires": { + "hyphenate-style-name": "1.0.2" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "cuid": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.0.tgz", + "integrity": "sha512-bXgtIl3CPO0kzfx46z3CPuOoyxEA32ljiLWG3TE60rpe3j99aoVK7p5EBQkHh4AyLBgXSbhJyEzo9SA1VKPRLA==" + }, + "currency-symbol-map": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-2.2.0.tgz", + "integrity": "sha1-KzwYcv8aws5ZXYJz5Y4f/wJyrqI=" + }, + "d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" + }, + "d3-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", + "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" + }, + "d3-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.0.tgz", + "integrity": "sha1-a0gLqohohdRlHcJIqPSsnaFtsHo=" + }, + "d3-interpolate": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.5.tgz", + "integrity": "sha1-aeCZ/zkhRxblY8muw+qdHqS4p58=", + "requires": { + "d3-color": "1.0.3" + } + }, + "d3-scale": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz", + "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=", + "requires": { + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-format": "1.2.0", + "d3-interpolate": "1.1.5", + "d3-time": "1.0.7", + "d3-time-format": "2.1.0" + } + }, + "d3-scale-chromatic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.1.1.tgz", + "integrity": "sha1-gRQG6OCdq3iknaxKMgR9XT7dDEQ=", + "requires": { + "d3-interpolate": "1.1.5" + } + }, + "d3-time": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.7.tgz", + "integrity": "sha1-lMr27bt4ebuAnQ0fdXK8SEgvcnA=" + }, + "d3-time-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.0.tgz", + "integrity": "sha512-mqTsfDTylgwE3YE/VNs9oB2OGX274fO0B5j1irbgLQI+X3FPoJg25pesNxrcdZ2nBeRx/6sHDJlDyMIjWL0BGQ==", + "requires": { + "d3-time": "1.0.7" + } + }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true + }, + "dateformat": { + "version": "1.0.1-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.1-1.2.3.tgz", + "integrity": "sha1-Ll0DA57KifnYeX+ZOJ3l+w9Kovw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz", + "integrity": "sha1-bA3PB+LD90UkYpt0Fmi9RsezYus=", + "optional": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "dev": true, + "requires": { + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.1", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "pify": "2.3.0", + "strip-dirs": "2.1.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.6.1" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "4.1.1", + "file-type": "6.2.0", + "is-stream": "1.1.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "requires": { + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.9.1" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + } + } + }, + "deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "requires": { + "ast-types": "0.11.3", + "escodegen": "1.9.0", + "esprima": "3.1.3" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "deprecate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz", + "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg=" + }, + "deprecated-decorator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", + "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-hover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-hover/-/detect-hover-1.0.2.tgz", + "integrity": "sha1-WJ+wtGkiCJep7uP6NqkX4e2jeiE=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "detect-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/detect-it/-/detect-it-3.0.3.tgz", + "integrity": "sha1-jhPaoLYhJhUMv3bQg6HTTRsH0HE=", + "requires": { + "detect-hover": "1.0.2", + "detect-passive-events": "1.0.4", + "detect-pointer": "1.0.2", + "detect-touch-events": "2.0.1" + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "detect-passive-events": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/detect-passive-events/-/detect-passive-events-1.0.4.tgz", + "integrity": "sha1-btR35uW863kHlzXc01d4nTf5qRo=" + }, + "detect-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-pointer/-/detect-pointer-1.0.2.tgz", + "integrity": "sha1-Hg5OJh2rRQVcUMdPtaT/Cc6xj70=" + }, + "detect-touch-events": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-touch-events/-/detect-touch-events-2.0.1.tgz", + "integrity": "sha1-NlgzzwxcQMQJCggJa4pojbAPozc=" + }, + "diacritic": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/diacritic/-/diacritic-0.0.2.tgz", + "integrity": "sha1-/CqIe1pbwKCoVPthTHwvIJBh7gQ=" + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true + }, + "direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.1.tgz", + "integrity": "sha1-BIHMbrRLS7DADaDdsQqRRpu//l0=" + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "disposables": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.1.tgz", + "integrity": "sha1-BkcnoltU9QK9griaot+4358bOeM=" + }, + "dnd-core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.5.4.tgz", + "integrity": "sha512-BcI782MfTm3wCxeIS5c7tAutyTwEIANtuu3W6/xkoJRwiqhRXKX3BbGlycUxxyzMsKdvvoavxgrC3EMPFNYL9A==", + "requires": { + "asap": "2.0.6", + "invariant": "2.2.2", + "lodash": "4.17.10", + "redux": "3.7.2" + } + }, + "doctrine": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", + "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "dom-helpers": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "integrity": "sha1-MgPgf+0he9H0JLAZc1WC/Deyglo=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "dom7": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.0.2.tgz", + "integrity": "sha512-SL5wdVwVguNehkLOpq8Sj3o0C2A5LMBd6Mc7XdnA02n90hLvXXu0vdDirGhdRoP581NgANi1Swe4Omq7SD4lTA==", + "requires": { + "ssr-window": "1.0.0" + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "4.0.2" + } + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + }, + "dtrace-provider": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.5.tgz", + "integrity": "sha1-mOu6Ihr6xG4cOf02hY2Pk2dSS5I=", + "optional": true, + "requires": { + "nan": "2.8.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "requires": { + "base64url": "2.0.0", + "safe-buffer": "5.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz", + "integrity": "sha1-Dqv3Gp6+qQE/scw1o5DgaGJPJ+g=" + }, + "emoji-regex": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.19" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "enzyme": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", + "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", + "dev": true, + "requires": { + "cheerio": "1.0.0-rc.2", + "function.prototype.name": "1.1.0", + "has": "1.0.1", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.3", + "is-number-object": "1.0.3", + "is-string": "1.0.4", + "is-subset": "0.1.1", + "lodash": "4.17.10", + "object-inspect": "1.5.0", + "object-is": "1.0.1", + "object.assign": "4.1.0", + "object.entries": "1.0.4", + "object.values": "1.0.4", + "raf": "3.4.0", + "rst-selector-parser": "2.2.3" + } + }, + "enzyme-to-json": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.1.tgz", + "integrity": "sha512-PrgRyZAgEwOrh5/8BtBWrwGcv1mC7yNohytIciAX6SUqDaXg1BlU8CepYQ9BgnDP1i1jTB65qJJITMMCph+T6A==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", + "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "5.3.0", + "babel-code-frame": "6.26.0", + "chalk": "2.3.1", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.3.0", + "ignore": "3.3.8", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "1.1.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + } + } + }, + "eslint-import-resolver-meteor": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-meteor/-/eslint-import-resolver-meteor-0.4.0.tgz", + "integrity": "sha1-yGhjhAghIIz4EzxczlGQnCamFWk=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "resolve": "1.5.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-plugin-import": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz", + "integrity": "sha1-2tMXgSktZmSyUxf9BJ0uKy8CIF0=", + "dev": true, + "requires": { + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.2.0", + "has": "1.0.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0", + "resolve": "1.7.1" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } + } + }, + "eslint-plugin-jest": { + "version": "21.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.0.tgz", + "integrity": "sha512-Qe1egBnn0obmFQ9quZiJwwsf1H6oBXrJBku7OUt8XdCSwKL6h7xC4OKyg2px9jQXxv7YcTNUIFAGk2OUpPfDOA==", + "dev": true + }, + "eslint-plugin-jsx-a11y": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz", + "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", + "dev": true, + "requires": { + "aria-query": "0.7.1", + "array-includes": "3.0.3", + "ast-types-flow": "0.0.7", + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.1", + "jsx-ast-utils": "2.0.1" + } + }, + "eslint-plugin-promise": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz", + "integrity": "sha512-H3ne8ob4Bn6NXSN9N9twsn7t8dyHT5bF/ibQepxIHi6JiPIdC2gXlfYvZYucbdrWio4FxBq7Z4mSauQP+qmMkQ==", + "dev": true, + "requires": { + "doctrine": "2.0.2", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.0" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "5.5.3", + "acorn-jsx": "3.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + } + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expect": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.0.tgz", + "integrity": "sha512-Fiy862jT3qc70hwIHwwCBNISmaqBrfWKKrtqyMJ6iwZr+6KXtcnHojZFtd63TPRvRl8EQTJ+YXYy2lK6/6u+Hw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "jest-diff": "22.4.0", + "jest-get-type": "22.1.0", + "jest-matcher-utils": "22.4.0", + "jest-message-util": "22.4.0", + "jest-regex-util": "22.1.0" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "2.0.0" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "fibers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-2.0.0.tgz", + "integrity": "sha512-sLxo4rZVk7xLgAjb/6zEzHJfSALx6u6coN1z61XCOF7i6CyTdJawF4+RdpjCSeS8AP66eR2InScbYAz9RAVOgA==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "find-babel-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", + "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "dev": true, + "requires": { + "json5": "0.5.1", + "path-exists": "3.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.2.0", + "pkg-dir": "2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + } + } + }, + "find-free-port": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-free-port/-/find-free-port-1.2.0.tgz", + "integrity": "sha512-8f/3bDLvyRWKQk+j2DSH7F1FyMJZJJHYlVtZYuO8AeS7LjApR5DSlLX/dxpiJFGjf60bXRSGoyP4nsdXBui/Bg==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "flatten-obj": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatten-obj/-/flatten-obj-3.1.1.tgz", + "integrity": "sha512-PyxxiUNTcuh2Ey9ooWlYILcPeh6/OdCyLrRWQejtCYqzcuJrWlATftbX/z447AvmIMKDEcAwBE8dEXz94Zlc8A==", + "requires": { + "isobj": "1.0.0" + } + }, + "flushwritable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", + "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "2.2.1" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "requires": { + "extsprintf": "1.0.2" + } + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", + "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "is-callable": "1.1.3" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "gcp-metadata": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.3.1.tgz", + "integrity": "sha512-5kJPX/RXuqoLmHiOOgkSDk/LI0QaXpEvZ3pvQP4ifjGGDKZKVSOjL/GcDjXA5kLxppFCOjmmsu0Uoop9d1upaQ==", + "requires": { + "extend": "3.0.1", + "retry-request": "3.3.1" + } + }, + "gcs-resumable-upload": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.7.7.tgz", + "integrity": "sha1-2clyWvlwu8hsvwr+8kBtwizpGGQ=", + "requires": { + "buffer-equal": "1.0.0", + "configstore": "3.1.1", + "google-auto-auth": "0.6.1", + "pumpify": "1.4.0", + "request": "2.83.0", + "stream-events": "1.0.4", + "through2": "2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "gcp-metadata": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz", + "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=", + "requires": { + "extend": "3.0.1", + "retry-request": "1.3.2" + } + }, + "google-auto-auth": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz", + "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=", + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.1.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.83.0" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "1.1.3", + "commander": "2.14.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + }, + "retry-request": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-1.3.2.tgz", + "integrity": "sha1-Wa0k5x+K4/MS1fe0vPRnpeWle9Y=", + "requires": { + "request": "2.76.0", + "through2": "2.0.3" + }, + "dependencies": { + "request": { + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", + "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "node-uuid": "1.4.8", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3" + } + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + } + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-node-dimensions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-node-dimensions/-/get-node-dimensions-1.2.0.tgz", + "integrity": "sha1-lSmOMqdSoVXynrcQ4GlVe0p/6Yw=" + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", + "integrity": "sha512-7aelVrYqCLuVjq2kEKRTH8fXPTC0xKTkM+G7UlFkEwCXY3sFbSxvY375JoFowOAYbkaU47SrBvOefUlLZZ+6QA==", + "dev": true, + "requires": { + "data-uri-to-buffer": "1.2.0", + "debug": "2.6.9", + "extend": "3.0.1", + "file-uri-to-path": "1.0.0", + "ftp": "0.3.10", + "readable-stream": "2.3.3" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getos": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.0.tgz", + "integrity": "sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q==", + "dev": true, + "requires": { + "async": "2.4.0" + }, + "dependencies": { + "async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.4.0.tgz", + "integrity": "sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-cache": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/global-cache/-/global-cache-1.2.1.tgz", + "integrity": "sha512-EOeUaup5DgWKlCMhA9YFqNRIlZwoxt731jCh47WBV9fQqHgXhr3Fa55hfgIUqilIcPsfdNKN7LHjrNY+Km40KA==", + "requires": { + "define-properties": "1.1.2", + "is-symbol": "1.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "globals": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.83.0" + } + }, + "google-auto-auth": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.8.2.tgz", + "integrity": "sha512-W91J1paFbyG45gpDWdTu9tKDxbiTDWYkOAxytNVF4oHVVgTCBV/8+lWdjj/6ldjN3eb+sEd9PKJBjm0kmCxvcw==", + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.3.1", + "google-auth-library": "0.12.0", + "request": "2.83.0" + }, + "dependencies": { + "google-auth-library": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.12.0.tgz", + "integrity": "sha512-79qCXtJ1VweBmmLr4yLq9S4clZB2p5Y+iACvuKk9gu4JitEnPc+bQFmYvtCYehVR44MQzD1J8DVmYW2w677IEw==", + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.isstring": "4.0.1", + "lodash.merge": "4.6.1", + "request": "2.83.0" + } + } + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "requires": { + "node-forge": "0.7.5" + } + }, + "got": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-8.1.0.tgz", + "integrity": "sha512-clILMRaLB1Ase3NWiSgTUrhpc951Z5V2IMtcFp8SKwu2aY+aeZZUuv/KKQmix+pz+Ov9SugLry6+JsBezHa9Vw==", + "requires": { + "@sindresorhus/is": "0.7.0", + "cacheable-request": "2.1.4", + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "into-stream": "3.1.0", + "is-retry-allowed": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.0", + "mimic-response": "1.0.0", + "p-cancelable": "0.3.0", + "p-timeout": "2.0.1", + "pify": "3.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "3.0.0", + "url-to-options": "1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "graphlib": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz", + "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "graphql": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.13.1.tgz", + "integrity": "sha512-awNp3LTrQ7dJDSX3p3PBuxNDC+WFSOrWeV6+l4Xeh2PQJVOFyQ9SZPonXRz2WZc7aIxLZsf2nDZuuuc0qyEq/A==", + "requires": { + "iterall": "1.2.2" + } + }, + "graphql-extensions": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.0.8.tgz", + "integrity": "sha512-9Ew7qfzkcsV2zrW4OJrdEcFKWAM3hsEhnp4Hbx9RGJ/uZvzDzR1uNUI5wQtjmWfMOj/QvVbwSeNA48PxYAGiBw==", + "requires": { + "core-js": "2.5.3", + "source-map-support": "0.5.3" + } + }, + "graphql-fields": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/graphql-fields/-/graphql-fields-1.0.2.tgz", + "integrity": "sha1-CZ7h1ERbQtD0fgbWIqzrszq8bM4=" + }, + "graphql-iso-date": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/graphql-iso-date/-/graphql-iso-date-3.5.0.tgz", + "integrity": "sha512-xs+8agn0OPzbiQf91aoyiZ3xC/oq4q/iJ4q1yY7hD0mbgcYBrqnZ4R+ycBZLGdb84rON1wNfqY4BDMyQG50OOg==" + }, + "graphql-relay": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.5.4.tgz", + "integrity": "sha1-WAUM/hYRhZX4KrOqv8l0VGznVag=" + }, + "graphql-tools": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-2.21.0.tgz", + "integrity": "sha512-AmG4WGdpL1OHwnA20ouP7BVB3KnvUOvsc7+4ULWRzEunyRFUYqxrgnEf20iZnYAha8JCb7AP4WPMwWKmGT91rg==", + "requires": { + "apollo-link": "1.2.1", + "apollo-utilities": "1.0.10", + "deprecated-decorator": "0.1.6", + "iterall": "1.2.2", + "uuid": "3.1.0" + } + }, + "graphql.js": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/graphql.js/-/graphql.js-0.4.20.tgz", + "integrity": "sha512-bVekIr1I+bIN8sbYuD8IDNFcKYbNBNyorbu4icYIvToG6VVLlEe3m+44XURomS69rjyzwPWoYDAUCnG530hT+w==", + "dev": true + }, + "gridfs-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gridfs-stream/-/gridfs-stream-1.1.1.tgz", + "integrity": "sha1-PdOhAOwgIaGBKC9utGcJY2B034k=", + "requires": { + "flushwritable": "1.0.0" + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.83.0" + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", + "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hasbin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz", + "integrity": "sha1-eMWSaJPIAhXCtWiuH9P8q3omlrA=", + "dev": true, + "requires": { + "async": "1.5.2" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "hash-stream-validation": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", + "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", + "requires": { + "through2": "2.0.3" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "resolve-pathname": "2.2.0", + "value-equal": "0.4.0", + "warning": "3.0.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "hoist-non-react-statics": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", + "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "1.0.3" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + } + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "hyphenate-style-name": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", + "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + }, + "i18next": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-10.3.0.tgz", + "integrity": "sha1-aGbRT2rns2KZIfeLwCjQSRTwZUw=" + }, + "i18next-browser-languagedetector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-2.1.0.tgz", + "integrity": "sha1-Gw4XsJUH+E56H6dhU5oHVE+SoN8=" + }, + "i18next-localstorage-cache": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/i18next-localstorage-cache/-/i18next-localstorage-cache-1.1.1.tgz", + "integrity": "sha1-V1JWzDXoyy2IFI91R2b90tJLsbc=" + }, + "i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ieee754": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "immutability-helper": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.6.5.tgz", + "integrity": "sha512-nRj5RN2em1O3NK25Zz0eBszg+kQ3mR5WgZp3wRajbyeu/Ii/eXhpwjB8JG4Hd78JUnuFVXSchWF5EZBI6F+vEA==", + "requires": { + "invariant": "2.2.2" + } + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inline-style-prefixer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.0.tgz", + "integrity": "sha1-MKA98bNGumsfuKgSvDydq+9IAi0=", + "requires": { + "bowser": "1.9.2", + "css-in-js-utils": "2.0.0" + } + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "2.3.0", + "p-is-promise": "1.1.0" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retina": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", + "integrity": "sha1-10AbKGvqKuN/Ykd1iN5QTQuGR+M=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" + }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=" + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, + "is-touch-device": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-touch-device/-/is-touch-device-1.0.1.tgz", + "integrity": "sha512-LAYzo9kMT1b2p19L/1ATGt2XcSilnzNlyvq6c0pbPRVisLbAPpLqr53tIJS00kvrTkj0HtR8U7+u8X0yR8lPSw==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isemail": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobj": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isobj/-/isobj-1.0.0.tgz", + "integrity": "sha1-Z7oo+cbcmBMOuho3m9y9HZOcc/Q=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.2.tgz", + "integrity": "sha512-kH5YRdqdbs5hiH4/Rr1Q0cSAGgjh3jTtg8vu9NLebBAoK3adVO4jk81J+TYOkTr2+Q4NLeb1ACvmEt65iG/Vbw==", + "dev": true, + "requires": { + "async": "2.6.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.2", + "istanbul-lib-report": "1.1.3", + "istanbul-lib-source-maps": "1.2.3", + "istanbul-reports": "1.1.4", + "js-yaml": "3.10.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", + "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz", + "integrity": "sha512-nz8t4HQ2206a/3AXi+NHFWEa844DMpPsgbcUteJbt1j8LX1xg56H9rOMnhvcvVvPbW60qAIyrSk44H8ZDqaSSA==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.2", + "semver": "5.4.1" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", + "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.2", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.1.2", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", + "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, + "jest": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.2.tgz", + "integrity": "sha512-wD7dXWtfaQAgbNVsjFqzmuhg6nzwGsTRVea3FpSJ7GURhG+J536fw4mdoLB01DgiEozDDeF1ZMR/UlUszTsCrg==", + "dev": true, + "requires": { + "import-local": "1.0.0", + "jest-cli": "22.4.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "jest-cli": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.2.tgz", + "integrity": "sha512-ebo6ZWK2xDSs7LGnLvM16SZOIJ2dj0B6/oERmGcal32NHkks450nNfGrGTyOSPgJDgH8DFhVdBXgSamN7mtZ0Q==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.1", + "exit": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "import-local": "1.0.0", + "is-ci": "1.1.0", + "istanbul-api": "1.2.2", + "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-instrument": "1.9.2", + "istanbul-lib-source-maps": "1.2.3", + "jest-changed-files": "22.2.0", + "jest-config": "22.4.2", + "jest-environment-jsdom": "22.4.1", + "jest-get-type": "22.1.0", + "jest-haste-map": "22.4.2", + "jest-message-util": "22.4.0", + "jest-regex-util": "22.1.0", + "jest-resolve-dependencies": "22.1.0", + "jest-runner": "22.4.2", + "jest-runtime": "22.4.2", + "jest-snapshot": "22.4.0", + "jest-util": "22.4.1", + "jest-validate": "22.4.2", + "jest-worker": "22.2.2", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "realpath-native": "1.0.0", + "rimraf": "2.6.2", + "slash": "1.0.0", + "string-length": "2.0.0", + "strip-ansi": "4.0.0", + "which": "1.3.0", + "yargs": "10.1.2" + } + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "jest-changed-files": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.2.0.tgz", + "integrity": "sha512-SzqOvoPMrXB0NPvDrSPeKETpoUNCtNDOsFbCzAGWxqWVvNyrIMLpUjVExT3u3LfdVrENlrNGCfh5YoFd8+ZeXg==", + "dev": true, + "requires": { + "throat": "4.1.0" + } + }, + "jest-config": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.2.tgz", + "integrity": "sha512-oG31qYO73/3vj/Q8aM2RgzmHndTkz9nRk8ISybfuJqqbf0RW7OUjHVOZPLOUiwLWtz52Yq2HkjIblsyhbA7vrg==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "glob": "7.1.2", + "jest-environment-jsdom": "22.4.1", + "jest-environment-node": "22.4.1", + "jest-get-type": "22.1.0", + "jest-jasmine2": "22.4.2", + "jest-regex-util": "22.1.0", + "jest-resolve": "22.4.2", + "jest-util": "22.4.1", + "jest-validate": "22.4.2", + "pretty-format": "22.4.0" + } + }, + "jest-diff": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.0.tgz", + "integrity": "sha512-+/t20WmnkOkB8MOaGaPziI8zWKxquMvYw4Ub+wOzi7AUhmpFXz43buWSxVoZo4J5RnCozpGbX3/FssjJ5KV9Nw==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "diff": "3.4.0", + "jest-get-type": "22.1.0", + "pretty-format": "22.4.0" + } + }, + "jest-docblock": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.0.tgz", + "integrity": "sha512-lDY7GZ+/CJb02oULYLBDj7Hs5shBhVpDYpIm8LUyqw9X2J22QRsM19gmGQwIFqGSJmpc/LRrSYudeSrG510xlQ==", + "dev": true, + "requires": { + "detect-newline": "2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.1.tgz", + "integrity": "sha512-x/JzAoH+dWPBnIMv5OQKiIR0TYf6UvbRjsIuDZ11yDFXkHKGJZg6jNnLAsokAm3cq9kUa2hH5BPUC9XU4n1ELQ==", + "dev": true, + "requires": { + "jest-mock": "22.2.0", + "jest-util": "22.4.1", + "jsdom": "11.6.2" + } + }, + "jest-environment-node": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.1.tgz", + "integrity": "sha512-wj9+zzfRgnUbm5VwFOCGgG1QmbucUyrjPKBKUJdLW8K5Ss5zrNc1k+v6feZhFg6sS3ZGnjgtIyklaxEARxu+LQ==", + "dev": true, + "requires": { + "jest-mock": "22.2.0", + "jest-util": "22.4.1" + } + }, + "jest-get-type": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.1.0.tgz", + "integrity": "sha512-nD97IVOlNP6fjIN5i7j5XRH+hFsHL7VlauBbzRvueaaUe70uohrkz7pL/N8lx/IAwZRTJ//wOdVgh85OgM7g3w==", + "dev": true + }, + "jest-haste-map": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.2.tgz", + "integrity": "sha512-EdQADHGXRqHJYAr7q9B9YYHZnrlcMwhx1+DnIgc9uN05nCW3RvGCxJ91MqWXcC1AzatLoSv7SNd0qXMp2jKBDA==", + "dev": true, + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "22.4.0", + "jest-serializer": "22.4.0", + "jest-worker": "22.2.2", + "micromatch": "2.3.11", + "sane": "2.4.1" + } + }, + "jest-jasmine2": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.2.tgz", + "integrity": "sha512-KZaIHpXQ0AIlvQJFCU0uoXxtz5GG47X14r9upMe7VXE55UazoMZBFnQb9TX2HoYX2/AxJYnjHuvwKVCFqOrEtw==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "co": "4.6.0", + "expect": "22.4.0", + "graceful-fs": "4.1.11", + "is-generator-fn": "1.0.0", + "jest-diff": "22.4.0", + "jest-matcher-utils": "22.4.0", + "jest-message-util": "22.4.0", + "jest-snapshot": "22.4.0", + "jest-util": "22.4.1", + "source-map-support": "0.5.3" + } + }, + "jest-junit": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-3.6.0.tgz", + "integrity": "sha512-zczUffyyJVvKldrkQZYlbytNDcxeuSSlysXqyEqOp/XiW/on5QDBMJMsmuY7Nmkve3KdA4U/tRkSiG/C2ewrjw==", + "dev": true, + "requires": { + "mkdirp": "0.5.1", + "strip-ansi": "4.0.0", + "xml": "1.0.1" + } + }, + "jest-leak-detector": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.0.tgz", + "integrity": "sha512-r3NEIVNh4X3fEeJtUIrKXWKhNokwUM2ILp5LD8w1KrEanPsFtZmYjmyZYjDTX2dXYr33TW65OvbRE3hWFAyq6g==", + "dev": true, + "requires": { + "pretty-format": "22.4.0" + } + }, + "jest-matcher-utils": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.0.tgz", + "integrity": "sha512-03m3issxUXpWMwDYTfmL8hRNewUB0yCRTeXPm+eq058rZxLHD9f5NtSSO98CWHqe4UyISIxd9Ao9iDVjHWd2qg==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "jest-get-type": "22.1.0", + "pretty-format": "22.4.0" + } + }, + "jest-message-util": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.0.tgz", + "integrity": "sha512-eyCJB0T3hrlpFF2FqQoIB093OulP+1qvATQmD3IOgJgMGqPL6eYw8TbC5P/VCWPqKhGL51xvjIIhow5eZ2wHFw==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.38", + "chalk": "2.3.1", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" + } + }, + "jest-mock": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.2.0.tgz", + "integrity": "sha512-eOfoUYLOB/JlxChOFkh/bzpWGqUXb9I+oOpkprHHs9L7nUNfL8Rk28h1ycWrqzWCEQ/jZBg/xIv7VdQkfAkOhw==", + "dev": true + }, + "jest-regex-util": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.1.0.tgz", + "integrity": "sha512-on0LqVS6Xeh69sw3d1RukVnur+lVOl3zkmb0Q54FHj9wHoq6dbtWqb3TSlnVUyx36hqjJhjgs/QLqs07Bzu72Q==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.2.tgz", + "integrity": "sha512-P1hSfcc2HJYT5t+WPu/11OfFMa7m8pBb2Gf2vm6W9OVs7YTXQ5RCC3nDqaYZQaTqxEM1ZZaTcQGcE6U2xMOsqQ==", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "chalk": "2.3.1" + } + }, + "jest-resolve-dependencies": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz", + "integrity": "sha512-76Ll61bD/Sus8wK8d+lw891EtiBJGJkWG8OuVDTEX0z3z2+jPujvQqSB2eQ+kCHyCsRwJ2PSjhn3UHqae/oEtA==", + "dev": true, + "requires": { + "jest-regex-util": "22.1.0" + } + }, + "jest-runner": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.2.tgz", + "integrity": "sha512-W4vwgiVQS0NyXt8hgpw7i0YUtsfoChiQcoHWBJeq2ocV4VF2osEZx8HYgpH5HfNe1Cb5LZeZWxX8Dr3hesbGFg==", + "dev": true, + "requires": { + "exit": "0.1.2", + "jest-config": "22.4.2", + "jest-docblock": "22.4.0", + "jest-haste-map": "22.4.2", + "jest-jasmine2": "22.4.2", + "jest-leak-detector": "22.4.0", + "jest-message-util": "22.4.0", + "jest-runtime": "22.4.2", + "jest-util": "22.4.1", + "jest-worker": "22.2.2", + "throat": "4.1.0" + } + }, + "jest-runtime": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.2.tgz", + "integrity": "sha512-9/Fxbj99cqxI7o2nTNzevnI38eDBstkwve8ZeaAD/Kz0fbU3i3eRv2QPEmzbmyCyBvUWxCT7BzNLTzTqH1+pyA==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "22.4.4", + "babel-plugin-istanbul": "4.1.5", + "chalk": "2.3.1", + "convert-source-map": "1.5.1", + "exit": "0.1.2", + "graceful-fs": "4.1.11", + "jest-config": "22.4.2", + "jest-haste-map": "22.4.2", + "jest-regex-util": "22.1.0", + "jest-resolve": "22.4.2", + "jest-util": "22.4.1", + "jest-validate": "22.4.2", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "realpath-native": "1.0.0", + "slash": "1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "2.3.0", + "yargs": "10.1.2" + }, + "dependencies": { + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "jest-serializer": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.0.tgz", + "integrity": "sha512-dnqde95MiYfdc1ZJpjEiHCRvRGGJHPsZQARJFucEGIaOzxqqS9/tt2WzD/OUSGT6kxaEGLQE92faVJGdoCu+Rw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.0.tgz", + "integrity": "sha512-6Zz4F9G1Nbr93kfm5h3A2+OkE+WGpgJlskYE4iSNN2uYfoTL5b9W6aB9Orpx+ueReHyqmy7HET7Z3EmYlL3hKw==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "jest-diff": "22.4.0", + "jest-matcher-utils": "22.4.0", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "22.4.0" + } + }, + "jest-util": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.1.tgz", + "integrity": "sha512-9ySBdJY2qVWpg0OvZbGcFXE2NgwccpZVj384E9bx7brKFc7l5anpqah15mseWcz7FLDk7/N+LyYgqFme7Rez2Q==", + "dev": true, + "requires": { + "callsites": "2.0.0", + "chalk": "2.3.1", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "jest-message-util": "22.4.0", + "mkdirp": "0.5.1", + "source-map": "0.6.1" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "jest-validate": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.2.tgz", + "integrity": "sha512-TLOgc/EULFBjMCAqZp5OdVvjxV16DZpfthd/UyPzM6lRmgWluohNVemAdnL3JvugU1s2Q2npcIqtbOtiPjaZ0A==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "jest-config": "22.4.2", + "jest-get-type": "22.1.0", + "leven": "2.1.0", + "pretty-format": "22.4.0" + } + }, + "jest-worker": { + "version": "22.2.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.2.2.tgz", + "integrity": "sha512-ZylDXjrFNt/OP6cUxwJFWwDgazP7hRjtCQbocFHyiwov+04Wm1x5PYzMGNJT53s4nwr0oo9ocYTImS09xOlUnw==", + "dev": true, + "requires": { + "merge-stream": "1.0.1" + } + }, + "joi": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", + "requires": { + "hoek": "2.16.3", + "isemail": "1.2.0", + "moment": "2.20.1", + "topo": "1.1.0" + }, + "dependencies": { + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + } + } + }, + "jquery-i18next": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jquery-i18next/-/jquery-i18next-1.2.1.tgz", + "integrity": "sha512-UNcw3rgxoKjGEg4w23FEn2h3OlPJU7rPzsgDuXDBZktIzeiVbJohs9Cv9hj8oP8KNfBRKOoErL/OVxg2FaAR4g==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + } + } + }, + "js2xmlparser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "dev": true, + "requires": { + "xmlcreate": "1.0.2" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdoc": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", + "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", + "dev": true, + "requires": { + "babylon": "7.0.0-beta.19", + "bluebird": "3.5.1", + "catharsis": "0.8.9", + "escape-string-regexp": "1.0.5", + "js2xmlparser": "3.0.0", + "klaw": "2.0.0", + "marked": "0.3.6", + "mkdirp": "0.5.1", + "requizzle": "0.2.1", + "strip-json-comments": "2.0.1", + "taffydb": "2.6.2", + "underscore": "1.8.3" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", + "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + } + } + }, + "jsdom": { + "version": "11.6.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", + "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "5.3.0", + "acorn-globals": "4.1.0", + "array-equal": "1.0.0", + "browser-process-hrtime": "0.1.2", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "domexception": "1.0.1", + "escodegen": "1.9.0", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.2.0", + "nwmatcher": "1.4.3", + "parse5": "4.0.0", + "pn": "1.1.0", + "request": "2.83.0", + "request-promise-native": "1.0.5", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.3", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "6.4.0", + "ws": "4.0.0", + "xml-name-validator": "3.0.0" + }, + "dependencies": { + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, + "jsonwebtoken": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", + "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=", + "requires": { + "joi": "6.10.1", + "jws": "3.1.4", + "lodash.once": "4.1.1", + "ms": "2.0.0", + "xtend": "4.0.1" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "3.0.3" + } + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "5.1.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "requires": { + "base64url": "2.0.0", + "jwa": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "klaw": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", + "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "later": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/later/-/later-1.2.0.tgz", + "integrity": "sha1-8s9sTdeVbdL1IK3wMpg26YdrrQ8=" + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "left-pad": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz", + "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "libphonenumber-js": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.0.24.tgz", + "integrity": "sha512-Gg5gXRYFFyMPyNtF8Zdy6PaE99RW2wj1Ul4C2bJAnarXjgAHYa3QwFukC2QSRdsVyDLfmebltEKApRyi9+bJ1w==", + "requires": { + "babel-runtime": "6.26.0", + "bluebird": "3.5.1", + "minimist": "1.2.0", + "semver-compare": "1.0.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "dev": true, + "requires": { + "signal-exit": "3.0.2" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" + }, + "lodash._basecallback": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", + "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", + "requires": { + "lodash._baseisequal": "3.0.7", + "lodash._bindcallback": "3.0.1", + "lodash.isarray": "3.0.4", + "lodash.pairs": "3.0.1" + } + }, + "lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "requires": { + "lodash.keys": "3.1.2" + } + }, + "lodash._basefind": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basefind/-/lodash._basefind-3.0.0.tgz", + "integrity": "sha1-srugXMZF+XLeLPkl+iv2Og9gyK4=" + }, + "lodash._basefindindex": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz", + "integrity": "sha1-8IM2ChsCJBjtgbyJm+sxLiHnSk8=" + }, + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", + "requires": { + "lodash.isarray": "3.0.4", + "lodash.istypedarray": "3.0.6", + "lodash.keys": "3.1.2" + } + }, + "lodash._baseismatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lodash._baseismatch/-/lodash._baseismatch-3.1.3.tgz", + "integrity": "sha1-Byj8SO+hFpnT1fLXMEnyqxPED9U=", + "requires": { + "lodash._baseisequal": "3.0.7" + } + }, + "lodash._basematches": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._basematches/-/lodash._basematches-3.2.0.tgz", + "integrity": "sha1-9H4D8H7CB4SrCWjQy2y1l+IQEVg=", + "requires": { + "lodash._baseismatch": "3.1.3", + "lodash.pairs": "3.0.1" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "lodash.every": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", + "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=" + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=" + }, + "lodash.findwhere": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.findwhere/-/lodash.findwhere-3.1.0.tgz", + "integrity": "sha1-eTfTTz6sgY3sf6lOjKXib9uhz8E=", + "requires": { + "lodash._basematches": "3.2.0", + "lodash.find": "3.2.1" + }, + "dependencies": { + "lodash.find": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-3.2.1.tgz", + "integrity": "sha1-BG4xnzrOkSrGySRsf2g8XsB7Nq0=", + "requires": { + "lodash._basecallback": "3.3.1", + "lodash._baseeach": "3.0.4", + "lodash._basefind": "3.0.0", + "lodash._basefindindex": "3.6.0", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + } + } + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + }, + "lodash.noop": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", + "integrity": "sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=" + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.pairs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", + "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", + "requires": { + "lodash.keys": "3.1.2" + } + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "lodash.without": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "macos-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", + "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "dev": true + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.4" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "dev": true + }, + "match-sorter": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-2.2.0.tgz", + "integrity": "sha512-hKyj9Gm5EcOJR2A3+2cNPMyQKQ8q8pPfjT7DvOyx3xs+xe4O/g3dKttFwesPF+0T0nhPWpldP2EtMO3bBMAdbg==", + "requires": { + "diacritic": "0.0.2" + } + }, + "material-colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.5.tgz", + "integrity": "sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE=" + }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "1.1.6" + } + }, + "md5-file": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", + "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", + "dev": true, + "requires": { + "buffer-alloc": "1.1.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "1.1.0" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "message-box": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.0.tgz", + "integrity": "sha512-SPLfVDEM2YcAgV2IB0B5vOGjvqXSSw7ZibEeXcff8HYpxyG1Uj+XjgnGUGyR1C0EQCvPI3MBx3p7opt2CIQ2hw==", + "requires": { + "lodash.merge": "4.6.1", + "lodash.template": "4.4.0" + } + }, + "meteor-node-stubs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-0.4.1.tgz", + "integrity": "sha512-UO2OStvLOKoApmOdIP5eCqoLaa/ritMXRg4ffJVdkNLEsczzPvTjgC0Mxk4cM4R8MZkwll90FYgjDf5qUTJdMA==", + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.1", + "string_decoder": "1.1.1", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "asn1.js": { + "version": "4.10.1", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.1", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.4.1", + "bundled": true, + "requires": { + "util": "0.10.3" + } + }, + "base64-js": { + "version": "1.3.0", + "bundled": true + }, + "bn.js": { + "version": "4.11.8", + "bundled": true + }, + "brorand": { + "version": "1.1.0", + "bundled": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.1", + "safe-buffer": "5.1.2" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "bundled": true, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.1", + "bundled": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.0", + "inherits": "2.0.1", + "parse-asn1": "5.1.1" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "bundled": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "4.9.1", + "bundled": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.11", + "isarray": "1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "bundled": true + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "requires": { + "inherits": "2.0.1", + "safe-buffer": "5.1.2" + } + }, + "console-browserify": { + "version": "1.1.0", + "bundled": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "create-ecdh": { + "version": "4.0.3", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.1", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "bundled": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.1", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "bundled": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.1", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "date-now": { + "version": "0.1.4", + "bundled": true + }, + "des.js": { + "version": "1.0.0", + "bundled": true, + "requires": { + "inherits": "2.0.1", + "minimalistic-assert": "1.0.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "domain-browser": { + "version": "1.2.0", + "bundled": true + }, + "elliptic": { + "version": "6.4.0", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.1", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "events": { + "version": "1.1.1", + "bundled": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" + } + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "2.0.1", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.3", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "bundled": true + } + } + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "https-browserify": { + "version": "0.0.1", + "bundled": true + }, + "ieee754": { + "version": "1.1.11", + "bundled": true + }, + "indexof": { + "version": "0.0.1", + "bundled": true + }, + "inherits": { + "version": "2.0.1", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "md5.js": { + "version": "1.3.4", + "bundled": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.1" + } + }, + "miller-rabin": { + "version": "4.0.1", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true + }, + "os-browserify": { + "version": "0.2.1", + "bundled": true + }, + "pako": { + "version": "0.2.9", + "bundled": true + }, + "parse-asn1": { + "version": "5.1.1", + "bundled": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" + } + }, + "path-browserify": { + "version": "0.0.0", + "bundled": true + }, + "pbkdf2": { + "version": "3.0.16", + "bundled": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "process": { + "version": "0.11.10", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "public-encrypt": { + "version": "4.0.2", + "bundled": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "querystring": { + "version": "0.2.0", + "bundled": true + }, + "querystring-es3": { + "version": "0.2.1", + "bundled": true + }, + "randombytes": { + "version": "2.0.6", + "bundled": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "randomfill": { + "version": "1.0.4", + "bundled": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "bundled": true + } + } + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "requires": { + "inherits": "2.0.1", + "safe-buffer": "5.1.2" + } + }, + "stream-browserify": { + "version": "2.0.1", + "bundled": true, + "requires": { + "inherits": "2.0.1", + "readable-stream": "2.3.6" + } + }, + "stream-http": { + "version": "2.8.1", + "bundled": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.1", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "timers-browserify": { + "version": "1.4.2", + "bundled": true, + "requires": { + "process": "0.11.10" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "bundled": true + }, + "tty-browserify": { + "version": "0.0.0", + "bundled": true + }, + "url": { + "version": "0.11.0", + "bundled": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "bundled": true + } + } + }, + "util": { + "version": "0.10.3", + "bundled": true, + "requires": { + "inherits": "2.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "vm-browserify": { + "version": "0.0.4", + "bundled": true, + "requires": { + "indexof": "0.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + }, + "methmeth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/methmeth/-/methmeth-1.1.0.tgz", + "integrity": "sha1-6AomYY5S9cQiKGG7dIUQvRDikIk=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz", + "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==", + "requires": { + "yallist": "3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "requires": { + "minipass": "2.2.1" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "modelo": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.3.tgz", + "integrity": "sha512-9DITV2YEMcw7XojdfvGl3gDD8J9QjZTJ7ZOUuSAkP+F3T6rDbzMJuPktxptsdHYEvZcmXrCD3LMOhdSAEq6zKA==" + }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" + }, + "moment-timezone": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz", + "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", + "requires": { + "moment": "2.20.1" + } + }, + "mongo-object": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.2.tgz", + "integrity": "sha512-xRrnal5HuCz3we8Bzk17iYfgCMfaaSU+cq0OkQ/PP+CYhhFmw4Joqmcc0R9XUAgxbFAybg7uzxbNGUw13kEUxQ==", + "requires": { + "lodash.foreach": "4.5.0", + "lodash.isempty": "4.4.0", + "lodash.isobject": "3.0.2", + "lodash.without": "4.4.0" + } + }, + "mongodb": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.5.tgz", + "integrity": "sha512-8ioTyyc8tkNwZCTDa1FPWvmpJFfvE484DnugC8KpVrw4AKAE03OOAlORl2yYTNtz3TX4Ab7FRo00vzgexB/67A==", + "requires": { + "mongodb-core": "3.0.5" + } + }, + "mongodb-core": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.5.tgz", + "integrity": "sha512-4A1nx/xAU5d/NPICjiyzVxzNrIdJQQsYRe3xQkV1O638t+fHHfAOLK+SQagqGnu1m0aeSxb1ixp/P0FGSQWIGA==", + "requires": { + "bson": "1.0.6", + "require_optional": "1.0.1" + } + }, + "mongodb-memory-server": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-1.7.4.tgz", + "integrity": "sha512-8CNbBV80cBradJEuyAl+Vw45Wf0MJYTplDphGE9z3qqaQVRYG25PhZ2Uk+kyVVF6HqF4obe+meCMpoOoeXwJ8w==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "debug": "3.1.0", + "decompress": "4.2.0", + "fs-extra": "5.0.0", + "get-port": "3.2.0", + "getos": "3.1.0", + "lockfile": "1.0.4", + "md5-file": "3.2.3", + "mkdirp": "0.5.1", + "request": "2.86.0", + "request-promise": "4.2.2", + "tmp": "0.0.33", + "uuid": "3.2.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "request": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", + "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "ncp": "2.0.0", + "rimraf": "2.4.5" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "6.0.4" + } + } + } + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "nearley": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.11.1.tgz", + "integrity": "sha512-1azpqq1JvHKZNPEixS1jNEXf4kDilhFtr8AIZIGjP8N0TcAcUhKgi354niI5pM4JoOsMQ+H6vzCYWQa95LQjcw==", + "dev": true, + "requires": { + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", + "randexp": "0.4.6", + "semver": "5.4.1" + } + }, + "needle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "dev": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.19", + "sax": "1.2.4" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true + }, + "nexmo": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nexmo/-/nexmo-2.2.0.tgz", + "integrity": "sha512-7D/QVyQakLJ8M40hANSvINzswK/3XWfml0hY7Ce2pwn5Kinu5UL5i5+nobnvvftoi0mv1Sx288+fmVEqJkh0Mw==", + "requires": { + "jsonwebtoken": "7.4.3", + "request": "2.83.0", + "uuid": "2.0.3" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } + } + }, + "nock": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.1.6.tgz", + "integrity": "sha512-DuKF+1W/FnMO6MXIGgCIWcM95bETjBbmFdR4v7dAj1zH9a9XhOjAa//PuWh98XIXxcZt7wdiv0JlO0AA0e2kqQ==", + "requires": { + "chai": "3.5.0", + "debug": "2.6.9", + "deep-equal": "1.0.1", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "propagate": "0.4.0", + "qs": "6.5.1", + "semver": "5.4.1" + }, + "dependencies": { + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + } + } + }, + "node-fetch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.1.tgz", + "integrity": "sha1-NpynC4L1DIZJYQSmx3bSdPTkotQ=" + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" + }, + "node-geocoder": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/node-geocoder/-/node-geocoder-3.22.0.tgz", + "integrity": "sha512-w7ew1vH6IjkhexoxcJ2aFBMMHdfS/VY5xiJ29jd6ml3l5nitySLeJ2vc5IxEfhgq2sZvh7mBk9dJlMqKEKBqJg==", + "requires": { + "bluebird": "3.5.1", + "request": "2.83.0", + "request-promise": "4.2.2" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.4.1", + "shellwords": "0.1.1", + "which": "1.3.0" + } + }, + "node-pre-gyp": { + "version": "0.6.39", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.6", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + } + } + }, + "nodemailer-wellknown": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.2.3.tgz", + "integrity": "sha1-ZA7SBKAWYnZD+Yc5qU+O+dOcoKk=" + }, + "nodemon": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.17.2.tgz", + "integrity": "sha512-v1fVfgaZanBHP/ZOc9V72uKKIF4dcRfZV7GISNVi/w/g5pwB7nIvOK+RGULjrzhs97cwUX41cM4+dlw+bg2igw==", + "dev": true, + "requires": { + "chokidar": "2.0.2", + "debug": "3.1.0", + "ignore-by-default": "1.0.1", + "minimatch": "3.0.4", + "pstree.remy": "1.1.0", + "semver": "5.5.0", + "supports-color": "5.2.0", + "touch": "3.1.0", + "undefsafe": "2.0.2", + "update-notifier": "2.3.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.9", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.1", + "underscore": "1.4.4" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "2.0.0", + "query-string": "5.1.0", + "sort-keys": "2.0.0" + } + }, + "nouislider": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-9.2.0.tgz", + "integrity": "sha1-6HxQfeKwtNB1A4taQlR8fbvrr2k=" + }, + "nouislider-algolia-fork": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/nouislider-algolia-fork/-/nouislider-algolia-fork-10.0.0.tgz", + "integrity": "sha1-ZtCpQaqgymTlg3nme9MglW88884=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", + "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-inspect": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.5.0.tgz", + "integrity": "sha512-UmOFbHbwvv+XHj7BerrhVq+knjceBdkvU5AriwLMvhv2qi+e7DJzxfBeFpILEjVzCp+xA+W/pIf06RGPWlZNfw==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.11" + } + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "output-file-sync": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", + "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "is-plain-obj": "1.1.0", + "mkdirp": "0.5.1" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.1.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "1.0.0" + } + }, + "pac-proxy-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0", + "get-uri": "2.0.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "pac-resolver": "3.0.0", + "raw-body": "2.3.2", + "socks-proxy-agent": "3.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "requires": { + "co": "4.6.0", + "degenerator": "1.0.4", + "ip": "1.1.5", + "netmask": "1.0.6", + "thunkify": "2.1.2" + } + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.4.1" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "9.4.6" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-extra": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/path-extra/-/path-extra-1.0.3.tgz", + "integrity": "sha1-fBEhiablDVlXkOetIDfkTkEMEWY=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/path-parser/-/path-parser-4.0.4.tgz", + "integrity": "sha512-U71kuqOWLb/syIOvL3PuuoMYy1j9M709F3VfS8MqmSy+gTnIwY5CXuASKlhs+5DDAkmuDIML3vdW7Pna28E/cg==", + "requires": { + "search-params": "2.1.2" + } + }, + "path-to-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.1.0.tgz", + "integrity": "sha512-dZY7QPCPp5r9cnNuQ955mOv4ZFVDXY/yvqeV7Y1W2PJA3PEFcuow9xKFfJxbBj1pIjOAP+M2B4/7xubmykLrXw==" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "2.3.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "paypal-rest-sdk": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/paypal-rest-sdk/-/paypal-rest-sdk-1.8.1.tgz", + "integrity": "sha512-Trj2GuPn10GqpICAxQh5wjxuDT7rq7DMOkvyatz05wI5xPGmqXN7UC0WfDSF9WSBs4YdcWZP0g+nY+sOdaFggw==", + "requires": { + "buffer-crc32": "0.2.13", + "semver": "5.4.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pirates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz", + "integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==", + "dev": true, + "requires": { + "node-modules-regexp": "1.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "pop-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", + "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", + "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", + "requires": { + "chalk": "2.3.1", + "source-map": "0.6.1", + "supports-color": "5.2.0" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "prerender-node": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/prerender-node/-/prerender-node-2.7.4.tgz", + "integrity": "sha1-L7PEHRRHjxemCfWpAM0XvwDjy3E=", + "requires": { + "request": "2.81.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "22.4.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.0.tgz", + "integrity": "sha512-pvCxP2iODIIk9adXlo4S3GRj0BrJiil68kByAa1PrgG97c1tClh9dLMgp3Z6cHFZrclaABt0UH8PIhwHuFLqYA==", + "dev": true, + "requires": { + "ansi-regex": "3.0.0", + "ansi-styles": "3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + } + } + }, + "prop-types-exact": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.1.2.tgz", + "integrity": "sha512-3x4BWv7w2luSStiHwSzrhK9U1sm+vHwSyg9le2RfY41pZyJdiPKDOKh6TCQywwl++SCr7MMKu7POp4LU/L/eIA==", + "requires": { + "has": "1.0.1", + "object.assign": "4.1.0" + } + }, + "propagate": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", + "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.0.tgz", + "integrity": "sha512-g6n6vnk8fRf705ShN+FEXFG/SDJaW++lSs0d9KaJh4uBWW/wi7en4Cpo5VYQW3SZzAE121lhB/KLQrbURoubZw==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.2", + "pac-proxy-agent": "2.0.2", + "proxy-from-env": "1.0.0", + "socks-proxy-agent": "3.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pstree.remy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", + "integrity": "sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q==", + "dev": true, + "requires": { + "ps-tree": "1.1.0" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", + "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", + "requires": { + "asap": "2.0.6", + "pop-iterate": "1.0.1", + "weak-map": "1.0.5" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "query-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/query-parse/-/query-parse-2.0.0.tgz", + "integrity": "sha512-mabTzsUZo6OnNvJ7zr6v0cCVtxZT7ZUw/39wJU33c8VOFYRqW9+eNkWNhsfGqTc2OKZaghbWjn6Cwtut+FzsdA==", + "requires": { + "lodash": "4.17.10" + } + }, + "query-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", + "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "radium": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/radium/-/radium-0.22.0.tgz", + "integrity": "sha512-9zOYegr4gXfgDiVcf02Qyj8zzupmYSTtIhxvSU/42Ls1Q/+r1cisuGUUJ5m06Ha2cc/f3e5vMM80rj2l34Slew==", + "requires": { + "exenv": "1.2.2", + "inline-style-prefixer": "4.0.0", + "prop-types": "15.6.0" + } + }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "dev": true, + "requires": { + "performance-now": "2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "0.1.15" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", + "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-addons-create-fragment": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz", + "integrity": "sha1-o5TefCx77Na1R1uhuXrEcs58dPg=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, + "react-addons-pure-render-mixin": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-pure-render-mixin/-/react-addons-pure-render-mixin-15.6.2.tgz", + "integrity": "sha1-a4P0C2s27kBzXL1hJes/E84c3ck=", + "requires": { + "fbjs": "0.8.16", + "object-assign": "4.1.1" + } + }, + "react-addons-shallow-compare": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz", + "integrity": "sha1-GYoAuR/DdiPbZKKP0XtZa6NicC8=", + "requires": { + "fbjs": "0.8.16", + "object-assign": "4.1.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + } + } + }, + "react-addons-test-utils": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.6.2.tgz", + "integrity": "sha1-wStu/cIkfBDae4dw0YUICnsEcVY=", + "dev": true + }, + "react-autosuggest": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/react-autosuggest/-/react-autosuggest-9.3.3.tgz", + "integrity": "sha512-g0W1x2+PfWWcEsz2r7sCPv1Dpwq6eH0uysFLwI4iVKfPxZkHvRL2tjRvnoFVfrP6/61lfqII4pOKh1V1S4VPrQ==", + "requires": { + "prop-types": "15.6.0", + "react-autowhatever": "10.1.0", + "shallow-equal": "1.0.0" + } + }, + "react-autowhatever": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-autowhatever/-/react-autowhatever-10.1.0.tgz", + "integrity": "sha512-LMZggoRgcmldAMyABY3Dz/DRiTQViMsQllXtOsDrZeBRwPIfn0RAOySaQMUNyECrHaCB5pm66jgQvkyNSh/BjA==", + "requires": { + "prop-types": "15.6.0", + "react-themeable": "1.1.0", + "section-iterator": "2.0.0" + } + }, + "react-avatar": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-avatar/-/react-avatar-2.5.1.tgz", + "integrity": "sha512-bwH5pWY6uxaKZt+IZBfD+SU3Dpy3FaKbmAzrOI4N8SATUPLXOdGaJHWUl6Vl8hHSwWSsoLh/m7xYHdnn0lofZw==", + "requires": { + "babel-runtime": "6.26.0", + "is-retina": "1.0.3", + "md5": "2.2.1" + } + }, + "react-color": { + "version": "2.13.8", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.13.8.tgz", + "integrity": "sha1-vMWPeaciub/DfEAuaM0Y8mlwruQ=", + "requires": { + "lodash": "4.17.10", + "material-colors": "1.2.5", + "prop-types": "15.6.0", + "reactcss": "1.2.3", + "tinycolor2": "1.4.1" + } + }, + "react-copy-to-clipboard": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz", + "integrity": "sha512-ELKq31/E3zjFs5rDWNCfFL4NvNFQvGRoJdAKReD/rUPA+xxiLPQmZBZBvy2vgH7V0GE9isIQpT9WXbwIVErYdA==", + "requires": { + "copy-to-clipboard": "3.0.8", + "prop-types": "15.6.0" + } + }, + "react-cursor-position": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-cursor-position/-/react-cursor-position-2.4.0.tgz", + "integrity": "sha512-uwYtWzfdQYqeTcBHFjzwLJNmxec2YQjSFPintG2hiVNKwIr1tE0RJsFIpqGzZL0ZhWiyg0BOSVPCZ8XSINl3PQ==", + "requires": { + "object-assign": "4.1.1", + "object.omit": "3.0.0", + "prop-types": "15.6.0" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + }, + "object.omit": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", + "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", + "requires": { + "is-extendable": "1.0.1" + } + } + } + }, + "react-dates": { + "version": "16.3.6", + "resolved": "https://registry.npmjs.org/react-dates/-/react-dates-16.3.6.tgz", + "integrity": "sha512-wVvyRFKyLk/txS19AK/dqU40fwhTNc/+kwikzTTcrsdM7fa8AJAwmB2MrKeu3h+Fk4aILm9JSDXtmp1JQrrVpA==", + "requires": { + "airbnb-prop-types": "2.8.1", + "consolidated-events": "1.1.1", + "is-touch-device": "1.0.1", + "lodash": "4.17.10", + "object.assign": "4.1.0", + "object.values": "1.0.4", + "prop-types": "15.6.0", + "react-addons-shallow-compare": "15.6.2", + "react-moment-proptypes": "1.5.0", + "react-portal": "4.1.3", + "react-with-styles": "3.1.0", + "react-with-styles-interface-css": "4.0.1" + } + }, + "react-dnd": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.5.4.tgz", + "integrity": "sha512-y9YmnusURc+3KPgvhYKvZ9oCucj51MSZWODyaeV0KFU0cquzA7dCD1g/OIYUKtNoZ+MXtacDngkdud2TklMSjw==", + "requires": { + "disposables": "1.0.1", + "dnd-core": "2.5.4", + "hoist-non-react-statics": "2.3.1", + "invariant": "2.2.2", + "lodash": "4.17.10", + "prop-types": "15.6.0" + } + }, + "react-dnd-html5-backend": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.5.4.tgz", + "integrity": "sha512-jDqAkm/hI8Tl4HcsbhkBgB6HgpJR1e+ML1SbfxaegXYiuMxEVQm0FOwEH5WxUoo6fmIG4N+H0rSm59POuZOCaA==", + "requires": { + "lodash": "4.17.10" + } + }, + "react-dom": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", + "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-dropzone": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-4.2.8.tgz", + "integrity": "sha512-L/q6ySfhdG9Md3P21jFumzlm92TxRT0FtYX6G793Nf8bt7Fzpwx6gJsPk0idV094koj/Y5vRpp0q9+e0bdsjxw==", + "requires": { + "attr-accept": "1.1.2", + "prop-types": "15.6.0" + } + }, + "react-helmet": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz", + "integrity": "sha1-qBgR3yExOm1VxfBYxK66XW89l6c=", + "requires": { + "deep-equal": "1.0.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0", + "react-side-effect": "1.1.3" + } + }, + "react-image-magnify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-image-magnify/-/react-image-magnify-2.4.1.tgz", + "integrity": "sha512-5LHf27Lq33CV92eIf1CFAkZMzXoTSq+fpXlG7zkDlgDgfTJjGXqROe8GC4BCqC/JdJuUNzWGh9M7h3p43k6Ibw==", + "requires": { + "clamp": "1.0.1", + "detect-it": "3.0.3", + "object-assign": "4.1.1", + "prop-types": "15.6.0", + "react-cursor-position": "2.4.0", + "react-required-if": "1.0.1" + } + }, + "react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==", + "requires": { + "prop-types": "15.6.0" + } + }, + "react-loadable": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.3.1.tgz", + "integrity": "sha1-lpnpoI/tSbrNacqqKCA0tip2vN0=", + "requires": { + "prop-types": "15.6.0" + } + }, + "react-measure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-measure/-/react-measure-2.0.2.tgz", + "integrity": "sha1-ByqaX6/AHfutwfpfsJ/DUQN/Y2w=", + "requires": { + "get-node-dimensions": "1.2.0", + "prop-types": "15.6.0", + "resize-observer-polyfill": "1.4.2" + } + }, + "react-moment-proptypes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-moment-proptypes/-/react-moment-proptypes-1.5.0.tgz", + "integrity": "sha512-0dQJNs0aaiMeGp1AJACDTzGMM7N4qv4Wgg1948/ARdLt3VKlkcem6Yjm5ExUmUtoXk6WpSXvFQ204l7E+RTEEQ==", + "requires": { + "moment": "2.20.1" + } + }, + "react-nouislider": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-nouislider/-/react-nouislider-2.0.1.tgz", + "integrity": "sha512-/K5cHKkvsvZ/fwgFATxkORAEtuiWVrQOqNchEInRn7qlv9mDh+LEq+NydFu91v7Cy2XjHzVPD9ZU12wg5t9yCg==", + "requires": { + "nouislider": "9.2.0" + } + }, + "react-onclickoutside": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz", + "integrity": "sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg==" + }, + "react-portal": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.1.3.tgz", + "integrity": "sha512-0JHna4qv6LhkQfBg2/Ket0NsVAOHezBtInNlr1XHDEPR4LplUWuY5oJ4ysHCMxHpP2Rtd3B44SRUAnHmOzOCaA==", + "requires": { + "prop-types": "15.6.0" + } + }, + "react-required-if": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-required-if/-/react-required-if-1.0.1.tgz", + "integrity": "sha1-9B0Gvrt1NGwgbNHejcDvW3yPmr0=" + }, + "react-router": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", + "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", + "requires": { + "history": "4.7.2", + "hoist-non-react-statics": "2.3.1", + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "path-to-regexp": "1.7.0", + "prop-types": "15.6.0", + "warning": "3.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", + "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", + "requires": { + "history": "4.7.2", + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "prop-types": "15.6.0", + "react-router": "4.2.0", + "warning": "3.0.0" + } + }, + "react-s-alert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-s-alert/-/react-s-alert-1.4.1.tgz", + "integrity": "sha512-+cSpVPe6YeGklhlo7zbVlB0Z6jdiU9HPmEVzp5nIhNm9lvdL7rVO2Jx09pCwT99GmODyoN0iNhbQku6r7six8A==", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "react-select": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-1.2.1.tgz", + "integrity": "sha512-vaCgT2bEl+uTyE/uKOEgzE5Dc/wLtzhnBvoHCeuLoJWc4WuadN6WQDhoL42DW+TziniZK2Gaqe/wUXydI3NSaQ==", + "requires": { + "classnames": "2.2.5", + "prop-types": "15.6.0", + "react-input-autosize": "2.2.1" + } + }, + "react-side-effect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.3.tgz", + "integrity": "sha1-USwlq+DewXKDTEAB7FxR4E1BvFw=", + "requires": { + "exenv": "1.2.2", + "shallowequal": "1.0.2" + } + }, + "react-table": { + "version": "6.7.6", + "resolved": "https://registry.npmjs.org/react-table/-/react-table-6.7.6.tgz", + "integrity": "sha1-P547MIMozrBO+TpHur76uiYZyQU=", + "requires": { + "classnames": "2.2.5" + } + }, + "react-taco-table": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/react-taco-table/-/react-taco-table-0.5.1.tgz", + "integrity": "sha1-kOMQ1dXGJzrtIh9lzf7WI9PFiew=", + "requires": { + "classnames": "2.2.5", + "d3-format": "1.2.0", + "d3-scale": "1.0.6", + "d3-scale-chromatic": "1.1.1", + "lodash.curry": "4.1.1", + "prop-types": "15.6.0", + "stable": "0.1.6" + } + }, + "react-tether": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/react-tether/-/react-tether-0.6.1.tgz", + "integrity": "sha512-/1o2d77RyL78S1IjS1+yGMTKSldYMBVtu4H20zNIC9eAGsgA/KMxdLRcE3k32wj4TWCsVMPDnxeTokHuVWNLag==", + "requires": { + "prop-types": "15.6.0", + "tether": "1.4.3" + } + }, + "react-textarea-autosize": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz", + "integrity": "sha512-bx6z2I35aapr71ggw2yZIA4qhmqeTa4ZVsSaTeFvtf9kfcZppDBh2PbMt8lvbdmzEk7qbSFhAxR9vxEVm6oiMg==", + "requires": { + "prop-types": "15.6.0" + } + }, + "react-themeable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-themeable/-/react-themeable-1.1.0.tgz", + "integrity": "sha1-fURm3ZsrX6dQWHJ4JenxUro3mg4=", + "requires": { + "object-assign": "3.0.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, + "react-transition-group": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz", + "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==", + "requires": { + "chain-function": "1.0.0", + "dom-helpers": "3.2.1", + "loose-envify": "1.3.1", + "prop-types": "15.6.0", + "warning": "3.0.0" + } + }, + "react-with-direction": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-with-direction/-/react-with-direction-1.3.0.tgz", + "integrity": "sha512-2TflEebNckTNUybw3Rzqjg4BwM/H380ZL5lsbZ5f4UTY2JyE5uQdQZK5T2w+BDJSAMcqoA2RDJYa4e7Cl6C2Kg==", + "requires": { + "airbnb-prop-types": "2.8.1", + "brcast": "2.0.2", + "deepmerge": "1.5.2", + "direction": "1.0.1", + "hoist-non-react-statics": "2.3.1", + "object.assign": "4.1.0", + "object.values": "1.0.4", + "prop-types": "15.6.0" + } + }, + "react-with-styles": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-with-styles/-/react-with-styles-3.1.0.tgz", + "integrity": "sha512-neH8a79MoPGTMhwRstNVRydJaZA2yjwNSBYo1zFjkQZ44EGRUgs/RR2dMdSt2ARa8yGew2rOpeKQOWqaEoqnpw==", + "requires": { + "deepmerge": "1.5.2", + "global-cache": "1.2.1", + "hoist-non-react-statics": "2.3.1", + "prop-types": "15.6.0", + "react-with-direction": "1.3.0" + } + }, + "react-with-styles-interface-css": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/react-with-styles-interface-css/-/react-with-styles-interface-css-4.0.1.tgz", + "integrity": "sha512-kLS+Ytv0/XBph7ovFP/7IazwBD/W/Xo9Zr/90d6QSGCRjhvHZXusFDOzXUwBE1GAkGRjZy+RrgbPad5wKyXclA==", + "requires": { + "aphrodite": "1.2.5", + "array.prototype.flatten": "1.2.1", + "global-cache": "1.2.1" + } + }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "4.17.10" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "realpath-native": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", + "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", + "dev": true, + "requires": { + "util.promisify": "1.0.0" + } + }, + "recompose": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz", + "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==", + "requires": { + "change-emitter": "0.1.6", + "fbjs": "0.8.16", + "hoist-non-react-statics": "2.3.1", + "symbol-observable": "1.0.4" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.10", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "symbol-observable": "1.0.4" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-6.0.0.tgz", + "integrity": "sha512-BvXxRS7RfVWxtm7vrq+0I0j7sqZ1zeSC+yzf5HS0qLnKcZPX541gFEGB39LvGuKHrkyKXrzXug+oC7xkM1Zovw==", + "dev": true, + "requires": { + "regenerate": "1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.4.tgz", + "integrity": "sha512-p2I0fY+TbSLD2/VFTFb/ypEHxs3e3AjU0DzttdPqk2bSmDhfSh5E54b86Yc6XhUa5KykK1tgbvZ4Nr82oCJWkQ==", + "dev": true, + "requires": { + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "regexpu-core": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.1.5.tgz", + "integrity": "sha512-3xo5pFze1F8oR4F9x3aFbdtdxAxQ9WBX6gXfLgeBt7KpDI0+oDF7WVntnhsPKqobU/GAYc2pmx+y3z0JI1+z3w==", + "dev": true, + "requires": { + "regenerate": "1.4.0", + "regenerate-unicode-properties": "6.0.0", + "regjsgen": "0.4.0", + "regjsparser": "0.3.0", + "unicode-match-property-ecmascript": "1.0.3", + "unicode-match-property-value-ecmascript": "1.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.6", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.6" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", + "dev": true + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "request-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.2.tgz", + "integrity": "sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ=", + "requires": { + "bluebird": "3.5.1", + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.3" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + } + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "requires": { + "lodash": "4.17.10" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-package-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", + "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=", + "dev": true + }, + "require-resolve": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/require-resolve/-/require-resolve-0.0.2.tgz", + "integrity": "sha1-urQQqxruLz9Vt5MXRR3TQodk5vM=", + "dev": true, + "requires": { + "x-path": "0.0.2" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + } + } + }, + "requizzle": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", + "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.4.2.tgz", + "integrity": "sha1-o3GY5iCeiIrLFTKplo4G04tniOU=" + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry-request": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", + "integrity": "sha512-PjAmtWIxjNj4Co/6FRtBl8afRP3CxrrIAnUzb1dzydfROd+6xt7xAebFeskgQgkfFf8NmzrXIoaB3HxmswXyxw==", + "requires": { + "request": "2.83.0", + "through2": "2.0.3" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "rootpath": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz", + "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms=" + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "4.4.0", + "nearley": "2.11.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-json-stringify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz", + "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", + "optional": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "sane": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.4.1.tgz", + "integrity": "sha512-fW9svvNd81XzHDZyis9/tEY1bZikDGryy8Hi1BErPyNPYv47CdLseUN+tI5FBHWXEENRtj1SWtX/jBnggLaP0w==", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "exec-sh": "0.2.1", + "fb-watchman": "2.0.0", + "fsevents": "1.1.3", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.18.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scmp": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-0.0.3.tgz", + "integrity": "sha1-NkjfLXKUZB5/eGc//CloHZutkHM=" + }, + "search-params": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/search-params/-/search-params-2.1.2.tgz", + "integrity": "sha512-RToWw6ftSKU8awWFFXK7CxNblBrwDck800RjXxqcFICg4HP1DAI71f4eJlxUpV4mtuWe0ueAnlHrQX7UtbQVNA==" + }, + "section-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/section-iterator/-/section-iterator-2.0.0.tgz", + "integrity": "sha1-v0RNev7rlK1Dw5rS+yYVFifMuio=" + }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", + "dev": true + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "requires": { + "commander": "2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + } + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "2.0.1", + "lazy-cache": "0.2.7", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.0.0.tgz", + "integrity": "sha1-UI0YOLPeWQq4dXsBGyXkMJAJRfc=" + }, + "shallowequal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", + "integrity": "sha512-zlVXeVUKvo+HEv1e2KQF/csyeMKx2oHvatQ9l6XjCUj3agvC8XGf6R9HvIPDSmp8FNPvx7b5kaEJTRi7CqxtEw==" + }, + "sharp": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.19.0.tgz", + "integrity": "sha1-YXKekPKR5iVAEiqAZcpfxwwaix8=", + "requires": { + "color": "2.0.1", + "detect-libc": "1.0.3", + "nan": "2.8.0", + "semver": "5.4.1", + "simple-get": "2.7.0", + "tar": "4.3.3", + "tunnel-agent": "0.6.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "shippo": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/shippo/-/shippo-1.3.1.tgz", + "integrity": "sha512-059KiFYu70KmkA2s4/gsm7Dfn6aZfPJUPeAH5q2wMfi0a4Rb/TOvewlQu1F8Us51+oWuQYsmGvPURrMRl3jslg==" + }, + "shopify-api-node": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/shopify-api-node/-/shopify-api-node-2.11.0.tgz", + "integrity": "sha512-HLFeh6NBAMKn4AED6AxuvYb8Xomwanq+bfTM43NJ532VdVYkVtAgiEmJO2XGSQPjNwBIl+YmOYsV1LnmiFuUvw==", + "requires": { + "got": "8.1.0", + "lodash": "4.17.10", + "qs": "6.5.1", + "stopcock": "1.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simpl-schema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.5.0.tgz", + "integrity": "sha512-lv9n+1R7Oe3fpm3cWVyrs3mG1C9+DCc8QTCRn6cfLIsPkLfuMhBPLDwpnIsdA8Ch0fRO7BSxKvpVPcYvcYeSxg==", + "requires": { + "clone": "2.1.2", + "extend": "3.0.1", + "lodash.every": "4.6.0", + "lodash.find": "4.6.0", + "lodash.findwhere": "3.1.0", + "lodash.includes": "4.3.0", + "lodash.isempty": "4.4.0", + "lodash.isobject": "3.0.2", + "lodash.omit": "4.5.0", + "lodash.pick": "4.4.0", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "message-box": "0.2.0", + "mongo-object": "0.1.2" + } + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", + "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", + "requires": { + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.1.tgz", + "integrity": "sha1-wt/DhquqDD4zxI2z/ocFnmkGXv0=" + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "slugify": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.2.9.tgz", + "integrity": "sha512-n0cdJ+kN3slJu8SbZXt/EHjljBqF6MxvMGSg/NPpBzoY7yyXoH38wp/ox20a1JaG1KgmdTN5Lf3aS9+xB2Y2aQ==" + }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "snyk": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.78.0.tgz", + "integrity": "sha1-4QhTTAhUWz4BpbpLuu2Aw6Iz88k=", + "dev": true, + "requires": { + "abbrev": "1.1.1", + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "debug": "3.1.0", + "hasbin": "1.2.3", + "inquirer": "3.3.0", + "lodash": "4.17.10", + "needle": "2.2.0", + "opn": "5.3.0", + "os-name": "2.0.1", + "proxy-agent": "3.0.0", + "proxy-from-env": "1.0.0", + "recursive-readdir": "2.2.2", + "semver": "5.5.0", + "snyk-config": "2.1.0", + "snyk-go-plugin": "1.5.0", + "snyk-gradle-plugin": "1.3.0", + "snyk-module": "1.8.2", + "snyk-mvn-plugin": "1.2.0", + "snyk-nuget-plugin": "1.4.0", + "snyk-php-plugin": "1.5.0", + "snyk-policy": "1.12.0", + "snyk-python-plugin": "1.6.0", + "snyk-resolve": "1.0.1", + "snyk-resolve-deps": "3.1.0", + "snyk-sbt-plugin": "1.2.5", + "snyk-tree": "1.0.0", + "snyk-try-require": "1.3.0", + "tempfile": "2.0.0", + "then-fs": "2.0.0", + "undefsafe": "2.0.2", + "uuid": "3.2.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "email-validator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.3.tgz", + "integrity": "sha1-M+UNZvUmuXzXLBcgWu+ux5yKKh4=", + "dev": true + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "nconf": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", + "dev": true, + "requires": { + "async": "1.5.2", + "ini": "1.3.5", + "secure-keys": "1.0.0", + "yargs": "3.32.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "dev": true, + "requires": { + "macos-release": "1.1.0", + "win-release": "1.1.1" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "snyk-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.1.0.tgz", + "integrity": "sha512-D1Xz1pZa9lwA9AHogmAigyJGo/iuEGH+rcPB77mFsneVfnuiK9c6IjnsHbEBUf1cePtZvWdGBjs6e75Cvc2AMg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "nconf": "0.10.0" + } + }, + "snyk-go-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.5.0.tgz", + "integrity": "sha512-H6CHhGqchCcQV/JhOiSbTI8JLYhQU7dZ/oLwHMfVEXSD3bWOp1evlohuaQQaqic/ZInitLsjkCLHG2x47ZgUgQ==", + "dev": true, + "requires": { + "graphlib": "2.1.5", + "toml": "2.3.3" + } + }, + "snyk-gradle-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-1.3.0.tgz", + "integrity": "sha512-rKZcPwbDM9zk3pFcO0w77MIKOZTkk5ZBVBkBlTlUiFg+eNOKqPTmw2hBGF5NB4ASQmMnx3uB1C8+hrQ405CthA==", + "dev": true, + "requires": { + "clone-deep": "0.3.0" + } + }, + "snyk-module": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.8.2.tgz", + "integrity": "sha512-XqhdbZ/CUuJ5gSaYdYfapLqx9qm2Mp6nyRMBCLXe9tJSiohOJsc9fQuUDbdOiRCqpA4BD6WLl+qlwOJmJoszBg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "hosted-git-info": "2.5.0" + } + }, + "snyk-mvn-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-1.2.0.tgz", + "integrity": "sha512-ieTWhn1MB88gEQ6nUtGCeUKQ6Xoxm+u+QmD9u3zfP1QS5ep9fWt3YYDUQjgUiDTJJy7QyVQdZ/fsz3RECnOA7w==", + "dev": true + }, + "snyk-nuget-plugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.4.0.tgz", + "integrity": "sha512-BFZv6UxViTWbu4+AiWRD1cTby3FZ4rs2CuLma0d80iOTzgfmvFmgeWHlM8bXx0WAC47HYywXQuDJeKzV7iiaXQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "es6-promise": "4.2.4", + "xml2js": "0.4.19", + "zip": "1.2.0" + } + }, + "snyk-php-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.0.tgz", + "integrity": "sha512-HS5NSxR4JwTdSQttDrV9y9eOC75U3JfLWEDhGJf1qJIObLlF6Vbj9kZcphmdi4CUNwDcQqEPglh911zXB1tzQQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "lodash": "4.17.10" + } + }, + "snyk-policy": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.12.0.tgz", + "integrity": "sha512-CEioNnDzccHyid7UIVl3bJ1dnG4co4ofI+KxuC1mo0IUXy64gxnBTeVoZF5gVLWbAyxGxSeW8f0+8GmWMHVb7w==", + "dev": true, + "requires": { + "debug": "3.1.0", + "email-validator": "2.0.3", + "js-yaml": "3.10.0", + "lodash.clonedeep": "4.5.0", + "semver": "5.5.0", + "snyk-module": "1.8.2", + "snyk-resolve": "1.0.1", + "snyk-try-require": "1.3.0", + "then-fs": "2.0.0" + } + }, + "snyk-python-plugin": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.6.0.tgz", + "integrity": "sha512-/9PcO6lvSY62qGpFjrRQ00NQdUulZnit6tOLMZp+91BnOjoiw4aKKr7uoky6rbwu64fEmK3sE+tcp8BXqH9kDQ==", + "dev": true + }, + "snyk-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", + "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", + "dev": true, + "requires": { + "debug": "3.1.0", + "then-fs": "2.0.0" + } + }, + "snyk-resolve-deps": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-3.1.0.tgz", + "integrity": "sha512-YVAelR+dTpqLgfk6lf6WgOlw+MGmGI0r3/Dny8tUbJJ9uVTHTRAOdZCbUyTFqJG7oEmEZxUwmfjqgAuniYwx8Q==", + "dev": true, + "requires": { + "ansicolors": "0.3.2", + "debug": "3.1.0", + "lodash.assign": "4.2.0", + "lodash.assignin": "4.2.0", + "lodash.flatten": "4.4.0", + "lodash.get": "4.4.2", + "lodash.set": "4.3.2", + "lru-cache": "4.1.1", + "semver": "5.5.0", + "snyk-module": "1.8.2", + "snyk-resolve": "1.0.1", + "snyk-tree": "1.0.0", + "snyk-try-require": "1.3.0", + "then-fs": "2.0.0" + } + }, + "snyk-try-require": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.0.tgz", + "integrity": "sha1-81cGrPkciveI1Y4fGta/D89sVJM=", + "dev": true, + "requires": { + "debug": "3.1.0", + "lodash.clonedeep": "4.5.0", + "lru-cache": "4.1.1", + "then-fs": "2.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "requires": { + "temp-dir": "1.0.0", + "uuid": "3.2.1" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "snyk-sbt-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-1.2.5.tgz", + "integrity": "sha512-6D981zAdFYatBLNwp7J5Vl5wZFieBlwKj1Ans9uZ5BZZfg4mjIX/62tfADmJEbHijvnN+i7N8cNQRvVOyLo2UA==", + "dev": true, + "requires": { + "debug": "2.6.9" + } + }, + "snyk-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", + "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", + "dev": true, + "requires": { + "archy": "1.0.0" + } + }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "sortablejs": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.7.0.tgz", + "integrity": "sha1-gKKyNwq9Vo4c7IwnETHvMKkE+ig=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", + "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==", + "requires": { + "source-map": "0.6.1" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split-array-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", + "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", + "requires": { + "async": "2.6.0", + "is-stream-ended": "0.1.4" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "ssr-window": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-1.0.0.tgz", + "integrity": "sha512-WHFyFLegz/NOgwdlFTw93Wd4c/gQ5hkv6amtdK/K0atfZvr28vwfEV7MR3NtWek+gnpiSd/tKXHQVfQRtA6OJg==" + }, + "stable": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", + "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=" + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stopcock": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stopcock/-/stopcock-1.0.0.tgz", + "integrity": "sha1-MUmvE+CTjwGQ6BheGBxKmuGMnOU=" + }, + "store": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/store/-/store-2.0.12.tgz", + "integrity": "sha1-jFNOKguDH3K3X8XxEZhXxE711ZM=" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "stream-events": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.4.tgz", + "integrity": "sha512-D243NJaYs/xBN2QnoiMDY7IesJFIK7gEhnvAYqJa5JvDdnh2dC4qDBwlCf0ohPpX2QRlA/4gnbnPd3rs3KxVcA==", + "requires": { + "stubs": "3.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-format-obj": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz", + "integrity": "sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==" + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "1.0.0", + "strip-ansi": "4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "4.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "stripe": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-5.4.0.tgz", + "integrity": "sha512-VCDFp4oQu1uOcOLHIwRIznH8ikLJcpDsHahWN48V/QuV6y2Bm281cq5wnkjqv+LPdUpqXVp9pjlb+SfN6dnyZg==", + "requires": { + "bluebird": "3.5.1", + "lodash.isplainobject": "4.0.6", + "qs": "6.5.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + } + } + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "3.0.0" + } + }, + "sweetalert2": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-7.12.3.tgz", + "integrity": "sha512-GArvfIjAWnuV9j7WW/Yk1DAk8rX9nEsOm38GM+UWk/Bvh4Szd0ljg97b1Mhke5QpZBXcUkI3lHXk14CZn8dafw==" + }, + "swiper": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-4.1.6.tgz", + "integrity": "sha512-oEpyQc4qCAgQCWlSPCxJd4STQFJqASyVcLCs7CzzZiFc8NnTfBaMt3p9iwqoC8c6KofJmt6zonyUj50KRFWW3g==", + "requires": { + "dom7": "2.0.2", + "ssr-window": "1.0.0" + } + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.3.0", + "ajv-keywords": "2.1.1", + "chalk": "2.3.1", + "lodash": "4.17.10", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, + "tar": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.3.3.tgz", + "integrity": "sha512-v9wjbOXloOIeXifMQGkKhPH3H7tjd+8BubFKOTU+64JpFZ3q2zBfsGlnc7KmyRgl8UxVa1SCRiF3F9tqSOgcaQ==", + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "yallist": "3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + }, + "dependencies": { + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + } + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "dev": true, + "requires": { + "bl": "1.2.2", + "buffer-alloc": "1.1.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.3", + "to-buffer": "1.1.1", + "xtend": "4.0.1" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "test-exclude": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.0.tgz", + "integrity": "sha512-8hMFzjxbPv6xSlwGhXSvOMJ/vTy3bkng+2pxmf6E1z6VF7I9nIyNfvHtaw+NBPgvz647gADBbMSbwLfZYppT/w==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "tether": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.3.tgz", + "integrity": "sha512-YCfE/Ym9MpZpzUmzbek7MiLEyTofxx2YS0rJfSOUXX0aZtfQgxcgw7/Re2oGJUsREWZtEF0DzBKCjqH+DzgL6A==" + }, + "tether-drop": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tether-drop/-/tether-drop-1.4.2.tgz", + "integrity": "sha1-KOJAzOB39K4djlmQoDtx4M1vv+w=", + "requires": { + "tether": "1.4.3" + } + }, + "tether-tooltip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tether-tooltip/-/tether-tooltip-1.2.0.tgz", + "integrity": "sha1-CPSXZNX0SHCLURGcn+EZlytNaWI=", + "requires": { + "tether": "1.4.3", + "tether-drop": "1.4.2" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "then-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", + "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "dev": true, + "requires": { + "promise": "7.3.1" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "to-utf8": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=", + "dev": true + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "toml": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", + "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==", + "dev": true + }, + "topo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", + "requires": { + "hoek": "2.16.3" + }, + "dependencies": { + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + } + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, + "transliteration": { + "version": "github:reactioncommerce/transliteration#699d48cc8dd9a64f1a2773e1b36b6faa4bbdca2f", + "requires": { + "yargs": "8.0.2" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tus-js-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-1.5.1.tgz", + "integrity": "sha512-qBSNXpc6ZPe6stn4NSkQ1dnVhVblPAtQo6037g5Qr5zr9gGX1gr+8e0+HtQMBp22Ouo6LYesWMdKbcOR5sRj5A==", + "requires": { + "buffer-from": "0.1.2", + "extend": "3.0.1", + "lodash.throttle": "4.1.1", + "resolve-url": "0.2.1" + } + }, + "tus-node-server": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/tus-node-server/-/tus-node-server-0.2.11.tgz", + "integrity": "sha512-1Eb/GGejUTUpCpuHbol8OsQDk38Mx8jPLne+0VvPTKVv6Gvoj+Q7trjc5mQHQqCd8vIYsXHEEJ/46YR1bZZJig==", + "requires": { + "@google-cloud/storage": "1.1.1", + "configstore": "3.1.1", + "crypto-rand": "0.0.2", + "debug": "3.1.0", + "google-auto-auth": "0.8.2", + "object-assign": "4.1.1", + "request": "2.83.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "twilio": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.11.3.tgz", + "integrity": "sha512-xGUH+SW8lBsPmTB9nNuawB8AajhevjIktD6LvESbIJ5HVeAgE44Y327AziCAT6lQr90PYB5joO5IUagH6YwzDA==", + "requires": { + "deprecate": "1.0.0", + "jsonwebtoken": "8.2.1", + "lodash": "4.0.0", + "moment": "2.19.3", + "q": "2.0.3", + "request": "2.83.0", + "rootpath": "0.1.2", + "scmp": "0.0.3", + "xmlbuilder": "9.0.1" + }, + "dependencies": { + "jsonwebtoken": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", + "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==", + "requires": { + "jws": "3.1.4", + "lodash.includes": "4.3.0", + "lodash.isboolean": "3.0.3", + "lodash.isinteger": "4.0.4", + "lodash.isnumber": "3.0.3", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.once": "4.1.1", + "ms": "2.1.1", + "xtend": "4.0.1" + } + }, + "lodash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.0.0.tgz", + "integrity": "sha1-msQ4RMWV4o0wEIt7pYNwM5WSLfw=" + }, + "moment": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz", + "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "xmlbuilder": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.1.tgz", + "integrity": "sha1-kc1wiXdVNj66V8Et3uq0o0GmH2U=" + } + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "optional": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "dev": true, + "requires": { + "buffer": "3.6.0", + "through": "2.3.8" + } + }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, + "requires": { + "debug": "2.6.9" + } + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "dev": true + }, + "underscore-contrib": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", + "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.3.tgz", + "integrity": "sha512-iG/2t0F2LAU8aZYPkX5gi7ebukHnr3sWFESpb+zPQeeaQwOkfoO6ZW17YX7MdRPNG9pCy+tjzGill+Ah0Em0HA==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.3.tgz", + "integrity": "sha512-nFcaBFcr08UQNF15ZgI5ISh3yUnQm7SJRRxwYrL5VYX46pS+6Q7TCTv4zbK+j6/l7rQt0mMiTL2zpmeygny6rA==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "1.0.3", + "unicode-property-aliases-ecmascript": "1.0.3" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.1.tgz", + "integrity": "sha512-lM8B0FDZQh9yYGgiabRQcyWicB27VLOolSBRIxsO7FeQPtg+79Oe7sC8Mzr8BObDs+G9CeYmC/shHo6OggNEog==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.3.tgz", + "integrity": "sha512-TdDmDOTxEf2ad1g3ZBpM6cqKIb2nJpVlz1Q++casDryKz18tpeMBhSng9hjC1CTQCkOV9Rw2knlSB6iRo7ad1w==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.3.1", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "v8flags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", + "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "velocity-animate": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.1.tgz", + "integrity": "sha512-VJ3csMz5zP1ifkbBlsNYpxnoWkPHfVRQ8tUongS78W5DxSGHB68pjYHDTgUYBkVM7P/HpYdVukgVUFcxjr1gGg==" + }, + "velocity-react": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.3.3.tgz", + "integrity": "sha1-1tRyds/Ivip1Yjh5sgFArFjBuCs=", + "requires": { + "lodash": "3.10.1", + "prop-types": "15.6.0", + "react-transition-group": "1.2.1", + "velocity-animate": "1.5.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "0.2.1", + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whatwg-url": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "dev": true, + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "ws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.0.0.tgz", + "integrity": "sha512-QYslsH44bH8O7/W2815u5DpnCpXWpEK44FmaHffNwgJI4JMaSZONgPBTOfrxJ29mXKbXak+LsJ2uAkDTYq2ptQ==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "x-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/x-path/-/x-path-0.0.2.tgz", + "integrity": "sha1-KU0Ha7l6dwbMBwu7Km/YxU32exI=", + "dev": true, + "requires": { + "path-extra": "1.0.3" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.7" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "4.1.0" + } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "zen-observable": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.7.1.tgz", + "integrity": "sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg==" + }, + "zen-observable-ts": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.8.tgz", + "integrity": "sha512-oGjFvBbAA94uh/HvAwJDwMHtNq4lZRtupJx8XsyreOTYvH8x1ef9hIeH/M+IqiAXtNpglq/Klh5rbpYWEeRSOQ==", + "requires": { + "zen-observable": "0.7.1" + } + }, + "zip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip/-/zip-1.2.0.tgz", + "integrity": "sha1-rQrUImUwm+QutW/IYZThfCTmapw=", + "dev": true, + "requires": { + "bops": "0.1.1" + } + } + } +} diff --git a/package.json b/package.json index f292d0e0c..0b8ae6470 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "reaction", "description": "Reaction is a modern reactive, real-time event driven ecommerce platform.", - "version": "1.12.1", + "version": "1.13.0", "main": "main.js", "directories": { "test": "tests" @@ -19,7 +19,8 @@ "url": "https://github.com/reactioncommerce/reaction/issues" }, "dependencies": { - "@babel/runtime": "7.0.0-beta.38", + "@babel/runtime": "7.0.0-beta.49", + "@reactioncommerce/data-factory": "^1.0.0", "@reactioncommerce/file-collections": "0.5.0", "@reactioncommerce/file-collections-sa-gridfs": "0.0.2", "@reactioncommerce/hooks": "1.0.2", @@ -73,10 +74,10 @@ "jquery-i18next": "^1.2.1", "later": "^1.2.0", "libphonenumber-js": "^1.0.24", - "lodash": "^4.17.5", + "lodash": "^4.17.10", "lodash.pick": "^4.4.0", "match-sorter": "^2.2.0", - "meteor-node-stubs": "^0.3.2", + "meteor-node-stubs": "0.4.1", "moment": "^2.20.1", "moment-timezone": "^0.5.14", "mongodb": "^3.0.5", @@ -141,24 +142,25 @@ "velocity-react": "^1.3.3" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.38", - "@babel/core": "7.0.0-beta.38", - "@babel/node": "^7.0.0-beta.38", - "@babel/preset-env": "^7.0.0-beta.38", - "@babel/preset-es2015": "7.0.0-beta.38", - "@babel/preset-react": "7.0.0-beta.38", - "@babel/preset-stage-2": "7.0.0-beta.38", + "@babel/cli": "7.0.0-beta.49", + "@babel/core": "7.0.0-beta.49", + "@babel/node": "7.0.0-beta.49", + "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.49", + "@babel/preset-env": "7.0.0-beta.49", + "@babel/preset-es2015": "7.0.0-beta.49", + "@babel/preset-react": "7.0.0-beta.49", + "@babel/preset-stage-2": "7.0.0-beta.49", "@reactioncommerce/eslint-config": "1.8.0", "babel-core": "^7.0.0-bridge.0", - "babel-eslint": "^8.2.1", - "babel-jest": "^22.4.1", - "babel-plugin-dynamic-import-node": "^1.2.0", - "babel-plugin-inline-import": "^2.0.6", - "babel-plugin-lodash": "^3.3.2", - "babel-plugin-module-resolver": "^3.1.0", - "babel-plugin-rewire-exports": "^0.3.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-preset-meteor": "7.0.0-beta.38-1", + "babel-eslint": "8.2.3", + "babel-jest": "22.4.4", + "babel-plugin-dynamic-import-node": "1.2.0", + "babel-plugin-inline-import": "3.0.0", + "babel-plugin-lodash": "3.3.2", + "babel-plugin-module-resolver": "3.1.1", + "babel-plugin-rewire-exports": "0.3.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-preset-meteor": "7.0.0-beta.49", "chai": "^4.1.2", "enzyme": "^3.3.0", "enzyme-to-json": "^3.3.1", @@ -244,7 +246,12 @@ } } ], - "@babel/preset-stage-2" + [ + "@babel/preset-stage-2", + { + "decoratorsLegacy": true + } + ] ], "plugins": [ "babel-plugin-inline-import", @@ -278,7 +285,12 @@ } } ], - "@babel/preset-stage-2" + [ + "@babel/preset-stage-2", + { + "decoratorsLegacy": true + } + ] ], "plugins": [ "rewire-exports", @@ -303,8 +315,7 @@ ] ] } - }, - "presets": [] + } }, "jest": {}, "eslintConfig": { diff --git a/private/data/i18n/ar.json b/private/data/i18n/ar.json index b5997c3ef..5720bf9a9 100644 --- a/private/data/i18n/ar.json +++ b/private/data/i18n/ar.json @@ -513,20 +513,6 @@ "isCommercial": "هذه عناوين تجارية" } }, - "revisions": { - "isDisabled": ".مراجعة المراقبة غير مفعل .أي تغيير سوف يتم نشره فوراً", - "isEnabled": "يتم تمكين مراجعة مراقبة للمنتجات. سوف يحتاج أي تغييرات على أن تنشر قبل أن يكون مرئيا للعملاء.", - "unpublishedChanges": "تغييرات غير منشورة", - "publishChanges": "تغييرات النشر", - "showChanges": "إظهار التغييرات", - "hideChanges": "إخفاء التغييرات", - "discardChanges": "التراجع عن التغييرات ", - "changedPublished": "تم نشر التغييرات بنجاح", - "changesDiscarded": "تم التراجع عن التغييرات بنجاح ", - "noChanges": "لا يوجد تغييرات", - "noChangesPublished": ".لا يوجد تغييرات لنشرها", - "noChangesDiscarded": "لايوجد تغييرات للتراجع عنها " - }, "address": { "country": "البلد", "fullName": "الأسم كامل", diff --git a/private/data/i18n/bg.json b/private/data/i18n/bg.json index e326d60c6..ac4566b42 100644 --- a/private/data/i18n/bg.json +++ b/private/data/i18n/bg.json @@ -513,20 +513,6 @@ "isCommercial": "Това е търговски адрес." } }, - "revisions": { - "isDisabled": "контрол на контрол е забранено. Всички промени ще бъдат публикувани веднага.", - "isEnabled": "контрол на контрол е активиран за продукти. ще се нуждае от никакви промени, за да бъдат публикувани преди да бъдат видими за клиентите.", - "unpublishedChanges": "Непубликувани промени", - "publishChanges": "Публикуване на промените", - "showChanges": "Показване на промените", - "hideChanges": "Скриване на промените", - "discardChanges": "Отхвърлите промените", - "changedPublished": "Промени публикувани успешно", - "changesDiscarded": "Промени изхвърли успешно", - "noChanges": "Няма промени", - "noChangesPublished": "Няма промени за публикуване", - "noChangesDiscarded": "Няма промени, за да изхвърли" - }, "address": { "country": "Държава", "fullName": "Пълно име", diff --git a/private/data/i18n/cs.json b/private/data/i18n/cs.json index 9635919d9..2e967bbcf 100644 --- a/private/data/i18n/cs.json +++ b/private/data/i18n/cs.json @@ -513,20 +513,6 @@ "isCommercial": "Jedná se o obchodní adresu." } }, - "revisions": { - "isDisabled": "Ovládání revize je zakázáno. Jakékoli změny budou zveřejněny okamžitě.", - "isEnabled": "Ovládání revize je povoleno za produkty. bude muset případné změny, které mají být zveřejněny dříve, než jsou viditelné pro zákazníky.", - "unpublishedChanges": "nepublikované Změny", - "publishChanges": "Publish changes", - "showChanges": "Zobrazit změny", - "hideChanges": "skrýt Změny", - "discardChanges": "Zrušit změny", - "changedPublished": "Změny úspěšně publikován", - "changesDiscarded": "Změny úspěšně zlikvidovat", - "noChanges": "Žádné změny", - "noChangesPublished": "Nejsou žádné změny publikovat", - "noChangesDiscarded": "Nejsou žádné změny k vyhazování" - }, "address": { "country": "Země", "fullName": "Celé jméno", diff --git a/private/data/i18n/de.json b/private/data/i18n/de.json index 33320f8aa..4d831df91 100644 --- a/private/data/i18n/de.json +++ b/private/data/i18n/de.json @@ -513,20 +513,6 @@ "isCommercial": "This is a commercial address." } }, - "revisions": { - "isDisabled": "Die Revisionsverwaltung ist deaktiviert. Jegliche Änderungen werden sofort veröffentlicht.", - "isEnabled": "Revisionskontrolle für Produkte aktiviert. Alle Änderungen werden müssen, bevor sie an den Kunden sichtbar veröffentlicht.", - "unpublishedChanges": "Unveröffentlichte Änderungen", - "publishChanges": "Änderungen veröffentlichen", - "showChanges": "Änderungen anzeigen", - "hideChanges": "Änderungen verbergen", - "discardChanges": "Änderungen verwerfen", - "changedPublished": "Die Änderungen wurden erfolgreich veröffentlicht", - "changesDiscarded": "Änderungen erfolgreich verworfen", - "noChanges": "Keine Änderungen", - "noChangesPublished": "Es gibt keine Änderungen zu veröffentlichen", - "noChangesDiscarded": "Keine zu verwerfenden Änderungen gefunden" - }, "address": { "country": "Land", "fullName": "Vor- und Zuname", diff --git a/private/data/i18n/el.json b/private/data/i18n/el.json index 797072181..48bf2a57d 100644 --- a/private/data/i18n/el.json +++ b/private/data/i18n/el.json @@ -513,20 +513,6 @@ "isCommercial": "Είναι εμπορική διεύθυνση;" } }, - "revisions": { - "isDisabled": "έλεγχος αναθεώρηση είναι απενεργοποιημένη. Οποιεσδήποτε αλλαγές θα δημοσιεύονται αμέσως.", - "isEnabled": "ελέγχου αναθεώρησης είναι ενεργοποιημένη για Προϊόντα. Οποιεσδήποτε αλλαγές θα πρέπει να δημοσιεύονται πριν να είναι ορατή στους πελάτες.", - "unpublishedChanges": "Ανέκδοτες Αλλαγές", - "publishChanges": "Δημοσίευση αλλαγών", - "showChanges": "Εμφάνιση αλλαγών", - "hideChanges": "Απόκρυψη αλλαγών", - "discardChanges": "Απορρίψετε τις αλλαγές", - "changedPublished": "Αλλαγές που δημοσιεύθηκε με επιτυχία", - "changesDiscarded": "Αλλαγές απορρίφθηκε με επιτυχία", - "noChanges": "Χωρίς αλλαγές", - "noChangesPublished": "Δεν υπάρχουν αλλαγές να δημοσιεύσει", - "noChangesDiscarded": "Δεν υπάρχουν αλλαγές για να απορρίψετε" - }, "address": { "country": "Χώρα", "fullName": "Ονοματεπώνυμο", diff --git a/private/data/i18n/en.json b/private/data/i18n/en.json index 7e2dc2835..608481546 100644 --- a/private/data/i18n/en.json +++ b/private/data/i18n/en.json @@ -526,20 +526,6 @@ "isCommercial": "This is a commercial address." } }, - "revisions": { - "isDisabled": "Revision control is disabled. Any changes will be published immediately.", - "isEnabled": "Revision control is enabled for products. Any changes will be need to be published before being visible to customers.", - "unpublishedChanges": "Unpublished changes", - "publishChanges": "Publish changes", - "showChanges": "Show changes", - "hideChanges": "Hide changes", - "discardChanges": "Discard changes", - "changedPublished": "Changes published successfully", - "changesDiscarded": "Changes discarded successfully", - "noChanges": "No changes", - "noChangesPublished": "There are no changes to publish", - "noChangesDiscarded": "There are no changes to discard" - }, "address": { "country": "Country", "fullName": "Full name", diff --git a/private/data/i18n/es.json b/private/data/i18n/es.json index 4e2812e6f..20a05158a 100644 --- a/private/data/i18n/es.json +++ b/private/data/i18n/es.json @@ -513,20 +513,6 @@ "isCommercial": "Esta es una dirección comercial" } }, - "revisions": { - "isDisabled": "El control de revisión está deshabilitado Todos los cambios se publicarán de imediato.", - "isEnabled": "Revisión de control está habilitada para los productos. Se necesitan cualquier cambio que se publicará antes de ser visibles para los clientes.", - "unpublishedChanges": "Cambios sin publicar", - "publishChanges": "Publicar cambios", - "showChanges": "Mostrar cambios", - "hideChanges": "Ocultar cambios", - "discardChanges": "Descartar cambios", - "changedPublished": "Cambios publicados correctamente", - "changesDiscarded": "Los cambios se han descartado", - "noChanges": "Sin cambios", - "noChangesPublished": "No hay cambios para publicar", - "noChangesDiscarded": "No hay cambios que descartar" - }, "address": { "country": "País", "fullName": "Nombre completo", diff --git a/private/data/i18n/fr.json b/private/data/i18n/fr.json index 8a8719062..2810b3c17 100644 --- a/private/data/i18n/fr.json +++ b/private/data/i18n/fr.json @@ -513,20 +513,6 @@ "isCommercial": "Il s'agit d'une adresse commerciale." } }, - "revisions": { - "isDisabled": "La gestion de versions est désactivée. Toute modification sera immédiatement publiée.", - "isEnabled": "La gestion de versions est activée pour les produits. Toute modification devra être publiée avant d'être visible pour les clients.", - "unpublishedChanges": "Modifications non publiées", - "publishChanges": "Publier les modifications", - "showChanges": "Afficher les modifications", - "hideChanges": "Masquer les modifications", - "discardChanges": "Annuler les modifications", - "changedPublished": "Les modifications ont été publiées avec succès", - "changesDiscarded": "Modifications annulées avec succès", - "noChanges": "Aucune modification", - "noChangesPublished": "Aucune modification à publier", - "noChangesDiscarded": "Aucune modification à annuler" - }, "address": { "country": "Pays", "fullName": "Nom complet", diff --git a/private/data/i18n/he.json b/private/data/i18n/he.json index ff4fec442..6618b3fc7 100644 --- a/private/data/i18n/he.json +++ b/private/data/i18n/he.json @@ -444,20 +444,6 @@ "isCommercial": "האם זו כתובת מסחרית?" } }, - "revisions": { - "isDisabled": "ניהול הגרסאות מושבת. כל השינויים יפורסמו באופן מידי.", - "isEnabled": "ניהול גרסאות מופעל עבור המוצרים. יש לפרסם את כל השינויים לפני שיהפכו להיות גלויים עבור הלקוחות.", - "unpublishedChanges": "שינויים שלא פורסמו", - "publishChanges": "פרסם שינויים", - "showChanges": "הצג שינויים", - "hideChanges": "הסתר שינויים", - "discardChanges": "בטל שינויים", - "changedPublished": "השינויים פורסמו בהצלחה", - "changesDiscarded": "השינויים בוטלו בהצלחה", - "noChanges": "אין שינויים", - "noChangesPublished": "אין שינויים לפרסום", - "noChangesDiscarded": "אין שינויים הניתנים לביטול" - }, "address": { "country": "ארץ", "fullName": "שם פרטי ומשפחה", diff --git a/private/data/i18n/hr.json b/private/data/i18n/hr.json index 43e29a017..6a3d3d7c8 100644 --- a/private/data/i18n/hr.json +++ b/private/data/i18n/hr.json @@ -513,20 +513,6 @@ "isCommercial": "Ovo je adresa tvrtke." } }, - "revisions": { - "isDisabled": "kontrola Revizija je onemogućen. Sve promjene bit će odmah objavljena.", - "isEnabled": "kontrola Revizija je omogućena za proizvode. Sve promjene bit će morati biti objavljena prije nego što je vidljivo na kupce.", - "unpublishedChanges": "Neobjavljena Promjene", - "publishChanges": "Objavi promjene", - "showChanges": "Prikaži promjene", - "hideChanges": "Sakrij promjene", - "discardChanges": "Odbaciti promjene", - "changedPublished": "Promjene objavljeno uspješno", - "changesDiscarded": "Promjene uspješno odbačena", - "noChanges": "Nema promjena", - "noChangesPublished": "Nema promjena za objavu", - "noChangesDiscarded": "Nema promjena za odbacivanje" - }, "address": { "country": "Država", "fullName": "Puno ime", diff --git a/private/data/i18n/hu.json b/private/data/i18n/hu.json index c33995fad..20a5be666 100644 --- a/private/data/i18n/hu.json +++ b/private/data/i18n/hu.json @@ -513,20 +513,6 @@ "isCommercial": "Céges cím." } }, - "revisions": { - "isDisabled": "Revision szabályozás ki van kapcsolva. A módosításokat haladéktalanul közzé kell tenni.", - "isEnabled": "Revision szabályozás engedélyezve a termékek. A módosításokat közzé kell tenni, mielőtt láthatóvá az ügyfelek számára.", - "unpublishedChanges": "közzétett módosítások", - "publishChanges": "Módosítások közzététele", - "showChanges": "Változások megjelenítése", - "hideChanges": "Változások elrejtése", - "discardChanges": "Módosítások elvetése", - "changedPublished": "Változások közzététele sikeresen", - "changesDiscarded": "Változások sikeresen elvetve", - "noChanges": "Nincs változás", - "noChangesPublished": "Nincs változás közzétételére", - "noChangesDiscarded": "Nincs változás megválni" - }, "address": { "country": "Ország", "fullName": "Teljes név", diff --git a/private/data/i18n/it.json b/private/data/i18n/it.json index 4c3ec6151..a4ff374dc 100644 --- a/private/data/i18n/it.json +++ b/private/data/i18n/it.json @@ -513,20 +513,6 @@ "isCommercial": "Questo è un indirizzo commerciale." } }, - "revisions": { - "isDisabled": "controllo di revisione è disabilitato. Eventuali modifiche saranno pubblicate immediatamente.", - "isEnabled": "controllo di revisione è abilitato per i prodotti. saranno bisogno di alcuna modifica per essere pubblicato prima di essere visibile ai clienti.", - "unpublishedChanges": "Modifiche non pubblicati", - "publishChanges": "Pubblica modifiche", - "showChanges": "Mostra modifiche", - "hideChanges": "Nascondi le modifiche", - "discardChanges": "Non salvare le modifiche", - "changedPublished": "Modifiche pubblicato con successo", - "changesDiscarded": "Modifiche scartato con successo", - "noChanges": "Nessun cambiamento", - "noChangesPublished": "Non ci sono modifiche da pubblicare", - "noChangesDiscarded": "Non ci sono modifiche da scartare" - }, "address": { "country": "Nazione", "fullName": "Nome e cognome", diff --git a/private/data/i18n/my.json b/private/data/i18n/my.json index 436585cfb..d65f08776 100644 --- a/private/data/i18n/my.json +++ b/private/data/i18n/my.json @@ -513,20 +513,6 @@ "isCommercial": "ဒါကစီးပွားဖြစ်လိပ်စာဖြစ်ပါတယ်။" } }, - "revisions": { - "isDisabled": "တည်းဖြတ်မူထိန်းချုပ်မှုကိုပိတ်ထားသည်။ မဆိုအပြောင်းအလဲများချက်ချင်းပုံနှိပ်ထုတ်ဝေပါလိမ့်မည်။", - "isEnabled": "တည်းဖြတ်မူထိန်းချုပ်မှုထုတ်ကုန်များအတွက် enabled ဖြစ်ပါတယ်။ မဆိုစသောအပြောင်းအလဲဖောက်သည်မြင်နိုင်ဖြစ်ခြင်းမီကထုတ်ဝေသောခံရဖို့လိုအပ်ပါလိမ့်မည်။", - "unpublishedChanges": "အတည်မပြုရသေးသောအပြောင်းအလဲများ", - "publishChanges": "အပြောင်းအလဲများ Publish", - "showChanges": "အပြောင်းအလဲများ show ကို", - "hideChanges": "အပြောင်းအလဲများဝှက်ရန်", - "discardChanges": "စွန့်ပစ်အပြောင်းအလဲများ", - "changedPublished": "အောင်မြင်စွာပုံနှိပ်ထုတ်ဝေအပြောင်းအလဲများ", - "changesDiscarded": "အောင်မြင်စွာလွှင့်ပစ်အပြောင်းအလဲများ", - "noChanges": "အဘယ်သူမျှမအပြောင်းအလဲများ", - "noChangesPublished": "ထုတ်ဝေဖို့မအပြောင်းအလဲများရှိပါသည်", - "noChangesDiscarded": "ဖယ်ရန်မအပြောင်းအလဲများရှိပါသည်" - }, "address": { "country": "ပြည်", "fullName": "နာမည်အပြည့်အစုံ", diff --git a/private/data/i18n/nl.json b/private/data/i18n/nl.json index 3fc2d72ea..2acae4c84 100644 --- a/private/data/i18n/nl.json +++ b/private/data/i18n/nl.json @@ -513,20 +513,6 @@ "isCommercial": "Dit is een zakelijk adres." } }, - "revisions": { - "isDisabled": "Revisie controle is uitgeschakeld. Eventuele wijzigingen zullen onmiddellijk worden gepubliceerd.", - "isEnabled": "Revisie controle is ingeschakeld voor producten. Eventuele wijzigingen zullen nodig hebben voordat ze zichtbaar zijn voor klanten om te worden gepubliceerd.", - "unpublishedChanges": "ongepubliceerde Wijzigingen", - "publishChanges": "Wijzigingen publiceren", - "showChanges": "Wijzigingen weergeven", - "hideChanges": "verbergen Wijzigingen", - "discardChanges": "Veranderingen ongedaan maken", - "changedPublished": "Wijzigingen met succes gepubliceerd", - "changesDiscarded": "Wijzigingen met succes verwijderd", - "noChanges": "Geen veranderingen", - "noChangesPublished": "Er zijn geen wijzigingen te publiceren", - "noChangesDiscarded": "Er zijn geen wijzigingen te ontdoen" - }, "address": { "country": "Land", "fullName": "Volledige naam", diff --git a/private/data/i18n/pl.json b/private/data/i18n/pl.json index 56f99b88f..05ca21256 100644 --- a/private/data/i18n/pl.json +++ b/private/data/i18n/pl.json @@ -513,20 +513,6 @@ "isCommercial": "Adres firmowy." } }, - "revisions": { - "isDisabled": "kontrola wersji jest wyłączona. Wszelkie zmiany będą publikowane natychmiast.", - "isEnabled": "kontrola wersji jest włączona dla Produktów. Wszelkie zmiany muszą być opublikowane, zanim będą widoczne dla klientów.", - "unpublishedChanges": "Niepublikowane Zmiany", - "publishChanges": "Opublikuj zmiany", - "showChanges": "Pokaż zmiany", - "hideChanges": "Schowaj Zmiany", - "discardChanges": "Odrzucać zmiany", - "changedPublished": "Zmiany opublikowane powodzeniem", - "changesDiscarded": "Zmiany odrzucone powodzeniem", - "noChanges": "Bez zmian", - "noChangesPublished": "Brak zmiany publikuj", - "noChangesDiscarded": "Brak zmiany, aby odrzucić" - }, "address": { "country": "Kraj", "fullName": "Pełne imię i nazwisko", diff --git a/private/data/i18n/pt.json b/private/data/i18n/pt.json index 5f699af65..d461be715 100644 --- a/private/data/i18n/pt.json +++ b/private/data/i18n/pt.json @@ -513,20 +513,6 @@ "isCommercial": "Trata-se de um endereço comercial." } }, - "revisions": { - "isDisabled": "O controlo da revisão está desativado. As alterações serão publicadas de imediato.", - "isEnabled": "controle de revisão está habilitado para os produtos. será preciso qualquer alteração a ser publicado antes de ser visível para os clientes.", - "unpublishedChanges": "Alterações não publicadas", - "publishChanges": "Publicar alterações", - "showChanges": "Mostrar alterações", - "hideChanges": "Ocultar alterações", - "discardChanges": "Eliminar alterações", - "changedPublished": "Alterações publicadas com sucesso", - "changesDiscarded": "Alterações eliminadas com sucesso", - "noChanges": "Sem alterações", - "noChangesPublished": "Não há alterações para publicar", - "noChangesDiscarded": "Não há alterações para eliminar" - }, "address": { "country": "País", "fullName": "Nome completo", diff --git a/private/data/i18n/ro.json b/private/data/i18n/ro.json index 4f2b610f9..e853fedc1 100644 --- a/private/data/i18n/ro.json +++ b/private/data/i18n/ro.json @@ -513,20 +513,6 @@ "isCommercial": "Aceasta este o adresă comercială." } }, - "revisions": { - "isDisabled": "Opțiunea „Revision control” este dezactivată. Orice schimbare va fi imediat publicată.", - "isEnabled": "Controlul revizie este activat pentru produse. Toate modificările vor fi trebui să fie publicate înainte de a fi vizibile pentru clienți.", - "unpublishedChanges": "Schimbări nepublicate", - "publishChanges": "Publicare schimbări", - "showChanges": "Expunere schimbări", - "hideChanges": "Ascundere modificări", - "discardChanges": "Eliminare schimbări", - "changedPublished": "Schimbările au fost publicate cu succes.", - "changesDiscarded": "Schimbări eliminate cu succes", - "noChanges": "Nicio schimbare", - "noChangesPublished": "Nu există modificări pentru publicare", - "noChangesDiscarded": "Nu există nicio schimbare de eliminat" - }, "address": { "country": "Țară", "fullName": "Numele complet", diff --git a/private/data/i18n/ru.json b/private/data/i18n/ru.json index c0894cdb7..8cf085c8b 100644 --- a/private/data/i18n/ru.json +++ b/private/data/i18n/ru.json @@ -513,20 +513,6 @@ "isCommercial": "Это юридический адрес" } }, - "revisions": { - "isDisabled": "Управление версиями отключено. Любые изменения будут немедленно опубликованы.", - "isEnabled": "Контроль версий включена для продуктов. Любые изменения будут должны быть опубликованы до быть видимым для клиентов.", - "unpublishedChanges": "Неопубликованные изменения", - "publishChanges": "Опубликовать изменения", - "showChanges": "Отобразить изменения", - "hideChanges": "Скрыть изменения", - "discardChanges": "Отменить изменения", - "changedPublished": "Изменения успешно опубликованы", - "changesDiscarded": "Изменения успешно отменены", - "noChanges": "Изменений нет", - "noChangesPublished": "Нет изменений для публикации", - "noChangesDiscarded": "Отсутствуют изменения для отмены" - }, "address": { "country": "Страна", "fullName": "Ф.И.О.", diff --git a/private/data/i18n/sl.json b/private/data/i18n/sl.json index a8f36ddaf..24c746d1a 100644 --- a/private/data/i18n/sl.json +++ b/private/data/i18n/sl.json @@ -513,20 +513,6 @@ "isCommercial": "To je komercialna naslov." } }, - "revisions": { - "isDisabled": "Nadzor Revizija je onemogočeno. Vse spremembe bodo objavljene takoj.", - "isEnabled": "Nadzor Revizija je omogočen za izdelke. Vse spremembe bo treba objaviti, preden se vidno strankam.", - "unpublishedChanges": "neobjavljene spremembe", - "publishChanges": "objavi spremembe", - "showChanges": "prikaži spremembe", - "hideChanges": "Skrij spremembe", - "discardChanges": "Zavreči spremembe", - "changedPublished": "Spremembe so bile uspešno objavljeno", - "changesDiscarded": "Spremembe uspešno zavreči", - "noChanges": "ni spremembe", - "noChangesPublished": "Ni spremembe objavijo", - "noChangesDiscarded": "Ni sprememb za zavržke" - }, "address": { "country": "Država", "fullName": "Polno ime", diff --git a/private/data/i18n/sv.json b/private/data/i18n/sv.json index 412408846..5b2c4680a 100644 --- a/private/data/i18n/sv.json +++ b/private/data/i18n/sv.json @@ -513,20 +513,6 @@ "isCommercial": "Detta är en kommersiell adress." } }, - "revisions": { - "isDisabled": "Versionskontroll är inaktiverad. Eventuella ändringar kommer att publiceras omedelbart.", - "isEnabled": "Versionskontroll har aktiverats för produkter. Eventuella ändringar kommer att behöva publiceras innan de blir synliga för kunderna.", - "unpublishedChanges": "Avpublicera ändringar", - "publishChanges": "publicera ändringar", - "showChanges": "visa ändringar", - "hideChanges": "Göm ändringar", - "discardChanges": "Ignorera ändringar", - "changedPublished": "Ändringarna publicerades", - "changesDiscarded": "Ändringarna kastades bort", - "noChanges": "Inga förändringar", - "noChangesPublished": "Det finns inga ändringar att publicera", - "noChangesDiscarded": "Det finns inga ändringar att avbryta" - }, "address": { "country": "Land", "fullName": "Fullständigt namn", diff --git a/private/data/i18n/tr.json b/private/data/i18n/tr.json index b7e4bd673..57ab200c6 100644 --- a/private/data/i18n/tr.json +++ b/private/data/i18n/tr.json @@ -513,20 +513,6 @@ "isCommercial": "Bu ticari bir adres." } }, - "revisions": { - "isDisabled": "Revizyon kontrolü devre dışı bırakılır. Herhangi bir değişiklik derhal yayınlanacaktır.", - "isEnabled": "Revizyon kontrol Ürünleri etkindir. Herhangi bir değişiklik müşterilere görünür olmak önce yayınlanmış gerekir edilecektir.", - "unpublishedChanges": "yayınlanmamış değişiklikler", - "publishChanges": "Değişiklikleri Yayınla", - "showChanges": "Değişiklikleri göster", - "hideChanges": "gizle değişiklikler", - "discardChanges": "Değişiklikleri gözardı et", - "changedPublished": "Değişiklikler başarıyla yayınlandı", - "changesDiscarded": "Değişiklikler başarıyla atılır", - "noChanges": "Değişiklik yok", - "noChangesPublished": "yayımlamak için herhangi bir değişiklik bulunmamaktadır", - "noChangesDiscarded": "atmak için herhangi bir değişiklik bulunmamaktadır" - }, "address": { "country": "Ülke", "fullName": "Ad Saoyad", diff --git a/private/data/i18n/vi.json b/private/data/i18n/vi.json index 0e3039715..6f9b9cadd 100644 --- a/private/data/i18n/vi.json +++ b/private/data/i18n/vi.json @@ -513,20 +513,6 @@ "isCommercial": "Đây là địa chỉ thương mại." } }, - "revisions": { - "isDisabled": "kiểm soát sửa đổi được vô hiệu hóa. Mọi thay đổi sẽ được công bố ngay lập tức.", - "isEnabled": "kiểm soát sửa đổi được kích hoạt cho sản phẩm. Mọi thay đổi sẽ cần phải được công bố trước khi được rõ cho khách hàng.", - "unpublishedChanges": "Thay đổi chưa được công bố", - "publishChanges": "Xuất bản thay đổi", - "showChanges": "Hiện Thay đổi", - "hideChanges": "Ẩn Thay đổi", - "discardChanges": "Loại bỏ những thay đổi", - "changedPublished": "Thay đổi đăng thành công", - "changesDiscarded": "Thay đổi loại bỏ thành công", - "noChanges": "Không thay đổi", - "noChangesPublished": "Không có thay đổi để xuất bản", - "noChangesDiscarded": "Không có thay đổi để loại bỏ" - }, "address": { "country": "Quốc gia", "fullName": "Họ và tên", diff --git a/private/data/i18n/zh.json b/private/data/i18n/zh.json index d6e80393b..54f6e8e96 100644 --- a/private/data/i18n/zh.json +++ b/private/data/i18n/zh.json @@ -513,20 +513,6 @@ "isCommercial": "这是商业地址。" } }, - "revisions": { - "isDisabled": "版本控制已禁用。将立即发布任何更改。", - "isEnabled": "版本控制产品启用。任何更改都将是需要看到客户之前公布。", - "unpublishedChanges": "未发布更改", - "publishChanges": "发布更改", - "showChanges": "显示更改", - "hideChanges": "隐藏更改", - "discardChanges": "放弃更改", - "changedPublished": "更改已成功发布", - "changesDiscarded": "成功放弃更改", - "noChanges": "无更改", - "noChangesPublished": "没有要发布的更改", - "noChangesDiscarded": "没有需要放弃的更改" - }, "address": { "country": "国家", "fullName": "姓名", diff --git a/server/api/core/importer.js b/server/api/core/importer.js index 8d3c555dc..4e6261336 100644 --- a/server/api/core/importer.js +++ b/server/api/core/importer.js @@ -4,6 +4,7 @@ import Random from "@reactioncommerce/random"; import { Mongo, MongoInternals } from "meteor/mongo"; import { EJSON } from "meteor/ejson"; import { check, Match } from "meteor/check"; +import { getSlug } from "/server/api/core/utils"; import * as Collections from "/lib/collections"; /** @@ -119,6 +120,11 @@ Importer.commit = function (collection) { // Only commit if the buffer isn't empty (otherwise it'll throw). if (this._count[name]) { this.buffer(collection).execute((error, result) => { + if (error) { + Logger.error(error); + return; + } + // Inserted document counts don't affect the modified document count, so we // throw everything together. const nImported = result.nModified + result.nInserted + result.nUpserted; @@ -237,13 +243,15 @@ Importer.buffer = function (collection) { * * Push the variant if it doesn't exist. * * Update the variant. */ -Importer.product = function (key, product) { +Importer.product = function (key, product, shopId) { // If product has an _id, we use it to look up the product before // updating the product so as to avoid trying to change the _id // which is immutable. if (product._id && !key._id) { key._id = product._id; } + product.shopId = shopId; + product.handle = getSlug(product.title || product._id || Random.id()); return this.object(Collections.Products, key, product); }; @@ -277,14 +285,16 @@ Importer.package = function (pkg, shopId) { * @memberof Importer * @summary Store a template in the import buffer. * @param {Object} templateInfo The template data to be updated + * @param {String} shopId The package data to be updated * @returns {undefined} */ -Importer.template = function (templateInfo) { +Importer.template = function (templateInfo, shopId) { check(templateInfo, Object); const key = { name: templateInfo.name, - type: templateInfo.type || "template" + type: templateInfo.type || "template", + shopId }; return this.object(Collections.Templates, key, templateInfo); @@ -297,11 +307,12 @@ Importer.template = function (templateInfo) { * @summary Store a translation in the import buffer. * @param {Object} key A key to look up the translation * @param {Object} translation The translation data to be updated + * @param {String} shopId The package data to be updated * @returns {Object} updated translation buffer */ -Importer.translation = function (key, translation) { +Importer.translation = function (key, translation, shopId) { const modifiedKey = Object.assign(key, { ns: translation.ns }); - return this.object(Collections.Translations, modifiedKey, translation); + return this.object(Collections.Translations, modifiedKey, { ...translation, shopId }); }; /** @@ -314,6 +325,7 @@ Importer.translation = function (key, translation) { * @returns {Object} this shop */ Importer.shop = function (key, shop) { + shop.slug = getSlug(shop.name); return this.object(Collections.Shops, key, shop); }; @@ -345,7 +357,7 @@ Importer.layout = function (layout, shopId) { * @param {Object} shipping The shipping data to be updated * @returns {Object} this shipping */ -Importer.shipping = function (key, shipping) { +Importer.shipping = function (key, shipping, shopId) { let importKey = {}; // // we have a bit of a strange structure in Shipping @@ -361,6 +373,8 @@ Importer.shipping = function (key, shipping) { shopId: result.shopId }; delete shipping.methods; + } else { + shipping.shopId = shopId; } const modifiedKey = Object.assign({}, key, importKey); return this.object(Collections.Shipping, modifiedKey, shipping); @@ -375,7 +389,8 @@ Importer.shipping = function (key, shipping) { * @param {Object} tag The tag data to be updated * @returns {Object} this tag */ -Importer.tag = function (key, tag) { +Importer.tag = function (key, tag, shopId) { + tag.shopId = shopId; return this.object(Collections.Tags, key, tag); }; @@ -436,14 +451,16 @@ Importer.object = function (collection, key, object) { * @param {Object[]} json An array containing the import documents * @param {string[]} keys Fields that should be used as the import key. * @param {Function} callback A callback accepting two parameters. + * @param {Array} cbArgs An array of extra callback arguments, mainly used to pass shopId to callbacks * The callback should accept a key document to consult the database as a first * parameter and an update document as the second parameter. * @returns {undefined} */ -Importer.process = function (json, keys, callback) { +Importer.process = function (json, keys, callback, cbArgs) { check(json, String); check(keys, Array); check(callback, Function); + check(cbArgs, Array); const array = EJSON.parse(json); @@ -452,7 +469,7 @@ Importer.process = function (json, keys, callback) { for (let j = 0; j < keys.length; j += 1) { key[keys[j]] = array[i][keys[j]]; } - callback.call(this, key, array[i]); + callback.call(this, key, array[i], ...cbArgs); } }; diff --git a/server/api/core/loadSettings.js b/server/api/core/loadSettings.js index 999648cc2..baa9d5991 100644 --- a/server/api/core/loadSettings.js +++ b/server/api/core/loadSettings.js @@ -42,10 +42,7 @@ export function loadSettings(json) { exists = Packages.findOne({ name: item.name }); - // - // TODO migrate functionality to Reaction.Importer - // Reaction.Importer.package(item, shopId); - // + // insert into the Packages collection if (exists) { result = Packages.upsert({ diff --git a/server/api/core/templates.js b/server/api/core/templates.js index 112241d69..4693acd99 100644 --- a/server/api/core/templates.js +++ b/server/api/core/templates.js @@ -279,10 +279,11 @@ export function resetRegisteredTemplates() { */ export function initTemplates() { Hooks.Events.add("afterCoreInit", () => { + const shopId = Reaction.getShopId(); Assets.find({ type: "template" }).forEach((t) => { Logger.debug(`Importing ${t.name} template`); if (t.content) { - Reaction.Importer.template(JSON.parse(t.content)); + Reaction.Importer.template(JSON.parse(t.content), shopId); } else { Logger.debug(`No template content found for ${t.name} asset`); } diff --git a/server/api/core/utils.js b/server/api/core/utils.js index 6b936795e..2282ad0f3 100644 --- a/server/api/core/utils.js +++ b/server/api/core/utils.js @@ -1,27 +1,4 @@ -import { latinLangs, getShopLang } from "/lib/api/helpers"; - -// dynamic import of slugiy/transliteration.slugify -let slugify; -async function lazyLoadSlugify() { - let mod; - // getting the shops base language - const lang = getShopLang(); - // if slugify has been loaded but the language has changed - // to be a non latin based language then load transliteration - if (slugify && slugify.name === "replace" && latinLangs.indexOf(lang) === -1) { - mod = await import("transliteration"); - } else if (slugify) { - // if slugify/transliteration is loaded and no lang change - return; - } else if (latinLangs.indexOf(lang) >= 0) { - // if the shops language use latin based chars load slugify else load transliterations's slugify - mod = await import("slugify"); - } else { - mod = await import("transliteration"); - } - // slugify is exported to modules.default while transliteration is exported to modules.slugify - slugify = mod.default || mod.slugify; -} +import { slugify } from "transliteration"; /** * @name getSlug @@ -34,12 +11,5 @@ async function lazyLoadSlugify() { * @return {String} slugified string */ export function getSlug(slugString) { - let slug; - Promise.await(lazyLoadSlugify()); - if (slugString && slugify) { - slug = slugify(slugString.toLowerCase()); - } else { - slug = ""; - } - return slug; + return (typeof slugString === "string" && slugify(slugString)) || ""; } diff --git a/server/imports/fixtures/products.js b/server/imports/fixtures/products.js index fe591df67..d917ed4eb 100755 --- a/server/imports/fixtures/products.js +++ b/server/imports/fixtures/products.js @@ -1,9 +1,9 @@ import faker from "faker"; import _ from "lodash"; import { Factory } from "meteor/dburles:factory"; +import { getSlug } from "server/api/core/utils"; import { Products, Tags } from "/lib/collections"; import { getShop } from "./shops"; -import { Hooks } from "/server/api"; /** * @method metaField @@ -99,14 +99,10 @@ export function productVariant(options = {}) { */ export function addProduct(options = {}) { const product = Factory.create("product", options); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", product); // top level variant const variant = Factory.create("variant", Object.assign({}, productVariant(options), { ancestors: [product._id] })); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", variant); - const variant2 = Factory.create("variant", Object.assign({}, productVariant(options), { ancestors: [product._id, variant._id] })); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", variant2); - const variant3 = Factory.create("variant", Object.assign({}, productVariant(options), { ancestors: [product._id, variant._id] })); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", variant3); + Factory.create("variant", Object.assign({}, productVariant(options), { ancestors: [product._id, variant._id] })); + Factory.create("variant", Object.assign({}, productVariant(options), { ancestors: [product._id, variant._id] })); return product; } @@ -119,10 +115,8 @@ export function addProduct(options = {}) { */ export function addProductSingleVariant() { const product = Factory.create("product"); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", product); // top level variant const variant = Factory.create("variant", Object.assign({}, productVariant(), { ancestors: [product._id] })); - Hooks.Events.run("afterInsertCatalogProductInsertRevision", variant); return { product, variant }; } @@ -219,10 +213,13 @@ export default function () { max: 12.99 }; + const productTitle = faker.commerce.productName(); + const product = { - title: faker.commerce.productName(), + title: productTitle, pageTitle: faker.lorem.sentence(), description: faker.lorem.paragraph(), + handle: getSlug(productTitle), type: "simple", vendor: faker.company.companyName(), price: priceRange, diff --git a/server/imports/fixtures/shops.js b/server/imports/fixtures/shops.js index 73c7ec647..5737632bc 100755 --- a/server/imports/fixtures/shops.js +++ b/server/imports/fixtures/shops.js @@ -160,7 +160,7 @@ const shop = { enabled: true }], workflow: { - status: "active" + status: "new" }, public: true, brandAssets: [ diff --git a/server/methods/accounts/accounts.js b/server/methods/accounts/accounts.js index 637dc99c8..ac57e9057 100644 --- a/server/methods/accounts/accounts.js +++ b/server/methods/accounts/accounts.js @@ -387,6 +387,7 @@ export function addressBookAdd(address, accountUserId) { }; const accountsUpdateQuery = { $set: { + shopId: Reaction.getShopId(), userId }, $addToSet: { diff --git a/server/methods/core/cart.js b/server/methods/core/cart.js index 35f8d9e5b..b5ce915e9 100644 --- a/server/methods/core/cart.js +++ b/server/methods/core/cart.js @@ -284,6 +284,7 @@ Meteor.methods({ // anonymous. const currentCartId = Collections.Cart.insert({ sessionId, + shopId, userId }); Logger.debug(`create cart: into new user cart. created: ${currentCartId} for user ${userId}`); @@ -377,6 +378,51 @@ Meteor.methods({ } }); + // Customer adding a catalog product in the cart. + if (Reaction.hasPermission("createProduct", Reaction.getShopId()) === false) { + // Fetch the catalog product that should be added to the cart + const { product: catalogProduct } = Collections.Catalog.findOne({ + $or: [ + { "product._id": productId }, + { "product.variants._id": variantId }, + { "product.variants.options._id": variantId } + ] + }); + + // Merge the product document and the catalog product document. + // This is to ensure the inventory fields are available for inventory management, + // but also have the most up-to-date title, description, etc for cart and orders if needed. + product = { + ...product, + ...catalogProduct + }; + + // Merge the variant document and the catalog variant document. + for (const catalogVariant of catalogProduct.variants) { + // If the catalog variant has options, try to find a match + if (Array.isArray(catalogVariant.options)) { + const catalogVariantOption = catalogVariant.options.find((option) => option === variantId); + + if (catalogVariantOption) { + variant = { + ...variant, + ...catalogVariantOption + }; + break; + } + } + + // Try to math the top level variant with supplied variant id + if (catalogVariant.variantId === variantId) { + variant = { + ...variant, + ...catalogVariant + }; + break; + } + } + } + // TODO: this lines still needed. We could uncomment them in future if // decide to not completely remove product data from this method // const product = Collections.Products.findOne(productId); diff --git a/server/methods/core/groups.app-test.js b/server/methods/core/groups.app-test.js index 8eda92197..1c129e6df 100644 --- a/server/methods/core/groups.app-test.js +++ b/server/methods/core/groups.app-test.js @@ -41,7 +41,7 @@ describe("Group test", function () { shop = Factory.create("shop"); user = getUser(); // make the same user on Meteor.users available on Accounts - Accounts.upsert({ _id: user._id }, { $set: { userId: user._id } }); + Accounts.upsert({ _id: user._id }, { $set: { shopId: shop._id, userId: user._id } }); }); afterEach(function () { diff --git a/server/methods/core/shop.js b/server/methods/core/shop.js index 6d14a4bcc..362044a81 100644 --- a/server/methods/core/shop.js +++ b/server/methods/core/shop.js @@ -5,6 +5,7 @@ import { check, Match } from "meteor/check"; import { HTTP } from "meteor/http"; import { Job } from "/imports/plugins/core/job-collection/lib"; import { GeoCoder, Hooks, Logger } from "/server/api"; +import { getSlug } from "/server/api/core/utils"; import { Reaction } from "/lib/api"; import * as Collections from "/lib/collections"; import * as Schemas from "/lib/collections/schemas"; @@ -205,6 +206,7 @@ Meteor.methods({ shop.emails = shopUser.emails; shop.addressBook = shopAccount.addressBook; + shop.slug = getSlug(shop.name); Collections.Shops.simpleSchema(shop).validate(shop); @@ -642,7 +644,8 @@ Meteor.methods({ const tag = { name: tagName, - slug: Reaction.getSlug(tagName), + slug: getSlug(tagName), + shopId: Reaction.getShopId(), isTopLevel, updatedAt: new Date(), createdAt: new Date() @@ -674,12 +677,12 @@ Meteor.methods({ this.unblock(); const newTag = { - slug: Reaction.getSlug(tagName), + slug: getSlug(tagName), name: tagName }; const existingTag = Collections.Tags.findOne({ - slug: Reaction.getSlug(tagName), + slug: getSlug(tagName), name: tagName }); diff --git a/server/methods/core/shops.app-test.js b/server/methods/core/shops.app-test.js index a70b3edd2..665d2f752 100644 --- a/server/methods/core/shops.app-test.js +++ b/server/methods/core/shops.app-test.js @@ -98,12 +98,14 @@ describe("core shop methods", function () { }); it("creates a new shop for admin for userId and a partial shopObject", function () { + this.timeout(15000); const partialShop = { name }; Meteor.call("shop/createShop", userId, partialShop); }); it("creates a new shop for admin for userId and a partial shopObject ignoring extraneous data", function () { + this.timeout(15000); const extraneousData = Random.id(); const partialShop = { name, extraneousData }; @@ -120,6 +122,7 @@ describe("core shop methods", function () { describe("shop/changeLayouts", function () { it("should replace every layout with the new layout", function () { + this.timeout(15000); const shop = Factory.create("shop"); Meteor.call("shop/changeLayouts", shop._id, "myNewLayout"); const myShop = Shops.findOne(shop._id); diff --git a/server/publications/collections/product-publications.app-test.js b/server/publications/collections/product-publications.app-test.js index 47ffbe50a..569bd395b 100644 --- a/server/publications/collections/product-publications.app-test.js +++ b/server/publications/collections/product-publications.app-test.js @@ -1,31 +1,56 @@ /* eslint dot-notation: 0 */ /* eslint prefer-arrow-callback:0 */ +/* eslint promise/no-callback-in-promise:0 */ import Random from "@reactioncommerce/random"; import { expect } from "meteor/practicalmeteor:chai"; import { sinon } from "meteor/practicalmeteor:sinon"; +import { Factory } from "meteor/dburles:factory"; import { Roles } from "meteor/alanning:roles"; +import { PublicationCollector } from "meteor/johanbrook:publication-collector"; import { createActiveShop } from "/server/imports/fixtures/shops"; import { Reaction } from "/server/api"; import * as Collections from "/lib/collections"; import Fixtures from "/server/imports/fixtures"; -import { PublicationCollector } from "meteor/johanbrook:publication-collector"; -import { RevisionApi } from "/imports/plugins/core/revisions/lib/api/revisions"; +import publishProductsToCatalog from "/imports/plugins/core/catalog/server/no-meteor/utils/publishProductsToCatalog"; +import publishProductToCatalog from "/imports/plugins/core/catalog/server/no-meteor/utils/publishProductToCatalog"; +import collections from "/imports/collections/rawCollections"; Fixtures(); describe("Publication", function () { - const shopId = Random.id(); - const primaryShopId = Random.id(); + let shopId; + let merchantShopId; + let primaryShopId; + let inactiveMerchantShopId; let sandbox; + let merchantShop1ProductIds; + let merchantShop1VisibleProductIds; + let activeShopProductIds; + let activeShopVisibleProductIds; + let activeMerchantProductIds; + + const productScrollLimit = 24; + beforeEach(function () { + shopId = Random.id(); + merchantShopId = Random.id(); + primaryShopId = Random.id(); + inactiveMerchantShopId = Random.id(); + + sandbox = sinon.sandbox.create(); + sandbox.stub(Reaction, "getPrimaryShopId", () => primaryShopId); + Collections.Shops.remove({}); + // muting some shop creation hook behavior (to keep output clean) + sandbox.stub(Reaction, "setShopName"); + sandbox.stub(Reaction, "setDomain"); + createActiveShop({ _id: shopId, shopType: "merchant" }); + createActiveShop({ _id: merchantShopId, shopType: "merchant" }); createActiveShop({ _id: primaryShopId, shopType: "primary" }); - - sandbox = sinon.sandbox.create(); - sandbox.stub(RevisionApi, "isRevisionControlEnabled", () => true); + Factory.create("shop", { _id: inactiveMerchantShopId, shopType: "merchant" }); }); afterEach(function () { @@ -48,12 +73,14 @@ describe("Publication", function () { }; beforeEach(function () { + this.timeout(15000); Collections.Products.remove({}); // a product with price range A, and not visible - Collections.Products.insert({ + const productId1 = Collections.Products.insert({ ancestors: [], title: "My Little Pony", + handle: "my-little-pony", shopId, type: "simple", price: priceRangeA, @@ -63,9 +90,10 @@ describe("Publication", function () { isBackorder: false }); // a product with price range B, and visible - Collections.Products.insert({ + const productId2 = Collections.Products.insert({ ancestors: [], title: "Shopkins - Peachy", + handle: "shopkins-peachy", shopId, price: priceRangeB, type: "simple", @@ -75,9 +103,10 @@ describe("Publication", function () { isBackorder: false }); // a product with price range A, and visible - Collections.Products.insert({ + const productId3 = Collections.Products.insert({ ancestors: [], title: "Fresh Tomatoes", + handle: "fresh-tomatoes", shopId, price: priceRangeA, type: "simple", @@ -86,10 +115,24 @@ describe("Publication", function () { isSoldOut: false, isBackorder: false }); - - Collections.Products.insert({ + // a product for an unrelated marketplace shop + const productId4 = Collections.Products.insert({ + ancestors: [], + title: "Teddy Ruxpin", + handle: "teddy-ruxpin", + shopId: merchantShopId, + type: "simple", + price: priceRangeA, + isVisible: true, + isLowQuantity: false, + isSoldOut: false, + isBackorder: false + }); + // a product for the Primary Shop + const productId5 = Collections.Products.insert({ ancestors: [], title: "Garbage Pail Kids", + handle: "garbage-pail-kids", shopId: primaryShopId, type: "simple", price: priceRangeA, @@ -98,272 +141,290 @@ describe("Publication", function () { isSoldOut: false, isBackorder: false }); + // a product for an inactive Merchant Shop + // this product is here to guard against false-positive test results + Collections.Products.insert({ + ancestors: [], + title: "Lite Bright", + handle: "lite-bright", + shopId: inactiveMerchantShopId, + type: "simple", + price: priceRangeA, + isVisible: true, + isLowQuantity: false, + isSoldOut: false, + isBackorder: false + }); + + // helper arrays for writing expectations in tests + merchantShop1ProductIds = [productId1, productId2, productId3]; + merchantShop1VisibleProductIds = [productId2, productId3]; + activeShopProductIds = [productId1, productId2, productId3, productId4, productId5]; + activeShopVisibleProductIds = [productId2, productId3, productId4, productId5]; + activeMerchantProductIds = [productId2, productId3, productId4]; collector = new PublicationCollector({ userId: Random.id() }); }); describe("Products", function () { - it("should return all products to admins", function (done) { + it("should return all products from active shops to admins in the Primary Shop", function (done) { // setup - sandbox.stub(Reaction, "getShopId", () => shopId); + sandbox.stub(Reaction, "getShopId", () => primaryShopId); sandbox.stub(Roles, "userIsInRole", () => true); sandbox.stub(Reaction, "hasPermission", () => true); - sandbox.stub(Reaction, "getShopsWithRoles", () => [shopId, primaryShopId]); - - let isDone = false; + sandbox.stub(Reaction, "getShopsWithRoles", () => [shopId, merchantShopId, primaryShopId]); - collector.collect("Products", 24, undefined, {}, (collections) => { - const products = collections.Products; + collector.collect("Products", 24, undefined, {}, true, ({ Products }) => { + const productIds = Products.map((product) => product._id); - expect(products.length).to.equal(4); - - if (!isDone) { - isDone = true; - done(); - } - }); + expect(productIds).to.have.members(activeShopProductIds); + }).then(() => done(/* empty */)).catch(done); }); - it("returns products from only the shops for which an admin has createProduct Role", function (done) { + it("should return all products from the current shop to admins in a Merchant Shop", function (done) { // setup sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => true); sandbox.stub(Reaction, "hasPermission", () => true); - sandbox.stub(Reaction, "getShopsWithRoles", () => [primaryShopId]); + sandbox.stub(Reaction, "getShopsWithRoles", () => [shopId, merchantShopId, primaryShopId]); - let isDone = false; + collector.collect("Products", 24, undefined, {}, true, ({ Products }) => { + const productIds = Products.map((product) => product._id); - collector.collect("Products", 24, undefined, {}, (collections) => { - const products = collections.Products; - - expect(products.length).to.equal(1); - - if (!isDone) { - isDone = true; - done(); - } - }); + expect(productIds).to.have.members(merchantShop1ProductIds); + }).then(() => done(/* empty */)).catch(done); }); - it("should have an expected product title", function (done) { + it("returns products from only the shops for which an admin has createProduct Role", function (done) { // setup - sandbox.stub(Reaction, "getShopId", () => shopId); + sandbox.stub(Reaction, "getShopId", () => primaryShopId); sandbox.stub(Roles, "userIsInRole", () => true); sandbox.stub(Reaction, "hasPermission", () => true); sandbox.stub(Reaction, "getShopsWithRoles", () => [shopId]); - let isDone = false; - - collector.collect("Products", 24, undefined, {}, (collections) => { - const products = collections.Products; - const data = products[1]; - const expectedTitles = ["My Little Pony", "Shopkins - Peachy"]; + collector.collect("Products", 24, undefined, {}, true, ({ Products }) => { + const productIds = Products.map((product) => product._id); - expect(expectedTitles.some((title) => title === data.title)).to.be.ok; - - if (!isDone) { - isDone = true; - done(); - } - }); + expect(productIds).to.have.members(merchantShop1ProductIds); + }).then(() => done(/* empty */)).catch(done); }); it("should return only visible products to visitors", function (done) { sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - let isDone = false; - - collector.collect("Products", 24, undefined, {}, (collections) => { - const products = collections.Products; - const data = products[0]; + collector.collect("Products", 24, undefined, {}, ({ Products }) => { + const data = Products[0]; const expectedTitles = ["Fresh Tomatoes", "Shopkins - Peachy"]; - // the correct expectation should be 2, but there is an issue where - // products not owned by this shop are appearing in results. - // this will be addressed in a PR shortly. - // expect(products.length).to.equal(2); - expect(products.length).to.equal(3); + expect(Products.length).to.equal(2); expect(expectedTitles.some((title) => title === data.title)).to.be.ok; - - if (isDone === false) { - isDone = true; - done(); - } - }); + }).then(() => done(/* empty */)).catch(done); }); it("should return only products matching query", function (done) { - const productScrollLimit = 24; const filters = { query: "Shopkins" }; + sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; - const data = products[0]; + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + const data = Products[0]; expect(data.title).to.equal("Shopkins - Peachy"); - - done(); - }); + }).then(() => done(/* empty */)).catch(done); }); it("should not return products not matching query", function (done) { - const productScrollLimit = 24; const filters = { query: "random search" }; + sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; - - expect(products.length).to.equal(0); - - done(); - }); + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + expect(Products.length).to.equal(0); + }).then(() => done(/* empty */)).catch(done); }); it("should return products in price.min query", function (done) { - const productScrollLimit = 24; const filters = { "price.min": "2.00" }; + sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; - - expect(products.length).to.equal(1); - - done(); - }); + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + expect(Products.length).to.equal(1); + }).then(() => done(/* empty */)).catch(done); }); it("should return products in price.max query", function (done) { - const productScrollLimit = 24; const filters = { "price.max": "24.00" }; + sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; - - expect(products.length).to.equal(3); - - done(); - }); + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + expect(Products.length).to.equal(2); + }).then(() => done(/* empty */)).catch(done); }); it("should return products in price.min - price.max range query", function (done) { - const productScrollLimit = 24; const filters = { "price.min": "12.00", "price.max": "19.98" }; + sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; - - // the correct expectation should be 2, but there is an issue where - // products not owned by this shop are appearing in results. - // this will be addressed in a PR shortly. - // expect(products.length).to.equal(2); - expect(products.length).to.equal(3); - - done(); - }); + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + expect(Products.length).to.equal(2); + }).then(() => done(/* empty */)).catch(done); }); it("should return products where value is in price set query", function (done) { - const productScrollLimit = 24; const filters = { "price.min": "13.00", "price.max": "24.00" }; + sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + expect(Products.length).to.equal(1); + }).then(() => done(/* empty */)).catch(done); + }); + + it("should return products from all shops when multiple shops are provided", function (done) { + const filters = { shops: [shopId, merchantShopId] }; + + sandbox.stub(Reaction, "getShopId", () => primaryShopId); + sandbox.stub(Roles, "userIsInRole", () => false); + + collector.collect("Products", productScrollLimit, filters, {}, ({ Products }) => { + const productIds = Products.map((product) => product._id); + + expect(productIds).to.have.members(activeMerchantProductIds); + }).then(() => done(/* empty */)).catch(done); + }); + }); + + describe("Products/grid", function () { + beforeEach(function () { + Collections.Catalog.remove({}); + }); + + describe("Catalog conditions", function () { + it("returns nothing when the Catalog is empty", function (done) { + sandbox.stub(Reaction, "getShopId", () => shopId); + + collector.collect("Products/grid", ({ Catalog }) => { + const productIds = Catalog.map((product) => product._id); + + expect(productIds).to.be.empty; + }).then(() => done(/* empty */)).catch(done); + }); + + it("returns products from the Catalog", function (done) { + sandbox.stub(Reaction, "getShopId", () => shopId); + + publishProducts(); - expect(products.length).to.equal(1); + collector.collect("Products/grid", ({ Catalog }) => { + const productIds = Catalog.map((product) => product._id); - done(); + expect(productIds).to.not.be.empty; + }).then(() => done(/* empty */)).catch(done); }); }); - it("should return products from all shops when multiple shops are provided", function (done) { - const filters = { shops: [shopId] }; - const productScrollLimit = 24; - sandbox.stub(Reaction, "getCurrentShop", function () { return { _id: "123" }; }); - sandbox.stub(Roles, "userIsInRole", () => true); - sandbox.stub(Reaction, "hasPermission", () => true); - sandbox.stub(Reaction, "getShopsWithRoles", () => [shopId]); + describe("Shop conditions", function () { + beforeEach(function () { + return publishProducts(); + }); + + it("returns products from the active shop", function (done) { + sandbox.stub(Reaction, "getShopId", () => shopId); - let isDone = false; + collector.collect("Products/grid", ({ Catalog }) => { + const productIds = Catalog.map((item) => item.product._id); - collector.collect("Products", productScrollLimit, filters, {}, (collections) => { - const products = collections.Products; - expect(products.length).to.equal(3); + expect(productIds).to.have.members(merchantShop1VisibleProductIds); + }).then(() => done(/* empty */)).catch(done); + }); - const data = products[1]; - expect(["My Little Pony", "Shopkins - Peachy"].some((title) => title === data.title)).to.be.ok; + it("returns all visible products from all active shops when the Primary Shop is active", function (done) { + sandbox.stub(Reaction, "getShopId", () => primaryShopId); - if (!isDone) { - isDone = true; - done(); - } + collector.collect("Products/grid", ({ Catalog }) => { + const productIds = Catalog.map((item) => item.product._id); + + expect(productIds).to.have.members(activeShopVisibleProductIds); + }).then(() => done(/* empty */)).catch(done); + }); + + it("returns products from all shops when the Primary Shop is active, filtered by shop id", function (done) { + const filters = { shopIdsOrSlugs: [shopId, merchantShopId] }; + + sandbox.stub(Reaction, "getShopId", () => primaryShopId); + + collector.collect("Products/grid", 24, filters, ({ Catalog }) => { + const productIds = Catalog.map((item) => item.product._id); + + expect(productIds).to.have.members(activeMerchantProductIds); + }).then(() => done(/* empty */)).catch(done); }); }); + + /** + * @summary Publishes all products in the database + * @returns {Promise} true on successful publish for all documents, false if one ore more fail to publish + */ + function publishProducts() { + const productIds = Collections.Products.find({}).fetch().map((product) => product._id); + + return Promise.await(publishProductsToCatalog(productIds, collections)); + } }); describe("Product", function () { + beforeEach(function () { + Collections.Catalog.remove({}); + }); + it("should return a product based on an id", function (done) { const product = Collections.Products.findOne({ isVisible: true }); + Promise.await(publishProductToCatalog(product, collections)); + sandbox.stub(Reaction, "getShopId", () => shopId); - collector.collect("Product", product._id, (collections) => { - const products = collections.Products; - const data = products[0]; + collector.collect("Product", product._id, ({ Products }) => { + const data = Products[0]; expect(data.title).to.equal(product.title); - - done(); - }); + }).then(() => done(/* empty */)).catch(done); }); it("should not return a product if handle does not match exactly", function (done) { sandbox.stub(Reaction, "getShopId", () => shopId); - collector.collect("Product", "shopkins", (collections) => { - const products = collections.Products; - if (products) { - expect(products.length).to.equal(0); + collector.collect("Product", "shopkins", ({ Products }) => { + if (Products) { + expect(Products.length).to.equal(0); } else { - expect(products).to.be.undefined; + expect(Products).to.be.undefined; } - done(); - }); + }).then(() => done(/* empty */)).catch(done); }); it("should not return a product based on exact handle match if it isn't visible", function (done) { sandbox.stub(Reaction, "getShopId", () => shopId); sandbox.stub(Roles, "userIsInRole", () => false); - let isDone = false; - - collector.collect("Product", "my-little-pony", (collections) => { - const products = collections.Products; - if (products) { - expect(products.length).to.equal(0); + collector.collect("Product", "my-little-pony", ({ Products }) => { + if (Products) { + expect(Products.length).to.equal(0); } else { - expect(products).to.be.undefined; + expect(Products).to.be.undefined; } - - if (!isDone) { - isDone = true; - done(); - } - }); + }).then(() => done(/* empty */)).catch(done); }); it("should return a product to admin based on a exact handle match even if it isn't visible", function (done) { @@ -371,19 +432,11 @@ describe("Publication", function () { sandbox.stub(Roles, "userIsInRole", () => true); sandbox.stub(Reaction, "hasPermission", () => true); - let isDone = false; - - collector.collect("Product", "my-little-pony", (collections) => { - const products = collections.Products; - const data = products[0]; + collector.collect("Product", "my-little-pony", ({ Products }) => { + const data = Products[0]; expect(data.title).to.equal("My Little Pony"); - - if (!isDone) { - isDone = true; - done(); - } - }); + }).then(() => done(/* empty */)).catch(done); }); }); }); diff --git a/server/publications/collections/product.js b/server/publications/collections/product.js index a557151a7..1fae70a0b 100644 --- a/server/publications/collections/product.js +++ b/server/publications/collections/product.js @@ -1,8 +1,48 @@ import { Meteor } from "meteor/meteor"; import { check, Match } from "meteor/check"; -import { Products, Revisions, Shops } from "/lib/collections"; +import { Catalog, Products, Shops } from "/lib/collections"; import { Logger, Reaction } from "/server/api"; -import { RevisionApi } from "/imports/plugins/core/revisions/lib/api/revisions"; + +/** + * Flatten variant tree from a Catalog Item Product document + * @param {Object} product A Catalog Item Product document + * @returns {Array} Variant array + */ +function flattenCatalogProductVariants(product) { + const variants = []; + + // Un-tree the variant tree + if (Array.isArray(product.variants)) { + // Loop over top-level variants + product.variants.forEach((variant) => { + if (Array.isArray(variant.options)) { + // Loop over variant options + variant.options.forEach((option) => { + variants.push({ + ancestors: [ + product.productId, + variant.variantId + ], + type: "variant", + isVisible: true, + ...option + }); + }); + } + + variants.push({ + ancestors: [ + product.productId + ], + type: "variant", + isVisible: true, + ...variant + }); + }); + } + + return variants; +} /** * product detail publication @@ -66,54 +106,49 @@ Meteor.publish("Product", function (productIdOrHandle, shopIdOrSlug) { $in: [true, false, undefined] }; - if (RevisionApi.isRevisionControlEnabled()) { - const handle = Revisions.find({ - "workflow.status": { - $nin: [ - "revision/published" - ] - }, - "$or": [ - { "documentData._id": _id }, - { "documentData.ancestors": _id } - ] - }).observe({ - added: (revision) => { - this.added("Revisions", revision._id, revision); - if (revision.documentType === "product") { - // Check merge box (session collection view), if product is already in cache. - // If yes, we send a `changed`, otherwise `added`. I'm assuming - // that this._documents.Products is somewhat equivalent to the - // merge box Meteor.server.sessions[sessionId].getCollectionView("Products").documents - if (this._documents.Products && this._documents.Products[revision.documentId]) { - this.changed("Products", revision.documentId, { __revisions: [revision] }); - } else { - this.added("Products", revision.documentId, { __revisions: [revision] }); - } - } - }, - changed: (revision) => { - this.changed("Revisions", revision._id, revision); - if (revision.documentType === "product") { - if (this._documents.Products && this._documents.Products[revision.documentId]) { - this.changed("Products", revision.documentId, { __revisions: [revision] }); - } - } - }, - removed: (revision) => { - this.removed("Revisions", revision._id); - if (revision.documentType === "product") { - if (this._documents.Products && this._documents.Products[revision.documentId]) { - this.changed("Products", revision.documentId, { __revisions: [] }); - } - } - } + return Products.find(selector); + } + + if (!selector.shopId) { + selector.shopId = product.shopId; + } + // Product data for customers visiting the PDP page + const cursor = Catalog.find({ + "$or": [{ + "product._id": productIdOrHandle + }, { + "product.slug": productIdOrHandle + }], + "product.type": "product-simple", + "product.shopId": selector.shopId, + "product.isVisible": true, + "product.isDeleted": { $in: [null, false] } + }); + + const handle = cursor.observeChanges({ + added: (id, { product: catalogProduct }) => { + this.added("Products", catalogProduct.productId, catalogProduct); + flattenCatalogProductVariants(catalogProduct).forEach((variant) => { + this.added("Products", variant.variantId, variant); + }); + }, + changed: (id, { product: catalogProduct }) => { + this.changed("Products", catalogProduct.productId, catalogProduct); + flattenCatalogProductVariants(product).forEach((variant) => { + this.changed("Products", variant.variantId, variant); }); - this.onStop(() => { - handle.stop(); + }, + removed: (id, { product: catalogProduct }) => { + this.removed("Products", catalogProduct.productId, catalogProduct); + flattenCatalogProductVariants(product).forEach((variant) => { + this.removed("Products", variant.variantId, variant); }); } - } + }); + + this.onStop(() => { + handle.stop(); + }); - return Products.find(selector); + return this.ready(); }); diff --git a/server/publications/collections/products.js b/server/publications/collections/products.js index 22427fd22..df1082651 100644 --- a/server/publications/collections/products.js +++ b/server/publications/collections/products.js @@ -4,9 +4,8 @@ import { Meteor } from "meteor/meteor"; import { Tracker } from "meteor/tracker"; import { check, Match } from "meteor/check"; import { registerSchema } from "@reactioncommerce/schemas"; -import { Products, Shops, Revisions, Catalog } from "/lib/collections"; +import { Products, Shops, Catalog } from "/lib/collections"; import { Reaction, Logger } from "/server/api"; -import { RevisionApi } from "/imports/plugins/core/revisions/lib/api/revisions"; // // define search filters as a schema so we can validate @@ -88,74 +87,38 @@ const catalogProductFiltersSchema = new SimpleSchema({ } }); -/** - * Broadens an existing selector to include all variants of the given top-level productIds - * Additionally considers the tags product filter, if given - * Can operate on the "Revisions" and the "Products" collection - * @memberof Helpers - * @param collectionName {String} - "Revisions" or "Products" - * @param selector {object} - the selector that should be extended - * @param productFilters { object } - the product filter (e.g. orginating from query parameters) - * @param productIds {String[]} - the top-level productIds we want to get the variants of. - */ -function extendSelectorWithVariants(collectionName, selector, productFilters, productIds) { - let prefix = ""; +function applyShopsFilter(selector, shopIdsOrSlugs) { + // Active shop + const shopId = Reaction.getShopId(); + const primaryShopId = Reaction.getPrimaryShopId(); - if (collectionName.toLowerCase() === "revisions") { - prefix = "documentData."; - } else if (collectionName.toLowerCase() !== "products") { - throw new Error(`Can't extend selector for collection ${collectionName}.`); + // Don't publish if we're missing an active or primary shopId + if (!shopId || !primaryShopId) { + return false; } - // Remove hashtag filter from selector (hashtags are not applied to variants, we need to get variants) - const newSelector = _.omit(selector, ["hashtags", "ancestors"]); - if (productFilters && productFilters.tags) { - // Re-configure selector to pick either Variants of one of the top-level products, or the top-level products in the filter - _.extend(newSelector, { - $or: [{ - [`${prefix}ancestors`]: { - $in: productIds - } - }, { - $and: [{ - [`${prefix}hashtags`]: { - $in: productFilters.tags - } - }, { - [`${prefix}_id`]: { - $in: productIds - } - }] - }] - }); + let activeShopIds; + // if the current shop is the primary shop, get products from all shops + // otherwise, only list products from _this_ shop. + if (shopId === primaryShopId) { + activeShopIds = Shops.find({ + $or: [ + { "workflow.status": "active" }, + { _id: primaryShopId } + ] + }, { + fields: { + _id: 1 + } + }).fetch().map((activeShop) => activeShop._id); } else { - _.extend(newSelector, { - $or: [{ - [`${prefix}ancestors`]: { - $in: productIds - } - }, { - [`${prefix}_id`]: { - $in: productIds - } - }] - }); + activeShopIds = [shopId]; } - return newSelector; -} -function filterProducts(productFilters) { - // if there are filter/params that don't match the schema - // validate, catch except but return no results - try { - if (productFilters) filters.validate(productFilters); - } catch (e) { - Logger.debug(e, "Invalid Product Filters"); + if (!activeShopIds.length) { return false; } - const shopIdsOrSlugs = productFilters && productFilters.shops; - if (shopIdsOrSlugs) { // Get all shopIds associated with the slug or Id const shopIds = Shops.find({ @@ -165,33 +128,48 @@ function filterProducts(productFilters) { }, { slug: { $in: shopIdsOrSlugs } }] + }, { + fields: { + _id: 1 + } }).map((shop) => shop._id); - // If we found shops, update the productFilters - if (shopIds) { - productFilters.shops = shopIds; - } else { - return false; - } + activeShopIds = _.intersection(activeShopIds, shopIds); + } + + if (activeShopIds.length) { + return { + ...selector, + shopId: { $in: activeShopIds } + }; + } + + return selector; +} + +function filterProducts(productFilters) { + // if there are filter/params that don't match the schema + // validate, catch except but return no results + try { + if (productFilters) filters.validate(productFilters); + } catch (error) { + Logger.warn(error, "Invalid Product Filters"); + return false; } // Init default selector - Everyone can see products that fit this selector - const selector = { + const baseSelector = { ancestors: [], // Lookup top-level products isDeleted: { $ne: true }, // by default, we don't publish deleted products isVisible: true // by default, only lookup visible products }; - if (productFilters) { - // handle multiple shops - if (productFilters.shops) { - _.extend(selector, { - shopId: { - $in: productFilters.shops - } - }); - } + const shopIdsOrSlugs = productFilters && productFilters.shops; + const selector = applyShopsFilter(baseSelector, shopIdsOrSlugs); + + if (!selector) return false; + if (productFilters) { // filter by tags if (productFilters.tags) { _.extend(selector, { @@ -313,132 +291,41 @@ function filterProducts(productFilters) { } /** - * products publication - * @param {Number} [productScrollLimit] - optional, defaults to 24 - * @param {Array} shops - array of shopId to retrieve product from. - * @return {Object} return product cursor + * @summary Products publication + * @param {Number} [productScrollLimit] - Top-level product limit. Optional, defaults to 24 + * @param {Object} [productFilters] - Optional filters to apply + * @param {Object} [sort] - Optional MongoDB sort object + * @param {Boolean} [editMode] - If true, will add a shopId filter limiting the results to shops + * for which the logged in user has "createProduct" permission. Default is false. + * @return {MongoCursor|undefined} Products collection cursor, or undefined if none to publish */ -Meteor.publish("Products", function (productScrollLimit = 24, productFilters, sort = {}, editMode = true) { +Meteor.publish("Products", function (productScrollLimit = 24, productFilters, sort = {}, editMode = false) { check(productScrollLimit, Number); check(productFilters, Match.OneOf(undefined, Object)); check(sort, Match.OneOf(undefined, Object)); check(editMode, Match.Maybe(Boolean)); - // TODO: Consider publishing the non-admin publication if a user is not in "edit mode" to see what is published - - // Active shop - const shopId = Reaction.getShopId(); - const primaryShopId = Reaction.getPrimaryShopId(); - - // Get a list of shopIds that this user has "createProduct" permissions for (owner permission is checked by default) - const userAdminShopIds = Reaction.getShopsWithRoles(["createProduct"], this.userId); - - // Don't publish if we're missing an active or primary shopId - if (!shopId || !primaryShopId) { - return this.ready(); - } - - // Get active shop id's to use for filtering - const activeShopsIds = Shops.find({ - $or: [ - { "workflow.status": "active" }, - { _id: primaryShopId } - ] - }, { - fields: { - _id: 1 - } - }).fetch().map((activeShop) => activeShop._id); - const selector = filterProducts(productFilters); if (selector === false) { return this.ready(); } - // We publish an admin version of this publication to admins of products who are in "Edit Mode" - // Authorized content curators for shops get special publication of the product - // with all relevant revisions all is one package - // userAdminShopIds is a list of shopIds that the user has createProduct or owner access for - if (editMode && userAdminShopIds && Array.isArray(userAdminShopIds) && userAdminShopIds.length > 0) { - selector.isVisible = { - $in: [true, false, null, undefined] - }; - selector.shopId = { - $in: userAdminShopIds - }; - - // Get _ids of top-level products - const productIds = Products.find(selector, { - sort, - limit: productScrollLimit - }, { - fields: { - _id: 1 - } - }).map((product) => product._id); - - - const productSelectorWithVariants = extendSelectorWithVariants("Products", selector, productFilters, productIds); - - if (RevisionApi.isRevisionControlEnabled()) { - const revisionSelector = { - "workflow.status": { - $nin: [ - "revision/published" - ] - } - }; - const revisionSelectorWithVariants = extendSelectorWithVariants("Revisions", revisionSelector, productFilters, productIds); - const handle = Revisions.find(revisionSelectorWithVariants).observe({ - added: (revision) => { - this.added("Revisions", revision._id, revision); - if (revision.documentType === "product") { - // Check merge box (session collection view), if product is already in cache. - // If yes, we send a `changed`, otherwise `added`. I'm assuming - // that this._documents.Products is somewhat equivalent to - // the merge box Meteor.server.sessions[sessionId].getCollectionView("Products").documents - if (this._documents.Products && this._documents.Products[revision.documentId]) { - this.changed("Products", revision.documentId, { __revisions: [revision] }); - } else { - this.added("Products", revision.documentId, { __revisions: [revision] }); - } - } - }, - changed: (revision) => { - this.changed("Revisions", revision._id, revision); - if (revision.documentType === "product") { - if (this._documents.Products && this._documents.Products[revision.documentId]) { - this.changed("Products", revision.documentId, { __revisions: [revision] }); - } - } - }, - removed: (revision) => { - this.removed("Revisions", revision._id); - if (revision.documentType === "product") { - if (this._documents.Products && this._documents.Products[revision.documentId]) { - this.changed("Products", revision.documentId, { __revisions: [] }); - } - } - } - }); - - this.onStop(() => { - handle.stop(); - }); + // Get a list of shopIds that this user has "createProduct" permissions for (owner permission is checked by default) + const userAdminShopIds = Reaction.getShopsWithRoles(["createProduct"], this.userId) || []; - return Products.find(productSelectorWithVariants); + // We publish an admin version of this publication to admins of products who are in "Edit Mode" + if (editMode) { + // Limit to only shops we have "createProduct" role for + selector.shopId.$in = _.intersection(selector.shopId.$in, userAdminShopIds); + if (selector.shopId.$in.length === 0) { + return this.ready(); } - // Revision control is disabled, but is admin - return Products.find(productSelectorWithVariants, { - sort, - limit: productScrollLimit - }); + delete selector.isVisible; // in edit mode, you should see all products } - // This is where the publication begins for non-admin users - // Get _ids of top-level products + // Get the IDs of the first N (limit) top-level products that match the query const productIds = Products.find(selector, { sort, limit: productScrollLimit @@ -448,85 +335,21 @@ Meteor.publish("Products", function (productScrollLimit = 24, productFilters, so } }).map((product) => product._id); - let newSelector = _.omit(selector, ["hashtags", "ancestors"]); - - // Remove hashtag filter from selector (hashtags are not applied to variants, we need to get variants) - if (productFilters && Object.keys(productFilters).length === 0 && productFilters.constructor === Object) { - if (productFilters.tags) { - // Re-configure selector to pick either Variants of one of the top-level products, - // or the top-level products in the filter - _.extend(newSelector, { - $or: [{ - ancestors: { - $in: productIds - } - }, { - $and: [{ - hashtags: { - $in: productFilters.tags - } - }, { - _id: { - $in: productIds - } - }] - }] - }); - } - // filter by query - if (productFilters.query) { - const cond = { - $regex: productFilters.query, - $options: "i" - }; - _.extend(newSelector, { - $or: [{ - title: cond - }, { - pageTitle: cond - }, { - description: cond - }, { - ancestors: { - $in: productIds - } - }, - { - _id: { - $in: productIds - } - }] - }); - } - } else { - _.extend(newSelector, { - $or: [{ - ancestors: { - $in: productIds - } - }, { - _id: { - $in: productIds - } - }] - }); - } - - // Adjust the selector to include only active shops - newSelector = { - ...newSelector, - shopId: { - $in: activeShopsIds - } - }; - - // Returning Complete product tree for top level products to avoid sold out warning. - return Products.find(newSelector, { + // Return a cursor for the matching products plus all their variants + return Products.find({ + $or: [{ + ancestors: { + $in: productIds + } + }, { + _id: { + $in: productIds + } + }] + }, { sort - // TODO: REVIEW Limiting final products publication for non-admins - // I think we shouldn't limit here, otherwise we are limited to 24 total products which - // could be far less than 24 top-level products - // limit: productScrollLimit + // We shouldn't limit here. Otherwise we are limited to 24 total products which + // could be far less than 24 top-level products. }); }); @@ -536,45 +359,21 @@ function filterCatalogItems(catalogFilters) { try { if (catalogFilters) catalogProductFiltersSchema.validate(catalogFilters); } catch (e) { - Logger.debug(e, "Invalid Catalog Product Filters"); + Logger.warn(e, "Invalid Catalog Product Filters"); return false; } - const shopIdsOrSlugs = catalogFilters && catalogFilters.shopIdsOrSlugs; - - if (shopIdsOrSlugs) { - // Get all shopIds associated with the slug or Id - const shopIds = Shops.find({ - "workflow.status": "active", - "$or": [{ - _id: { $in: shopIdsOrSlugs } - }, { - slug: { $in: shopIdsOrSlugs } - }] - }).map((shop) => shop._id); - - // If we found shops, update the productFilters - if (shopIds) { - catalogFilters.shopIds = shopIds; - } else { - return false; - } - } - // Init default selector - Everyone can see products that fit this selector - const selector = { + const baseSelector = { "product.isDeleted": { $ne: true }, // by default, we don't publish deleted products "product.isVisible": true // by default, only lookup visible products }; - if (!catalogFilters) return selector; + const { shopIdsOrSlugs } = catalogFilters || {}; + const selector = applyShopsFilter(baseSelector, shopIdsOrSlugs); - // handle multiple shops - if (catalogFilters.shopIds) { - selector.shopId = { - $in: catalogFilters.shopIds - }; - } + if (!selector) return false; + if (!catalogFilters) return selector; // filter by tags if (catalogFilters.tagIds) { diff --git a/server/publications/collections/reactiveAggregate.js b/server/publications/collections/reactiveAggregate.js index d0d067991..1498ccd2a 100644 --- a/server/publications/collections/reactiveAggregate.js +++ b/server/publications/collections/reactiveAggregate.js @@ -5,7 +5,10 @@ import { Mongo, MongoInternals } from "meteor/mongo"; // Add the aggregate function available in tbe raw collection to normal collections Mongo.Collection.prototype.aggregate = function (pipelines, options) { const coll = this._getCollection(); - return Meteor.wrapAsync(coll.aggregate.bind(coll))(pipelines, options); + const aggregateSync = Meteor.wrapAsync(coll.aggregate.bind(coll)); + const aggregationCursor = aggregateSync(pipelines, options); + const aggregationCursorToArraySync = Meteor.wrapAsync(aggregationCursor.toArray.bind(aggregationCursor)); + return aggregationCursorToArraySync(); }; // this group of methods were taken from https://github.com/meteorhacks/meteor-collection-utils diff --git a/server/publications/collections/revisions.js b/server/publications/collections/revisions.js deleted file mode 100644 index 011afb949..000000000 --- a/server/publications/collections/revisions.js +++ /dev/null @@ -1,42 +0,0 @@ -import { Meteor } from "meteor/meteor"; -import { check, Match } from "meteor/check"; -import { Roles } from "meteor/alanning:roles"; -import { Revisions } from "/lib/collections"; -import { Reaction } from "/server/api"; - -/** - * accounts - */ - -Meteor.publish("Revisions", function (documentIds) { - check(documentIds, Match.OneOf(String, Array)); - - // we could additionally make checks of useId defined, but this could lead to - // situation when user will may not have time to get an account - if (this.userId === null) { - return this.ready(); - } - const shopId = Reaction.getShopId(); - if (!shopId) { - return this.ready(); - } - - if (Roles.userIsInRole(this.userId, ["admin", "owner"])) { - if (Array.isArray(documentIds)) { - return Revisions.find({ - // shopId, - documentId: { - $in: documentIds - } - }); - } - - // global admin can get all accounts - return Revisions.find({ - // shopId, - documentId: documentIds - }); - } - // regular users should get just their account - return this.ready(); -}); diff --git a/server/startup/accounts.js b/server/startup/accounts.js index 1cc4b2d2e..afc58f10a 100644 --- a/server/startup/accounts.js +++ b/server/startup/accounts.js @@ -162,7 +162,7 @@ export default function () { } // clone before adding roles - const account = Object.assign({}, user, additionals); + const account = Object.assign({ shopId }, user, additionals); account.userId = user._id; Collections.Accounts.insert(account); Hooks.Events.run("afterAccountsInsert", account.userId, user._id); diff --git a/server/startup/i18n.js b/server/startup/i18n.js index f2db95a2d..cdb4672f5 100644 --- a/server/startup/i18n.js +++ b/server/startup/i18n.js @@ -185,11 +185,13 @@ export function importAllTranslations() { Logger.debug("All translation assets updated"); + const shopId = Reaction.getShopId(); + // Then loop through those I18N assets and import them Assets.find({ type: "i18n" }).forEach((t) => { Logger.debug(`Importing ${t.name} translation for "${t.ns}"`); if (t.content) { - Reaction.Importer.process(t.content, ["i18n"], Reaction.Importer.translation); + Reaction.Importer.process(t.content, ["i18n"], Reaction.Importer.translation, [shopId]); } else { Logger.debug(`No translation content found for ${t.name} - ${t.ns} asset`); } diff --git a/server/startup/load-data.js b/server/startup/load-data.js index ec2b4df4b..1384cccc7 100644 --- a/server/startup/load-data.js +++ b/server/startup/load-data.js @@ -1,8 +1,13 @@ import { Meteor } from "meteor/meteor"; -import { Shops } from "/lib/collections"; +import { Products, Shipping, Tags, Shops } from "/lib/collections"; import { Logger, Reaction } from "/server/api"; import { Fixture } from "/server/api/core/importer"; +/** + * Load fixture data into various collections if those collections are blank + * @name loadData + * @returns {undefined} No return value + */ export default function loadData() { if (!process.env.SKIP_FIXTURES) { /** @@ -10,43 +15,55 @@ export default function loadData() { */ Logger.info("Load default data from /private/data/"); + let shopId = Reaction.getShopId(); // Since import overwrites, only import Shops when none exist - if (!Reaction.getShopId()) { + if (!shopId) { try { Logger.debug("Loading Shop Data"); - Reaction.Importer.process(Assets.getText("data/Shops.json"), ["name"], Reaction.Importer.shop); + Reaction.Importer.process(Assets.getText("data/Shops.json"), ["name"], Reaction.Importer.shop, [shopId]); // ensure Shops are loaded first. Reaction.Importer.flush(Shops); } catch (error) { Logger.error(error, "Bypassing loading Shop default data"); } + shopId = Reaction.getShopId(); // make sure the default shop has been created before going further - while (!Reaction.getShopId()) { + while (!shopId) { Logger.debug("Loading default shop, waiting until it's ready before moving on..."); Meteor._sleepForMs(1000); + shopId = Reaction.getShopId(); } } - try { - Logger.debug("Loading Shipping Data"); - Fixture.process(Assets.getText("data/Shipping.json"), ["name"], Reaction.Importer.shipping); - } catch (error) { - Logger.error(error, "Bypassing loading Shipping default data."); + // Import Shipping data + if (Shipping.find().count() === 0) { + try { + Logger.debug("Loading Shipping Data"); + Fixture.process(Assets.getText("data/Shipping.json"), ["name"], Reaction.Importer.shipping, [shopId]); + } catch (error) { + Logger.error(error, "Bypassing loading Shipping default data."); + } } - try { - Logger.debug("Loading Product Data"); - Fixture.process(Assets.getText("data/Products.json"), ["title"], Reaction.Importer.product); - } catch (error) { - Logger.error(error, "Bypassing loading Products default data."); + // Import Product data + if (Products.find().count() === 0) { + try { + Logger.debug("Loading Product Data"); + Fixture.process(Assets.getText("data/Products.json"), ["title"], Reaction.Importer.product, [shopId]); + } catch (error) { + Logger.error(error, "Bypassing loading Products default data."); + } } - try { - Logger.debug("Loading Tag Data"); - Fixture.process(Assets.getText("data/Tags.json"), ["name"], Reaction.Importer.tag); - } catch (error) { - Logger.error(error, "Bypassing loading Tags default data."); + // Import Tag data + if (Tags.find().count() === 0) { + try { + Logger.debug("Loading Tag Data"); + Fixture.process(Assets.getText("data/Tags.json"), ["name"], Reaction.Importer.tag, [shopId]); + } catch (error) { + Logger.error(error, "Bypassing loading Tags default data."); + } } // // these will flush and import with the rest of the imports from core init. diff --git a/tests/tag/tags.test.js b/tests/tag/tags.test.js index 945cc689f..0a56d83d5 100644 --- a/tests/tag/tags.test.js +++ b/tests/tag/tags.test.js @@ -1,17 +1,12 @@ import GraphTester from "../GraphTester"; +import Factory from "/imports/test-utils/helpers/factory"; jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000; const internalShopId = "123"; const opaqueShopId = "cmVhY3Rpb24vc2hvcDoxMjM="; // reaction/shop:123 const shopName = "Test Shop"; -const tags = []; -for (let i = 100; i < 155; i += 1) { - const tagName = i.toString(); - const tagId = i.toString(); - const tagPosition = i; - tags.push({ _id: tagId, name: tagName, shopId: internalShopId, position: tagPosition }); -} +const mockTags = Factory.Tag.makeMany(55, { shopId: internalShopId, _id: (i) => (i + 100).toString(), position: (i) => i + 100 }); const tagsQuery = `($shopId: ID!, $after: ConnectionCursor, $before: ConnectionCursor, $first: ConnectionLimitInt, $last: ConnectionLimitInt) { tags(shopId: $shopId, after: $after, before: $before, first: $first, last: $last) { @@ -37,12 +32,12 @@ beforeAll(async () => { query = tester.query(tagsQuery); await tester.insertPrimaryShop({ _id: internalShopId, name: shopName }); - await Promise.all(tags.map((tag) => tester.collections.Tags.insert(tag))); + await Promise.all(mockTags.map((tag) => tester.collections.Tags.insert(tag))); }); afterAll(() => tester.stop()); -test("get the first 50 tags when neither first or last is in query", async () => { +test("get the first 20 tags when neither first or last is in query", async () => { let result; try { result = await query({ shopId: opaqueShopId }); @@ -51,9 +46,9 @@ test("get the first 50 tags when neither first or last is in query", async () => return; } - expect(result.tags.nodes.length).toBe(50); + expect(result.tags.nodes.length).toBe(20); expect(result.tags.totalCount).toBe(55); - expect(result.tags.pageInfo).toEqual({ endCursor: "MTQ5", hasNextPage: true, hasPreviousPage: false, startCursor: "MTAw" }); + expect(result.tags.pageInfo).toEqual({ endCursor: "MTE5", hasNextPage: true, hasPreviousPage: false, startCursor: "MTAw" }); try { result = await query({ shopId: opaqueShopId, after: result.tags.pageInfo.endCursor }); @@ -62,9 +57,20 @@ test("get the first 50 tags when neither first or last is in query", async () => return; } - expect(result.tags.nodes.length).toBe(5); + expect(result.tags.nodes.length).toBe(20); expect(result.tags.totalCount).toBe(55); - expect(result.tags.pageInfo).toEqual({ endCursor: "MTU0", hasNextPage: false, hasPreviousPage: true, startCursor: "MTUw" }); + expect(result.tags.pageInfo).toEqual({ endCursor: "MTM5", hasNextPage: true, hasPreviousPage: true, startCursor: "MTIw" }); + + try { + result = await query({ shopId: opaqueShopId, after: result.tags.pageInfo.endCursor }); + } catch (error) { + expect(error).toBeUndefined(); + return; + } + + expect(result.tags.nodes.length).toBe(15); + expect(result.tags.totalCount).toBe(55); + expect(result.tags.pageInfo).toEqual({ endCursor: "MTU0", hasNextPage: false, hasPreviousPage: true, startCursor: "MTQw" }); // Ensure it's also correct when we pass `first: 5` explicitly try {