diff --git a/.circleci/config.yml b/.circleci/config.yml index 130eddf0dac..f274e3a567d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,14 +36,6 @@ jobs: keys: - cumulus-tasks-{{ checksum "global-hash" }} - - restore_cache: - keys: - - gitc-tasks-{{ checksum "global-hash" }} - - - restore_cache: - keys: - - services-{{ checksum "global-hash" }} - - run: name: Installing Dependencies command: | @@ -54,7 +46,7 @@ jobs: # start http service sudo rm -rf /var/www/html - sudo ln -s /home/circleci/project/.tmp-test-data /var/www/html + sudo ln -s /home/circleci/project/packages/test-data /var/www/html sudo service apache2 start # start sftp service @@ -79,50 +71,16 @@ jobs: - save_cache: key: cumulus-tasks-{{ checksum "global-hash" }} paths: - - ./cumulus/tasks/hello-world/node_modules - - ./cumulus/tasks/discover-granules/node_modules - - ./cumulus/tasks/discover-pdrs/node_modules - - ./cumulus/tasks/parse-pdr/node_modules - - ./cumulus/tasks/post-to-cmr/node_modules - - ./cumulus/tasks/pdr-status-check/node_modules - - ./cumulus/tasks/queue-granules/node_modules - - ./cumulus/tasks/queue-pdrs/node_modules - - ./cumulus/tasks/sync-granule/node_modules - - ./cumulus/tasks/discover-s3-granules/node_modules - - ./cumulus/tasks/sf-sns-report/node_modules - - - save_cache: - key: gitc-tasks-{{ checksum "global-hash" }} - paths: - - ./cumulus/tasks/copy-idx-from-s3-to-efs/node_modules - - ./cumulus/tasks/delete-ingest-tracking-data/node_modules - - ./cumulus/tasks/delete-pdr-ftp/node_modules - - ./cumulus/tasks/delete-pdr-s3/node_modules - - ./cumulus/tasks/discover-cmr-granules/node_modules - - ./cumulus/tasks/discover-http-tiles/node_modules - - ./cumulus/tasks/dowload-activity-mock/node_modules - - ./cumulus/tasks/filter-payload/node_modules - - ./cumulus/tasks/generate-mrf/node_modules - - ./cumulus/tasks/generate-pan/node_modules - - ./cumulus/tasks/generate-pdrd/node_modules - - ./cumulus/tasks/run-gdal/node_modules - - ./cumulus/tasks/sync-http-urls/node_modules - - ./cumulus/tasks/sync-wms/node_modules - - ./cumulus/tasks/tee/node_modules - - ./cumulus/tasks/trigger-ingest/node_modules - - ./cumulus/tasks/trigger-mrf-gen/node_modules - - ./cumulus/tasks/trigger-process-pdrs/node_modules - - ./cumulus/tasks/validate-archives/node_modules - - ./cumulus/tasks/discover-pdr/node_modules - - ./cumulus/tasks/generate-pdr-file-list/node_modules - - ./cumulus/tasks/validate-pdr/node_modules - - - save_cache: - key: services-{{ checksum "global-hash" }} - paths: - - ./cumulus/services/sfn-scheduler/node_modules - - ./cumulus/services/sfn-throttler/node_modules - + - ./tasks/hello-world/node_modules + - ./tasks/discover-granules/node_modules + - ./tasks/discover-pdrs/node_modules + - ./tasks/parse-pdr/node_modules + - ./tasks/post-to-cmr/node_modules + - ./tasks/pdr-status-check/node_modules + - ./tasks/queue-granules/node_modules + - ./tasks/queue-pdrs/node_modules + - ./tasks/sync-granule/node_modules + - ./tasks/sf-sns-report/node_modules - run: name: Running Tests @@ -181,7 +139,11 @@ jobs: - checkout - run: name: Install Dependencies - command: yarn + command: | + # checkout the latest tag + LATEST_GIT_TAG=$(git describe --tags --abbrev=0 --match v*) + git checkout tags/$LATEST_GIT_TAG -b latest_git_tag + yarn - run: name: Publishing to NPM @@ -201,4 +163,4 @@ workflows: - build_and_test filters: branches: - only: release + only: release-version-1.3.0 diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 340b3519a5d..3bf5890ffb0 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1576 +1338 \ No newline at end of file diff --git a/.tmp-test-data/.gitignore b/.tmp-test-data/.gitignore deleted file mode 100644 index f8476208f65..00000000000 --- a/.tmp-test-data/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!README -!.gitignore diff --git a/.tmp-test-data/README b/.tmp-test-data/README deleted file mode 100644 index 3ae916b208b..00000000000 --- a/.tmp-test-data/README +++ /dev/null @@ -1,6 +0,0 @@ -The http and sftp containers managed by docker-compose.yml will serve out any -files in this directory. The intention is that any files being fetched using -http or sftp should be copied into this directory (probably under a -subdirectory), fetched, and then deleted. - -The docker containers defined in docker-compose.yml are used for testing. diff --git a/CHANGELOG.md b/CHANGELOG.md index 070a1566bdf..77c637c035b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,27 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [v1.3.0] - 2018-03-29 + +### Deprecated +- discover-s3-granules is deprecated. The functionality is provided by the discover-granules task +### Fixed +- **CUMULUS-331:** Fix aws.downloadS3File to handle non-existent key +- Using test ftp provider for discover-granules testing [CUMULUS-427] +- **CUMULUS-304: "Add AWS API throttling to pdr-status-check task"** Added concurrency limit on SFN API calls. The default concurrency is 10 and is configurable through Lambda environment variable CONCURRENCY. +- **CUMULUS-414: "Schema validation not being performed on many tasks"** revised npm build scripts of tasks that use cumulus-message-adapter to place schema directories into dist directories. +- **CUMULUS-301:** Update all tests to use test-data package for testing data. +- **CUMULUS-271: "Empty response body from rules PUT endpoint"** Added the updated rule to response body. +- Increased memory allotment for `CustomBootstrap` lambda function. Resolves failed deployments where `CustomBootstrap` lambda function was failing with error `Process exited before completing request`. This was causing deployments to stall, fail to update and fail to rollback. This error is thrown when the lambda function tries to use more memory than it is allotted. +- Cumulus repository folders structure updated: + - removed the `cumulus` folder altogether + - moved `cumulus/tasks` to `tasks` folder at the root level + - moved the tasks that are not converted to use CMA to `tasks/.not_CMA_compliant` + - updated paths where necessary + +### Added +- `@cumulus/integration-tests` - Added support for testing the output of an ECS activity as well as a Lambda function. + ## [v1.2.0] - 2018-03-20 ### Fixed @@ -99,7 +120,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [v1.0.0] - 2018-02-23 -[Unreleased]: https://github.com/cumulus-nasa/cumulus/compare/v1.2.0...HEAD +[Unreleased]: https://github.com/cumulus-nasa/cumulus/compare/v1.3.0...HEAD +[v1.3.0]: https://github.com/cumulus-nasa/cumulus/compare/v1.2.0...v1.3.0 [v1.2.0]: https://github.com/cumulus-nasa/cumulus/compare/v1.1.4...v1.2.0 [v1.1.4]: https://github.com/cumulus-nasa/cumulus/compare/v1.1.3...v1.1.4 [v1.1.3]: https://github.com/cumulus-nasa/cumulus/compare/v1.1.2...v1.1.3 diff --git a/README.md b/README.md index 1aee8f3ee97..4e9ac6701f8 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ If you prefer to run docker in detached mode (i.e. run containers in the backgro Run the test commands next + $ export LOCALSTACK_HOST=localhost $ yarn test Run end to end tests by @@ -168,6 +169,31 @@ Release PRs **MUST** be named with `release-` prefix. This will kick off the AWS All packages on master branch are automatically published to NPM. +Follow the following steps to publish to NPM: + +- Create a new branch from `master` and call it `release-version-` +- Run `yarn update` +- Select the correct version upgrade type (e.g. major/minor/patch) + +![](https://static.notion-static.com/13acbe0a-c59d-4c42-90eb-23d4ec65c9db/Screen_Shot_2018-03-15_at_12.21.16_PM.png) + +- Update CHANGELOG.md +- Push to Github +- Create a new git tag + + $ git tag -a v1.x.x -m "version 1.x.x release" + +- Push the tag to github + + $ git push origin v1.x.x + +- Create a PR against the `master` branch +- After the PR is merged, update the (tag) and give a proper title and copy the release details from the CHANGELOG.md to the release + +![](https://static.notion-static.com/def32886-040c-4df9-9462-8b2418cbb925/Release_v1_3_0__cumulus-nasa_cumulus.png) + +![](https://static.notion-static.com/287c7d98-351a-446d-a7ff-45eef2b45d7c/New_release__cumulus-nasa_cumulus.png) + ## Running command in all package folders $ lerna exec -- rm -rf ./package-lock.json diff --git a/cumulus/lib/cf-template.js b/cumulus/lib/cf-template.js deleted file mode 100644 index 06ab5717b50..00000000000 --- a/cumulus/lib/cf-template.js +++ /dev/null @@ -1,85 +0,0 @@ -const path = require('path'); -const yaml = require('js-yaml'); -const deepAssign = require('deep-assign'); - -const ignoredType = (name, kind) => { - const T = function IgnoredType(val) { - this.val = val; - }; - - return new yaml.Type(`!${name}`, { - kind: kind, - construct: (data) => new T(data), - instanceOf: T, - represent: (data) => data.val - }); -}; - -const ignoredTypes = []; -const ignoredTypeNames = [ - 'Base64', 'And', 'Equals', 'If', 'Not', - 'Equals', 'Or', 'FindInMap', 'GetAtt', - 'GetAZs', 'ImportValue', 'Join', 'Select', - 'Split', 'Sub', 'Ref' -]; - -for (const name of ignoredTypeNames) { - ignoredTypes.push(ignoredType(name, 'scalar')); - ignoredTypes.push(ignoredType(name, 'mapping')); - ignoredTypes.push(ignoredType(name, 'sequence')); -} - -const buildSchema = (prefix = '', context = {}) => { - const types = [ - new yaml.Type('!Var', { - kind: 'scalar', - construct: (data) => context[data] - }), - new yaml.Type('!ResourceName', { - kind: 'scalar', - construct: (data) => prefix + data - }) - ]; - return yaml.Schema.create(types.concat(ignoredTypes)); -}; - -const prefixResources = (template, prefix) => { - const unprefixed = template.Resources; - if (!unprefixed) return template; - - const prefixed = { }; - for (const key of Object.keys(template.Resources)) { - prefixed[prefix + key] = unprefixed[key]; - } - return Object.assign({}, template, { Resources: prefixed }); -}; - -const parseTemplate = (templateStr, prefix, context) => - prefixResources( - yaml.safeLoad(templateStr, { schema: buildSchema(prefix, context) }), - prefix - ); - -const dumpTemplate = (template) => - yaml.safeDump(template, { schema: buildSchema() }) - .replace(/!]+)>/g, '!$1'); - -const mergeTemplates = (templates) => deepAssign(...templates); - -const defaultPaths = (componentType) => { - const result = [ - path.resolve(__dirname, './templates/defaults.yml') - ]; - if (componentType === 'ecs-task') { - result.push(path.resolve(__dirname, './templates/service-defaults.yml')); - } - result.push(path.resolve(__dirname, `./templates/${componentType}-defaults.yml`)); - return result; -}; - -module.exports = { - parseTemplate: parseTemplate, - dumpTemplate: dumpTemplate, - mergeTemplates: mergeTemplates, - defaultPaths: defaultPaths -}; diff --git a/cumulus/lib/templates/defaults.yml b/cumulus/lib/templates/defaults.yml deleted file mode 100644 index b70b723fc48..00000000000 --- a/cumulus/lib/templates/defaults.yml +++ /dev/null @@ -1,15 +0,0 @@ -Parameters: - ConfigS3Bucket: - Type: String - Description: Name of an S3 bucket that can hold deployment configuration and artifacts - PrivateBucketName: - Type: String - Description: An alphanumeric stirng for the name of the private bucket for the stack - PublicBucketName: - Type: String - Description: An alphanumeric string for the name of the public bucket for the stack - StackName: - Type: String - Description: - Identifier for the stack being created. This is used to prefix resources and permissions - and may differ from AWS::StackName if, e.g., this is a child stack deployment diff --git a/cumulus/lib/templates/ecs-task-defaults.yml b/cumulus/lib/templates/ecs-task-defaults.yml deleted file mode 100644 index cdda24eb8c0..00000000000 --- a/cumulus/lib/templates/ecs-task-defaults.yml +++ /dev/null @@ -1,13 +0,0 @@ -Resources: - Task: - Properties: - ContainerDefinitions: - - Command: - - !GetAtt [!ResourceName Fn, Arn] - - "--activity" - - Ref: !ResourceName Activity - - Activity: - Type: "AWS::StepFunctions::Activity" - Properties: - Name: !Join ['-', [!Ref StackName, !Var name]] diff --git a/cumulus/lib/templates/service-defaults.yml b/cumulus/lib/templates/service-defaults.yml deleted file mode 100644 index 866ffa65b50..00000000000 --- a/cumulus/lib/templates/service-defaults.yml +++ /dev/null @@ -1,35 +0,0 @@ -Resources: - Service: - Type: AWS::ECS::Service - Properties: - Cluster: !Ref IngestECSCluster - DesiredCount: 2 - TaskDefinition: - Ref: !ResourceName Task - DeploymentConfiguration: - MaximumPercent: 100 - MinimumHealthyPercent: 0 - - Task: - Type: AWS::ECS::TaskDefinition - Properties: - ContainerDefinitions: - - Name: !Var name - Cpu: '512' - Essential: true - Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/gitcdev/ecs-lambda-runner:latest - Memory: '256' - Environment: - - Name: AWS_DEFAULT_REGION - Value: !Ref AWS::Region - LogConfiguration: - LogDriver: awslogs - Options: - awslogs-group: - Ref: !ResourceName Logs - awslogs-region: !Ref AWS::Region - - Logs: - Type: AWS::Logs::LogGroup - Properties: - LogGroupName: !Join ['-', [!Ref StackName, task, !Var name, ecs]] diff --git a/cumulus/lib/templates/task-defaults.yml b/cumulus/lib/templates/task-defaults.yml deleted file mode 100644 index 95c1cb58123..00000000000 --- a/cumulus/lib/templates/task-defaults.yml +++ /dev/null @@ -1,10 +0,0 @@ -Resources: - Fn: - Type: AWS::Lambda::Function - Properties: - FunctionName: !Join ['', [!Sub "${StackName}-task-", !Var name]] - Code: !Var path - Timeout: 300 - MemorySize: 256 - Handler: index.handler - Role: !GetAtt [TaskExecutionRole, Arn] diff --git a/cumulus/services/provider-gateway/.gitignore b/cumulus/services/provider-gateway/.gitignore deleted file mode 100644 index 8688cad2092..00000000000 --- a/cumulus/services/provider-gateway/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -/target -/classes -/checkouts -pom.xml -pom.xml.asc -*.jar -*.class -/.lein-* -/.nrepl-port -.hgignore -.hg/ -dev/locals.clj -/local_activities -my.pem -profiles.clj diff --git a/cumulus/services/provider-gateway/Dockerfile b/cumulus/services/provider-gateway/Dockerfile deleted file mode 100644 index bae9bed9d28..00000000000 --- a/cumulus/services/provider-gateway/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -# Base Alpine Linux based image with OpenJDK JRE only -FROM openjdk:8-jre-alpine -# copy application WAR (with libraries inside) -COPY target/provider-gateway-0.1.0-SNAPSHOT-standalone.jar /app.jar - -# specify default command -CMD ["/usr/bin/java", "-jar", "/app.jar"] \ No newline at end of file diff --git a/cumulus/services/provider-gateway/README.md b/cumulus/services/provider-gateway/README.md deleted file mode 100644 index 6b0e17ca063..00000000000 --- a/cumulus/services/provider-gateway/README.md +++ /dev/null @@ -1,233 +0,0 @@ -# Provider Gateway - -A long running service that will download files from a variety of URLs and upload to S3. It interacts with step functions for the Activity API. - -Providers support a limited number of connections for downloading data. AWS infrastructure like lambdas could easily scale up beyond the number of connections a provider supports. We must fully utilize the connections that are available. The Provider Gateway sets up persistent connections to the providers up to the limit configured. It reads download requests from the Step Function Activity API and queues the requests be processed. Every connection has a single thread that downloads data from the provider to S3 as fast as it can to attempt to fully utilize the limited resource. - -## Building and Deploying - -**As of this writing the building and deploying of Provider Gateway is not part of Cumulus proper. It must be manually built and deployed to a container registry** - -A container can be build and deployed to AWS ECR by running `bin/docker_deploy.sh` - -```Bash -export AWS_DEFAULT_REGION=us-west-2 -bin/docker_deploy.sh -``` - -## Running Locally - -Running the Provider Gateway locally is best done in a Clojure REPL. - -1. Make sure you have [Leiningen](https://leiningen.org/) and Java installed. -2. Create the file `dev/locals.clj` with contents set appropriately. (See below) -3. Edit `dev/user.clj` to set how the system will be configured. There are settings to pull config from AWS or run locally with the file system as the activity API. - -### Locals.clj sample contents - -Place contents like the following in `dev/locals.clj`. - -```Clojure -(ns locals) - -(def defaults - {"AWS_ACCOUNT_ID" "1234567" - "AWS_DEFAULT_REGION" "us-west-2" - "STACK_NAME" "gitc-xx"}) -``` - -## Configuration - -### Provider Configuration - -The provider gateway is configured through the `collections.yml` file in each provider. - -#### Example Provider Configuration: - -```YAML -providers: - - id: HTTP_PROV - config: - gateway_config: - activity: HttpProvDownloadActivity - sync_activity: HttpProvSyncActivity - conn_config: - conn_type: http - num_connections: 2 - - id: FTP_PROV - config: - gateway_config: - activity: FtpProvDownloadActivity - sync_activity: FtpProvSyncActivity - conn_config: - conn_type: ftp - host: 123.123.123.123 - port: 21 - username: user - password: password - num_connections: 2 - - id: SFTP_PROV - config: - gateway_config: - activity: SftpProvDownloadActivity - sync_activity: SftpProvSyncActivity - conn_config: - conn_type: sftp - host: 123.123.123.123 - port: 21 - username: user - password: password - num_connections: 2 -``` - -#### Fields in Provider Gateway Config - -The following fields are configured per provider. - -* `activity` - The CloudFormation name of the step function activity receiving download requests - * Note separate ARNs per provider because each activity is essentially a queue we want separate queues per provider so that one provider with more limited resources does not hold up another provider. -* `sync_activity` - The CloudFormation name of the step function activity receiving requests to synchronize -* `conn_config` - Configuration settings per connection type. See example for valid fields. -* `num_connections` - The number of threads to allocate for downloading data from a provider. - -#### Download and Sync Task Config - -The download and sync task configurations are configured in the `workflow_config_template` element of the message structure. The tasks names are "DownloadActivity" and "SyncHttpUrls" respectively. - -* `bucket` - Configures the name of the bucket in S3 to upload items -* `key_prefix` - A prefix to use for generating a key when uploading new items. - -##### Example Task Config - -```JSON -{"SyncHttpUrls": { - "output": { - "bucket": "{resources.buckets.private}", - "key_prefix": "sources/EPSG{meta.epsg}/{meta.key}" - }} -} -``` - -## Message Structure - -The input and output message structure matches the message payload schema for Cumulus - -### Download Message Request Structure - -#### Download Message Input Payload Structure - -Field descriptions - -* `payload` - * `files` - an array of file download requests - * Each File Map - * `type` - only `"download"` supported currently - * `source` - * `url` - Location of file to download - * `version` - optional version number. This can help avoid unnecessary downloads if the file is already in S3. - * `size` - Options size of the file to copy. Size is important to specify to avoid having to buffer the file in memory before copying to S3. If size is not present then the size will attempt to be determined via HTTP HEAD request, FTP ls, or similar. - * `target` either `"FROM_CONFIG"` or a map with `bucket` and `key` of an S3 location - - -##### Example Download Message Input Payload - -```JSON -{ - "... other fields here as in message": "...", - "payload": { - "other-keys": "other keys at this level and below are ignored and passed through to output", - "files": [{ - "type": "download", - "source": { - "url": "http://example.com/foo/bar.txt", - "version": "OptionalVersion", - "size": 1234 - }, - "target": { - "bucket": "the-bucket", - "key": "bar.txt" - } - }, { - "type": "download", - "source": { - "url": "http://example.com/foo/bar2.txt", - }, - "target": "FROM_CONFIG" - }] - } -} -``` - -#### Download Message Output Payload Structure - -The output is similar to the input structure but it has additional information. - -```JSON -{ - "... other fields here as in message": "...", - "payload": { - "other-keys": "other keys at this level and below are ignored and passed through to output", - "files": [{ - "type": "download", - "source": { - "url": "http://example.com/foo/bar.txt", - "version": "v1" - }, - "target": { - "bucket": "the-bucket", - "key": "bar.txt" - }, - "success" : false, - "error" : "The file did not exist at the source." - }, { - "type": "download", - "source": { - "url": "http://example.com/foo/bar2.txt", - "version": "v1" - }, - "target": { - "bucket": "the-bucket", - "key": "bar2.txt" - }, - "success": true - }] - } -} -``` - -### Sync Message Request Structure - -Synchronization messages can send a list of files and version to synchronize to S3. - -#### Sync Message Input Payload Structure - -The payload is a list of file urls and versions to synchronize. - -```JSON -{ - "... other fields here as in message": "...", - "payload" : [ { - "url" : "http://example.com/foo/bar.txt", - "version" : "bar-1" - }, { - "url" : "http://example.com/foo/bar2.txt", - "version" : "bar2-1" - } ] - } -``` -#### Sync Message Output Payload Structure - -The output payload from synchronization is a list of S3 Bucket and Keys of the files that exist. - -```JSON -{ - "... other fields here as in message": "...", - "payload": [{ - "Bucket": "the-bucket", - "Key": "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/bar.txt" - }, { - "Bucket": "the-bucket", - "Key": "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/bar2.txt" - }] -} -``` diff --git a/cumulus/services/provider-gateway/bin/build.sh b/cumulus/services/provider-gateway/bin/build.sh deleted file mode 100755 index add56b4b983..00000000000 --- a/cumulus/services/provider-gateway/bin/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -lein uberjar -docker build -t nasa-cumulus/provider-gateway . diff --git a/cumulus/services/provider-gateway/bin/docker_deploy.sh b/cumulus/services/provider-gateway/bin/docker_deploy.sh deleted file mode 100755 index ca0ab535588..00000000000 --- a/cumulus/services/provider-gateway/bin/docker_deploy.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -AWS_ACCOUNT_ID=$(aws ec2 describe-security-groups \ ---group-names 'Default' \ ---query 'SecurityGroups[0].OwnerId' \ ---output text) - -if [ -z "$AWS_DEFAULT_REGION" ]; then - region="us-east-1" -else - region=$AWS_DEFAULT_REGION -fi - -NAMESPACE="nasa-cumulus" -IMAGE_NAME="provider-gateway" - -## -- Testing -- -lein test - -if [ $? -ne 0 ] ; then - echo "Tests failed" - exit 1 -fi - -# -- Build -- -echo "Building ..." -./bin/build.sh - -# -- Tag -- -echo "Tagging ..." -docker tag \ -${NAMESPACE}/${IMAGE_NAME}:latest \ -${AWS_ACCOUNT_ID}.dkr.ecr.${region}.amazonaws.com/${NAMESPACE}/${IMAGE_NAME}:latest - -# -- Login -- -echo "Logging in ..." -# Get the login command -login_cmd=$(aws ecr get-login --region ${region} --no-include-email) -# Run the command -$login_cmd - -# -- Push -- -echo "Pushing ..." -docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${region}.amazonaws.com/${NAMESPACE}/${IMAGE_NAME}:latest - -# Remove leftover build stuff so a local repl will still work. -lein clean \ No newline at end of file diff --git a/cumulus/services/provider-gateway/bin/docker_run.sh b/cumulus/services/provider-gateway/bin/docker_run.sh deleted file mode 100755 index 80aba76a1cb..00000000000 --- a/cumulus/services/provider-gateway/bin/docker_run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -docker run -d \ ---name provider-gateway \ --e AWS_ACCESS_KEY_ID=`aws configure get aws_access_key_id` \ --e AWS_SECRET_ACCESS_KEY=`aws configure get aws_secret_access_key` \ --e AWS_REGION=${AWS_DEFAULT_REGION} \ --e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ --e AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} \ --e STACK_NAME=${STACK_NAME} \ ---net="host" \ -nasa-cumulus/provider-gateway:latest \ No newline at end of file diff --git a/cumulus/services/provider-gateway/bin/docker_stop.sh b/cumulus/services/provider-gateway/bin/docker_stop.sh deleted file mode 100755 index 80577b04ef9..00000000000 --- a/cumulus/services/provider-gateway/bin/docker_stop.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -line=$(docker container ls -a -f name=provider-gateway | tail -n 1) -docker kill provider-gateway -parts=($line) -id=${parts[0]} -docker rm "$id" \ No newline at end of file diff --git a/cumulus/services/provider-gateway/bin/docker_tail_logs.sh b/cumulus/services/provider-gateway/bin/docker_tail_logs.sh deleted file mode 100755 index f34493d118f..00000000000 --- a/cumulus/services/provider-gateway/bin/docker_tail_logs.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -docker logs provider-gateway -f \ No newline at end of file diff --git a/cumulus/services/provider-gateway/config/cloudformation.yml b/cumulus/services/provider-gateway/config/cloudformation.yml deleted file mode 100644 index 842d982db5c..00000000000 --- a/cumulus/services/provider-gateway/config/cloudformation.yml +++ /dev/null @@ -1,20 +0,0 @@ -Resources: - - Service: - Properties: - DesiredCount: 1 - - Task: - Properties: - ContainerDefinitions: - - Cpu: '512' - Essential: true - Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/nasa-cumulus/provider-gateway:latest - Memory: '2048' - Environment: - - Name: AWS_DEFAULT_REGION - Value: !Ref AWS::Region - - Name: STACK_NAME - Value: !Sub ${StackName} - - Name: AWS_ACCOUNT_ID - Value: !Sub ${AWS::AccountId} diff --git a/cumulus/services/provider-gateway/dev/user.clj b/cumulus/services/provider-gateway/dev/user.clj deleted file mode 100644 index 53247b2fa82..00000000000 --- a/cumulus/services/provider-gateway/dev/user.clj +++ /dev/null @@ -1,56 +0,0 @@ -(ns user - (:require - [clojure.pprint :refer (pprint pp)] - [clojure.tools.namespace.repl :as tnr] - [clojure.spec.alpha :as s] - [cheshire.core :as json] - [com.stuartsierra.component :as c] - [cumulus.provider-gateway.system :as sys] - [cumulus.provider-gateway.util :as util] - [proto-repl.saved-values])) - -(def local-activity-dir - "./local_activities") - -(def local-provider - {:provider-id "LOCAL", - :activity-api {:activity-api-type "file-system" - :dir local-activity-dir} - ; :conn_config {:conn_type "http"} - :conn_config {:conn_type "ftp" - :host "localhost" - :username "ftp" - :password "ftp"} - :num_connections 2}) - -(def system nil) - -(defn start [] - (set! *print-length* 5000) - (s/check-asserts true) - (try - (let [ - the-system (sys/create-system [local-provider])] - ;; use this instead to run the system against AWS using collections.yml as configuration - ; the-system (sys/create-system)] - (alter-var-root #'system - (constantly (c/start the-system)))) - (catch Exception e - (.printStackTrace e) - (throw e))) - nil) - -(defn stop [] - (try - (alter-var-root #'system #(when % (c/stop %))) - (catch Exception e - (.printStackTrace e) - (throw e))) - nil) - -(defn reset [] - (stop) - (tnr/refresh :after 'user/start)) - -(println "Custom user.clj loaded.") - diff --git a/cumulus/services/provider-gateway/project.clj b/cumulus/services/provider-gateway/project.clj deleted file mode 100644 index beb247d5319..00000000000 --- a/cumulus/services/provider-gateway/project.clj +++ /dev/null @@ -1,60 +0,0 @@ -(defproject nasa-cumulus/provider-gateway "0.1.0-SNAPSHOT" - :description "FIXME: write description" - :url "http://example.com/FIXME" - :dependencies [[org.clojure/clojure "1.9.0-alpha17"] - [com.stuartsierra/component "0.3.2"] - [org.clojure/core.async "0.3.443"] - - ;; AWS API - [amazonica "0.3.107"] - - ;; Parsing JSON - [cheshire "5.7.1"] - - ;; Parsing yaml - [com.fasterxml.jackson.dataformat/jackson-dataformat-yaml "2.8.9"] - [org.yaml/snakeyaml "1.18"] - - ;; HTTP Client - [clj-http "3.6.1"] - - ;; FTP Client - [commons-net/commons-net "3.6"] - - ;; SFTP Client - [com.jcraft/jsch "0.1.54"] - - ;; UUID Generation - [danlentz/clj-uuid "0.1.7"]] - - - ;; The ^replace is done to disable the tiered compilation for accurate benchmarks - ;; See https://github.com/technomancy/leiningen/wiki/Faster - :jvm-opts ^:replace ["-server" - "-Dclojure.compiler.direct-linking=true"] - - :profiles {:dev {:dependencies [[org.clojure/tools.namespace "0.2.11"] - [criterium "0.4.4"] - [proto-repl "0.3.1"] - [pjstadig/humane-test-output "0.8.2"] - - ;; HTTP server for testing - [ring/ring-jetty-adapter "1.5.0"] - ;; SFTP server for testing - [org.apache.sshd/sshd-core "1.6.0"] - ;; FTP server for testing - [org.apache.ftpserver/ftpserver-core "1.1.1"]] - :jvm-opts ^:replace ["-server"] - ;; Uncomment this to enable assertions. Turn off during performance tests. - ; "-ea" - - ;; Use the following to enable JMX profiling with visualvm - ; "-Dcom.sun.management.jmxremote" - ; "-Dcom.sun.management.jmxremote.ssl=false" - ; "-Dcom.sun.management.jmxremote.authenticate=false" - ; "-Dcom.sun.management.jmxremote.port=1098"] - :source-paths ["src" "dev" "test"] - :injections [(require 'pjstadig.humane-test-output) - (pjstadig.humane-test-output/activate!)]} - :uberjar {:main cumulus.provider-gateway.runner - :aot :all}}) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/activities/sync_task_to_request_handler.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/activities/sync_task_to_request_handler.clj deleted file mode 100644 index 988a72d660b..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/activities/sync_task_to_request_handler.clj +++ /dev/null @@ -1,72 +0,0 @@ -(ns cumulus.provider-gateway.activities.sync-task-to-request-handler - "Provides code that handles tasks read from the activity API that indicate we should synchronize - files with contents already in S3." - (:require - [clojure.spec.alpha :as s] - [cumulus.provider-gateway.download-activity-handler :as activity-handler] - [cumulus.provider-gateway.util :as util] - [cumulus.provider-gateway.aws.s3 :as s3] - [cumulus.provider-gateway.specs.config :as config-spec] - [cumulus.provider-gateway.specs.sync-task :as sync-spec])) - -;; PERFORMANCE ENHANCEMENT: the input to the sync activity includes just the files. If we were to -;; get the file sizes when scanning the folder we'd be able to improve S3 upload speeds. - -(def TASK_NAME - "SyncHttpUrls") - -(defn- file->download-request - "Converts a file into a download request." - [config file] - (s/assert ::sync-spec/file file) - (s/assert ::config-spec/config config) - (let [{{:keys [bucket key_prefix]} :output} config - file-name (util/url->file-name (:url file))] - {:type "download" - :source file - :target {:bucket bucket - :key (str key_prefix "/" file-name)}})) - -(defrecord SyncTaskToRequestHandler - [s3-api] - - activity-handler/TaskToRequests - - (handle-new-task - [_ task] - (let [task-updated (activity-handler/default-handle-new-task TASK_NAME s3-api task)] - (assoc task-updated :input - {:files (mapv #(file->download-request (:config task-updated) %) (:input task-updated))}))) - - (handle-completed-task - [_ {:keys [results] :as completion-request}] - (cond - (every? :version_skip results) - {:exception "NotNeededWorkflowError"} - - ;; If any failed to transfer we'll return a remote resource error - (some (complement :success) results) - {:exception "RemoteResourceError"} - - :else - (let [payload-files (->> results - ;; Get the successful completions - (filter :success) - ;; Get their upload locations - (map :target) - ;; Change to the style expected - (map #(hash-map :Bucket (:bucket %) :Key (:key %)))) - message (-> completion-request - :original-message - (assoc :payload payload-files))] - (activity-handler/upload-large-payload - TASK_NAME - s3-api - (:config completion-request) - message))))) - -(defn create-sync-task-to-request-handler - ([] - (create-sync-task-to-request-handler s3/aws-s3-api)) - ([s3-api] - (->SyncTaskToRequestHandler s3-api))) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/activity_api.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/activity_api.clj deleted file mode 100644 index c049accf3c4..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/activity_api.clj +++ /dev/null @@ -1,232 +0,0 @@ -(ns cumulus.provider-gateway.aws.activity-api - "Defines an API for talking to the AWS Step Function Activity API in AWS or other substitute - instances." - (:require - [clojure.spec.alpha :as s] - [amazonica.aws.stepfunctions :as sf] - [clojure.java.io :as io] - [cheshire.core :as json]) - (:import - (com.amazonaws - SdkClientException) - (com.amazonaws.http.timers.client - ClientExecutionTimeoutException) - (java.io - File) - (java.net - URI) - (java.nio.file - FileSystems - Paths - StandardWatchEventKinds - WatchEvent$Kind))) - -(defprotocol ActivityProtocol - "Defines a protocol that mimics the AWS activity API." - - (get-task - [this] - "Returns a task which is a group of download or upload requests to complete. Blocks for a certain - period of time. Returns null if there are no tasks found within a period of time.") - - (report-task-failure - [this task-token error-code cause] - "Reports a failure to execute the activity") - - (report-task-success - [this task-token output] - "Reports a successful activity execution. The output should be a JSON string to pass to the next - step of the step function.")) - -(defmulti create-activity-api - (fn [config] - (:activity-api-type config))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; InMemory implementation - -;; In memory implementation of the activity API for testing. -(defrecord InMemoryActivities - [ - ;; An atom containing a sequence of tasks. Requests to get a task will take from the atom. - tasks-atom - - ;; A map of task token to the results - failed-tasks-atom - - ;; A map of successful task ids to the output found. - successful-tasks-atom] - - ActivityProtocol - - (get-task - [this] - (let [val-to-return (atom nil)] - (swap! tasks-atom (fn [tasks] - (reset! val-to-return (first tasks)) - (rest tasks))) - (or @val-to-return - ;; Simulate blocking call to wait for more data - (do (Thread/sleep 1000) nil)))) - - (report-task-failure - [this task-token error-code cause] - (swap! failed-tasks-atom assoc task-token {:error-code error-code :cause cause}) - nil) - - (report-task-success - [this task-token output] - (swap! successful-tasks-atom assoc task-token output) - nil)) - -(defn create-in-memory-activities - [tasks] - (map->InMemoryActivities {:tasks-atom (atom tasks) - :failed-tasks-atom (atom {}) - :successful-tasks-atom (atom {})})) - -(defmethod create-activity-api "in-memory" - [config] - (create-in-memory-activities (:tasks config))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; AWS implementation - -(def POLL_TIMEOUT - "The length of time in milliseconds to poll the activity API for an activity to run before timing - out. AWS recommends setting this at 65 seconds." - 65000) - -;; Implements the ActivityProtocol against the real AWS API. -(defrecord AwsActivityApi - [activity-arn] - - ActivityProtocol - - (get-task - [this] - (try - (println "Reading task from" activity-arn) - (let [task (sf/get-activity-task {:activity-arn activity-arn - :sdk-client-execution-timeout POLL_TIMEOUT}) - _ (println "Task read" (pr-str task)) - {:keys [task-token input]} task] - {:task-token task-token - :input (json/decode input true)}) - (catch ClientExecutionTimeoutException e - ;; ignoring this and returning nil - nil) - (catch SdkClientException ce - ;; If the client exception is read timed out we will ignore it. Otherwise rethrow. - ;; com.amazonaws.SdkClientException: Unable to execute HTTP request: Read timed out - (when-not (.contains (.getMessage ce) "Read timed out") - (throw ce))))) - - (report-task-failure - [this task-token error-code cause] - (println "Reporting failure" task-token error-code cause) - (sf/send-task-failure {:taskToken task-token :errorCode error-code :cause cause}) - nil) - - (report-task-success - [this task-token output] - (println "Reporting success" task-token) - (sf/send-task-success {:output (json/encode output) :taskToken task-token}) - nil)) - -(defn create-aws-activity-api - "Creates an instance of the AWS implementation of the ActivityProtocol" - [activity-arn] - (->AwsActivityApi activity-arn)) - -(defmethod create-activity-api "aws" - [config] - (create-aws-activity-api (:arn config))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Folder implementation - -(defn ensure-dir-exists - [dir] - (let [f (io/as-file dir)] - (when-not (.exists f) - (.mkdirs f)))) - -(defn get-oldest-input-file - "Tries to find the oldest input file in the input directory. If it can not find a file waits for - a period of time for a file to show up." - [input-dir watch-service] - - (or - ;; Look for existing files in the directory. - (->> (.listFiles input-dir) - (filter #(.isFile %)) - (sort-by #(.lastModified %)) - first) - - ;; If not existing files in the directory then use the watch service to wait up to N seconds - ;; for a file to arrive - (when-let [event-key (.poll watch-service 10 java.util.concurrent.TimeUnit/SECONDS)] - (try - (let [event (first (.pollEvents event-key))] - (io/as-file (str input-dir File/separator (.context event)))) - (finally - (.reset event-key)))))) - -;; Implements the ActivityProtocol using the file system. Reads from a /inputs and -;; writes to /outputs -(defrecord FileSystemActivityApi - [ - ;; An atom containing a number to use to generate unique task tokens - task-token-atom - - ;; Java NIO watch service against the input dir to look for new files - watch-service - - ;; Directory monitored for new tasks to execute - input-dir - - ;; Successful task output will be written as new files to this directory. - output-dir] - - ActivityProtocol - - (get-task - [this] - (when-let [oldest-input-file (get-oldest-input-file input-dir watch-service)] - (let [contents (json/decode (slurp oldest-input-file) true) - task-token (str "task-" (swap! task-token-atom inc))] - (println "Task read" (pr-str contents)) - (when-not (.delete oldest-input-file) - (throw (Exception. (str "Could not delete input file " oldest-input-file)))) - {:task-token task-token - :input contents}))) - - (report-task-failure - [this task-token error-code cause] - (println "Task Failure:" (pr-str {:taskToken task-token :errorCode error-code :cause cause}))) - - (report-task-success - [this task-token output] - (println "Reporting success" task-token) - (let [output-file (io/as-file (str output-dir File/separator task-token ".json"))] - (spit output-file (json/encode output {:pretty true}))) - nil)) - -(defn create-file-system-activity-api - [target-dir] - (let [input-dir (io/as-file (str target-dir File/separator "inputs")) - output-dir (io/as-file (str target-dir File/separator "outputs")) - watch-service (.newWatchService (FileSystems/getDefault)) - path (Paths/get (URI. (str (io/as-url input-dir))))] - (ensure-dir-exists input-dir) - (ensure-dir-exists output-dir) - (.register path watch-service (into-array WatchEvent$Kind [StandardWatchEventKinds/ENTRY_CREATE])) - (map->FileSystemActivityApi {:task-token-atom (atom 0) - :watch-service watch-service - :input-dir input-dir - :output-dir output-dir}))) - -(defmethod create-activity-api "file-system" - [config] - (create-file-system-activity-api (:dir config))) \ No newline at end of file diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/s3.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/s3.clj deleted file mode 100644 index bed1aff6110..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/s3.clj +++ /dev/null @@ -1,148 +0,0 @@ -(ns cumulus.provider-gateway.aws.s3 - "Defines protocols and functions for accessing AWS S3 or stubbed implementations" - (:require - [amazonica.aws.s3 :as s3] - [cheshire.core :as json]) - (:import - (com.amazonaws.services.s3.model - AmazonS3Exception))) - -(defprotocol S3Api - "Defines an API for the kinds of requests we need to make to S3." - (read-s3-string - [this bucket key] - "Reads a string from the given s3 bucket and key") - - (write-s3-string - [this bucket key value] - [this bucket key value metadata] - "Writes a string to the given s3 bucket and key") - - (write-s3-stream - [this bucket key stream] - [this bucket key stream metadata] - "Writes a stream to the given s3 bucket and key") - - (get-s3-object-metadata - [this bucket key] - "Returns a map of metadata for the given object and key. Returns nil if it doesn't exist")) - -(defmulti create-s3-api - "Creates an instance of the AWS API for use." - (fn [type] - type)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; AWS impl - -(def aws-s3-api - "Default implementation of the S3 API that talks to the real S3" - (reify - S3Api - - (read-s3-string - [_ bucket key] - (slurp (:input-stream (s3/get-object bucket key)))) - - (write-s3-stream - [this bucket key stream] - (write-s3-stream this bucket key stream nil)) - - (write-s3-stream - [_ bucket key stream metadata] - (s3/put-object :bucket-name bucket - :key key - :input-stream stream - :metadata metadata)) - - (write-s3-string - [this bucket key value] - (write-s3-string this bucket key value nil)) - - (write-s3-string - [this bucket key value metadata] - (let [bytes (.getBytes value "UTF-8") - is (java.io.ByteArrayInputStream. bytes)] - (write-s3-stream this bucket key is (merge {:content-length (count bytes)} metadata)))) - - (get-s3-object-metadata - [_ bucket key] - (try - (s3/get-object-metadata :bucket-name bucket :key key) - (catch AmazonS3Exception e - ;; Ignore exception and return nil if not found. - (when-not (.startsWith (.getMessage e) "Not Found") - (throw e))))))) - -(defmethod create-s3-api :aws - [_] - ;; same instance is used for all of them - aws-s3-api) - -;; No type specified defaults to AWS -(defmethod create-s3-api nil - [_] - (create-s3-api :aws)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; InMemory data -;; Used for testing so we can test code that works with S3 without actually connecting to it.. - -(defrecord InMemoryS3API - ;; nested maps of bucket -> key -> {:metadata ... :value ...} - [bucket-key-to-value-atom] - - S3Api - (read-s3-string - [_ bucket key] - (get-in @bucket-key-to-value-atom [bucket key :value])) - - (write-s3-string - [this bucket key value] - (write-s3-string this bucket key value nil)) - - (write-s3-string - [_ bucket key value metadata] - (swap! bucket-key-to-value-atom #(assoc-in % [bucket key] {:value value :metadata metadata}))) - - (write-s3-stream - [this bucket key stream] - (write-s3-stream this bucket key stream nil)) - - (write-s3-stream - [this bucket key stream metadata] - (write-s3-string this bucket key (slurp stream) metadata)) - - (get-s3-object-metadata - [_ bucket key] - (get-in @bucket-key-to-value-atom [bucket key :metadata]))) - -(defn create-in-memory-s3-api - "Creates an instance of the in-memory s3 api. Takes an existing map of data in S3 of buckets to keys - to values" - ([] - (create-in-memory-s3-api {})) - ([existing-data] - (->InMemoryS3API (atom existing-data)))) - -(defmethod create-s3-api :in-memory - [_] - ;; same instance is used for all of them - (create-in-memory-s3-api)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Helper functions - -(defn read-s3-json - "Reads a string from the given s3 bucket and key" - ([bucket key] - (read-s3-json aws-s3-api bucket key)) - ([s3-api bucket key] - (json/decode (read-s3-string s3-api bucket key) true))) - -(defn write-s3-json - "Reads a string from the given s3 bucket and key" - ([bucket key value] - (write-s3-json aws-s3-api bucket key value)) - ([s3-api bucket key value] - (write-s3-string s3-api bucket key (json/generate-string value {:pretty true})))) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/download_activity_handler.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/download_activity_handler.clj deleted file mode 100644 index 7000b1e0215..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/download_activity_handler.clj +++ /dev/null @@ -1,225 +0,0 @@ -(ns cumulus.provider-gateway.download-activity-handler - "Handles reading from the Step Function Activity API for download requests. It reads requests - from the API and and places download tasks on a channel to be processed. It reads from another - channel a list of completed downloads and writes output back to the activity API." - (:require - [clj-uuid :as uuid] - [clojure.core.async :as a] - [com.stuartsierra.component :as c] - [cumulus.provider-gateway.aws.activity-api :as activity] - [cumulus.provider-gateway.util :as util] - [cumulus.provider-gateway.aws.s3 :as s3])) - -(def COMPLETION_CHANNEL_BUFFER_SIZE - "The number of items that can be added to the set of completion requests to write to the activity - api." - 5) - -(defprotocol TaskToRequests - "Converts an input task from the activity API into a set of requests (download, upload, etc) - to process and handles converting the response back into an action to complete" - - (handle-new-task - [this task] - "Takes a new task received from the activity api converts it into a map with the list of requests - to process.") - - (handle-completed-task - [this completion-request] - "Takes a completed task response and does any final cleanup needed. Returns data to return as - output of the step function request.")) - -(defn start-activity-reader-thread - "Starts a thread which will read from the activity API and process requests." - [running-atom activity-api task-to-requests-handler task-channel completion-channel] - (a/thread - (while @running-atom - (if-let [task (activity/get-task activity-api)] - (let [_ (println (format "Read task from activity api %s" (:task-token task))) - start-time (System/currentTimeMillis) - task (handle-new-task task-to-requests-handler task) - ;; Put the completion channel in the task so we'll get a message when the task is - ;; finished. - task (assoc task - :completion-channel completion-channel - :start-time start-time)] - (a/>!! task-channel task)))) - (println "Activity reader thread completed"))) - -(defn start-activity-completer-thread - "Starts a thread reading from the completion channel and writing responses back to the activity - api." - [activity-api task-to-requests-handler completion-channel] - (a/thread - (util/while-let - [{:keys [type task-token start-time] :as completion-request} (a/meta-key - "Returns the meta key to use from a message" - [message] - (let [unique-key - (if-let [key (get-in message [:meta :key])] - (format "%s/%s" key (uuid/v1)) - (format "%s/%s" (get-in message [:meta :collection]) (uuid/v1)))] - (println "USING S3 MESSAGE KEY [" unique-key "]") - unique-key)) - -(defn- message->private-bucket - "Returns the name of the private bucket from a message." - [message] - (get-in message [:resources :buckets :private])) - -(defn load-payload - "Loads the payload from the task which could be stored in an intermediate representation on S3." - [s3-api task] - (when-let [payload (get-in task [:input :payload])] - (let [{bucket :Bucket key :Key} payload] - (if (and bucket key) - (s3/read-s3-json s3-api bucket key) - payload)))) - -(defn load-config - "Loads the configuration for the task from the workflow_config_template and populates any - mustache style replacements" - [task-name task] - (let [message (:input task) - config (get-in message [:workflow_config_template (keyword task-name)])] - ;; Replace all the mustache stuff - (util/populate-message-config-replacements message config))) - -(defn default-handle-new-task - "Takes a task read from the activity API and prepares it for processing." - [task-name s3-api task] - (let [;; Read payload from S3 - payload (load-payload s3-api task) - ;; Load the task configuration - config (load-config task-name task)] - (-> task - (assoc :original-message (:input task)) - (assoc :config config) - ;; Replace the task input with the payload that we're processing. - (assoc :input payload)))) - -(defn upload-large-payload - "Uploads a payload to S3 so that task messages do not exceed the maximum supported by Step - Functions. Returns the new message pointing to S3 payload" - [task-name s3-api config message] - (if (:skip_upload_output_payload_to_s3 config) - - ;; Skip upload and return message with payload data in place. - (do - (println "USING STANDARD MESSAGING") - message) - - ;; Upload the resulting payload to s3 - (let [private-bucket (message->private-bucket message) - payload-location (str task-name "/" (message->meta-key message))] - (println "USING S3 MESSAGING") - (println (str "STORING MESSAGE AT [" payload-location "]")) - (s3/write-s3-json s3-api private-bucket payload-location (:payload message)) - ;; Create the output message to pass to the next task - (assoc message :payload {:Bucket private-bucket :Key payload-location})))) - -(defn default-handle-completed-task - "Takes a completed task and creates the output to send to the activity api." - [task-name s3-api completion-request] - - ;; We return a message with a payload pointing to an S3 bucket with a list of the files that - ;; were successfully downloaded. - (let [message (-> completion-request - :original-message - (assoc-in [:payload :files] (:results completion-request)))] - (upload-large-payload task-name s3-api (:config completion-request) message))) - -(def TASK_NAME - "DownloadActivity") - -(defrecord DefaultTaskHandler - [s3-api] - TaskToRequests - - (handle-new-task - [_ task] - (default-handle-new-task TASK_NAME s3-api task)) - - (handle-completed-task - [_ completion-request] - (default-handle-completed-task TASK_NAME s3-api completion-request))) - -(defn create-activity-handler - ([activity-api] - (create-activity-handler activity-api (->DefaultTaskHandler s3/aws-s3-api))) - ([activity-api task-to-requests-handler] - (map->ActivityHandler {:activity-api activity-api - :task-to-requests-handler task-to-requests-handler - :running-atom (atom false)}))) - diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/ftp.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/ftp.clj deleted file mode 100644 index ca498df0c41..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/ftp.clj +++ /dev/null @@ -1,153 +0,0 @@ -(ns cumulus.provider-gateway.protocols.ftp - "Defines an instance of the FTP protocol which can download data from an FTP server" - (:require - [clojure.java.io :as io] - [cumulus.provider-gateway.protocols.url-connection :as url-conn]) - (:import - (java.io - FilterInputStream) - (org.apache.commons.net.ftp - FTP - FTPConnectionClosedException - FTPFile - FTPReply - FTPClient))) - -(defn- check-reply - "Checks that the reply from the server for the last request was successful." - [client] - (let [reply (.getReplyCode client)] - (when-not (FTPReply/isPositiveCompletion reply) - (.disconnect client) - (throw (Exception. "Last command did not complete successfully"))))) - -(defn- safe-close-connection - "Catches any exceptions when trying to close the connection" - [conn] - (try - (url-conn/close conn) - (catch Exception _ - conn))) - -(defn- connect-client - "Takes an existing FTP client and configures and connects to the FTP server." - [config client] - (let [{:keys [host port username password]} config - port (or port 21)] - (println (format "Connecting to FTP server [%s] on port [%d]" - host - port)) - (.setControlEncoding client "UTF-8") - ;; The following line was added to fix an issue (GITC-455) when connecting to FTP servers - ;; using extended passive mode (EPSV) from AWS ECS containers. This may cause problems - ;; if the FTP server is not using EPSV. - (.setUseEPSVwithIPv4 client true) - (.setConnectTimeout client 30000) ; ms - (.setDataTimeout client -1) ; forever ms - (.setControlKeepAliveTimeout client 300) ; seconds - (.setControlKeepAliveReplyTimeout client 3000) ; ms - - ;; Connect and check reply code to verify success - (.connect client host port) - (check-reply client) - - (when username - (when-not (.login client username password) - (.disconnect client) - (throw (Exception. (format "Unable to login with username [%s] and password [****]" - username))))) - (.setFileType client FTP/BINARY_FILE_TYPE) - (.enterLocalPassiveMode client) - client)) - -(defn- create-ftp-client - "Creates an connects and instance of an FTP Client" - [config] - (connect-client config (FTPClient.))) - - -(comment - (def c (create-ftp-connection - {:host "localhost" - :username "ftp" - :password "ftp"})) - - (map #(.getSize %) (seq (.listFiles (:client c) "/PDR/PDN.ID1703251200.PD2R"))) - - (def s (url-conn/download c "ftp://localhost/PDR/PDN.ID1703251200.PDR")) - - ;; returns nil if it doesn't exist - (def s (url-conn/download c "ftp://localhost/foo.txt")) - - (slurp s) - (.isConnected (:client c)) - (url-conn/close c)) - -(defn retrieve-file-stream - [config client path] - (try - (.retrieveFileStream client path) - (catch FTPConnectionClosedException e - (println "Detected a closed FTP connection. Attempting to reconnect") - (connect-client config client) - (println "Reconnect success") - (.retrieveFileStream client path)))) - -(defrecord FtpConnection - [ - config - - ^FTPClient client] - - url-conn/UrlConnection - - (close - [conn] - (when (and client (.isConnected client)) - (try (.logout client) (catch FTPConnectionClosedException _ nil)) - (try (.disconnect client) (catch FTPConnectionClosedException _ nil))) - (assoc conn :client nil)) - - (get-size - [conn url] - (when-not client - (throw (Exception. "Connection not connected."))) - (let [path (.getPath (io/as-url url))] - (when-let [^FTPFile ftp-file (first (.listFiles client path))] - (.getSize ftp-file)))) - - (download - [conn url] - (when-not client - (throw (Exception. "Connection not connected"))) - (let [path (.getPath (io/as-url url)) - closed (atom false)] - (when-let [stream (retrieve-file-stream config client path)] - ;; Return a non-closing FilterInputStream. Closing the stream returned by filter - ;; retrieveFileStream closes the whole connection. - (proxy - [FilterInputStream] - [^InputStream stream] - (close - [] - (when-not @closed - (try - ;; When we're done with the stream as indicated by the user calling close we use - ;; completePendingCommand to verify success of the action and indicate that we're done. - (if (.completePendingCommand client) - (check-reply client) - ;; There was a problem. Close the connection and throw exception. - (do - (safe-close-connection conn) - (throw (Exception. "Could not complete pending command of downloaded stream")))) - (finally - (reset! closed true)))))))))) - -(defn create-ftp-connection - "Creates an instance of connection to an FTP server" - [config] - (map->FtpConnection {:config config :client (create-ftp-client config)})) - - - - diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/http.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/http.clj deleted file mode 100644 index 6959f706308..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/http.clj +++ /dev/null @@ -1,58 +0,0 @@ -(ns cumulus.provider-gateway.protocols.http - "Defines an instance of the HTTP protocol which can download data from an HTTP server" - (:require - [clj-http.client :as client] - [clj-http.conn-mgr :as conn-mgr] - [cumulus.provider-gateway.protocols.url-connection :as url-conn])) - -(defrecord HttpConnection - [connection-manager] - - url-conn/UrlConnection - - (close - [conn] - (when connection-manager - (conn-mgr/shutdown-manager connection-manager)) - (assoc conn :connection-manager nil)) - - (get-size - [conn url] - (when-not connection-manager - (throw (Exception. "Connection not connected."))) - (let [resp (client/head url {:connection-manager connection-manager - :throw-exceptions? false})] - (when (= 200 (:status resp)) - (some-> resp :headers (get "Content-Length") (Long.))))) - - (download - [conn url] - (when-not connection-manager - (throw (Exception. "Connection not connected."))) - (let [resp (client/get url {:connection-manager connection-manager - :as :stream - :throw-exceptions? false})] - (if (= 200 (:status resp)) - (:body resp) - (do - ;; The body must be closed or else the connection manager will get hung on subsequent requests - (.close (:body resp)) - nil))))) - -(defn create-http-connection - [] - (->HttpConnection - (conn-mgr/make-reusable-conn-manager - {:insecure? true - :timeout 300 ;; time in seconds that connections are left open before automatically closing. - :threads 1 - :default-per-route 1}))) - - -(comment - (def sample-url - "https://lance3.modaps.eosdis.nasa.gov/imagery/elements/VIIRS/VNGCR_NQD_C1/VNGCR_NQD_C1_r00c00/2017198/VNGCR_NQD_C1.A2017198.r00c00.001.txt") - (def c (create-http-connection)) - (def s (url-conn/download c sample-url)) - (slurp s) - (url-conn/close c)) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/sftp.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/sftp.clj deleted file mode 100644 index a19454a423b..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/sftp.clj +++ /dev/null @@ -1,87 +0,0 @@ -(ns cumulus.provider-gateway.protocols.sftp - "Defines an instance of the SFTP protocol which can download data from an SFTP server" - (:require - [clojure.java.io :as io] - [cumulus.provider-gateway.protocols.url-connection :as url-conn] - [cumulus.provider-gateway.util :as util]) - (:import - (com.jcraft.jsch - JSch - Session - ChannelSftp - SftpException))) - -(defmacro ignore-file-not-found - [& body] - `(try - ~@body - (catch SftpException e# - ;; Ignore FileNotFoundException and return null - (when-not (.contains (.getMessage e#) "FileNotFoundException") - (throw e#))))) - -(defrecord SftpConnection - [ - config - - ^JSch jsch - ^Session session - ^ChannelSftp channel] - - url-conn/UrlConnection - - (close - [conn] - (when channel - (.disconnect channel) - (.disconnect session)) - (assoc conn :channel nil :session nil)) - - (get-size - [conn url] - (when-not channel - (throw (Exception. "Connection not connected."))) - (let [path (util/url->path url)] - (ignore-file-not-found - (when-let [entry (first (.ls channel path))] - (.getSize (.getAttrs entry)))))) - - (download - [conn url] - (when-not channel - (throw (Exception. "Connection not connected"))) - (ignore-file-not-found - (.get channel (util/url->path url))))) - -(defn create-sftp-connection - "Creates an instance of connection to an FTP server" - [{:keys [username password host port disable-strict-host-checking] :as config}] - (let [jsch (JSch.) - session (doto (.getSession jsch username host port) - (.setPassword password)) - _ (when disable-strict-host-checking - ;; Makes testing easier - (.setConfig session "StrictHostKeyChecking" "no")) - _ (.connect session) - channel (.openChannel session "sftp")] - (.connect channel) - (map->SftpConnection {:config config - :jsch jsch - :session session - :channel channel}))) - -(comment - (def c (create-sftp-connection {:conn_type "sftp" - :host "localhost" - :username "ignored" - :password "ignored" - :disable-strict-host-checking true - :port 3032})) - (url-conn/close c) - (url-conn/download c "sftp://localhost/foo.bar") - (url-conn/get-size c "sftp://localhost/foo.bar") - (url-conn/get-size c "sftp://localhost/bar.txt") - (slurp (url-conn/download c "sftp://localhost/bar.txt")) - - (type *e)) - diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/url_connection.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/url_connection.clj deleted file mode 100644 index 6fe10b9f936..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/url_connection.clj +++ /dev/null @@ -1,17 +0,0 @@ -(ns cumulus.provider-gateway.protocols.url-connection) - -(defprotocol UrlConnection - "Defines a protocol for interacting with URLS to download data." - - (close - [conn] - "Closes the underlying connection") - - (get-size - [conn url] - "Attempts to get the size of the data at the given URL without actually downloading the data. - Returns nil if unable to access the data") - - (download - [conn url] - "Returns the contents of the URL as an Input stream. Returns nil if the file does not exist.")) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/runner.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/runner.clj deleted file mode 100644 index ddc6193ee61..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/runner.clj +++ /dev/null @@ -1,24 +0,0 @@ -(ns cumulus.provider-gateway.runner - "Entry point for the application. Defines a main method that accepts arguments." - (:require - [clojure.pprint :as pp] - [clojure.spec.alpha :as s] - [com.stuartsierra.component :as c] - [cumulus.provider-gateway.system :as sys]) - (:gen-class)) - -(defn -main - "Starts the App." - [& args] - - ;; Enable Clojure Spec assertions so we can find problems when running in our development environments - ;; Performance Note: Disable this when performance matters. The actual overhead it adds may not - ;; be much though - (s/check-asserts true) - - (pp/pprint (into {} (System/getenv))) - (c/start (sys/create-system)) - (println "Running...") - ;; run it forever - (.join (Thread/currentThread))); - diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/common.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/common.clj deleted file mode 100644 index da230092385..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/common.clj +++ /dev/null @@ -1,12 +0,0 @@ -(ns cumulus.provider-gateway.specs.common - "Defines common specifications" - (:require - [clojure.spec.alpha :as s])) - -(s/def ::url string?) - -(s/def ::size int?) - -(s/def ::bucket string?) - -(s/def ::key string?) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/config.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/config.clj deleted file mode 100644 index cc0996519e7..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/config.clj +++ /dev/null @@ -1,16 +0,0 @@ -(ns cumulus.provider-gateway.specs.config - "Defines specifications for configuration items for tasks configurations" - (:require - [clojure.spec.alpha :as s] - [cumulus.provider-gateway.specs.common :as common])) - -(s/def ::skip_upload_output_payload_to_s3 - boolean?) - -(s/def ::key_prefix string?) - -(s/def ::output - (s/keys :req-un [::common/bucket ::key_prefix])) - -(s/def ::config - (s/keys :opt-un [::output ::skip_upload_output_payload_to_s3])) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/provider.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/provider.clj deleted file mode 100644 index d1e64b8f6f5..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/provider.clj +++ /dev/null @@ -1,76 +0,0 @@ -(ns cumulus.provider-gateway.specs.provider - "Defines specifications for provider configuration." - (:require - [clojure.spec.alpha :as s] - [cumulus.provider-gateway.specs.common :as common])) - -;;;; -;; Provider Activity api configuration - -(s/def ::activity-api-type string?) -(defmulti activity-api-type :activity-api-type) - -(s/def ::dir string?) - -(defmethod activity-api-type "file-system" - [_] - (s/keys :req-un [::activity-api-type ::dir])) - -(s/def ::in-memory-tasks (s/coll-of map?)) -(s/def ::tasks ::in-memory-tasks) - -(defmethod activity-api-type "in-memory" - [_] - (s/keys :req-un [::activity-api-type ::tasks])) - -(defmethod activity-api-type "aws" - [_] - (s/keys :req-un [::activity-api-type])) - -(defmethod activity-api-type :default - [value] - (throw (Exception. (str "Invalid api type in " value)))) - - -(s/def ::activity-api - (s/multi-spec activity-api-type ::activity-api-type)) -;;;; -;; Provider Connection config -(s/def ::conn_type string?) -(defmulti connection-type :conn_type) - -(s/def ::host string?) -(s/def ::port int?) -(s/def ::username string?) -(s/def ::password string?) - -(defmethod connection-type "ftp" - [_] - (s/keys :req-un [::conn_type ::host] - :opt-un [::port ::username ::password])) - -(defmethod connection-type "sftp" - [_] - (s/keys :req-un [::conn_type ::host ::username ::password] - :opt-un [::port])) - -(defmethod connection-type "http" - [_] - ;; HTTP doesn't really have any configuration - (s/keys :req-un [::conn_type])) - -(defmethod connection-type :default - [value] - (throw (Exception. (str "Invalid connection type in " value)))) - -(s/def ::conn_config (s/multi-spec connection-type ::conn_type)) - -;;;; -;; The Provider Spec -(s/def ::provider-id string?) -(s/def ::num_connections int?) -(s/def ::sync-activity-api ::activity-api) - -(s/def ::provider - (s/keys :req-un [::provider-id ::conn_config ::num_connections] - :opt-un [::activity-api ::sync-activity-api])) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/sync_task.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/sync_task.clj deleted file mode 100644 index 5023631738e..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/sync_task.clj +++ /dev/null @@ -1,11 +0,0 @@ -(ns cumulus.provider-gateway.specs.sync-task - (:require - [clojure.spec.alpha :as s] - [cumulus.provider-gateway.specs.common :as common])) - - -(s/def ::version string?) - -;; Describes the file object that -(s/def ::file - (s/keys :req-un [::common/url ::version])) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/task.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/task.clj deleted file mode 100644 index d1db6f5d24d..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/task.clj +++ /dev/null @@ -1,35 +0,0 @@ -(ns cumulus.provider-gateway.specs.task - "Describes the expected fields in a download task." - (:require - [clojure.spec.alpha :as s] - [cumulus.provider-gateway.specs.common :as common] - [cumulus.provider-gateway.specs.config :as config])) - -(s/def ::source - (s/keys :req-un [::url] - :opt-un [::size])) - -(s/def ::target - (s/or - :from-config #(= % "FROM_CONFIG") - :s3-bucket-key (s/keys :req-un [::common/bucket ::common/key]))) - -(s/def ::type #{"download"}) - -(s/def ::request - (s/keys :req-un [::type ::source ::target])) - -(s/def ::files - (s/coll-of ::request)) - -(s/def ::payload - (s/keys :req-un [::files])) - -(s/def ::task-token string?) -(s/def ::input ::payload) - -;; This is the task when it arrives to the task executor -(s/def ::task - (s/keys :req-un [::config/config - ::task-token - ::input])) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/system.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/system.clj deleted file mode 100644 index 0e28059d7a2..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/system.clj +++ /dev/null @@ -1,110 +0,0 @@ -(ns cumulus.provider-gateway.system - "Defines the running system." - (:require - [clojure.spec.alpha :as s] - [clojure.core.async :as a] - [clojure.string :as str] - [com.stuartsierra.component :as c] - [cumulus.provider-gateway.aws.activity-api :as activity] - [cumulus.provider-gateway.activities.sync-task-to-request-handler :as strh] - [cumulus.provider-gateway.download-activity-handler :as activity-handler] - [cumulus.provider-gateway.task-executor :as task-executor] - [cumulus.provider-gateway.util :as util] - [cumulus.provider-gateway.specs.provider :as provider-spec] - [cumulus.provider-gateway.aws.s3 :as s3])) - -(def COLLECTIONS_YAML - "The location of the collection yaml file within the deploy bucket" - "ingest/collections.yml") - -(defn load-collections-config - ([] - (load-collections-config (util/get-stack-name))) - ([stack-name] - (util/parse-yaml (s3/read-s3-string s3/aws-s3-api - (str stack-name "-deploy") COLLECTIONS_YAML)))) - -(def TASK_CHANNEL_BUFFER_SIZE - "The number of messages that can be buffered in the download task channel before writing to it will - be blocked. There's a task channel per provider." - 5) - -(defn create-activity-arn - [activity-name] - (format "arn:aws:states:%s:%s:activity:%s-%s" - (util/get-aws-region) - (util/get-aws-account-id) - (util/get-stack-name) - activity-name)) - -(defn get-gateway-providers - "Returns the set of providers configured in collections.yml" - ([] - (get-gateway-providers (load-collections-config))) - ([config] - (->> config - :providers - ;; Get all the providers with a gateway config - (filter #(get-in % [:config :gateway_config])) - - (map (fn [{id :id - {config :gateway_config} :config}] - (merge - {:provider-id id} - (select-keys config [:conn_config :num_connections]) - (when (:activity config) - {:activity-api {:activity-api-type "aws" - :arn (create-activity-arn (:activity config))}}) - (when (:sync_activity config) - {:sync-activity-api {:activity-api-type "aws" - :arn (create-activity-arn (:sync_activity config))}}))))))) - -(defn create-provider-components - "Takes a configured provider and creates system components prefixed with the providers id so they - won't conflict with components for other providers." - [provider] - (s/assert ::provider-spec/provider provider) - (let [;; helper function for making a keyword with a provider id prefix. - pk #(keyword (str (:provider-id provider) "-" (name %)))] - - (merge - {;; A channel for communicating task read from the activity API to the task executor - (pk :task-channel) (a/chan TASK_CHANNEL_BUFFER_SIZE) - - ;; The implementation of the S3 API to use. - (pk :s3-api) (s3/create-s3-api (:s3-api-type provider)) - - ;; The task executor processes download requests for a provider. - (pk :task-executor) (c/using (task-executor/create-task-executor provider) - {:task-channel (pk :task-channel) - :s3-api (pk :s3-api)})} - - ;; Create an activity handler that downloads requests - (when (:activity-api provider) - {(pk :download-activity-handler) (c/using (activity-handler/create-activity-handler - (activity/create-activity-api (:activity-api provider))) - {:task-channel (pk :task-channel)})}) - - ;; Create a sync activity handler - (when (:sync-activity-api provider) - {(pk :sync-activity-handler) - (c/using (activity-handler/create-activity-handler - (activity/create-activity-api (:sync-activity-api provider)) - (strh/create-sync-task-to-request-handler)) - {:task-channel (pk :task-channel)})})))) - -(defn create-system - "Creates a new instance of the message store system." - ([] - (create-system (get-gateway-providers))) - ([providers] - (println "Using provider config" (pr-str providers)) - (let [provider-components (->> providers - (map create-provider-components) - (reduce (fn [vals provider-entries] - (reduce into vals provider-entries)) - []))] - - (apply - c/system-map - provider-components)))) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/task_executor.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/task_executor.clj deleted file mode 100644 index 29eae2d17d0..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/task_executor.clj +++ /dev/null @@ -1,211 +0,0 @@ -(ns cumulus.provider-gateway.task-executor - "Defines a components and functions for executing download task requests." - (:require - [clojure.spec.alpha :as s] - [clojure.core.async :as a] - [com.stuartsierra.component :as c] - [cumulus.provider-gateway.aws.s3 :as s3] - [cumulus.provider-gateway.protocols.url-connection :as url-conn] - [cumulus.provider-gateway.util :as util] - [cumulus.provider-gateway.specs.task :as specs] - [cumulus.provider-gateway.protocols.ftp :as ftp-conn] - [cumulus.provider-gateway.protocols.sftp :as sftp-conn] - [cumulus.provider-gateway.protocols.http :as http-conn])) - -(defn- create-connection - "Creates a connection based from a provider connection configuration." - [conn-config] - (case (:conn_type conn-config) - "ftp" (ftp-conn/create-ftp-connection conn-config) - "sftp" (sftp-conn/create-sftp-connection conn-config) - "http" (http-conn/create-http-connection) - ;; else - (throw (Exception. (format "Unexpected connection type [%s]" (:conn_type conn-config)))))) - -(defn version-skip-download? - "Returns true if we should skip the download to S3 if the key has data at the given bucket" - [s3-api bucket key version] - (when version - (let [start-time (System/currentTimeMillis) - metadata (s3/get-s3-object-metadata s3-api bucket key)] - (util/log-latency "s3-version-check" (- (System/currentTimeMillis) start-time)) - (= version (get-in metadata [:user-metadata :version]))))) - -(defn- request->s3-target - "Takes a task and request and returns the target bucket and key." - [task request] - (let [{:keys [target]} request] - (cond - (:bucket target) - target - - ;; If the target is FROM_CONFIG then we will generate the bucket and key from the task - ;; configuration - (= "FROM_CONFIG" target) - (let [{:keys [bucket key_prefix]} (get-in task [:config :output]) - file-name (util/url->file-name (get-in request [:source :url]))] - {:bucket bucket - :key (str key_prefix "/" file-name)}) - - :else - (throw (Exception. (str "Unable to determine target for request " (pr-str request))))))) - -;; Performance Note: The version skip download check below is on the same thread as the download. -;; ideally this could be filtered out ahead of time so we don't waste time utilizing a provider -;; connection for this. From my tests the version check is usually on the order of 10 ms or less -;; so it's probably inconsequential. -;; IMPORTANT NOTE: If we change this in the future to filter out somewhere before it even gets -;; to the task we need to make sure that we still report the file as successfully completed in -;; the response. This is needed for the sync activity handler so that it can report all the -;; files that are in S3. - -(defn- process-download-request - "Processes a request to download a single file from a URL and upload it to S3" - [s3-api conn log task request] - (let [{{:keys [url size version]} :source} request - {:keys [bucket key]} (request->s3-target task request) - - ;; Return the request with the bucket and key in the target. This may have been dynamically - ;; generated. - request (assoc request :target {:bucket bucket :key key})] - (if (version-skip-download? s3-api bucket key version) - (do - (log (format "Skipping download of %s because it already exists in S3 with version %s" - url version)) - (assoc request :success true :version_skip true)) - - ;; Version is out of date or not present - (let [;; Fetch the size of the content if we don't know it. - size (or size (url-conn/get-size conn url)) - size-log-msg (str "(" (or size "unknown") " bytes)") - version-log-msg (if version (str " with version " version) "") - start-time (System/currentTimeMillis)] - (log (format "Transfering %s %s%s to S3 %s %s" - url size-log-msg version-log-msg bucket key)) - (if-let [stream (url-conn/download conn url)] - (do - (s3/write-s3-stream s3-api bucket key stream - {:content-length size - :user-metadata {:version version}}) - (let [latency-ms (- (System/currentTimeMillis) start-time)] - (log (format "Completed download and upload to s3 %s in %d ms." - size-log-msg latency-ms)) - (util/log-latency "download-upload-s3" latency-ms)) - (assoc request :success true)) - - ;; The URL does not exist - (assoc request - :success false - :error "The file did not exist at the source.")))))) - -(defn- create-download-processing-threads - "Creates a set of threads for processing requests of the task channel" - [s3-api provider downloads-channel] - (let [{:keys [provider-id conn_config num_connections]} provider] - (doall - (for [thread-num (range 1 (inc num_connections)) - :let [thread-id (str provider-id "-" thread-num) - log (fn [& args] (apply println "Thread" thread-id "-" args)) - conn (create-connection conn_config)]] - (a/thread - (try - (util/while-let - [{:keys [file download-completion-ch task]} (a/!! download-completion-ch result))) - (finally - (println "Processing thread" thread-id "completed") - (url-conn/close conn)))))))) - -(defn- process-task - "Processes a task downloading all of the files in it." - [task downloads-channel] - (s/assert ::specs/task task) - (let [{:keys [completion-channel input]} task - download-completion-chs (mapv (fn [file] - (let [download-completion-ch (a/chan 1)] - (a/>!! downloads-channel - {:file file - :task task - :download-completion-ch download-completion-ch}) - download-completion-ch)) - (:files input)) - results (mapv a/!! completion-channel completion-msg))) - -(defn- create-task-processing-threads - "Creates a set of threads for processing requests of the task channel" - [provider task-channel downloads-channel] - (let [{:keys [provider-id num_connections]} provider] - (doall - (for [thread-num (range 1 (inc num_connections)) - :let [thread-id (str provider-id "-" thread-num)]] - (a/thread - (try - (util/while-let - [task (a/ this - (assoc :downloads-channel downloads-channel) - (assoc :task-thread-chs - (create-task-processing-threads provider task-channel downloads-channel)) - (assoc :download-thread-chs - (create-download-processing-threads s3-api provider downloads-channel)))) - this)) - - (stop - [this] - (if task-thread-chs - (do - ;; Close task and downloads-channel so that waiting thread will stop - (a/close! downloads-channel) - (a/close! task-channel) - ;; Wait until all the task thread channels are closed. That means the threads have completed. - (doseq [ch task-thread-chs] - (a/TaskExecutor {:provider provider})) diff --git a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/util.clj b/cumulus/services/provider-gateway/src/cumulus/provider_gateway/util.clj deleted file mode 100644 index dbb739512cb..00000000000 --- a/cumulus/services/provider-gateway/src/cumulus/provider_gateway/util.clj +++ /dev/null @@ -1,103 +0,0 @@ -(ns cumulus.provider-gateway.util - "Utility functions" - (:require - [cheshire.parse :as ch-parse] - [clojure.java.io :as io] - [clojure.string :as str] - [cheshire.core :as json] - [clojure.walk :as walk]) - (:import - (com.fasterxml.jackson.dataformat.yaml - YAMLFactory) - (org.apache.commons.io - FilenameUtils))) - -(defn log-latency - "Logs a latency measure in a way that can be parsed by CloudWatch" - [category time-ms] - (println (json/generate-string {:category category :latency time-ms}))) - -(defmacro while-let - "A macro that's similar to when let. It will continually evaluate the - bindings and execute the body until the binding results in a nil value." - [bindings & body] - `(loop [] - (when-let ~bindings - ~@body - (recur)))) - -(defn url->path - "Returns just the path of the URL. Works with sftp urls." - [url] - ;; SFTP isn't supported by Java URL so we just convert to FTP to get the path out of it. - (let [non-sftp-url (if (str/starts-with? url "sftp:") - (str/replace-first url "sftp:" "ftp:") - url) - url (io/as-url non-sftp-url)] - (.getPath url))) - -(defn url->file-name - "Returns just the file name without the path from a url" - [url] - (FilenameUtils/getName (url->path url))) - -(defn parse-yaml - "Parses yaml using the Jackson YAMLFactory and Cheshire JSON parsing. This does not handle YAML - tags. I could not find a way to add custom YAML tag parsing with any Java YAML parser. Snakeyaml - comes the closest but seems to only associate YAML tags with java beans. I was not able to get - that working and decided to skip it for now." - [contents] - (ch-parse/parse-strict - (.createJsonParser (YAMLFactory.) contents) - true nil nil)) - -(defn- env-vars - "Returns a map of env vars some of which may be overloaded by dev/locals.clj" - [] - (let [env (into {} (System/getenv))] - (if (find-ns 'locals) - (merge env (some-> (find-var 'locals/defaults) var-get)) - env))) - -(defn get-stack-name - [] - (get (env-vars) "STACK_NAME")) - -(defn get-aws-account-id - [] - (get (env-vars) "AWS_ACCOUNT_ID")) - -(defn get-aws-region - [] - (get (env-vars) "AWS_DEFAULT_REGION")) - -(defn mustache-replace - "Looks for pseudo-mustache patterns and replaces them using the lookup value map given." - [lookup-value-map value] - (let [patterns (re-seq #"\{[\w.\-]+\}" value)] - (reduce (fn [s pattern] - (let [lookup-path (map keyword (re-seq #"[\w\-]+" pattern)) - replacement-value (str (get-in lookup-value-map lookup-path))] - (str/replace s pattern replacement-value))) - value - (distinct patterns)))) - -(defn populate-message-config-replacements - "Takes a full message and optionally a subset of that message and populates any mustache-style - replacements anywhere in the subset." - ([message] - (populate-message-config-replacements message message)) - ([message message-part] - (walk/postwalk - (fn [value] - (if (string? value) - (mustache-replace message value) - value)) - message-part))) - -(defn running-in-repl? - "Returns true if we can detect this Clojure process is running in a REPL." - [] - (and - (find-ns 'user) - (find-var 'user/system))) diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/activities/sync_task_to_request_handler_test.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/activities/sync_task_to_request_handler_test.clj deleted file mode 100644 index 886f1748d4c..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/activities/sync_task_to_request_handler_test.clj +++ /dev/null @@ -1,97 +0,0 @@ -(ns cumulus.provider-gateway.activities.sync-task-to-request-handler-test - (:require - [clojure.test :refer :all] - [cheshire.core :as json] - [cumulus.provider-gateway.download-activity-handler :as activity-handler] - [cumulus.provider-gateway.activities.sync-task-to-request-handler :as strh] - [cumulus.provider-gateway.aws.s3 :as s3])) - -(def private-bucket - "gitc-private") - -(def meta-key - "VIIRS/VNGCR_LQD_C1/2017192") - -(defn stage-data - "Stages data in the in-memory s3 of the given set of files and returns a new synchronization task." - [in-memory-s3 files] - (let [payload-s3-key "LastStep/Payload"] - ;; Stage the payload for the task message - (s3/write-s3-json in-memory-s3 private-bucket payload-s3-key files) - ;; Return the task with the message - {:task-token "task-token" - :input - {:workflow_config_template - {:SyncHttpUrls {:output {:bucket "{resources.buckets.private}" - :key_prefix "sources/EPSG{meta.epsg}/{meta.key}"}}} - :resources {:buckets {:private private-bucket}} - :meta {:key meta-key - :epsg 4326} - :payload {:Bucket private-bucket - :Key payload-s3-key}}})) - -(deftest handle-new-task-test - (let [in-memory-s3 (s3/create-in-memory-s3-api) - handler (strh/create-sync-task-to-request-handler in-memory-s3) - files [{:url "http://example.com/foo/1.txt" - :version "v1"} - {:url "http://example.com/foo/2.txt" - :version "v1"}] - task (stage-data in-memory-s3 files) - updated-task (activity-handler/handle-new-task handler task) - - expected-input [{:type "download" - :source {:url "http://example.com/foo/1.txt" - :version "v1"} - :target {:bucket private-bucket - :key "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192/1.txt"}} - {:type "download" - :source {:url "http://example.com/foo/2.txt" - :version "v1"} - :target {:bucket private-bucket - :key "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192/2.txt"}}]] - ;; What do we expect the new task to look like? - (is (= {:task-token (:task-token task) - :config {:output {:bucket "gitc-private" - :key_prefix "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192"}} - :original-message (:input task) - :input {:files expected-input}} - updated-task)))) - -(deftest handle-completed-task-test - (let [in-memory-s3 (s3/create-in-memory-s3-api) - handler (strh/create-sync-task-to-request-handler in-memory-s3) - files [{:url "http://example.com/foo/1.txt" - :version "v1"} - {:url "http://example.com/foo/2.txt" - :version "v1"}] - task (stage-data in-memory-s3 files) - - input [{:type "download" - :source {:url "http://example.com/foo/1.txt" - :version "v1"} - :target {:bucket private-bucket - :key "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192/1.txt"}} - {:type "download" - :source {:url "http://example.com/foo/2.txt" - :version "v1"} - :target {:bucket private-bucket - :key "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192/2.txt"}}] - - completion-request {:task-token (:task-token task) - :original-message (:input task) - :input input - :results (map #(assoc % :success true) input)} - - output (activity-handler/handle-completed-task handler completion-request) - payload-key (get-in output [:payload :Key]) - key-regex (re-pattern (str strh/TASK_NAME "/" meta-key ".*$"))] - ;; Payload key should be of the form (TASK_NAME/META_KEY/UUID) - (is (re-matches key-regex payload-key)) - ;; Check the payload in the message in S3 has the right content - (is (= [{:Bucket private-bucket - :Key "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192/1.txt"} - {:Bucket private-bucket - :Key "sources/EPSG4326/VIIRS/VNGCR_LQD_C1/2017192/2.txt"}] - (s3/read-s3-json in-memory-s3 private-bucket payload-key))))) - diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/ftp_server.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/ftp_server.clj deleted file mode 100644 index e2f7886c490..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/ftp_server.clj +++ /dev/null @@ -1,89 +0,0 @@ -(ns cumulus.provider-gateway.ftp-server - "A test ftp server that can be used to test downloading data." - (:require - [clojure.java.io :as io]) - (:import - (java.io - File) - (org.apache.ftpserver - FtpServerFactory) - (org.apache.ftpserver.listener - ListenerFactory) - (org.apache.ftpserver.usermanager.impl - BaseUser) - (java.nio.file - Files) - (java.nio.file.attribute - FileAttribute))) - -(defn default-config - "Creates a default configuration for the FTP server. " - [] - {:port 3022 - :username "ftp" - :password (str (java.util.UUID/randomUUID)) - :file-paths->contents {}}) - -(defn- create-temp-directory - [] - (str (Files/createTempDirectory "ftptest" (into-array FileAttribute nil)))) - -(defn- create-files - [root-dir file-paths->contents] - (doseq [[path contents] file-paths->contents - :let [full-path (io/as-file (str root-dir path))]] - (.mkdirs (.getParentFile full-path)) - (spit full-path contents))) - -(defn start - "Starts the ftp server and returns an instance of the server." - [{:keys [port username password file-paths->contents] :as config}] - (let [ftp-home (create-temp-directory) - listener-factory (doto (ListenerFactory.) - (.setPort port)) - factory (doto (FtpServerFactory.) - (.addListener "default" (.createListener listener-factory))) - user (doto (BaseUser.) - (.setName username) - (.setPassword password) - (.setHomeDirectory ftp-home)) - _ (.save (.getUserManager factory) user) - server (.createServer factory)] - (.start server) - (create-files ftp-home file-paths->contents) - (assoc config - :ftp-home ftp-home - :server server))) - -(defn stop - "Stops the server and returns it." - [{:keys [server ftp-home] :as config}] - (when server - (.stop server)) - (when ftp-home - (.delete (io/as-file ftp-home))) - (dissoc config :ftp-home :server)) - - -(defn create-run-ftp-fixture - "A fixture which runs an FTP server. - * var - a var which will have the server set on it so that access to username, port, and password - is possible during a test. - * options - Any options for running the FTP server. See default-config for valid options." - [var options] - (fn [f] - (let [config (merge (default-config) options) - server (start config)] - (try - (alter-var-root var (constantly server)) - (f) - (finally - (stop server) - (alter-var-root var (constantly nil))))))) - -(comment - (def cfg (assoc (default-config) - :file-paths->contents cumulus.provider-gateway.integration-test/files->content)) - (def f (start cfg)) - (stop f) - (:password f)) diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/http_server.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/http_server.clj deleted file mode 100644 index 954bf0d6c15..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/http_server.clj +++ /dev/null @@ -1,67 +0,0 @@ -(ns cumulus.provider-gateway.http-server - "Defines an HTTP server for testing downloading data over HTTP." - (:require - [clj-http.client :as http] - [clojure.test :refer :all] - [clj-http.conn-mgr :as conn-mgr] - [ring.adapter.jetty :as jetty])) - -(def DEFAULT_PORT 3001) - -(defn default-config - "Creates a default configuration for the HTTP server. " - [] - {:port 3001 - :file-paths->contents {}}) - -(defn serve-content - [file-paths->contents {:keys [uri]}] - (if-let [content (file-paths->contents uri)] - {:status 200 :body content} - {:status 404 :body "Not Found"})) - -(defn start-jetty - [{:keys [port file-paths->contents] :as config}] - (assoc config - :server (jetty/run-jetty #(serve-content file-paths->contents %) - {:port port :join? false}))) - -(defn create-run-jetty-fixture - "A fixture which runs an HTTP server. - * var - a var which will have the server set on it so that access to port. - * options - Any options for running the HTTP server. See default-config for valid options." - [var options] - (let [config (merge (default-config) options)] - (fn [f] - (let [server (start-jetty config)] - (alter-var-root var (constantly server)) - (try - (f) - (finally - (.stop (:server server)) - (alter-var-root var (constantly nil)))))))) - -(comment - (def s (start-jetty (assoc (default-config) :file-paths->contents http-files->content))) - (.stop (:server s))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Testing the server - -(def http-files->content - {"/foo/bar.txt" "bar bar bar" - "/moo.txt" "cows say this"}) - -(def http-server - nil) - -(use-fixtures :once (create-run-jetty-fixture #'http-server - {:file-paths->contents http-files->content})) - -(deftest test-jetty-fixture - (testing "Content is available" - (doseq [[uri content] http-files->content] - (is (= content (:body (http/get (str "http://localhost:" DEFAULT_PORT uri))))))) - (testing "Var is set" - (is (some? http-server)) - (is (= DEFAULT_PORT (:port http-server))))) diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/integration_test.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/integration_test.clj deleted file mode 100644 index 6f675d23659..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/integration_test.clj +++ /dev/null @@ -1,472 +0,0 @@ -(ns cumulus.provider-gateway.integration-test - (:require - [clojure.java.io :as io] - [clojure.string :as str] - [clojure.test :refer :all] - [com.stuartsierra.component :as c] - [cumulus.provider-gateway.system :as sys] - [cumulus.provider-gateway.aws.activity-api :as activity-api] - [cumulus.provider-gateway.util :as util] - [cumulus.provider-gateway.http-server :as http-server] - [cumulus.provider-gateway.ftp-server :as ftp-server] - [cumulus.provider-gateway.sftp-server :as sftp-server])) - -(def http-files->content - {"/foo/bar.txt" "bar bar bar" - "/foo/bar2.txt" "another bar" - "/moo.txt" "a cow"}) - -(def ftp-files->content - {"/ftp/foo/bar.txt" "ftp bar bar bar" - "/ftp/foo/bar2.txt" "ftp another bar" - "/ftp/moo.txt" "a cow over ftp"}) - -(def sftp-files->content - {"/sftp/foo/bar.txt" "sftp bar bar bar" - "/sftp/foo/bar2.txt" "sftp another bar" - "/sftp/moo.txt" "a cow over sftp"}) - -(def running-ftp-server - "This will dynamically contain a reference to the running ftp server which is a map of info like - username and password." - nil) - -(def running-sftp-server - "This will dynamically contain a reference to the running sftp server which is a map of info like - username and password." - nil) - -(def running-http-server - "This will dynamically contain a reference to the running http server which is a map of info like - port." - nil) - -(use-fixtures :once (join-fixtures [(ftp-server/create-run-ftp-fixture - #'running-ftp-server - {:file-paths->contents ftp-files->content}) - (sftp-server/create-run-sftp-fixture - #'running-sftp-server - {:file-paths->contents sftp-files->content}) - (http-server/create-run-jetty-fixture - #'running-http-server - {:file-paths->contents http-files->content})])) - -(def storage-bucket - "the-bucket") - -(defn create-url - [type path] - (let [port (:port (case type - :http running-http-server - :ftp running-ftp-server - :sftp running-sftp-server)) - ;; to make running in repl easier - port (or port 1111)] - - (format "%s://localhost:%d/%s" (name type) port path))) - -(defn create-download-request - ([type path] - (create-download-request type path nil)) - ([type path options] - (let [file-url (create-url type path) - file-name (util/url->file-name file-url)] - (merge-with merge - {:type "download" - :source {:url file-url} - :target {:bucket storage-bucket - :key file-name}} - options)))) - -(defn create-successful-download-request - ([type path] - (create-successful-download-request type path nil)) - ([type path options] - (assoc (create-download-request type path options) :success true))) - -(defn create-failed-download-request - ([type path] - (create-failed-download-request type path nil)) - ([type path options] - (let [request (create-download-request type path options) - url (get-in request [:source :url]) - error "The file did not exist at the source."] - (assoc request :success false :error error)))) - -(defn create-download-task - "Creates a task containing a list of downloads to process" - [task-token download-requests] - {:task-token task-token - :input - {:workflow_config_template - {:DownloadActivity {:skip_upload_output_payload_to_s3 true - :output {:bucket "{resources.buckets.private}" - :key_prefix "sources/EPSG{meta.epsg}/SIPSTEST/{meta.collection}"}}} - :resources {:buckets {:private storage-bucket}} - :meta {:collection "VNGCR_LQD_C1" - :epsg 4326} - :payload {:ignored-key "This is ignored" - :files download-requests}}}) - -(defn create-download-task-output - "Creates the expected output for a task given some of the completed task download requests." - [completed-download-requests] - ;; The ouput is the same as the input with the files containing the completed download requests - (:input (create-download-task nil completed-download-requests))) - -(def MAX_WAIT_TIME 5000) - -(defn wait-for-tasks-to-complete - [activity-api task-ids] - (let [start (System/currentTimeMillis) - get-completed-tasks (fn [] - (let [{:keys [successful-tasks-atom failed-tasks-atom]} activity-api] - (set (concat (keys @successful-tasks-atom) - (keys @failed-tasks-atom))))) - done? #(= (get-completed-tasks) (set task-ids))] - (while (not (done?)) - (when (> (- (System/currentTimeMillis) start) MAX_WAIT_TIME) - (throw (Exception. - (format "All tasks not consumed within timeout period. Completed: %s Expecting: %s" - (pr-str (get-completed-tasks)) (pr-str task-ids))))) - (Thread/sleep 250)))) - -(defn create-expected-s3 - "Creates a map of expected s3 content from a list of file paths and the map of files->content" - ([files->content file-paths->versions] - (create-expected-s3 "" files->content file-paths->versions)) - ([key-prefix files->content file-paths->versions] - {storage-bucket - (reduce (fn [contents [path version]] - (assoc contents - (str key-prefix (last (str/split path #"/"))) - {:value (files->content path) - :metadata {:content-length (count (files->content path)) - :user-metadata {:version version}}})) - {} - file-paths->versions)})) - -(deftest http-download-request-integration-test - (let [task1-download-requests [(create-download-request :http "/foo/bar.txt" {:source {:version "v1"}}) - (create-download-request :http "/foo/bar2.txt" {:source {:version "v1"}})] - expected-task-1-completed-requests [(create-successful-download-request - :http "/foo/bar.txt" {:source {:version "v1"}}) - (create-successful-download-request - :http "/foo/bar2.txt" {:source {:version "v1"}})] - task2-download-requests [(create-download-request :http "moo2.txt") ;; doesn't exist - (create-download-request :http "moo.txt")] - expected-task-2-completed-requests [(create-failed-download-request :http "moo2.txt") - (create-successful-download-request :http "moo.txt")] - provider {:provider-id "LOCAL", - :s3-api-type :in-memory - :activity-api {:activity-api-type "in-memory" - :tasks [(create-download-task "task-1" task1-download-requests) - (create-download-task "task-2" task2-download-requests)]} - :conn_config {:conn_type "http"} - :num_connections 2} - system (c/start (sys/create-system [provider])) - activity-api (get-in system [:LOCAL-download-activity-handler :activity-api]) - s3-api (:LOCAL-s3-api system) - expected-s3 (create-expected-s3 - http-files->content - {"/foo/bar.txt" "v1" - "/foo/bar2.txt" "v1" - "/moo.txt" nil})] - (try - (wait-for-tasks-to-complete activity-api ["task-1" "task-2"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-1" (create-download-task-output expected-task-1-completed-requests) - "task-2" (create-download-task-output expected-task-2-completed-requests)} - (-> activity-api :successful-tasks-atom deref))) - - ;; Testing download with versioning - (let [task3-download-requests [(create-download-request :http "/foo/bar.txt" {:source {:version "v1"}}) - (create-download-request :http "/foo/bar2.txt" {:source {:version "v2"}})] - expected-task-3-completed-requests [(create-successful-download-request - :http "/foo/bar.txt" {:source {:version "v1"} - :version_skip true}) - (create-successful-download-request - :http "/foo/bar2.txt" {:source {:version "v2"}})] - provider (assoc-in provider [:activity-api :tasks] - [(create-download-task "task-3" task3-download-requests)]) - system (-> (sys/create-system [provider]) - (assoc :LOCAL-s3-api s3-api) - c/start) - activity-api (get-in system [:LOCAL-download-activity-handler :activity-api]) - expected-s3 (create-expected-s3 - http-files->content - {"/foo/bar.txt" "v1" - "/foo/bar2.txt" "v2" - "/moo.txt" nil})] - (try - (wait-for-tasks-to-complete activity-api ["task-3"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-3" (create-download-task-output expected-task-3-completed-requests)} - (-> activity-api :successful-tasks-atom deref)))))) - -(deftest from-config-integration-test - (let [task1-download-requests [(create-download-request :http "/foo/bar.txt") - (create-download-request :http "/foo/bar2.txt")] - task1-download-requests (map #(assoc % :target "FROM_CONFIG") task1-download-requests) - expected-task-1-completed-requests [(create-successful-download-request :http "/foo/bar.txt") - (create-successful-download-request :http "/foo/bar2.txt")] - expected-task-1-completed-requests (map (fn [file] - (update-in - file [:target :key] - #(str "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/" %))) - expected-task-1-completed-requests) - provider {:provider-id "LOCAL", - :s3-api-type :in-memory - :activity-api {:activity-api-type "in-memory" - :tasks [(create-download-task "task-1" task1-download-requests)]} - :conn_config {:conn_type "http"} - :num_connections 2} - system (c/start (sys/create-system [provider])) - activity-api (get-in system [:LOCAL-download-activity-handler :activity-api]) - s3-api (:LOCAL-s3-api system) - expected-s3 (create-expected-s3 - "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/" - http-files->content - {"/foo/bar.txt" nil - "/foo/bar2.txt" nil})] - (try - (wait-for-tasks-to-complete activity-api ["task-1"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-1" (create-download-task-output expected-task-1-completed-requests)} - (-> activity-api :successful-tasks-atom deref))))) - - -(deftest ftp-download-request-integration-test - (let [task1-download-requests [(create-download-request :ftp "/ftp/foo/bar.txt") - (create-download-request :ftp "/ftp/foo/bar2.txt")] - expected-task-1-completed-requests [(create-successful-download-request :ftp "/ftp/foo/bar.txt") - (create-successful-download-request :ftp "/ftp/foo/bar2.txt")] - task2-download-requests [(create-download-request :ftp "/ftp/moo2.txt") ;; doesn't exist - (create-download-request :ftp "/ftp/moo.txt")] - expected-task-2-completed-requests [(create-failed-download-request :ftp "/ftp/moo2.txt") - (create-successful-download-request :ftp "/ftp/moo.txt")] - provider {:provider-id "LOCAL", - :s3-api-type :in-memory - :activity-api {:activity-api-type "in-memory" - :tasks [(create-download-task "task-1" task1-download-requests) - (create-download-task "task-2" task2-download-requests)]} - :conn_config (merge {:conn_type "ftp" :host "localhost"} - (select-keys running-ftp-server [:username :password :port])) - :num_connections 2} - system (c/start (sys/create-system [provider])) - activity-api (get-in system [:LOCAL-download-activity-handler :activity-api]) - s3-api (:LOCAL-s3-api system) - expected-s3 (create-expected-s3 - ftp-files->content - {"/ftp/foo/bar.txt" nil - "/ftp/foo/bar2.txt" nil - "/ftp/moo.txt" nil})] - (try - (wait-for-tasks-to-complete activity-api ["task-1" "task-2"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-1" (create-download-task-output expected-task-1-completed-requests) - "task-2" (create-download-task-output expected-task-2-completed-requests)} - (-> activity-api :successful-tasks-atom deref))))) - -(deftest sftp-download-request-integration-test - (let [task1-download-requests [(create-download-request :sftp "/sftp/foo/bar.txt") - (create-download-request :sftp "/sftp/foo/bar2.txt")] - expected-task-1-completed-requests [(create-successful-download-request :sftp "/sftp/foo/bar.txt") - (create-successful-download-request :sftp "/sftp/foo/bar2.txt")] - task2-download-requests [(create-download-request :sftp "/sftp/moo2.txt") ;; doesn't exist - (create-download-request :sftp "/sftp/moo.txt")] - expected-task-2-completed-requests [(create-failed-download-request :sftp "/sftp/moo2.txt") - (create-successful-download-request :sftp "/sftp/moo.txt")] - provider {:provider-id "LOCAL", - :s3-api-type :in-memory - :activity-api {:activity-api-type "in-memory" - :tasks [(create-download-task "task-1" task1-download-requests) - (create-download-task "task-2" task2-download-requests)]} - :conn_config (merge {:conn_type "sftp" - :host "localhost" - :username "ignored on server" - :password "ignored on test server" - :disable-strict-host-checking true} - (select-keys running-sftp-server [:port])) - :num_connections 2} - system (c/start (sys/create-system [provider])) - activity-api (get-in system [:LOCAL-download-activity-handler :activity-api]) - s3-api (:LOCAL-s3-api system) - expected-s3 (create-expected-s3 - sftp-files->content - {"/sftp/foo/bar.txt" nil - "/sftp/foo/bar2.txt" nil - "/sftp/moo.txt" nil})] - (try - (wait-for-tasks-to-complete activity-api ["task-1" "task-2"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-1" (create-download-task-output expected-task-1-completed-requests) - "task-2" (create-download-task-output expected-task-2-completed-requests)} - (-> activity-api :successful-tasks-atom deref))))) - -(defn create-sync-task - "Creates a synchronization task" - [task-token files] - {:task-token task-token - :input - {:workflow_config_template - {:SyncHttpUrls {:skip_upload_output_payload_to_s3 true - :output {:bucket "{resources.buckets.private}" - :key_prefix "sources/EPSG{meta.epsg}/SIPSTEST/{meta.collection}"}}} - :resources {:buckets {:private storage-bucket}} - :meta {:collection "VNGCR_LQD_C1" - :epsg 4326} - :payload files}}) - -(defn create-sync-task-output - "Creates the expected output for a task given some of the completed task sync requests." - [files] - ;; The ouput is the same as the input with the files containing the completed download requests - (let [message (:input (create-sync-task nil files))] - ;; The payload output is a map with Bucket and Key of the files in their new location. - (update message :payload (fn [files] - (map (fn [file] - {:Bucket storage-bucket - :Key (str "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/" - (util/url->file-name (:url file)))}) - files))))) - -(deftest sync-task-integration-test - (let [sync-files-1 [{:url (create-url :http "/foo/bar.txt") :version "bar-1"} - {:url (create-url :http "/foo/bar2.txt") :version "bar2-1"}] - provider {:provider-id "LOCAL", - :s3-api-type :in-memory - :sync-activity-api {:activity-api-type "in-memory" - :tasks [(create-sync-task "task-1" sync-files-1)]} - :conn_config {:conn_type "http"} - :num_connections 2} - system (c/start (sys/create-system [provider])) - activity-api (get-in system [:LOCAL-sync-activity-handler :activity-api]) - s3-api (:LOCAL-s3-api system) - expected-s3 (create-expected-s3 - "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/" - http-files->content - {"/foo/bar.txt" "bar-1" - "/foo/bar2.txt" "bar2-1"})] - (testing "Sync with everything new" - (try - (wait-for-tasks-to-complete activity-api ["task-1"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-1" (create-sync-task-output sync-files-1)} - (-> activity-api :successful-tasks-atom deref)))) - - (let [sync-files-2 [{:url (create-url :http "/foo/bar.txt") :version "bar-1"} ;; same version - {:url (create-url :http "/foo/bar2.txt") :version "bar2-2"} ;; newer version - {:url (create-url :http "/moo.txt") :version "moo-1"}] ;; new file - provider (assoc-in provider [:sync-activity-api :tasks] - [(create-sync-task "task-2" sync-files-2)]) - system (-> (sys/create-system [provider]) - ;; Use the same mock s3 so the existing state will be persisted - (assoc :LOCAL-s3-api s3-api) - c/start) - activity-api (get-in system [:LOCAL-sync-activity-handler :activity-api]) - expected-s3 (create-expected-s3 - "sources/EPSG4326/SIPSTEST/VNGCR_LQD_C1/" - http-files->content - {"/foo/bar.txt" "bar-1" - "/foo/bar2.txt" "bar2-2" - "/moo.txt" "moo-1"})] - (testing "Sync with some updates" - (try - (wait-for-tasks-to-complete activity-api ["task-2"]) - (finally - (c/stop system))) - ;; verify the files in s3 - (is (= expected-s3 (-> s3-api :bucket-key-to-value-atom deref))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-2" (create-sync-task-output sync-files-2)} - (-> activity-api :successful-tasks-atom deref)))) - - (let [;; Creating a system with the same sync files as above with the same sync files. - ;; The sync task should find that there's nothing to do and return an exception - provider (assoc-in provider [:sync-activity-api :tasks] - [(create-sync-task "task-3" sync-files-2)]) - system (-> (sys/create-system [provider]) - ;; Use the same mock s3 so the existing state will be persisted - (assoc :LOCAL-s3-api s3-api) - c/start) - activity-api (get-in system [:LOCAL-sync-activity-handler :activity-api])] - (testing "Sync with no new updates" - (try - (wait-for-tasks-to-complete activity-api ["task-3"]) - (finally - (c/stop system))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-3" {:exception "NotNeededWorkflowError"}} - (-> activity-api :successful-tasks-atom deref)))))))) - -(deftest sync-task-file-doesnt-exist-integration-test - (let [sync-files-1 [{:url (create-url :http "/foo/bar.txt") :version "bar-1"} - {:url (create-url :http "moo2.txt") :version "moo1"}] ;; doesn't exist - provider {:provider-id "LOCAL", - :s3-api-type :in-memory - :sync-activity-api {:activity-api-type "in-memory" - :tasks [(create-sync-task "task-1" sync-files-1)]} - :conn_config {:conn_type "http"} - :num_connections 2} - system (c/start (sys/create-system [provider])) - activity-api (get-in system [:LOCAL-sync-activity-handler :activity-api])] - (try - (wait-for-tasks-to-complete activity-api ["task-1"]) - (finally - (c/stop system))) - ;; Verify no failures sent to activity api - (is (= {} (-> activity-api :failed-tasks-atom deref))) - - ;; Verify successful output from download requests. - (is (= {"task-1" {:exception "RemoteResourceError"}} - (-> activity-api :successful-tasks-atom deref))))) - diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/sftp_server.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/sftp_server.clj deleted file mode 100644 index e771600252f..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/sftp_server.clj +++ /dev/null @@ -1,89 +0,0 @@ -(ns cumulus.provider-gateway.sftp-server - (:require - [clojure.java.io :as io]) - (:import - (java.nio.file - Files) - (java.nio.file.attribute - FileAttribute) - (org.apache.sshd.server - SshServer) - (org.apache.sshd.common.file.virtualfs - VirtualFileSystemFactory) - (org.apache.sshd.server.auth.password - UserAuthPasswordFactory - AcceptAllPasswordAuthenticator) - (org.apache.sshd.server.scp - ScpCommandFactory) - (org.apache.sshd.server.keyprovider - SimpleGeneratorHostKeyProvider) - (org.apache.sshd.server.subsystem.sftp - SftpSubsystemFactory$Builder))) - -(defn default-config - "Creates a default configuration for the sFTP server. " - [] - {:port 3032 - :file-paths->contents {}}) - -(defn- create-temp-directory - [] - (Files/createTempDirectory "sftptest" (into-array FileAttribute nil))) - -(defn- create-files - [root-dir file-paths->contents] - (doseq [[path contents] file-paths->contents - :let [full-path (io/as-file (str root-dir "/" path))]] - (.mkdirs (.getParentFile full-path)) - (spit full-path contents))) - -(defn start - "Starts the sftp server and returns an instance of the server." - [{:keys [port file-paths->contents] :as config}] - (let [ftp-home (create-temp-directory) - server (doto - (SshServer/setUpDefaultServer) - (.setFileSystemFactory (VirtualFileSystemFactory. ftp-home)) - (.setPort port) - (.setKeyPairProvider (SimpleGeneratorHostKeyProvider. (io/as-file "my.pem"))) - (.setCommandFactory (ScpCommandFactory.)) - (.setUserAuthFactories [UserAuthPasswordFactory/INSTANCE]) - (.setPasswordAuthenticator AcceptAllPasswordAuthenticator/INSTANCE) - (.setSubsystemFactories [(.build (SftpSubsystemFactory$Builder.))]))] - (create-files (str ftp-home) file-paths->contents) - (.start server) - (assoc config - :ftp-home (str ftp-home) - :server server))) - -(defn stop - "Stops the server and returns it." - [{:keys [server ftp-home] :as config}] - (when server - (.stop server)) - (when ftp-home - (.delete (io/as-file ftp-home))) - (dissoc config :ftp-home :server)) - - -(defn create-run-sftp-fixture - "A fixture which runs an SFTP server. - * var - a var which will have the server set on it so that access to username, port, and password - is possible during a test. - * options - Any options for running the SFTP server. See default-config for valid options." - [var options] - (fn [f] - (let [config (merge (default-config) options) - server (start config)] - (try - (alter-var-root var (constantly server)) - (f) - (finally - (stop server) - (alter-var-root var (constantly nil))))))) - -(comment - (def s (start (assoc (default-config) - :file-paths->contents {"bar.txt" "bar bar bar"}))) - (stop s)) - diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/system_test.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/system_test.clj deleted file mode 100644 index 3772f646100..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/system_test.clj +++ /dev/null @@ -1,27 +0,0 @@ -(ns cumulus.provider-gateway.system-test - (:require - [clojure.test :refer :all] - [cumulus.provider-gateway.system :as sys] - [cumulus.provider-gateway.util :as util])) - -(deftest get-gateway-providers - (let [sample-config {:providers [{:id "MODAPS" - :config - {:gateway_config - {:activity "MODAPSProviderGatewayActivity" - :sync_activity "MODAPSSyncActivity" - :conn_config {:type "http"} - :num_connections 10}}} - {:id "LARC" :config {}}]} - arn-prefix (format "arn:aws:states:%s:%s:activity:%s-" - (util/get-aws-region) - (util/get-aws-account-id) - (util/get-stack-name))] - (is (= [{:activity-api {:activity-api-type "aws" - :arn (str arn-prefix "MODAPSProviderGatewayActivity")} - :sync-activity-api {:activity-api-type "aws" - :arn (str arn-prefix "MODAPSSyncActivity")} - :conn_config {:type "http"} - :num_connections 10 - :provider-id "MODAPS"}] - (sys/get-gateway-providers sample-config))))) diff --git a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/util_test.clj b/cumulus/services/provider-gateway/test/cumulus/provider_gateway/util_test.clj deleted file mode 100644 index 5236bf2df06..00000000000 --- a/cumulus/services/provider-gateway/test/cumulus/provider_gateway/util_test.clj +++ /dev/null @@ -1,49 +0,0 @@ -(ns cumulus.provider-gateway.util-test - (:require - [clojure.test :refer :all] - [cumulus.provider-gateway.util :as u])) - -(def lookup-data - {:meta {:epsg_thing 44 :collection-id "foo" :date {:year 2017}}}) - -(def lots-special-chars - "abc123!@#$%^&*()_+~`-=[]{});':\"\",./<>?\\|\t ") - -(deftest mustache-replace-test - (are [string expected] - (= expected (u/mustache-replace lookup-data string)) - ;; non replacements - "{" "{" - "{}" "{}" - "{a" "{a" - "a}" "a}" - "}" "}" - "{ald/dafd}" "{ald/dafd}" - - ;; not found - "123{a}456" "123456" - - ;; replacement examples - "{meta.collection-id}" "foo" - - ;; lots of characters - (str lots-special-chars "{meta.collection-id}" lots-special-chars) - (str lots-special-chars "foo" lots-special-chars) - - ;; multiple duplicates - "{meta.collection-id} {meta.collection-id} {meta.collection-id}" "foo foo foo" - "{meta.collection-id} {meta.date.year} {meta.collection-id}" "foo 2017 foo" - - "some{meta.epsg_thing}/{meta.collection-id}/{meta.date.year}end" - "some44/foo/2017end")) - -(deftest populate-message-config-replacements - (is (= {:foo [{:bar "foo"} - {:charlie "The year is 2017"}] - :alpha "44"} - (u/populate-message-config-replacements - lookup-data - {:foo [{:bar "{meta.collection-id}"} - {:charlie "The year is {meta.date.year}"}] - :alpha "{meta.epsg_thing}"})))) - diff --git a/cumulus/services/sfn-scheduler/README.md b/cumulus/services/sfn-scheduler/README.md deleted file mode 100644 index b427148400d..00000000000 --- a/cumulus/services/sfn-scheduler/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# @cumulus/sfn-scheduler - -[![CircleCI](https://circleci.com/gh/cumulus-nasa/cumulus.svg?style=svg)](https://circleci.com/gh/cumulus-nasa/cumulus) - -## What is Cumulus? - -Cumulus is a cloud-based data ingest, archive, distribution and management prototype for NASA's future Earth science data streams. - -[Cumulus Documentation](https://cumulus-nasa.github.io/) - -## Contributing - -See [Cumulus README](https://github.com/cumulus-nasa/cumulus/blob/master/README.md#installing-and-deploying) diff --git a/cumulus/services/sfn-scheduler/config/cloudformation.yml b/cumulus/services/sfn-scheduler/config/cloudformation.yml deleted file mode 100644 index 1d5bf86305b..00000000000 --- a/cumulus/services/sfn-scheduler/config/cloudformation.yml +++ /dev/null @@ -1,47 +0,0 @@ -Parameters: - StateMachinePrefix: - Type: String - Description: An alphanumeric string used to prefix State Machine names - -Resources: - Fn: - Type: AWS::Lambda::Function - Properties: - FunctionName: !Join ['-', [!Ref StackName, task, !Var name]] - Description: 'Runs scheduled discovery / ingest' - Runtime: nodejs6.10 - Code: !Var path - Timeout: 300 - MemorySize: 256 - Handler: index.handler - Role: !GetAtt [TaskExecutionRole, Arn] - - Service: - DependsOn: - - !ResourceName Fn - Properties: - DesiredCount: 1 - - Task: - Properties: - ContainerDefinitions: - - Command: - - !GetAtt [!ResourceName Fn, Arn] - - "--eventJson" - - !Sub >- - { - "resources": { - "stack": "${AWS::StackName}", - "state_machine_prefix": "${StateMachinePrefix}", - "buckets": { - "config": "${ConfigS3Bucket}", - "private": "${PrivateBucketName}", - "public": "${PublicBucketName}" - }, - "tables": { - "connections": "${StackName}-connects", - "locks": "${StackName}-locks" - } - }, - "payload": {"Key": "ingest/collections.yml", "Bucket": "${ConfigS3Bucket}"} - } diff --git a/cumulus/services/sfn-scheduler/index.js b/cumulus/services/sfn-scheduler/index.js deleted file mode 100644 index 5139482811e..00000000000 --- a/cumulus/services/sfn-scheduler/index.js +++ /dev/null @@ -1,117 +0,0 @@ -'use strict'; - -const _ = require('lodash'); -const aws = require('@cumulus/common/aws'); -const log = require('@cumulus/common/log'); -const sf = require('@cumulus/common/step-functions'); -const configUtil = require('@cumulus/common/config'); - -/** - * Runs the given function at the given offset and with the given period thereafter - * - * @param {number} periodMs - The period (ms) at which to run the given fn - * @param {number} offsetMs - The time offset (ms) at which to run the first invocation - * @param {function} fn - The function to call - */ -const doPeriodically = (periodMs, offsetMs, fn) => { - setTimeout(() => { - setInterval(fn, periodMs); - fn(); - }, offsetMs); -}; - -/** - * Starts an ingest for the given collection - * @param {object} resources - An object with keys and values mapping meaningful resource names - * to external URIs, ARNs, etc - * @param {object} provider - The provider configuration object for the collection's provider. - * @param {object} collection - Configuration for the collection to be ingested - */ -const triggerIngest = async (resources, provider, collection) => { - try { - const messageData = sf.constructStepFunctionInput(resources, provider, collection); - const stateMachine = collection.workflow; - const executionName = messageData.ingest_meta.execution_name; - - const message = JSON.stringify(messageData); - log.info(`Starting ingest of ${collection.name}`); - await aws.sfn().startExecution({ - stateMachineArn: stateMachine, - input: message, - name: executionName - }).promise(); - } - catch (err) { - log.error(err); - log.error(err.stack); - } -}; - -/** - * Starts a scheduler service that periodically triggers ingests described in config/collections.yml - * @param {MessageEnvelope} invocation - Configuration and resources for the scheduler - */ -module.exports.handler = async (invocation) => { - try { - const cfParams = { StackName: invocation.resources.stack }; - const cfResources = await aws.cf().describeStackResources(cfParams).promise(); - const cfResourcesById = {}; - const prefix = invocation.resources.state_machine_prefix; - - for (const cfResource of cfResources.StackResources) { - cfResourcesById[cfResource.LogicalResourceId] = cfResource; - } - - const configStr = await aws.getPossiblyRemote(invocation.payload); - const resolver = configUtil.resolveResource(cfResourcesById, prefix); - const config = configUtil.parseConfig(configStr, resolver); - - // Update the keys under the workflows to map identifiers (Arns) to workflow - config.workflows = _.mapKeys(config.workflows, (v, k) => resolver(k)); - - const collectionsByProviderId = _.groupBy(config.collections, (c) => c.provider_id); - for (const provider of config.providers) { - const collections = collectionsByProviderId[provider.id] || []; - let offsetMs = 0; - - // Stagger collection ingests by 2.9 minutes to avoid overwhelming a provider - // 2.9 is chosen because it's longer than a typical fetch cycle and also unlikely - // to evenly divide normal NRT intervals and cause clashes in start time - const staggerMs = 2.9 * 60 * 1000; - - for (const collection of collections) { - const trigger = collection.trigger; - if (trigger && trigger.type === 'interval') { - const periodMs = 1000 * trigger.period_s; - log.info(`Scheduling ${collection.name}.` + - `period=${periodMs}ms, offset=${offsetMs % periodMs}ms`); - doPeriodically(periodMs, offsetMs % periodMs, () => { - triggerIngest(invocation.resources, provider, collection); - }); - offsetMs += staggerMs; - } - else if (trigger && trigger.type === 'once') { - triggerIngest(invocation.resources, provider, collection); - } - } - } - // Run a heartbeat function to avoid terminating - setInterval((() => null), 10000000); - } - catch (err) { - log.error('Scheduler failed: ', err.message); - log.error(err.stack); - throw err; - } -}; - -const localHelpers = require('@cumulus/common/local-helpers'); -const fs = require('fs'); -if (localHelpers.isLocal) { - const stack = process.argv[3]; - const prefix = `${stack.replace(/\W/, 'x')}xx`; - module.exports.handler({ - resources: { state_machine_prefix: prefix, stack: stack }, - payload: fs.readFileSync('../config/collections.yml').toString() - }); -} diff --git a/cumulus/services/sfn-scheduler/package.json b/cumulus/services/sfn-scheduler/package.json deleted file mode 100644 index 82007cc4fff..00000000000 --- a/cumulus/services/sfn-scheduler/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@cumulus/sfn-scheduler", - "private": true, - "version": "1.2.0", - "description": "Runs ingest timers as configured in /config/products.json", - "main": "index.js", - "keywords": [ - "GIBS" - ], - "repository": { - "type": "git", - "url": "https://github.com/cumulus-nasa/cumulus" - }, - "scripts": { - "test": "echo 'no tests'" - }, - "author": "Cumulus Authors", - "license": "Apache-2.0", - "dependencies": { - "@cumulus/common": "^1.2.0", - "lodash": "^4.17.4", - "uuid": "^3.0.1" - } -} diff --git a/cumulus/services/sfn-throttler/config/cloudformation.yml b/cumulus/services/sfn-throttler/config/cloudformation.yml deleted file mode 100644 index 7c4c01825b7..00000000000 --- a/cumulus/services/sfn-throttler/config/cloudformation.yml +++ /dev/null @@ -1,15 +0,0 @@ -Resources: - Fn: - Type: AWS::Lambda::Function - Properties: - FunctionName: !Join ['-', [!Ref StackName, task, !Var name]] - Runtime: nodejs6.10 - Code: !Var path - Handler: index.handler - Role: !GetAtt [TaskExecutionRole, Arn] - - Service: - DependsOn: - - !ResourceName Fn - Properties: - DesiredCount: 1 diff --git a/cumulus/services/sfn-throttler/index.js b/cumulus/services/sfn-throttler/index.js deleted file mode 100644 index c0d71f70205..00000000000 --- a/cumulus/services/sfn-throttler/index.js +++ /dev/null @@ -1,157 +0,0 @@ -'use strict'; - -const aws = require('@cumulus/common/aws'); -const log = require('@cumulus/common/log'); -const _ = require('lodash'); - -/** - * Queries AWS to determine the number of running excutions of a given state machine. - * - * @param {string} stateMachineArn - The ARN of the state machine to check. - * @returns {number} The number of running executions - */ -const runningExecutionCount = async(stateMachineArn) => { - const data = await aws.sfn().listExecutions({ - stateMachineArn, - statusFilter: 'RUNNING' - }).promise(); - - const count = data.executions.length; - return count; -}; - -/** - * Fetches messages from the queue - * - * @param {string} queueUrl - Message Queue - * @param {int} count - number of messages - * @returns {Hash} messages - */ -const fetchMessages = async(queueUrl, count) => { - const maxNumberOfMessages = Math.min(count, 10); - - const data = await aws.sqs().receiveMessage({ - QueueUrl: queueUrl, - MaxNumberOfMessages: maxNumberOfMessages - }).promise(); - - const messages = data.Messages || []; - // eslint-disable-next-line max-len - return messages; -}; - -/** - * Start execution - * - * @param {*} executionParams - Execution parameters - * @returns {*} promise - */ -function startExecution(executionParams) { - return aws.sfn().startExecution(executionParams).promise(); -} - -/** - * Delete a message from an SQS queue. - * - * @param {string} queueUrl - The URL of the SQS queue. - * @param {Object} message - An SQS message, in the same format as received from - * AWS.SQS.receiveMessage(). - * @returns {Promise} - Promise - */ -function deleteMessage(queueUrl, message) { - aws.sqs().deleteMessage({ - QueueUrl: queueUrl, - ReceiptHandle: message.ReceiptHandle - }).promise(); -} - -/** - * Starts Execution - * - * @param {*} queueUrl - QueueUrl - * @param {*} stateMachineArn - StateMachone ARN - * @param {*} count - Count - * @returns {Promise} - Promise - */ -const startExecutions = async(queueUrl, stateMachineArn, count) => { - const messages = await fetchMessages(queueUrl, count); - - if (messages.length > 0) { - log.info(`Starting ${messages.length} executions of ${stateMachineArn}`); - } - - const executionPromises = messages.map((message) => - startExecution(JSON.parse(message.Body)) - .then(() => deleteMessage(queueUrl, message))); - - return Promise.all(executionPromises); -}; - -/** - * Manage Step Function - * - * @param {*} queueUrl - Queue URL - * @param {*} stateMachineArn - State Machine ARN - * @param {*} maxConcurrentExecutions - Max Concurrent Execution - * @returns {*} Not sure - */ -const manageThrottledStepFunction = async(queueUrl, stateMachineArn, maxConcurrentExecutions) => { - const count = await runningExecutionCount(stateMachineArn); - const executionsToStart = maxConcurrentExecutions - count; - - let sleepTimeInMs = 5000; - - if (executionsToStart > 0) { - await startExecutions(queueUrl, stateMachineArn, executionsToStart); - sleepTimeInMs = 1000; - } - - setTimeout( - manageThrottledStepFunction, - sleepTimeInMs, - queueUrl, - stateMachineArn, - maxConcurrentExecutions, - ); -}; - -/** - * Map Logical Ids to Arns - * - * @param {*} resources - resources - * @returns {*} Updated resources - */ -function mapLogicalIdsToArns(resources) { - return _.fromPairs(resources.map((r) => [r.LogicalResourceId, r.PhysicalResourceId])); -} - -/** - * Build Execution Config From Event - * - * @param {*} event - Event - * @returns {*} event - */ -const buildExecutionConfigsFromEvent = async(event) => { - const stackResources = await aws.describeCfStackResources(event.cloudFormationStackName); - const arnsByLogicalId = mapLogicalIdsToArns(stackResources); - - return event.stateMachineConfigs.map((stateMachineConfig) => { - const id = `${event.stateMachinePrefix}${stateMachineConfig.stateMachineName}`; - return _.set(stateMachineConfig, 'stateMachineArn', arnsByLogicalId[id]); - }); -}; - -module.exports.handler = function handler(event) { - log.info('Starting sfn-throttler service'); - - buildExecutionConfigsFromEvent(event) - .then((executionConfigs) => { - executionConfigs.forEach((executionConfig) => { - manageThrottledStepFunction( - executionConfig.sqsQueueUrl, - executionConfig.stateMachineArn, - executionConfig.maxConcurrentExecutions - ); - }); - }); -}; diff --git a/cumulus/services/sfn-throttler/package.json b/cumulus/services/sfn-throttler/package.json deleted file mode 100644 index 39e591fbeb2..00000000000 --- a/cumulus/services/sfn-throttler/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "aws-step-function-throttling-service", - "version": "1.2.0", - "private": true, - "description": "A service to throttle concurrent executions of AWS Step Functions.", - "main": "index.js", - "scripts": { - "test": "echo 'no tests'" - }, - "author": "Cumulus Authors", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "https://github.com/cumulus-nasa/cumulus" - }, - "dependencies": { - "aws-sdk": "^2.145.0", - "lodash": "^4.17.4" - }, - "devDependencies": { - "eslint": "^4.18.2", - "eslint-config-airbnb-base": "^12.1.0", - "eslint-plugin-import": "^2.8.0" - } -} diff --git a/cumulus/tasks/discover-pdrs/package-lock.json b/cumulus/tasks/discover-pdrs/package-lock.json deleted file mode 100644 index 54aff4da7a8..00000000000 --- a/cumulus/tasks/discover-pdrs/package-lock.json +++ /dev/null @@ -1,8426 +0,0 @@ -{ - "name": "@cumulus/discover-pdrs", - "version": "1.0.0-1.0.0-beta.9.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ava/babel-plugin-throws-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz", - "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=", - "dev": true - }, - "@ava/babel-preset-stage-4": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz", - "integrity": "sha1-rmC+iBoLq/fTX1Krp3DR9hlPdr0=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "package-hash": "1.2.0" - } - }, - "@ava/babel-preset-transform-test-files": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz", - "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=", - "dev": true, - "requires": { - "@ava/babel-plugin-throws-helper": "2.0.0", - "babel-plugin-espower": "2.3.2" - } - }, - "@ava/write-file-atomic": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz", - "integrity": "sha1-1iUEbzSV8fXjchNfRzkJaEtCkkc=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "@concordance/react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-1.0.0.tgz", - "integrity": "sha1-/PPK0CDlEhv9HGHQW8NRaqwl9zQ=", - "dev": true, - "requires": { - "arrify": "1.0.1" - } - }, - "@cumulus/common": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@cumulus/common/-/common-1.0.0-beta.11.tgz", - "integrity": "sha1-YXbMjoViDcq58nI+BGE6EaOlRuY=", - "requires": { - "@cumulus/test-data": "1.0.0-beta.11", - "ajv": "5.5.2", - "ajv-cli": "1.1.2", - "async": "2.6.0", - "aws-sdk": "2.188.0", - "babel-core": "6.25.0", - "babel-eslint": "6.1.2", - "babel-loader": "6.4.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-polyfill": "6.23.0", - "babel-preset-env": "1.6.1", - "babel-preset-es2015": "6.24.1", - "cwait": "1.1.1", - "eslint": "3.19.0", - "eslint-config-airbnb": "10.0.1", - "eslint-plugin-import": "1.16.0", - "eslint-plugin-jsx-a11y": "2.2.3", - "eslint-plugin-react": "6.10.3", - "expect.js": "0.3.1", - "exports-loader": "0.6.4", - "follow-redirects": "1.4.1", - "glob": "7.1.2", - "js-yaml": "3.9.1", - "lodash": "4.17.4", - "mocha": "2.5.3", - "mocha-junit-reporter": "1.17.0", - "mocha-webpack": "0.7.0", - "prepend-loader": "0.0.2", - "source-map-support": "0.4.15", - "transform-loader": "0.2.4", - "uuid": "3.2.1", - "webpack": "1.15.0", - "webpack-node-externals": "1.6.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "crypto-browserify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", - "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", - "requires": { - "browserify-aes": "0.4.0", - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "node-libs-browser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", - "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", - "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.3.0", - "domain-browser": "1.1.7", - "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.3", - "stream-browserify": "2.0.1", - "stream-http": "2.8.0", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.6", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - }, - "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", - "requires": { - "setimmediate": "1.0.5" - } - }, - "uglify-js": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", - "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", - "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - } - } - }, - "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=" - } - } - }, - "webpack": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", - "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", - "requires": { - "acorn": "3.3.0", - "async": "1.5.2", - "clone": "1.0.3", - "enhanced-resolve": "0.9.1", - "interpret": "0.6.6", - "loader-utils": "0.2.17", - "memory-fs": "0.3.0", - "mkdirp": "0.5.1", - "node-libs-browser": "0.7.0", - "optimist": "0.6.1", - "supports-color": "3.2.3", - "tapable": "0.1.10", - "uglify-js": "2.7.5", - "watchpack": "0.2.9", - "webpack-core": "0.6.9" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - } - } - }, - "@cumulus/cumulus-message-adapter-js": { - "version": "0.0.1-beta.2", - "resolved": "https://registry.npmjs.org/@cumulus/cumulus-message-adapter-js/-/cumulus-message-adapter-js-0.0.1-beta.2.tgz", - "integrity": "sha1-v2poDzUgEhhmhqVmgIepDijnmSk=" - }, - "@cumulus/ingest": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@cumulus/ingest/-/ingest-1.0.0-beta.11.tgz", - "integrity": "sha1-2+re83mj4+iEDm6c32U1XFn4c84=", - "requires": { - "@cumulus/common": "1.0.0-beta.11", - "@cumulus/pvl": "1.0.0-beta.11", - "@cumulus/test-data": "1.0.0-beta.11", - "aws-sdk": "2.188.0", - "babel-core": "6.25.0", - "babel-loader": "6.4.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-polyfill": "6.23.0", - "babel-preset-env": "1.6.1", - "babel-register": "6.26.0", - "checksum": "0.1.1", - "cksum": "1.3.0", - "got": "7.1.0", - "jsftp": "2.1.3", - "json-loader": "0.5.7", - "lodash.get": "4.4.2", - "mkdirp": "0.5.1", - "moment": "2.20.1", - "node-forge": "0.7.1", - "pino": "4.10.3", - "pump": "1.0.3", - "simplecrawler": "1.1.6", - "ssh2": "0.5.5", - "url-join": "1.1.0" - }, - "dependencies": { - "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" - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "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.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - } - }, - "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.0", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - }, - "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.0", - "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.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - } - } - }, - "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.0", - "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.4" - } - }, - "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.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "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.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "@cumulus/pvl": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@cumulus/pvl/-/pvl-1.0.0-beta.11.tgz", - "integrity": "sha1-aLc+kZm6T7uEZ8M51r04iJYKrMc=", - "requires": { - "ava": "0.17.0" - }, - "dependencies": { - "ansi-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", - "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", - "requires": { - "string-width": "1.0.2" - } - }, - "auto-bind": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-0.1.0.tgz", - "integrity": "sha1-einvyMI4jT1XjgL8LfUxyB/8HuE=" - }, - "ava": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-0.17.0.tgz", - "integrity": "sha1-NZ4qiWFoAe8Dkpw88QqdT45FHQI=", - "requires": { - "arr-flatten": "1.1.0", - "array-union": "1.0.2", - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "auto-bind": "0.1.0", - "ava-files": "0.2.0", - "ava-init": "0.1.6", - "babel-code-frame": "6.22.0", - "babel-core": "6.25.0", - "babel-plugin-ava-throws-helper": "0.1.0", - "babel-plugin-detective": "2.0.0", - "babel-plugin-espower": "2.3.2", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-es2015-node4": "2.1.1", - "babel-preset-stage-2": "6.24.1", - "babel-runtime": "6.25.0", - "bluebird": "3.5.0", - "caching-transform": "1.0.1", - "chalk": "1.1.3", - "chokidar": "1.7.0", - "clean-yaml-object": "0.1.0", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "cli-truncate": "0.2.1", - "co-with-promise": "4.6.0", - "common-path-prefix": "1.0.0", - "convert-source-map": "1.5.0", - "core-assert": "0.2.1", - "currently-unhandled": "0.4.1", - "debug": "2.6.8", - "empower-core": "0.6.2", - "figures": "1.7.0", - "find-cache-dir": "0.1.1", - "fn-name": "2.0.1", - "get-port": "2.1.0", - "has-flag": "2.0.0", - "ignore-by-default": "1.0.1", - "is-ci": "1.0.10", - "is-generator-fn": "1.0.0", - "is-obj": "1.0.1", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "last-line-stream": "1.0.0", - "lodash.debounce": "4.0.8", - "lodash.difference": "4.5.0", - "lodash.isequal": "4.5.0", - "loud-rejection": "1.6.0", - "matcher": "0.1.2", - "max-timeout": "1.0.0", - "md5-hex": "1.3.0", - "meow": "3.7.0", - "ms": "0.7.3", - "object-assign": "4.1.1", - "observable-to-promise": "0.4.0", - "option-chain": "0.1.1", - "package-hash": "1.2.0", - "pkg-conf": "1.1.3", - "plur": "2.1.2", - "power-assert-context-formatter": "1.1.1", - "power-assert-renderer-assertion": "1.1.1", - "power-assert-renderer-succinct": "1.1.1", - "pretty-ms": "2.1.0", - "repeating": "2.0.1", - "require-precompiled": "0.1.0", - "resolve-cwd": "1.0.0", - "semver": "5.4.1", - "set-immediate-shim": "1.0.1", - "source-map-support": "0.4.15", - "stack-utils": "0.4.0", - "strip-ansi": "3.0.1", - "strip-bom": "2.0.0", - "time-require": "0.1.2", - "unique-temp-dir": "1.0.0", - "update-notifier": "1.0.3" - } - }, - "ava-init": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.1.6.tgz", - "integrity": "sha1-7xntCyS2vzWdrW+63xoF2DY5XJE=", - "requires": { - "arr-exclude": "1.0.0", - "cross-spawn": "4.0.2", - "pinkie-promise": "2.0.1", - "read-pkg-up": "1.0.1", - "the-argv": "1.0.0", - "write-pkg": "1.0.0" - } - }, - "boxen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", - "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", - "requires": { - "ansi-align": "1.1.0", - "camelcase": "2.1.1", - "chalk": "1.1.3", - "cli-boxes": "1.0.0", - "filled-array": "1.1.0", - "object-assign": "4.1.1", - "repeating": "2.0.1", - "string-width": "1.0.2", - "widest-line": "1.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=" - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "requires": { - "slice-ansi": "0.0.4", - "string-width": "1.0.2" - } - }, - "configstore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", - "requires": { - "dot-prop": "3.0.0", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "os-tmpdir": "1.0.2", - "osenv": "0.1.4", - "uuid": "2.0.3", - "write-file-atomic": "1.3.4", - "xdg-basedir": "2.0.0" - } - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "requires": { - "lru-cache": "4.1.1", - "which": "1.3.0" - } - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "requires": { - "is-obj": "1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "get-port": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-2.1.0.tgz", - "integrity": "sha1-h4P53OvR7qSVozThpqJR54iHqxo=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "requires": { - "create-error-class": "3.0.2", - "duplexer2": "0.1.4", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "node-status-codes": "1.0.0", - "object-assign": "4.1.1", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "read-all-stream": "3.1.0", - "readable-stream": "2.3.3", - "timed-out": "3.1.3", - "unzip-response": "1.0.2", - "url-parse-lax": "1.0.0" - } - }, - "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" - } - }, - "latest-version": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", - "requires": { - "package-json": "2.4.0" - } - }, - "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=", - "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" - } - }, - "matcher": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-0.1.2.tgz", - "integrity": "sha1-7yDL3mTCTFDMYa9bg+4LG4/wAQE=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "ms": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" - }, - "observable-to-promise": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.4.0.tgz", - "integrity": "sha1-KK/nFkUwjy1B1x9HrT/s4aN35Ss=", - "requires": { - "is-observable": "0.2.0", - "symbol-observable": "0.2.4" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "option-chain": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-0.1.1.tgz", - "integrity": "sha1-6bgR4AbxwPVIAvKClb/Ilw+Nz70=", - "requires": { - "object-assign": "4.1.1" - } - }, - "package-json": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", - "requires": { - "got": "5.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.4.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "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=", - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "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" - } - }, - "pkg-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", - "integrity": "sha1-N45W1v0T6Iv7b0ol33qD+qvduls=", - "requires": { - "find-up": "1.1.2", - "load-json-file": "1.1.0", - "object-assign": "4.1.1", - "symbol": "0.2.3" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "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=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "resolve-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-1.0.0.tgz", - "integrity": "sha1-Tq7qQe0EDRcCRX32SkKysH0kb58=", - "requires": { - "resolve-from": "2.0.0" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "stack-utils": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", - "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=" - }, - "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-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - } - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, - "update-notifier": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", - "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", - "requires": { - "boxen": "0.6.0", - "chalk": "1.1.3", - "configstore": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "2.0.0", - "lazy-req": "1.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "2.0.0" - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "write-json-file": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-1.2.0.tgz", - "integrity": "sha1-LV3+lqvDyIkFfJOXGqQAXvtUgTQ=", - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "sort-keys": "1.1.2", - "write-file-atomic": "1.3.4" - } - }, - "write-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-1.0.0.tgz", - "integrity": "sha1-rriqnU14jh2JPfsIVJaLVDqRn1c=", - "requires": { - "write-json-file": "1.2.0" - } - }, - "xdg-basedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "requires": { - "os-homedir": "1.0.2" - } - } - } - }, - "@cumulus/test-data": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@cumulus/test-data/-/test-data-1.0.0-beta.11.tgz", - "integrity": "sha1-B5MIUPZEUIuP+mLEP9yqSFQ2x5M=" - }, - "Base64": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==" - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "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=" - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "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-cli": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-1.1.2.tgz", - "integrity": "sha1-fxbcTrELUzALztDm100P9nBx1aY=", - "requires": { - "ajv": "4.11.8", - "ajv-pack": "0.2.7", - "fast-json-patch": "0.5.7", - "glob": "7.1.2", - "minimist": "1.2.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" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" - }, - "ajv-pack": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/ajv-pack/-/ajv-pack-0.2.7.tgz", - "integrity": "sha1-vdNA8cZ5kQjXqsEpdaAAxuKjYsg=", - "requires": { - "js-beautify": "1.7.5", - "require-from-string": "1.2.1" - } - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "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": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-exclude": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/arr-exclude/-/arr-exclude-1.0.0.tgz", - "integrity": "sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "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=" - }, - "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.10.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "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.4" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "auto-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.1.0.tgz", - "integrity": "sha1-k7hk3H7gGjJigXddXHXKCnUeWWE=", - "dev": true - }, - "ava": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-0.21.0.tgz", - "integrity": "sha1-zY2Oo1RvVxUN6jhUi59y+MpYPSk=", - "dev": true, - "requires": { - "@ava/babel-preset-stage-4": "1.1.0", - "@ava/babel-preset-transform-test-files": "3.0.0", - "@ava/write-file-atomic": "2.2.0", - "@concordance/react": "1.0.0", - "ansi-escapes": "2.0.0", - "ansi-styles": "3.2.0", - "arr-flatten": "1.1.0", - "array-union": "1.0.2", - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "auto-bind": "1.1.0", - "ava-init": "0.2.1", - "babel-core": "6.25.0", - "bluebird": "3.5.0", - "caching-transform": "1.0.1", - "chalk": "2.1.0", - "chokidar": "1.7.0", - "clean-stack": "1.3.0", - "clean-yaml-object": "0.1.0", - "cli-cursor": "2.1.0", - "cli-spinners": "1.0.0", - "cli-truncate": "1.1.0", - "co-with-promise": "4.6.0", - "code-excerpt": "2.1.0", - "common-path-prefix": "1.0.0", - "concordance": "3.0.0", - "convert-source-map": "1.5.0", - "core-assert": "0.2.1", - "currently-unhandled": "0.4.1", - "debug": "2.6.8", - "dot-prop": "4.2.0", - "empower-core": "0.6.2", - "equal-length": "1.0.1", - "figures": "2.0.0", - "find-cache-dir": "1.0.0", - "fn-name": "2.0.1", - "get-port": "3.1.0", - "globby": "6.1.0", - "has-flag": "2.0.0", - "hullabaloo-config-manager": "1.1.1", - "ignore-by-default": "1.0.1", - "import-local": "0.1.1", - "indent-string": "3.2.0", - "is-ci": "1.0.10", - "is-generator-fn": "1.0.0", - "is-obj": "1.0.1", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "js-yaml": "3.9.1", - "last-line-stream": "1.0.0", - "lodash.clonedeepwith": "4.5.0", - "lodash.debounce": "4.0.8", - "lodash.difference": "4.5.0", - "lodash.flatten": "4.4.0", - "loud-rejection": "1.6.0", - "make-dir": "1.0.0", - "matcher": "1.0.0", - "md5-hex": "2.0.0", - "meow": "3.7.0", - "ms": "2.0.0", - "multimatch": "2.1.0", - "observable-to-promise": "0.5.0", - "option-chain": "1.0.0", - "package-hash": "2.0.0", - "pkg-conf": "2.0.0", - "plur": "2.1.2", - "pretty-ms": "2.1.0", - "require-precompiled": "0.1.0", - "resolve-cwd": "2.0.0", - "safe-buffer": "5.1.1", - "slash": "1.0.0", - "source-map-support": "0.4.15", - "stack-utils": "1.0.1", - "strip-ansi": "4.0.0", - "strip-bom-buf": "1.0.0", - "supports-color": "4.2.1", - "time-require": "0.1.2", - "trim-off-newlines": "1.0.1", - "unique-temp-dir": "1.0.0", - "update-notifier": "2.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 - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" - } - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "lodash.flattendeep": "4.4.0", - "md5-hex": "2.0.0", - "release-zalgo": "1.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "ava-files": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ava-files/-/ava-files-0.2.0.tgz", - "integrity": "sha1-x7i24uDOpjtXpuJ+DbFFx8Gc/iA=", - "requires": { - "auto-bind": "0.1.0", - "bluebird": "3.5.0", - "globby": "6.1.0", - "ignore-by-default": "1.0.1", - "lodash.flatten": "4.4.0", - "multimatch": "2.1.0", - "slash": "1.0.0" - }, - "dependencies": { - "auto-bind": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-0.1.0.tgz", - "integrity": "sha1-einvyMI4jT1XjgL8LfUxyB/8HuE=" - } - } - }, - "ava-init": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.1.tgz", - "integrity": "sha1-daxMhVMyYpDShm5jti+nA1aEvVg=", - "dev": true, - "requires": { - "arr-exclude": "1.0.0", - "execa": "0.7.0", - "has-yarn": "1.0.0", - "read-pkg-up": "2.0.0", - "write-pkg": "3.1.0" - } - }, - "aws-sdk": { - "version": "2.188.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.188.0.tgz", - "integrity": "sha1-kGKrx9umOTRZ+i80I89dKU8ARhE=", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - } - } - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - }, - "babel-eslint": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-6.1.2.tgz", - "integrity": "sha1-UpNBn+NnLWZZjTJ9qWlFZ7pqXy8=", - "requires": { - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash.assign": "4.2.0", - "lodash.pickby": "4.6.0" - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "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=" - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - }, - "dependencies": { - "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.0", - "regenerator-runtime": "0.11.1" - } - }, - "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.4", - "to-fast-properties": "1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "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=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.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=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "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.25.0", - "babel-template": "6.25.0" - } - }, - "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", - "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "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" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - } - } - }, - "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.25.0" - } - }, - "babel-plugin-ava-throws-helper": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-ava-throws-helper/-/babel-plugin-ava-throws-helper-0.1.0.tgz", - "integrity": "sha1-lREHcIoSIIAmv4ykzvGKh7ybDP4=", - "requires": { - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-detective": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-detective/-/babel-plugin-detective-2.0.0.tgz", - "integrity": "sha1-bmQug8IqM1J5dU6+LXVNJjX0nxM=" - }, - "babel-plugin-espower": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-2.3.2.tgz", - "integrity": "sha1-VRa4/NsmyfDh2BYHSfbkxl5xJx4=", - "requires": { - "babel-generator": "6.25.0", - "babylon": "6.17.4", - "call-matcher": "1.0.1", - "core-js": "2.5.0", - "espower-location-detector": "1.0.0", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" - }, - "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=" - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" - }, - "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=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "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=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.25.0" - } - }, - "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=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - }, - "dependencies": { - "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" - } - }, - "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.0", - "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.4" - } - }, - "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.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "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.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - }, - "dependencies": { - "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.0", - "regenerator-runtime": "0.11.1" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "requires": { - "babel-runtime": "6.25.0", - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - } - }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.3", - "invariant": "2.2.2", - "semver": "5.4.1" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-es2015-node4": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015-node4/-/babel-preset-es2015-node4-2.1.1.tgz", - "integrity": "sha1-4x8pCFm1hhnIz6JB0bC8kA+UHNs=", - "requires": { - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1" - } - }, - "babel-preset-es2017": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", - "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", - "core-js": "2.5.0", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - } - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "requires": { - "babel-runtime": "6.25.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" - }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" - }, - "boxen": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", - "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "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=", - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browserify-aes": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", - "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", - "requires": { - "inherits": "2.0.3" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "0.2.9" - } - }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "requires": { - "caniuse-lite": "1.0.30000792", - "electron-to-chromium": "1.3.31" - } - }, - "buf-compare": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", - "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=" - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" - }, - "dependencies": { - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - } - } - }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", - "requires": { - "core-js": "2.5.0", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=" - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "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=" - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30000792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz", - "integrity": "sha1-0M6pgfgRjzlhRxr7tDyaHlu/AzI=" - }, - "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=" - }, - "cdata": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/cdata/-/cdata-0.1.1.tgz", - "integrity": "sha512-H0gfEXypjHisCI4xkBfh6wAyzDESay6sscM5xeJMQu7zlYrq/jHzxzOfLElg/ULpkAGNomxzENi6tY6wXWNt9w==" - }, - "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" - } - }, - "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" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "checksum": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz", - "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=", - "requires": { - "optimist": "0.3.7" - }, - "dependencies": { - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "requires": { - "wordwrap": "0.0.3" - } - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "ci-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "cksum": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/cksum/-/cksum-1.3.0.tgz", - "integrity": "sha1-MMstqRX/DlnIaYupv5sC0swkqRE=" - }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", - "dev": true - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=" - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "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-spinners": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", - "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=", - "dev": true - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha1-Ky39g8U8/TVyuH/E1DCoCK+wQIY=", - "dev": true, - "requires": { - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "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" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } - } - }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "co-with-promise": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co-with-promise/-/co-with-promise-4.6.0.tgz", - "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=", - "requires": { - "pinkie-promise": "1.0.0" - } - }, - "code-excerpt": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.0.tgz", - "integrity": "sha1-XcwIHoj0p+O1VOnjXX7yMtR/gUc=", - "dev": true, - "requires": { - "convert-to-spaces": "1.0.2" - } - }, - "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=" - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "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=" - }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" - }, - "common-path-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", - "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "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" - } - }, - "concordance": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-3.0.0.tgz", - "integrity": "sha1-sihq9UQF/JlfxzRbCxBtjdBzyyk=", - "dev": true, - "requires": { - "date-time": "2.1.0", - "esutils": "2.0.2", - "fast-diff": "1.1.1", - "function-name-support": "0.2.0", - "js-string-escape": "1.0.1", - "lodash.clonedeep": "4.5.0", - "lodash.flattendeep": "4.4.0", - "lodash.merge": "4.6.0", - "md5-hex": "2.0.0", - "semver": "5.4.1", - "well-known-symbols": "1.0.0" - }, - "dependencies": { - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - } - } - }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "requires": { - "ini": "1.3.4", - "proto-list": "1.2.4" - } - }, - "configstore": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha1-CU7mYquD+tmRdnjeEU+q6o/NypA=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", - "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" - }, - "convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", - "dev": true - }, - "core-assert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", - "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=", - "requires": { - "buf-compare": "1.0.1", - "is-error": "2.2.1" - } - }, - "core-js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", - "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=" - }, - "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=" - }, - "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=", - "dev": true, - "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=" - }, - "crypto-browserify": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.2.8.tgz", - "integrity": "sha1-ubEdvm2WUd2IKgHmzEZ99xjs8Yk=", - "requires": { - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" - } - }, - "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=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "1.0.2" - } - }, - "cwait": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cwait/-/cwait-1.1.1.tgz", - "integrity": "sha512-VRS0E6E41fK2QDYIGsVeE6FRXoH5Vf3hGtDL/jZxh3W+KPVVoEggDem5xJveihgZrd+xmYSqGPIUi/jv5zXcxQ==", - "requires": { - "cdata": "0.1.1" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.38" - } - }, - "damerau-levenshtein": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "date-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", - "integrity": "sha1-AobRtMdpYzs8oT4eYlWNLb3C66I=", - "dev": true, - "requires": { - "time-zone": "1.0.0" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "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" - } - }, - "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=" - }, - "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" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "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" - } - }, - "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" - } - } - } - }, - "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" - } - }, - "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "2.0.2" - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "eastasianwidth": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", - "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=" - }, - "editorconfig": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", - "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", - "requires": { - "bluebird": "3.5.0", - "commander": "2.13.0", - "lru-cache": "3.2.0", - "semver": "5.4.1", - "sigmund": "1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "requires": { - "pseudomap": "1.0.2" - } - } - } - }, - "electron-to-chromium": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz", - "integrity": "sha512-XE4CLbswkZgZFn34cKFy1xaX+F5LHxeDLjY1+rsK9asDzknhbrd9g/n/01/acbU25KTsUSiLKwvlLyA+6XLUOA==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "empower-core": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", - "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", - "requires": { - "call-signature": "0.0.2", - "core-js": "2.5.0" - } - }, - "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" - } - }, - "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.2.0", - "tapable": "0.1.10" - }, - "dependencies": { - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=" - } - } - }, - "equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", - "dev": true - }, - "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", - "requires": { - "prr": "1.0.1" - } - }, - "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.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" - } - }, - "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" - } - }, - "es5-ext": { - "version": "0.10.38", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", - "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.0.2.tgz", - "integrity": "sha1-7sXHJurO9Rt/a3PCDbbhsTsGnJg=", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "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=" - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", - "requires": { - "babel-code-frame": "6.22.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "2.1.0", - "escope": "3.6.0", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.1", - "is-resolvable": "1.1.0", - "js-yaml": "3.9.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - } - }, - "eslint-config-airbnb": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-10.0.1.tgz", - "integrity": "sha1-pHAQhkbWxF4fY5oD8R1QShqkrtw=", - "requires": { - "eslint-config-airbnb-base": "5.0.3" - } - }, - "eslint-config-airbnb-base": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-5.0.3.tgz", - "integrity": "sha1-lxSsNews1/qw1E0Uip+R2ylEB00=" - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", - "requires": { - "debug": "2.6.8", - "object-assign": "4.1.1", - "resolve": "1.5.0" - } - }, - "eslint-plugin-import": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", - "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.8", - "doctrine": "1.3.0", - "es6-map": "0.1.5", - "es6-set": "0.1.5", - "eslint-import-resolver-node": "0.2.3", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "lodash.endswith": "4.2.1", - "lodash.find": "4.6.0", - "lodash.findindex": "4.6.0", - "minimatch": "3.0.4", - "object-assign": "4.1.1", - "pkg-dir": "1.0.0", - "pkg-up": "1.0.0" - }, - "dependencies": { - "doctrine": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", - "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "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=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "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" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", - "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", - "requires": { - "damerau-levenshtein": "1.0.4", - "jsx-ast-utils": "1.4.1", - "object-assign": "4.1.1" - } - }, - "eslint-plugin-react": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", - "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", - "requires": { - "array.prototype.find": "2.0.4", - "doctrine": "1.5.0", - "has": "1.0.1", - "jsx-ast-utils": "1.4.1", - "object.assign": "4.1.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - } - } - }, - "espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", - "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", - "requires": { - "is-url": "1.2.2", - "path-is-absolute": "1.0.1", - "source-map": "0.5.6", - "xtend": "4.0.1" - } - }, - "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", - "requires": { - "acorn": "5.3.0", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" - }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "requires": { - "core-js": "2.5.0" - } - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "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=", - "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=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "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" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "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=", - "requires": { - "fill-range": "2.2.3" - } - }, - "expect.js": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", - "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=" - }, - "exports-loader": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz", - "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=", - "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.6" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "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-diff": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.1.tgz", - "integrity": "sha1-CuoOTmBbaiGJ8Ok21Lf7rxt8/Zs=", - "dev": true - }, - "fast-json-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" - }, - "fast-json-patch": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-0.5.7.tgz", - "integrity": "sha1-taj0nSWWJFlu+YuHLz/aiVtNhmU=" - }, - "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=" - }, - "fast-safe-stringify": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-1.2.3.tgz", - "integrity": "sha512-QJYT/i0QYoiZBQ71ivxdyTqkwKkQ0oxACXHYxH2zYHJEgzi2LsbjgvtzTbLi1SZcF190Db2YP7I7eTsU2egOlw==" - }, - "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=", - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "filled-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=" - }, - "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.0.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "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=", - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "flatstr": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.5.tgz", - "integrity": "sha1-W0UbCMvUji6sVKK74L9GFlqhS+M=" - }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=" - }, - "follow-redirects": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", - "requires": { - "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" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "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=" - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.2.1" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha1-MoK3E/s62A7eDp/PRhG1qm/AM/Q=", - "optional": true, - "requires": { - "nan": "2.6.2", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": 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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": 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" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": 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.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "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", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha1-O50z+O3V+45HALj3eMRi5bFYH4k=", - "requires": { - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "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=" - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function-name-support": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/function-name-support/-/function-name-support-0.2.0.tgz", - "integrity": "sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE=", - "dev": true - }, - "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-port": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.1.0.tgz", - "integrity": "sha1-7wGxioTKZIaXD/meVERhQac//T4=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "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=", - "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=", - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "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" - } - } - } - }, - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" - }, - "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-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "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-yarn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz", - "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=", - "dev": true - }, - "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" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" - }, - "http-browserify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", - "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", - "requires": { - "Base64": "0.2.1", - "inherits": "2.0.3" - } - }, - "https-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.0.tgz", - "integrity": "sha1-s//f5zSyo9Sp79WOhlTJH86G6v0=" - }, - "hullabaloo-config-manager": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", - "integrity": "sha1-HZEXgTEprQNf2ehHfq8GaREmn+M=", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "es6-error": "4.0.2", - "graceful-fs": "4.1.11", - "indent-string": "3.2.0", - "json5": "0.5.1", - "lodash.clonedeep": "4.5.0", - "lodash.clonedeepwith": "4.5.0", - "lodash.isequal": "4.5.0", - "lodash.merge": "4.6.0", - "md5-hex": "2.0.0", - "package-hash": "2.0.0", - "pkg-dir": "2.0.0", - "resolve-from": "3.0.0", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "lodash.flattendeep": "4.4.0", - "md5-hex": "2.0.0", - "release-zalgo": "1.0.0" - } - } - } - }, - "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.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" - }, - "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=" - }, - "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": "0.1.1", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", - "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", - "dev": true, - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "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.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "requires": { - "restore-cursor": "1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.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" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "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" - } - } - } - }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" - }, - "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=" - }, - "irregular-plurals": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz", - "integrity": "sha1-evBpMb33S+M9z1haE+BvzMFsrs8=" - }, - "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=", - "requires": { - "binary-extensions": "1.10.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" - }, - "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.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "requires": { - "ci-info": "1.0.0" - } - }, - "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-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "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=", - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-error": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.1.tgz", - "integrity": "sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw=" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "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=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", - "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==", - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "3.2.2" - } - }, - "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-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "requires": { - "symbol-observable": "0.2.4" - } - }, - "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=" - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "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=", - "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-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "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=" - }, - "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==" - }, - "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-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" - }, - "is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "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" - } - }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" - } - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-beautify": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.5.tgz", - "integrity": "sha512-9OhfAqGOrD7hoQBLJMTA+BKuKmoEtTJXzZ7WDF/9gvjtey1koVLuZqIY6c51aPDjbNdNtIXAkiWKVhziawE9Og==", - "requires": { - "config-chain": "1.1.11", - "editorconfig": "0.13.3", - "mkdirp": "0.5.1", - "nopt": "3.0.6" - } - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "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.9.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "requires": { - "debug": "3.1.0", - "ftp-response-parser": "1.0.1", - "once": "1.4.0", - "parse-listing": "1.1.3", - "stream-combiner": "0.2.2", - "unorm": "1.4.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" - } - } - } - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "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" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "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=" - }, - "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" - }, - "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.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "last-line-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz", - "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=", - "requires": { - "through2": "2.0.3" - } - }, - "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=" - }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=" - }, - "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" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "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=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "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.clonedeepwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.endswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", - "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=" - }, - "lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=" - }, - "lodash.findindex": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", - "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "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.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", - "dev": true - }, - "lodash.pickby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", - "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=" - }, - "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", - "dev": true - }, - "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" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "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": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "matcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.0.0.tgz", - "integrity": "sha1-qvDEgW62m5IJRnQXViXzRmsOPhk=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "max-timeout": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/max-timeout/-/max-timeout-1.0.0.tgz", - "integrity": "sha1-to9povmeC0dv1Msj4gWcp1BxXh8=" - }, - "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.5" - } - }, - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=" - }, - "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "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=", - "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" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "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=", - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "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" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "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=", - "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=", - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "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.3" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "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": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "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=" - }, - "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" - } - }, - "mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - }, - "dependencies": { - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" - }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" - }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "requires": { - "inherits": "2.0.3", - "minimatch": "0.3.0" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" - } - } - }, - "mocha-junit-reporter": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.17.0.tgz", - "integrity": "sha1-LlFJ7UD8XS48px5C21qx/snG2Fw=", - "requires": { - "debug": "2.6.8", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "strip-ansi": "4.0.0", - "xml": "1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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" - } - } - } - }, - "mocha-webpack": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/mocha-webpack/-/mocha-webpack-0.7.0.tgz", - "integrity": "sha1-065ax93PKc+UfosO7Xc/pCKODM4=", - "requires": { - "anymatch": "1.3.2", - "fs-extra": "0.30.0", - "glob-parent": "2.0.0", - "interpret": "1.1.0", - "invariant": "2.2.2", - "is-glob": "2.0.1", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "normalize-path": "2.1.1", - "object-hash": "1.2.0", - "webpack-info-plugin": "0.1.0", - "webpack-sources": "0.1.5", - "yargs": "4.8.1" - }, - "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" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" - }, - "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" - } - }, - "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=", - "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" - } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "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=", - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "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" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "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=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "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-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - } - } - }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", - "optional": true - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", - "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=" - }, - "node-forge": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" - }, - "node-libs-browser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.6.0.tgz", - "integrity": "sha1-JEgG1E0xngSLyGB7XMTq+aKdLjw=", - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "0.0.1", - "crypto-browserify": "3.2.8", - "domain-browser": "1.1.7", - "events": "1.1.1", - "http-browserify": "1.7.0", - "https-browserify": "0.0.0", - "os-browserify": "0.1.2", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "1.1.14", - "stream-browserify": "1.0.0", - "string_decoder": "0.10.31", - "timers-browserify": "1.4.2", - "tty-browserify": "0.0.0", - "url": "0.10.3", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "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=" - } - } - }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "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": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "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=", - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "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=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "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=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.2.0.tgz", - "integrity": "sha512-smRWXzkvxw72VquyZ0wggySl7PFUtoDhvhpdwgESXxUrH7vVhhp9asfup1+rVLrhsl7L45Ee1Q/l5R2Ul4MwUg==" - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - }, - "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.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "observable-to-promise": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", - "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=", - "dev": true, - "requires": { - "is-observable": "0.2.0", - "symbol-observable": "1.0.4" - }, - "dependencies": { - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=", - "dev": true - } - } - }, - "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" - } - }, - "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.3" - } - }, - "option-chain": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-1.0.0.tgz", - "integrity": "sha1-k41zvU4Xg/lI00AjZEraI2aeMPI=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "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=" - } - } - }, - "os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=" - }, - "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": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "1.0.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.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "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-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "1.0.0" - } - }, - "package-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", - "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=", - "requires": { - "md5-hex": "1.3.0" - } - }, - "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.1", - "registry-url": "3.1.0", - "semver": "5.4.1" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "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-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha1-qlRvV/3BKc+/mUXNS3V7FLBhgt0=" - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "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=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "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=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pbkdf2-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", - "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=" - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", - "requires": { - "pinkie": "1.0.0" - } - }, - "pino": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/pino/-/pino-4.10.3.tgz", - "integrity": "sha512-IKXK0dcFQYITgOJBEvy1RCI5gUz+VVERXMhIvk5Ie+k9zzrbwXDs38M3H6JhoCHR58exyNpNcEKBrW4JC2P0pg==", - "requires": { - "chalk": "2.3.0", - "fast-json-parse": "1.0.3", - "fast-safe-stringify": "1.2.3", - "flatstr": "1.0.5", - "pump": "2.0.1", - "quick-format-unescaped": "1.1.2", - "split2": "2.2.0" - }, - "dependencies": { - "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.0" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.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" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "pkg-conf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", - "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "load-json-file": "2.0.0" - } - }, - "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" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "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=", - "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=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "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" - } - } - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "requires": { - "irregular-plurals": "1.3.0" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" - }, - "power-assert-context-formatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", - "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", - "requires": { - "core-js": "2.5.0", - "power-assert-context-traversal": "1.1.1" - } - }, - "power-assert-context-traversal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", - "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", - "requires": { - "core-js": "2.5.0", - "estraverse": "4.2.0" - } - }, - "power-assert-renderer-assertion": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", - "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", - "requires": { - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1" - } - }, - "power-assert-renderer-base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", - "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=" - }, - "power-assert-renderer-diagram": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", - "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", - "requires": { - "core-js": "2.5.0", - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1", - "stringifier": "1.3.0" - } - }, - "power-assert-renderer-succinct": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-succinct/-/power-assert-renderer-succinct-1.1.1.tgz", - "integrity": "sha1-wqRosjgiq9b4Diq6UyI0ewnfR24=", - "requires": { - "core-js": "2.5.0", - "power-assert-renderer-diagram": "1.1.2" - } - }, - "power-assert-util-string-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", - "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", - "requires": { - "eastasianwidth": "0.1.1" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "prepend-loader": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/prepend-loader/-/prepend-loader-0.0.2.tgz", - "integrity": "sha1-nhQshdw+PEA/Vwf73rhEf4OkN+Y=", - "requires": { - "loader-utils": "0.2.17" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "requires": { - "is-finite": "1.0.2", - "parse-ms": "1.0.1", - "plur": "1.0.0" - }, - "dependencies": { - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=" - } - } - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "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": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "quick-format-unescaped": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-1.1.2.tgz", - "integrity": "sha1-DKWB3jF0vs7yWsPC6JVjQjgdtpg=", - "requires": { - "fast-safe-stringify": "1.2.3" - } - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", - "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=", - "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=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "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.4", - "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=" - } - } - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "requires": { - "pinkie-promise": "2.0.1", - "readable-stream": "2.3.3" - }, - "dependencies": { - "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" - } - } - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "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=", - "dev": true, - "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": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "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=", - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - }, - "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" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "1.5.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - } - } - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "private": "0.1.7" - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", - "requires": { - "rc": "1.2.1", - "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=", - "requires": { - "rc": "1.2.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "4.0.2" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "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" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" - }, - "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-precompiled": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", - "integrity": "sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=" - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" - } - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "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" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "ripemd160": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=" - }, - "robots-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-1.0.2.tgz", - "integrity": "sha512-c979P2TTe5Ezjg+VV5XWC59bab1w1Xyb8KLnJ5SKuwN7YH+ys8Y5KCZ2OP2J7zXVE7Yq0eYWlrqUM/urIbx9sg==" - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "requires": { - "once": "1.4.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "samsam": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", - "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=", - "dev": true - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "5.4.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=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "sha.js": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", - "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "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=", - "dev": true - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - }, - "dependencies": { - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" - } - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simplecrawler": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/simplecrawler/-/simplecrawler-1.1.6.tgz", - "integrity": "sha512-TsXJVzrKZuExJPq7juipV76KIE+D3a9IWWve6v+BBCuwFWhFYl9BOFZtARWBwb08KtI4eTZ/GGu9QuboJzo62w==", - "requires": { - "async": "2.6.0", - "iconv-lite": "0.4.19", - "robots-parser": "1.0.2", - "urijs": "1.19.0" - } - }, - "sinon": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", - "integrity": "sha1-Ah/WS1TLd9nS+w1Dze3652KcOjY=", - "dev": true, - "requires": { - "diff": "3.3.0", - "formatio": "1.2.0", - "lolex": "1.6.0", - "native-promise-only": "0.8.1", - "path-to-regexp": "1.7.0", - "samsam": "1.2.1", - "text-encoding": "0.6.4", - "type-detect": "4.0.3" - } - }, - "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": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "requires": { - "source-map": "0.5.6" - } - }, - "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=" - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "requires": { - "through2": "2.0.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "ssh2": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.5.tgz", - "integrity": "sha1-x3gezS7OcwSiU89iD6taXCK7IjU=", - "requires": { - "ssh2-streams": "0.1.20" - } - }, - "ssh2-streams": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.20.tgz", - "integrity": "sha1-URGNFUVV31Rp7h9n4M8efoosDjo=", - "requires": { - "asn1": "0.2.3", - "semver": "5.4.1", - "streamsearch": "0.1.2" - } - }, - "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true - }, - "stream-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", - "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "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=" - } - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "requires": { - "duplexer": "0.1.1", - "through": "2.3.8" - } - }, - "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.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-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" - } - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringifier": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", - "integrity": "sha1-3vGDQvaTPbDy2/yaoCF1tEjBeVk=", - "requires": { - "core-js": "2.5.0", - "traverse": "0.6.6", - "type-name": "2.0.2" - } - }, - "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" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-bom-buf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", - "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - } - }, - "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=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "symbol": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", - "integrity": "sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c=" - }, - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=" - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "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" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" - } - } - }, - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=" - }, - "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" - } - }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "the-argv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/the-argv/-/the-argv-1.0.0.tgz", - "integrity": "sha1-AIRwUAVzDdhNt1UlPJMa45jblSI=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "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" - } - }, - "time-require": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", - "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", - "requires": { - "chalk": "0.4.0", - "date-time": "0.1.1", - "pretty-ms": "0.2.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" - } - }, - "date-time": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", - "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=" - }, - "parse-ms": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", - "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=" - }, - "pretty-ms": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", - "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", - "requires": { - "parse-ms": "0.1.2" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" - } - } - }, - "time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", - "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=" - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "requires": { - "process": "0.11.10" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "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-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=" - }, - "transform-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/transform-loader/-/transform-loader-0.2.4.tgz", - "integrity": "sha1-5ch4d7qW1R0/IlNoWHtG4ibRzsk=", - "requires": { - "loader-utils": "1.1.0" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "1.1.2" - } - }, - "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 - }, - "type-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - } - } - }, - "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=" - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", - "requires": { - "mkdirp": "0.5.1", - "os-tmpdir": "1.0.2", - "uid2": "0.0.3" - } - }, - "unorm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", - "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", - "dev": true, - "requires": { - "boxen": "1.2.1", - "chalk": "1.1.3", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "urijs": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.0.tgz", - "integrity": "sha512-Qs2odXn0hST5VSPVjpi73CMqtbAoanahaqWBujGU+IyMrMqpWcIhDewxQRhCkmqYxuyvICDcSuLdv2O7ncWBGw==" - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "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-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" - }, - "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=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "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=" - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "requires": { - "os-homedir": "1.0.2" - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "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" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", - "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", - "requires": { - "async": "0.9.2", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - } - } - }, - "webpack": { - "version": "1.12.15", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.12.15.tgz", - "integrity": "sha1-1GETNaXUVSaYUK65tK50zDUZIoY=", - "requires": { - "async": "1.5.2", - "clone": "1.0.3", - "enhanced-resolve": "0.9.1", - "esprima": "2.7.3", - "interpret": "0.6.6", - "loader-utils": "0.2.17", - "memory-fs": "0.3.0", - "mkdirp": "0.5.1", - "node-libs-browser": "0.6.0", - "optimist": "0.6.1", - "supports-color": "3.2.3", - "tapable": "0.1.10", - "uglify-js": "2.6.4", - "watchpack": "0.2.9", - "webpack-core": "0.6.9" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" - }, - "dependencies": { - "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" - } - } - } - }, - "webpack-info-plugin": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/webpack-info-plugin/-/webpack-info-plugin-0.1.0.tgz", - "integrity": "sha1-3/56qI/LlsWcxFCXZCHq+YzbeQE=", - "requires": { - "chalk": "1.1.3" - } - }, - "webpack-node-externals": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz", - "integrity": "sha1-Iyxi7GCSsQBjWj0p2DwXRxKN+b0=" - }, - "webpack-sources": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", - "integrity": "sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=", - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.5.6" - } - }, - "well-known-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-1.0.0.tgz", - "integrity": "sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg=", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", - "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=", - "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" - } - } - } - }, - "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=" - }, - "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" - } - } - } - }, - "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=", - "requires": { - "mkdirp": "0.5.1" - } - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "write-json-file": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.2.0.tgz", - "integrity": "sha1-UYYlBruzthnu+reFnx/WxtBTCHY=", - "dev": true, - "requires": { - "detect-indent": "5.0.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "pify": "2.3.0", - "sort-keys": "1.1.2", - "write-file-atomic": "2.1.0" - }, - "dependencies": { - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - } - } - }, - "write-pkg": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.1.0.tgz", - "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", - "dev": true, - "requires": { - "sort-keys": "2.0.0", - "write-json-file": "2.2.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" - }, - "xml2js": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", - "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", - "requires": { - "sax": "1.2.1", - "xmlbuilder": "4.2.1" - } - }, - "xmlbuilder": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "requires": { - "lodash": "4.17.4" - } - }, - "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": "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" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - } - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } - } - } - } -} diff --git a/cumulus/tasks/parse-pdr/package-lock.json b/cumulus/tasks/parse-pdr/package-lock.json deleted file mode 100644 index 9317b828051..00000000000 --- a/cumulus/tasks/parse-pdr/package-lock.json +++ /dev/null @@ -1,4487 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@ava/babel-plugin-throws-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz", - "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=" - }, - "@ava/babel-preset-stage-4": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz", - "integrity": "sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "package-hash": "1.2.0" - } - }, - "@ava/babel-preset-transform-test-files": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz", - "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=", - "requires": { - "@ava/babel-plugin-throws-helper": "2.0.0", - "babel-plugin-espower": "2.3.2" - } - }, - "@ava/write-file-atomic": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz", - "integrity": "sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "@concordance/react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-1.0.0.tgz", - "integrity": "sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==", - "requires": { - "arrify": "1.0.1" - } - }, - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "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=", - "requires": { - "string-width": "2.1.1" - } - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" - }, - "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": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-exclude": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/arr-exclude/-/arr-exclude-1.0.0.tgz", - "integrity": "sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=" - }, - "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==" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "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=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "auto-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.1.0.tgz", - "integrity": "sha1-k7hk3H7gGjJigXddXHXKCnUeWWE=" - }, - "ava": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-0.21.0.tgz", - "integrity": "sha512-+ZjahyjqyzkPLlFZe2OoLmiE3aaQ2jK5h74wrkuX5I+J6LpNAPoQ8X/EhqEtKEjuWwmniLAjnVjZ7OY8rWdJwA==", - "requires": { - "@ava/babel-preset-stage-4": "1.1.0", - "@ava/babel-preset-transform-test-files": "3.0.0", - "@ava/write-file-atomic": "2.2.0", - "@concordance/react": "1.0.0", - "ansi-escapes": "2.0.0", - "ansi-styles": "3.2.0", - "arr-flatten": "1.1.0", - "array-union": "1.0.2", - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "auto-bind": "1.1.0", - "ava-init": "0.2.1", - "babel-core": "6.25.0", - "bluebird": "3.5.0", - "caching-transform": "1.0.1", - "chalk": "2.1.0", - "chokidar": "1.7.0", - "clean-stack": "1.3.0", - "clean-yaml-object": "0.1.0", - "cli-cursor": "2.1.0", - "cli-spinners": "1.0.0", - "cli-truncate": "1.1.0", - "co-with-promise": "4.6.0", - "code-excerpt": "2.1.0", - "common-path-prefix": "1.0.0", - "concordance": "3.0.0", - "convert-source-map": "1.5.0", - "core-assert": "0.2.1", - "currently-unhandled": "0.4.1", - "debug": "2.6.8", - "dot-prop": "4.2.0", - "empower-core": "0.6.2", - "equal-length": "1.0.1", - "figures": "2.0.0", - "find-cache-dir": "1.0.0", - "fn-name": "2.0.1", - "get-port": "3.1.0", - "globby": "6.1.0", - "has-flag": "2.0.0", - "hullabaloo-config-manager": "1.1.1", - "ignore-by-default": "1.0.1", - "import-local": "0.1.1", - "indent-string": "3.2.0", - "is-ci": "1.0.10", - "is-generator-fn": "1.0.0", - "is-obj": "1.0.1", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "js-yaml": "3.9.1", - "last-line-stream": "1.0.0", - "lodash.clonedeepwith": "4.5.0", - "lodash.debounce": "4.0.8", - "lodash.difference": "4.5.0", - "lodash.flatten": "4.4.0", - "loud-rejection": "1.6.0", - "make-dir": "1.0.0", - "matcher": "1.0.0", - "md5-hex": "2.0.0", - "meow": "3.7.0", - "ms": "2.0.0", - "multimatch": "2.1.0", - "observable-to-promise": "0.5.0", - "option-chain": "1.0.0", - "package-hash": "2.0.0", - "pkg-conf": "2.0.0", - "plur": "2.1.2", - "pretty-ms": "2.1.0", - "require-precompiled": "0.1.0", - "resolve-cwd": "2.0.0", - "safe-buffer": "5.1.1", - "slash": "1.0.0", - "source-map-support": "0.4.15", - "stack-utils": "1.0.1", - "strip-ansi": "4.0.0", - "strip-bom-buf": "1.0.0", - "supports-color": "4.2.1", - "time-require": "0.1.2", - "trim-off-newlines": "1.0.1", - "unique-temp-dir": "1.0.0", - "update-notifier": "2.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=" - }, - "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.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" - } - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "requires": { - "graceful-fs": "4.1.11", - "lodash.flattendeep": "4.4.0", - "md5-hex": "2.0.0", - "release-zalgo": "1.0.0" - } - }, - "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" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "ava-init": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.1.tgz", - "integrity": "sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg==", - "requires": { - "arr-exclude": "1.0.0", - "execa": "0.7.0", - "has-yarn": "1.0.0", - "read-pkg-up": "2.0.0", - "write-pkg": "3.1.0" - } - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "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=" - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "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=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.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=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "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.25.0", - "babel-template": "6.25.0" - } - }, - "babel-loader": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.1.tgz", - "integrity": "sha1-uHE0yLEuPkwqlOBUYIW8aAorhIg=", - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" - } - }, - "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.25.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-espower": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-2.3.2.tgz", - "integrity": "sha1-VRa4/NsmyfDh2BYHSfbkxl5xJx4=", - "requires": { - "babel-generator": "6.25.0", - "babylon": "6.17.4", - "call-matcher": "1.0.1", - "core-js": "2.5.0", - "espower-location-detector": "1.0.0", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "requires": { - "babel-runtime": "6.25.0", - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - } - }, - "babel-preset-es2017": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", - "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1" - } - }, - "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", - "core-js": "2.5.0", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - } - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "requires": { - "babel-runtime": "6.25.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" - }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" - }, - "boxen": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", - "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "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.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "requires": { - "has-flag": "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=", - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browserify-aes": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", - "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", - "requires": { - "inherits": "2.0.3" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "0.2.9" - } - }, - "buf-compare": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", - "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=" - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" - }, - "dependencies": { - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - } - } - }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", - "requires": { - "core-js": "2.5.0", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=" - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "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=" - }, - "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" - } - }, - "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" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "ci-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" - }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=" - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "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=", - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-spinners": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", - "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=" - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "requires": { - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } - }, - "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" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "co-with-promise": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co-with-promise/-/co-with-promise-4.6.0.tgz", - "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=", - "requires": { - "pinkie-promise": "1.0.0" - } - }, - "code-excerpt": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.0.tgz", - "integrity": "sha1-XcwIHoj0p+O1VOnjXX7yMtR/gUc=", - "requires": { - "convert-to-spaces": "1.0.2" - } - }, - "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=" - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "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=" - }, - "common-path-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", - "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concordance": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-3.0.0.tgz", - "integrity": "sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ==", - "requires": { - "date-time": "2.1.0", - "esutils": "2.0.2", - "fast-diff": "1.1.1", - "function-name-support": "0.2.0", - "js-string-escape": "1.0.1", - "lodash.clonedeep": "4.5.0", - "lodash.flattendeep": "4.4.0", - "lodash.merge": "4.6.0", - "md5-hex": "2.0.0", - "semver": "5.4.1", - "well-known-symbols": "1.0.0" - }, - "dependencies": { - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "requires": { - "md5-o-matic": "0.1.1" - } - } - } - }, - "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.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" - }, - "convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=" - }, - "core-assert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", - "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=", - "requires": { - "buf-compare": "1.0.1", - "is-error": "2.2.1" - } - }, - "core-js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", - "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=" - }, - "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=" - }, - "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" - } - }, - "crypto-browserify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", - "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", - "requires": { - "browserify-aes": "0.4.0", - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" - } - }, - "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=" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "1.0.2" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "date-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", - "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", - "requires": { - "time-zone": "1.0.0" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "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=" - }, - "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" - } - }, - "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==" - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" - }, - "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" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "empower-core": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", - "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", - "requires": { - "call-signature": "0.0.2", - "core-js": "2.5.0" - } - }, - "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.2.0", - "tapable": "0.1.10" - }, - "dependencies": { - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=" - } - } - }, - "equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=" - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "requires": { - "prr": "0.0.0" - } - }, - "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" - } - }, - "es6-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.0.2.tgz", - "integrity": "sha1-7sXHJurO9Rt/a3PCDbbhsTsGnJg=" - }, - "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=" - }, - "espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", - "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", - "requires": { - "is-url": "1.2.2", - "path-is-absolute": "1.0.1", - "source-map": "0.5.6", - "xtend": "4.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" - }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "requires": { - "core-js": "2.5.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "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" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "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=", - "requires": { - "fill-range": "2.2.3" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "fast-diff": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.1.tgz", - "integrity": "sha1-CuoOTmBbaiGJ8Ok21Lf7rxt8/Zs=" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "requires": { - "is-object": "1.0.1", - "merge-descriptors": "1.0.1" - } - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "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=", - "requires": { - "commondir": "1.0.1", - "make-dir": "1.0.0", - "pkg-dir": "2.0.0" - } - }, - "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" - } - }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "1.0.2" - } - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "requires": { - "samsam": "1.2.1" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "2.6.2", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": 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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": 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" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": 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.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "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", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "function-name-support": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/function-name-support/-/function-name-support-0.2.0.tgz", - "integrity": "sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE=" - }, - "get-port": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.1.0.tgz", - "integrity": "sha1-7wGxioTKZIaXD/meVERhQac//T4=" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "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=", - "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=", - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "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" - } - } - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "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-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "has-yarn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz", - "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=" - }, - "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" - } - }, - "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==" - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "hullabaloo-config-manager": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", - "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==", - "requires": { - "dot-prop": "4.2.0", - "es6-error": "4.0.2", - "graceful-fs": "4.1.11", - "indent-string": "3.2.0", - "json5": "0.5.1", - "lodash.clonedeep": "4.5.0", - "lodash.clonedeepwith": "4.5.0", - "lodash.isequal": "4.5.0", - "lodash.merge": "4.6.0", - "md5-hex": "2.0.0", - "package-hash": "2.0.0", - "pkg-dir": "2.0.0", - "resolve-from": "3.0.0", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "requires": { - "graceful-fs": "4.1.11", - "lodash.flattendeep": "4.4.0", - "md5-hex": "2.0.0", - "release-zalgo": "1.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "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=" - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "import-local": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", - "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "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.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" - }, - "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" - } - }, - "irregular-plurals": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz", - "integrity": "sha512-njf5A+Mxb3kojuHd1DzISjjIl+XhyzovXEOyPPSzdQozq/Lf2tN27mOrAAsxEPZxpn6I4MGzs1oo9TxXxPFpaA==" - }, - "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=", - "requires": { - "binary-extensions": "1.10.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" - }, - "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-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "requires": { - "ci-info": "1.0.0" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "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=", - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-error": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.1.tgz", - "integrity": "sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw=" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "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=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "3.2.2" - } - }, - "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-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "requires": { - "symbol-observable": "0.2.4" - } - }, - "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-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "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-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" - }, - "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.9.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "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.5" - } - }, - "last-line-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz", - "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=", - "requires": { - "through2": "2.0.3" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "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=" - }, - "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" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "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" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.clonedeepwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "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.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" - }, - "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=" - }, - "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" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "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" - } - }, - "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "requires": { - "pify": "2.3.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "matcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.0.0.tgz", - "integrity": "sha1-qvDEgW62m5IJRnQXViXzRmsOPhk=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=" - }, - "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "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=", - "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" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "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=", - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "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" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "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=", - "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=", - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "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.3" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" - }, - "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=" - }, - "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" - } - }, - "module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", - "optional": true - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" - }, - "node-libs-browser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", - "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", - "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.3.0", - "domain-browser": "1.1.7", - "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.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.4", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "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=", - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "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" - } - }, - "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=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "observable-to-promise": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", - "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=", - "requires": { - "is-observable": "0.2.0", - "symbol-observable": "1.0.4" - }, - "dependencies": { - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - } - } - }, - "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=", - "requires": { - "mimic-fn": "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.3" - } - }, - "option-chain": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-1.0.0.tgz", - "integrity": "sha1-k41zvU4Xg/lI00AjZEraI2aeMPI=" - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "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=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "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" - } - }, - "package-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", - "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=", - "requires": { - "md5-hex": "1.3.0" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.4.1" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "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-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "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-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "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" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "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" - } - }, - "pbkdf2-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", - "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=" - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", - "requires": { - "pinkie": "1.0.0" - } - }, - "pkg-conf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", - "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", - "requires": { - "find-up": "2.1.0", - "load-json-file": "2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "2.1.0" - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "requires": { - "irregular-plurals": "1.3.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "requires": { - "is-finite": "1.0.2", - "parse-ms": "1.0.1", - "plur": "1.0.0" - }, - "dependencies": { - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=" - } - } - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "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=" - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "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=", - "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=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "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.4", - "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=" - } - } - }, - "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=", - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - } - } - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", - "requires": { - "rc": "1.2.1", - "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=", - "requires": { - "rc": "1.2.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "requires": { - "es6-error": "4.0.2" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "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" - } - }, - "require-precompiled": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", - "integrity": "sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=" - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "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" - } - }, - "ripemd160": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "samsam": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", - "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "5.4.1" - } - }, - "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=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "sha.js": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", - "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=" - }, - "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=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sinon": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", - "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", - "requires": { - "diff": "3.3.0", - "formatio": "1.2.0", - "lolex": "1.6.0", - "native-promise-only": "0.8.1", - "path-to-regexp": "1.7.0", - "samsam": "1.2.1", - "text-encoding": "0.6.4", - "type-detect": "4.0.3" - } - }, - "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==", - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "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" - } - }, - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "requires": { - "source-map": "0.5.6" - } - }, - "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=" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "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" - } - }, - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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" - } - } - } - }, - "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" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-bom-buf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", - "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", - "requires": { - "is-utf8": "0.2.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-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - } - }, - "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=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=" - }, - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=" - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "0.7.0" - } - }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "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" - } - }, - "time-require": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", - "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", - "requires": { - "chalk": "0.4.0", - "date-time": "0.1.1", - "pretty-ms": "0.2.2", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" - } - }, - "date-time": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", - "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=" - }, - "parse-ms": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", - "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=" - }, - "pretty-ms": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", - "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", - "requires": { - "parse-ms": "0.1.2" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" - } - } - }, - "time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=" - }, - "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=" - }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", - "requires": { - "setimmediate": "1.0.5" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "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=" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=" - }, - "uglify-js": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", - "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", - "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - } - } - }, - "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=" - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, - "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" - } - }, - "unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", - "requires": { - "mkdirp": "0.5.1", - "os-tmpdir": "1.0.2", - "uid2": "0.0.3" - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "update-notifier": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", - "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", - "requires": { - "boxen": "1.2.1", - "chalk": "1.1.3", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "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" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", - "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", - "requires": { - "async": "0.9.2", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - } - } - }, - "webpack": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", - "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", - "requires": { - "acorn": "3.3.0", - "async": "1.5.2", - "clone": "1.0.2", - "enhanced-resolve": "0.9.1", - "interpret": "0.6.6", - "loader-utils": "0.2.17", - "memory-fs": "0.3.0", - "mkdirp": "0.5.1", - "node-libs-browser": "0.7.0", - "optimist": "0.6.1", - "supports-color": "3.2.3", - "tapable": "0.1.10", - "uglify-js": "2.7.5", - "watchpack": "0.2.9", - "webpack-core": "0.6.9" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" - }, - "dependencies": { - "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" - } - } - } - }, - "well-known-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-1.0.0.tgz", - "integrity": "sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg=" - }, - "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" - } - }, - "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", - "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=", - "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" - } - } - } - }, - "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=" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "write-json-file": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.2.0.tgz", - "integrity": "sha1-UYYlBruzthnu+reFnx/WxtBTCHY=", - "requires": { - "detect-indent": "5.0.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "pify": "2.3.0", - "sort-keys": "1.1.2", - "write-file-atomic": "2.1.0" - }, - "dependencies": { - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "1.1.0" - } - } - } - }, - "write-pkg": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.1.0.tgz", - "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", - "requires": { - "sort-keys": "2.0.0", - "write-json-file": "2.2.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "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" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - } - } - } - } -} diff --git a/docker-compose.yml b/docker-compose.yml index fa52f30adfb..d8091000699 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: command: start volumes: - "./packages/test-data:/home/vsftpd:ro" - - "./.tmp-test-data:/var/www/html:ro" + - "./packages/test-data:/var/www/html:ro" - "./packages/test-data:/home/user" ports: - "20:20" @@ -24,7 +24,7 @@ services: volumes: - ".:/home/circleci/project" - "./packages/test-data:/home/vsftpd:ro" - - "./.tmp-test-data:/var/www/html:ro" + - "./packages/test-data:/var/html:ro" - "./packages/test-data:/home/user" ports: - "20:20" diff --git a/lerna.json b/lerna.json index ea04ef403b4..2d92da360fc 100644 --- a/lerna.json +++ b/lerna.json @@ -1,9 +1,8 @@ { "lerna": "2.9.0", - "version": "1.2.0", + "version": "1.3.0", "packages": [ "packages/*", - "cumulus/tasks/*", - "cumulus/services/*" + "tasks/*" ] } diff --git a/package.json b/package.json index bb7ee36041b..9310bedd87b 100644 --- a/package.json +++ b/package.json @@ -51,12 +51,12 @@ "babel-preset-es2015": "^6.13.2", "babel-preset-es2017": "^6.24.1", "copy-webpack-plugin": "^4.0.1", - "eslint": "^4.18.2", - "eslint-config-airbnb": "^10.0.0", - "eslint-plugin-import": "^1.13.0", - "eslint-plugin-jsdoc": "^3.3.1", - "eslint-plugin-jsx-a11y": "^2.1.0", - "eslint-plugin-react": "^6.0.0", + "eslint": "^4.19.1", + "eslint-config-airbnb": "^16.1.0", + "eslint-plugin-import": "^2.9.0", + "eslint-plugin-jsdoc": "^3.5.0", + "eslint-plugin-jsx-a11y": "^6.0.3", + "eslint-plugin-react": "^7.7.0", "exports-loader": "^0.6.3", "json-loader": "^0.5.4", "lerna": "^2.9.0", diff --git a/packages/api/config/lambdas.yml b/packages/api/config/lambdas.yml index c5b8699e34c..afb0b191e38 100644 --- a/packages/api/config/lambdas.yml +++ b/packages/api/config/lambdas.yml @@ -99,7 +99,7 @@ jobs: CustomBootstrap: handler: index.bootstrap timeout: 100 - memory: 256 + memory: 512 source: 'node_modules/@cumulus/api/dist/' envs: internal: '{{buckets.internal}}' diff --git a/packages/api/endpoints/rules.js b/packages/api/endpoints/rules.js index 46a5c87960c..047a3a7a9cb 100644 --- a/packages/api/endpoints/rules.js +++ b/packages/api/endpoints/rules.js @@ -2,7 +2,6 @@ 'use strict'; const _get = require('lodash.get'); -const { justLocalRun } = require('@cumulus/common/local-helpers'); const { inTestMode } = require('@cumulus/common/test-utils'); const { handle } = require('../lib/response'); const models = require('../models'); @@ -10,10 +9,11 @@ const { RecordDoesNotExist } = require('../lib/errors'); const { Search } = require('../es/search'); /** - * List all providers. - * @param {object} event aws lambda event object. - * @param {callback} cb aws lambda callback function - * @return {undefined} + * List all rules. + * + * @param {Object} event - aws lambda event object. + * @param {function} cb - aws lambda callback function + * @returns {Object} list of rules */ function list(event, cb) { const search = new Search(event, 'rule'); @@ -22,9 +22,10 @@ function list(event, cb) { /** * Query a single rule. - * @param {object} event aws lambda event object. - * @param {string} granuleId the id of the granule. - * @return {object} a single granule object. + * + * @param {Object} event - aws lambda event object. + * @param {function} cb - aws lambda callback function + * @returns {Object} a single granule object. */ function get(event, cb) { const name = _get(event.pathParameters, 'name'); @@ -40,8 +41,10 @@ function get(event, cb) { /** * Creates a new rule - * @param {object} event aws lambda event object. - * @return {object} returns the collection that was just saved. + * + * @param {Object} event - aws lambda event object. + * @param {function} cb - aws lambda callback function + * @returns {Object} returns the collection that was just saved. */ function post(event, cb) { let data = _get(event, 'body', '{}'); @@ -64,10 +67,12 @@ function post(event, cb) { /** * Updates an existing rule - * @param {object} event aws lambda event object. - * @return {object} a mapping of the updated properties. + * + * @param {Object} event - aws lambda event object. + * @param {function} cb - aws lambda callback function + * @returns {Object} a mapping of the updated properties. */ -async function put(event) { +async function put(event, cb) { const name = _get(event.pathParameters, 'name'); let data = _get(event, 'body', '{}'); @@ -78,14 +83,10 @@ async function put(event) { // if the data includes any fields other than state and rule.value // throw error - if (action && action !== 'rerun') { + if (!action || action !== 'rerun') { let check = Object.keys(data).filter((f) => (f !== 'state' && f !== 'rule')); - if (data.rule) { - check = check.concat(Object.keys(data.rule).filter((f) => f !== 'value')); - } - if (check.length > 0) { - throw new Error('Only state and rule.value values can be changed'); - } + if (data.rule) check = check.concat(Object.keys(data.rule).filter((f) => f !== 'value')); + if (check.length > 0) return cb({ message: 'Only state and rule.value values can be changed' }); } // get the record first @@ -94,30 +95,47 @@ async function put(event) { originalData = await model.get({ name }); } catch (e) { - if (e instanceof RecordDoesNotExist) { - throw new Error({ message: 'Record does not exist' }); - } + if (e instanceof RecordDoesNotExist) return cb({ message: 'Record does not exist' }); + return cb(e); } // if rule type is onetime no change is allowed unless it is a rerun if (action === 'rerun') { await models.Rule.invoke(originalData); - return; + return cb(null, originalData); } - return model.update(originalData, data); + return model.update(originalData, data) + .then((d) => cb(null, d)) + .catch((err) => cb(err)); } -async function del(event) { +/** + * deletes a rule + * + * @param {Object} event - aws lambda event object. + * @param {function} cb - aws lambda callback function + * @returns {Object} returns the collection that was just saved. + */ +async function del(event, cb) { let name = _get(event.pathParameters, 'name', ''); const model = new models.Rule(); name = name.replace(/%20/g, ' '); - await model.get({ name }).then((record) => model.delete(record)); - return { message: 'Record deleted' }; + return model.get({ name }) + .then((record) => model.delete(record)) + .then(() => cb(null, { message: 'Record deleted' })) + .catch((err) => cb(err)); } +/** + * Looks up the httpMethod in the lambda event and performs rule's operations accordingly + * + * @param {Object} event - lambda event + * @param {Object} context - lambda context + * @returns {(error|string)} Success message or error + */ function handler(event, context) { return handle(event, context, !inTestMode() /* authCheck */, (cb) => { if (event.httpMethod === 'GET' && event.pathParameters) { @@ -127,10 +145,10 @@ function handler(event, context) { post(event, cb); } else if (event.httpMethod === 'PUT' && event.pathParameters) { - put(event).then((r) => cb(null, r)).catch((e) => cb(JSON.stringify(e))); + put(event, cb); } else if (event.httpMethod === 'DELETE' && event.pathParameters) { - del(event).then((r) => cb(null, r)).catch((e) => cb(JSON.stringify(e))); + del(event, cb); } else { list(event, cb); diff --git a/packages/api/package.json b/packages/api/package.json index 409cb888c5f..14798074c39 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/api", - "version": "1.2.0", + "version": "1.3.0", "description": "Lambda functions for handling all daac's API operations", "main": "index.js", "scripts": { @@ -33,10 +33,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/cmrjs": "^1.2.0", - "@cumulus/common": "^1.2.0", - "@cumulus/ingest": "^1.2.0", - "@cumulus/pvl": "^1.2.0", + "@cumulus/cmrjs": "^1.3.0", + "@cumulus/common": "^1.3.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/pvl": "^1.3.0", "ajv": "^5.2.2", "archiver": "^2.1.1", "aws-sdk": "^2.95.0", diff --git a/packages/api/tests/test-endpoints-rules.js b/packages/api/tests/test-endpoints-rules.js index 84ee86b11a0..dd65ae896c2 100644 --- a/packages/api/tests/test-endpoints-rules.js +++ b/packages/api/tests/test-endpoints-rules.js @@ -74,7 +74,7 @@ test('GET gets a rule', (t) => { }); test('POST creates a rule', (t) => { - const newRule = Object.assign({}, testRule, {name: 'make_waffles'}); + const newRule = Object.assign({}, testRule, { name: 'make_waffles' }); const postEvent = { httpMethod: 'POST', body: JSON.stringify(newRule) @@ -82,21 +82,67 @@ test('POST creates a rule', (t) => { return testEndpoint(rulesEndpoint, postEvent, (response) => { const { message, record } = JSON.parse(response.body); t.is(message, 'Record saved'); - t.is(record.name, newRule.name); + newRule.updatedAt = record.updatedAt; + t.deepEqual(record, newRule); + }); +}); + +test('POST returns a record exists when one exists', (t) => { + const newRule = Object.assign({}, testRule); + const postEvent = { + httpMethod: 'POST', + body: JSON.stringify(newRule) + }; + return testEndpoint(rulesEndpoint, postEvent, (response) => { + const { message, record } = JSON.parse(response.body); + t.is(message, `A record already exists for ${newRule.name}`); + t.falsy(record); }); }); test('PUT updates a rule', (t) => { + const newRule = Object.assign({}, testRule, { state: 'ENABLED' }); const updateEvent = { - body: JSON.stringify({state: 'ENABLED'}), + body: JSON.stringify({ state: 'ENABLED' }), pathParameters: { name: testRule.name }, httpMethod: 'PUT' }; return testEndpoint(rulesEndpoint, updateEvent, (response) => { - const { state } = JSON.parse(response.body); - t.is(state, 'ENABLED'); + const record = JSON.parse(response.body); + newRule.updatedAt = record.updatedAt; + t.deepEqual(record, newRule); + }); +}); + +test('PUT returns "only state and rule.value values can be changed"', (t) => { + const updateEvent = { + body: JSON.stringify({ provider: 'new-whole-foods' }), + pathParameters: { + name: testRule.name + }, + httpMethod: 'PUT' + }; + return testEndpoint(rulesEndpoint, updateEvent, (response) => { + const { message, record } = JSON.parse(response.body); + t.is(message, 'Only state and rule.value values can be changed'); + t.falsy(record); + }); +}); + +test('PUT returns "record does not exist"', (t) => { + const updateEvent = { + body: JSON.stringify({ state: 'ENABLED' }), + pathParameters: { + name: 'new_make_coffee' + }, + httpMethod: 'PUT' + }; + return testEndpoint(rulesEndpoint, updateEvent, (response) => { + const { message, record } = JSON.parse(response.body); + t.is(message, 'Record does not exist'); + t.falsy(record); }); }); @@ -113,5 +159,3 @@ test('DELETE deletes a rule', (t) => { }); }); -test.todo('POST returns a record exists when one exists'); - diff --git a/packages/cmrjs/package.json b/packages/cmrjs/package.json index 435cd524b10..eb992305867 100644 --- a/packages/cmrjs/package.json +++ b/packages/cmrjs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cmrjs", - "version": "1.2.0", + "version": "1.3.0", "description": "A node SDK for CMR", "scripts": { "test": "echo 'no tests'" @@ -26,7 +26,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "got": "^7.1.0", "json-loader": "^0.5.4", "lodash.property": "^4.4.2", diff --git a/packages/common/aws.js b/packages/common/aws.js index 08ef45fcd2f..71a955b92d8 100644 --- a/packages/common/aws.js +++ b/packages/common/aws.js @@ -10,6 +10,7 @@ const log = require('./log'); const string = require('./string'); const { inTestMode, randomString, testAwsClient } = require('./test-utils'); const promiseRetry = require('promise-retry'); +const pump = require('pump'); const region = exports.region = process.env.AWS_DEFAULT_REGION || 'us-east-1'; if (region) { @@ -151,18 +152,22 @@ exports.promiseS3Upload = (params) => { /** * Downloads the given s3Obj to the given filename in a streaming manner - * @param s3Obj The parameters to send to S3 getObject call - * @param filename The output filename + * + * @param {Object} s3Obj - The parameters to send to S3 getObject call + * @param {string} filepath - The filepath of the file that is downloaded + * @returns {Promise} - returns filename if successful */ -exports.downloadS3File = (s3Obj, filename) => { +exports.downloadS3File = (s3Obj, filepath) => { const s3 = exports.s3(); - const file = fs.createWriteStream(filename); + const fileWriteStream = fs.createWriteStream(filepath); + return new Promise((resolve, reject) => { - s3.getObject(s3Obj) - .createReadStream() - .pipe(file) - .on('finish', () => resolve(filename)) - .on('error', reject); + const objectReadStream = s3.getObject(s3Obj).createReadStream(); + + pump(objectReadStream, fileWriteStream, (err) => { + if (err) reject(err); + else resolve(filepath); + }); }); }; diff --git a/packages/common/package.json b/packages/common/package.json index 2484345ab73..b4f9578588d 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/common", - "version": "1.2.0", + "version": "1.3.0", "description": "Common utilities used across tasks", "keywords": [ "GIBS", @@ -44,7 +44,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/test-data": "^1.2.0", + "@cumulus/test-data": "^1.3.0", "ajv": "^5.0.4-beta.3", "ajv-cli": "^1.1.1", "async": "^2.0.0", diff --git a/packages/common/tests/aws.js b/packages/common/tests/aws.js index 6bdee2a6838..98eb01fe6f4 100644 --- a/packages/common/tests/aws.js +++ b/packages/common/tests/aws.js @@ -1,5 +1,8 @@ 'use strict'; +const fs = require('fs'); +const path = require('path'); +const { tmpdir } = require('os'); const test = require('ava'); const aws = require('../aws'); const { randomString } = require('../test-utils'); @@ -43,3 +46,36 @@ test('listS3ObjectsV2 handles truncated case', async (t) => { return aws.recursivelyDeleteS3Bucket(Bucket); }); + +test('downloadS3File rejects promise if key not found', async (t) => { + const Bucket = randomString(); + await aws.s3().createBucket({ Bucket }).promise(); + + try { + await aws.downloadS3File({ Bucket, Key: 'not-gonna-find-it' }, '/tmp/wut'); + } + catch (err) { + t.is(err.message, 'The specified key does not exist.'); + } +}); + +test('downloadS3File resolves filepath if key is found', async (t) => { + const Bucket = randomString(); + const Key = 'example'; + const Body = 'example'; + + await aws.s3().createBucket({ Bucket }).promise(); + await aws.s3().putObject({ Bucket, Key: Key, Body: Body }).promise(); + + const params = { Bucket, Key: Key }; + const filepath = await aws.downloadS3File(params, path.join(tmpdir(), 'example')); + + const result = await new Promise((resolve, reject) => { + fs.readFile(filepath, 'utf-8', (err, data) => { + if (err) reject(err); + else resolve(data); + }); + }); + + t.is(result, Body); +}); diff --git a/packages/deployment/package.json b/packages/deployment/package.json index 9bba4219745..106fe27c720 100644 --- a/packages/deployment/package.json +++ b/packages/deployment/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/deployment", - "version": "1.1.4", + "version": "1.3.0", "description": "Deployment templates for cumulus", "scripts": { "test": "ava --no-color", diff --git a/packages/ingest/package.json b/packages/ingest/package.json index 3f96ad56acd..dbe5c7cc852 100644 --- a/packages/ingest/package.json +++ b/packages/ingest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/ingest", - "version": "1.2.0", + "version": "1.3.0", "description": "Ingest utilities", "scripts": { "test": "ava" @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", - "@cumulus/pvl": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/common": "^1.3.0", + "@cumulus/pvl": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "aws-sdk": "^2.4.11", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", diff --git a/packages/integration-tests/bin/cli.js b/packages/integration-tests/bin/cli.js index 7a8f9a6eeeb..979d6ce4c68 100755 --- a/packages/integration-tests/bin/cli.js +++ b/packages/integration-tests/bin/cli.js @@ -48,8 +48,10 @@ program { name: 'bucket-name', value: program.bucketName }, { name: 'workflow', value: program.workflow }, { name: 'input-file', value: program.inputFile }])) { - testRunner.testWorkflow(program.stackName, program.bucketName, - program.workflow, program.inputFile); + testRunner.testWorkflow( + program.stackName, program.bucketName, + program.workflow, program.inputFile + ); } }); diff --git a/packages/integration-tests/index.js b/packages/integration-tests/index.js index b8a731f0633..352f8aacc0c 100644 --- a/packages/integration-tests/index.js +++ b/packages/integration-tests/index.js @@ -3,7 +3,7 @@ const uuidv4 = require('uuid/v4'); const fs = require('fs-extra'); const { s3, sfn } = require('@cumulus/common/aws'); -const lambda = require('./lambda'); +const sfnStep = require('./sfnStep'); const executionStatusNumRetries = 20; const waitPeriodMs = 5000; @@ -69,11 +69,13 @@ async function waitForCompletedExecution(executionArn) { let statusCheckCount = 0; // While execution is running, check status on a time interval + /* eslint-disable no-await-in-loop */ while (executionStatus === 'RUNNING' && statusCheckCount < executionStatusNumRetries) { await timeout(waitPeriodMs); executionStatus = await getExecutionStatus(executionArn); - statusCheckCount++; + statusCheckCount += 1; } + /* eslint-enable no-await-in-loop */ if (executionStatus === 'RUNNING' && statusCheckCount >= executionStatusNumRetries) { //eslint-disable-next-line max-len @@ -122,8 +124,7 @@ async function startWorkflowExecution(workflowArn, inputFile) { */ async function executeWorkflow(stackName, bucketName, workflowName, inputFile) { const workflowArn = await getWorkflowArn(stackName, bucketName, workflowName); - const execution = await startWorkflowExecution(workflowArn, inputFile); - const executionArn = execution.executionArn; + const { executionArn } = await startWorkflowExecution(workflowArn, inputFile); console.log(`Executing workflow: ${workflowName}. Execution ARN ${executionArn}`); @@ -161,5 +162,10 @@ async function testWorkflow(stackName, bucketName, workflowName, inputFile) { module.exports = { testWorkflow, executeWorkflow, - getLambdaOutput: lambda.getLambdaOutput + ActivityStep: sfnStep.ActivityStep, + LambdaStep: sfnStep.LambdaStep, + /** + * @deprecated Since version 1.3. To be deleted version 2.0. sfnStep.LambdaStep.getStepOutput instead. + */ + getLambdaOutput: sfnStep.LambdaStep.getStepOutput }; diff --git a/packages/integration-tests/lambda.js b/packages/integration-tests/lambda.js deleted file mode 100644 index de454dab22a..00000000000 --- a/packages/integration-tests/lambda.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -const { sfn } = require('@cumulus/common/aws'); - -const lambdaScheduleEvents = [ - 'LambdaFunctionScheduled', - 'LambdaFunctionScheduleFailed' -]; - -const lambdaStartedEvents = [ - 'LambdaFunctionStartFailed', - 'LambdaFunctionStarted' -]; - -const lambdaCompletedEvents = [ - 'LambdaFunctionFailed', - 'LambdaFunctionSucceeded', - 'LambdaFunctionTimedOut' -]; - -/** - * Get the events for the lambda execution for the given workflow execution. - * This function currently assumes one execution of the given lambda per workflow. - * - * @param {string} workflowExecutionArn - Arn of the workflow execution - * @param {string} lambdaName - name of the lambda - * @returns {Object} an object containing a schedule event, start event, and complete - * event if exist, null if cannot find the lambda - */ -async function getLambdaExecution(workflowExecutionArn, lambdaName) { - const executionHistory = ( - await sfn().getExecutionHistory({ executionArn: workflowExecutionArn }).promise() - ); - - // Get the event where the lambda was scheduled - const scheduleEvent = executionHistory.events.find((event) => ( - lambdaScheduleEvents.includes(event.type)) && - (event.lambdaFunctionScheduledEventDetails.resource.includes(lambdaName)) - ); - - if (scheduleEvent === null) { - console.log(`Could not find lambda ${lambdaName} in execution.`); - return null; - } - - let startEvent = null; - let completeEvent = null; - - if (scheduleEvent.type !== 'LambdaFunctionScheduleFailed') { - startEvent = executionHistory.events.find((event) => - (lambdaStartedEvents.includes(event.type)) && - (event.previousEventId === scheduleEvent.id)); - - if (startEvent !== null && startEvent.type !== 'LambdaFunctionStartFailed') { - completeEvent = executionHistory.events.find((event) => - (lambdaCompletedEvents.includes(event.type)) && - (event.previousEventId === startEvent.id)); - } - } - - return { scheduleEvent, startEvent, completeEvent }; -} - -/** - * Get the output payload from the lambda, if the lambda succeeds - * - * @param {string} workflowExecutionArn - Arn of the workflow execution - * @param {string} lambdaName - name of the lambda - * @returns {Object} object containing the payload, null if error - */ -async function getLambdaOutput(workflowExecutionArn, lambdaName) { - const lambdaExecution = await getLambdaExecution(workflowExecutionArn, lambdaName); - - if (lambdaExecution === null) { - console.log(`Could not find lambda ${lambdaName} in execution.`); - return null; - } - - if (lambdaExecution.completeEvent === null || - lambdaExecution.completeEvent.type !== 'LambdaFunctionSucceeded') { - console.log(`Lambda ${lambdaName} was not successful.`); - return null; - } - - const succeededDetails = JSON.parse(lambdaExecution.completeEvent.lambdaFunctionSucceededEventDetails.output.toString()); - return succeededDetails; -} - -exports.getLambdaOutput = getLambdaOutput; diff --git a/packages/integration-tests/local.js b/packages/integration-tests/local.js index e28bd51e207..9218e199cca 100644 --- a/packages/integration-tests/local.js +++ b/packages/integration-tests/local.js @@ -2,6 +2,7 @@ * Includes helper functions for replicating Step Function Workflows * locally */ + 'use strict'; const path = require('path'); @@ -40,11 +41,7 @@ async function downloadCMA(version) { * @returns {Promise.} an array of undefined values */ function copyCMAToTasks(workflow, src, cmaFolder) { - return Promise.all( - workflow.steps.map( - (step) => fs.copy(src, path.join(step.lambda, cmaFolder)) - ) - ); + return Promise.all(workflow.steps.map((step) => fs.copy(src, path.join(step.lambda, cmaFolder)))); } /** @@ -55,11 +52,7 @@ function copyCMAToTasks(workflow, src, cmaFolder) { * @returns {Promise.} an array of undefined values */ function deleteCMAFromTasks(workflow, cmaFolder) { - return Promise.all( - workflow.steps.map( - (step) => fs.remove(path.join(step.lambda, cmaFolder)) - ) - ); + return Promise.all(workflow.steps.map((step) => fs.remove(path.join(step.lambda, cmaFolder)))); } /** diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index 96ed89d8f91..498e420eab8 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/integration-tests", - "version": "1.2.0", + "version": "1.3.0", "description": "Integration tests", "bin": { "cumulus-test": "./bin/cli.js" @@ -29,8 +29,8 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", - "@cumulus/deployment": "^1.1.4", + "@cumulus/common": "^1.3.0", + "@cumulus/deployment": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.24.1", diff --git a/packages/integration-tests/sfnStep.js b/packages/integration-tests/sfnStep.js new file mode 100644 index 00000000000..4a30cba45e1 --- /dev/null +++ b/packages/integration-tests/sfnStep.js @@ -0,0 +1,166 @@ +'use strict'; + +const { sfn } = require('@cumulus/common/aws'); + +/** + * `SfnStep` provides methods for getting the output of a step within an AWS + * Step Function for a specific execution. +*/ +class SfnStep { + /** + * `getStartEvent` gets the "start" event for a step, given its schedule event + * + * @param {Object} executionHistory - AWS Step Function execution history + * @param {Object} scheduleEvent - AWS Step Function schedule-type event + * @returns {Object} - AWS Step Function start-type event + */ + getStartEvent(executionHistory, scheduleEvent) { + return executionHistory.events.find((event) => { + const isStartEvent = this.startEvents.includes(event.type); + const previousEventIsScheduleEvent = event.previousEventId === scheduleEvent.id; + return isStartEvent && previousEventIsScheduleEvent; + }); + } + + /** + * `getCompletionEvent` gets the "completion" event for a step, given its start event + * + * @param {Object} executionHistory - AWS Step Function execution history + * @param {Object} startEvent - AWS Step Function start-type event + * @returns {Object} - AWS Step Function completion-type event + */ + getCompletionEvent(executionHistory, startEvent) { + return executionHistory.events.find((event) => { + const isCompletionEvent = this.completionEvents.includes(event.type); + const previousEventIsStartEvent = event.previousEventId === startEvent.id; + return isCompletionEvent && previousEventIsStartEvent; + }); + } + + /** + * Get the events for the step execution for the given workflow execution. + * This function currently assumes one execution of the given step (by step name) per workflow. + * + * @param {string} workflowExecutionArn - Arn of the workflow execution + * @param {string} stepName - name of the step + * @returns {Object} an object containing a schedule event, start event, and complete + * event if exist, null if cannot find the step + */ + async getStepExecution(workflowExecutionArn, stepName) { + const executionHistory = ( + await sfn().getExecutionHistory({ executionArn: workflowExecutionArn }).promise() + ); + + // Get the event where the step was scheduled + const scheduleEvent = executionHistory.events.find((event) => { + const eventScheduled = this.scheduleEvents.includes(event.type); + const eventDetails = event[this.eventDetailsKeys.scheduled]; + const isStepEvent = eventDetails && eventDetails.resource.includes(stepName); + return eventScheduled && isStepEvent; + }); + + if (!scheduleEvent) { + console.log(`Could not find step ${stepName} in execution.`); + return null; + } + + let startEvent = null; + let completeEvent = null; + + if (scheduleEvent.type !== this.startFailedEvent) { + startEvent = this.getStartEvent(executionHistory, scheduleEvent, this); + + if (startEvent !== null && startEvent.type !== this.startFailedEvent) { + completeEvent = this.getCompletionEvent(executionHistory, startEvent, this); + } + } + + return { scheduleEvent, startEvent, completeEvent }; + } + + /** + * Get the output payload from the step, if the step succeeds + * + * @param {string} workflowExecutionArn - Arn of the workflow execution + * @param {string} stepName - name of the step + * @returns {Object} object containing the payload, null if error + */ + async getStepOutput(workflowExecutionArn, stepName) { + const stepExecution = await this.getStepExecution(workflowExecutionArn, stepName, this); + + if (stepExecution === null) { + console.log(`Could not find step ${stepName} in execution.`); + return null; + } + + if (stepExecution.completeEvent === null || + stepExecution.completeEvent.type !== this.successEvent) { + console.log(`Step ${stepName} was not successful.`); + return null; + } + + return JSON.parse(stepExecution.completeEvent[this.eventDetailsKeys.succeeded].output.toString()); + } +} + +/** + * `LambdaStep` is a step inside a step function that runs an AWS Lambda function. + */ +class LambdaStep extends SfnStep { + //eslint-disable-next-line require-jsdoc + constructor() { + super(); + this.scheduleFailedEvent = 'LambdaFunctionScheduleFailed'; + this.scheduleEvents = [ + this.scheduleFailedEvent, + 'LambdaFunctionScheduled' + ]; + this.startFailedEvent = 'LambdaFunctionStartFailed'; + this.startEvents = [ + this.startFailedEvent, + 'LambdaFunctionStarted' + ]; + this.successEvent = 'LambdaFunctionSucceeded'; + this.completionEvents = [ + this.successEvent, + 'LambdaFunctionFailed', + 'LambdaFunctionTimedOut' + ]; + this.eventDetailsKeys = { + scheduled: 'lambdaFunctionScheduledEventDetails', + succeeded: 'lambdaFunctionSucceededEventDetails' + }; + } +} + +/** + * `ActivityStep` is a step inside a step function that runs an AWS ECS activity. + */ +class ActivityStep extends SfnStep { + //eslint-disable-next-line require-jsdoc + constructor() { + super(); + this.scheduleFailedEvent = 'ActivityScheduleFailed'; + this.scheduleEvents = [ + 'ActivityScheduled', + this.scheduleFailedEvent + ]; + this.startEvents = ['ActivityStarted']; + this.startFailedEvent = undefined; // there is no 'ActivityStartFailed' + this.successEvent = 'ActivitySucceeded'; + this.completionEvents = [ + this.successEvent, + 'ActivityFailed', + 'ActivityTimedOut' + ]; + this.eventDetailsKeys = { + scheduled: 'activityScheduledEventDetails', + succeeded: 'activitySucceededEventDetails' + }; + } +} + +module.exports = { + ActivityStep, + LambdaStep +}; diff --git a/packages/integration-tests/webpack.config.js b/packages/integration-tests/webpack.config.js index 3ed7304a281..8f44574f2be 100644 --- a/packages/integration-tests/webpack.config.js +++ b/packages/integration-tests/webpack.config.js @@ -19,4 +19,4 @@ module.exports = { loader: 'json' }] } -}; \ No newline at end of file +}; diff --git a/packages/pvl/package.json b/packages/pvl/package.json index 73a2bd0c722..0fce42333af 100644 --- a/packages/pvl/package.json +++ b/packages/pvl/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/pvl", - "version": "1.2.0", + "version": "1.3.0", "description": "Parse and serialize Parameter Value Language, a data markup language used by NASA", "main": "index.js", "scripts": { diff --git a/packages/task-debug/package.json b/packages/task-debug/package.json index 981914d126d..6840b97dca9 100644 --- a/packages/task-debug/package.json +++ b/packages/task-debug/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/task-debug", "private": true, - "version": "1.2.0", + "version": "1.3.0", "description": "A harness for debugging workflows.", "main": "index.js", "repository": { @@ -18,7 +18,7 @@ "test": "test" }, "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "commander": "^2.11.0" }, "devDependencies": { diff --git a/packages/test-data/package.json b/packages/test-data/package.json index 40f30b80593..7c36c2b4712 100644 --- a/packages/test-data/package.json +++ b/packages/test-data/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-data", - "version": "1.2.0", + "version": "1.3.0", "description": "Includes the test data for various packages", "keywords": [ "GIBS", diff --git a/cumulus/tasks/discover-s3-granules/README.md b/tasks/.deprecated/discover-s3-granules/README.md similarity index 100% rename from cumulus/tasks/discover-s3-granules/README.md rename to tasks/.deprecated/discover-s3-granules/README.md diff --git a/cumulus/tasks/discover-s3-granules/index.js b/tasks/.deprecated/discover-s3-granules/index.js similarity index 100% rename from cumulus/tasks/discover-s3-granules/index.js rename to tasks/.deprecated/discover-s3-granules/index.js diff --git a/cumulus/tasks/discover-s3-granules/package.json b/tasks/.deprecated/discover-s3-granules/package.json similarity index 87% rename from cumulus/tasks/discover-s3-granules/package.json rename to tasks/.deprecated/discover-s3-granules/package.json index 1061fe29fc5..b38b4cec9f5 100644 --- a/cumulus/tasks/discover-s3-granules/package.json +++ b/tasks/.deprecated/discover-s3-granules/package.json @@ -16,8 +16,8 @@ "scripts": { "test": "ava", "local": "node index.js | pino", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "ava": { diff --git a/cumulus/tasks/discover-s3-granules/schemas/config.json b/tasks/.deprecated/discover-s3-granules/schemas/config.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/schemas/config.json rename to tasks/.deprecated/discover-s3-granules/schemas/config.json diff --git a/cumulus/tasks/discover-s3-granules/schemas/output.json b/tasks/.deprecated/discover-s3-granules/schemas/output.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/schemas/output.json rename to tasks/.deprecated/discover-s3-granules/schemas/output.json diff --git a/cumulus/tasks/discover-s3-granules/tests/fixtures/input.json b/tasks/.deprecated/discover-s3-granules/tests/fixtures/input.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/tests/fixtures/input.json rename to tasks/.deprecated/discover-s3-granules/tests/fixtures/input.json diff --git a/cumulus/tasks/discover-s3-granules/tests/index.js b/tasks/.deprecated/discover-s3-granules/tests/index.js similarity index 100% rename from cumulus/tasks/discover-s3-granules/tests/index.js rename to tasks/.deprecated/discover-s3-granules/tests/index.js diff --git a/cumulus/tasks/discover-granules/webpack.config.js b/tasks/.deprecated/discover-s3-granules/webpack.config.js similarity index 100% rename from cumulus/tasks/discover-granules/webpack.config.js rename to tasks/.deprecated/discover-s3-granules/webpack.config.js diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/config/cloudformation.yml b/tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/copy-idx-from-s3-to-efs/config/cloudformation.yml rename to tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/config/cloudformation.yml diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/index.js b/tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/index.js similarity index 100% rename from cumulus/tasks/copy-idx-from-s3-to-efs/index.js rename to tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/index.js diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/package.json b/tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/package.json similarity index 100% rename from cumulus/tasks/copy-idx-from-s3-to-efs/package.json rename to tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/package.json diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/test/ast_l1t.yml b/tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/test/ast_l1t.yml similarity index 100% rename from cumulus/tasks/copy-idx-from-s3-to-efs/test/ast_l1t.yml rename to tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/test/ast_l1t.yml diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/test/copy-idx-spec.js b/tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/test/copy-idx-spec.js similarity index 100% rename from cumulus/tasks/copy-idx-from-s3-to-efs/test/copy-idx-spec.js rename to tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/test/copy-idx-spec.js diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/test/input_payload.json b/tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/test/input_payload.json similarity index 100% rename from cumulus/tasks/copy-idx-from-s3-to-efs/test/input_payload.json rename to tasks/.not_CMA_compliant/copy-idx-from-s3-to-efs/test/input_payload.json diff --git a/cumulus/tasks/delete-ingest-tracking-data/README.md b/tasks/.not_CMA_compliant/delete-ingest-tracking-data/README.md similarity index 100% rename from cumulus/tasks/delete-ingest-tracking-data/README.md rename to tasks/.not_CMA_compliant/delete-ingest-tracking-data/README.md diff --git a/cumulus/tasks/delete-ingest-tracking-data/config/cloudformation.yml b/tasks/.not_CMA_compliant/delete-ingest-tracking-data/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/delete-ingest-tracking-data/config/cloudformation.yml rename to tasks/.not_CMA_compliant/delete-ingest-tracking-data/config/cloudformation.yml diff --git a/cumulus/tasks/delete-ingest-tracking-data/index.js b/tasks/.not_CMA_compliant/delete-ingest-tracking-data/index.js similarity index 100% rename from cumulus/tasks/delete-ingest-tracking-data/index.js rename to tasks/.not_CMA_compliant/delete-ingest-tracking-data/index.js diff --git a/cumulus/tasks/delete-ingest-tracking-data/package.json b/tasks/.not_CMA_compliant/delete-ingest-tracking-data/package.json similarity index 100% rename from cumulus/tasks/delete-ingest-tracking-data/package.json rename to tasks/.not_CMA_compliant/delete-ingest-tracking-data/package.json diff --git a/cumulus/tasks/delete-ingest-tracking-data/test/filter-payload-spec.js b/tasks/.not_CMA_compliant/delete-ingest-tracking-data/test/filter-payload-spec.js similarity index 100% rename from cumulus/tasks/delete-ingest-tracking-data/test/filter-payload-spec.js rename to tasks/.not_CMA_compliant/delete-ingest-tracking-data/test/filter-payload-spec.js diff --git a/cumulus/tasks/delete-pdr-ftp/.babelrc b/tasks/.not_CMA_compliant/delete-pdr-ftp/.babelrc similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/.babelrc rename to tasks/.not_CMA_compliant/delete-pdr-ftp/.babelrc diff --git a/cumulus/tasks/delete-pdr-ftp/.gitignore b/tasks/.not_CMA_compliant/delete-pdr-ftp/.gitignore similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/.gitignore rename to tasks/.not_CMA_compliant/delete-pdr-ftp/.gitignore diff --git a/cumulus/tasks/delete-pdr-ftp/README.md b/tasks/.not_CMA_compliant/delete-pdr-ftp/README.md similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/README.md rename to tasks/.not_CMA_compliant/delete-pdr-ftp/README.md diff --git a/cumulus/tasks/delete-pdr-ftp/config/cloudformation.yml b/tasks/.not_CMA_compliant/delete-pdr-ftp/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/config/cloudformation.yml rename to tasks/.not_CMA_compliant/delete-pdr-ftp/config/cloudformation.yml diff --git a/cumulus/tasks/delete-pdr-ftp/ftp_util.js b/tasks/.not_CMA_compliant/delete-pdr-ftp/ftp_util.js similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/ftp_util.js rename to tasks/.not_CMA_compliant/delete-pdr-ftp/ftp_util.js diff --git a/cumulus/tasks/delete-pdr-ftp/index.js b/tasks/.not_CMA_compliant/delete-pdr-ftp/index.js similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/index.js rename to tasks/.not_CMA_compliant/delete-pdr-ftp/index.js diff --git a/cumulus/tasks/delete-pdr-ftp/package.json b/tasks/.not_CMA_compliant/delete-pdr-ftp/package.json similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/package.json rename to tasks/.not_CMA_compliant/delete-pdr-ftp/package.json diff --git a/cumulus/tasks/delete-pdr-ftp/test/delete-pdr-ftp-spec.js b/tasks/.not_CMA_compliant/delete-pdr-ftp/test/delete-pdr-ftp-spec.js similarity index 100% rename from cumulus/tasks/delete-pdr-ftp/test/delete-pdr-ftp-spec.js rename to tasks/.not_CMA_compliant/delete-pdr-ftp/test/delete-pdr-ftp-spec.js diff --git a/cumulus/tasks/delete-pdr-s3/.babelrc b/tasks/.not_CMA_compliant/delete-pdr-s3/.babelrc similarity index 100% rename from cumulus/tasks/delete-pdr-s3/.babelrc rename to tasks/.not_CMA_compliant/delete-pdr-s3/.babelrc diff --git a/cumulus/tasks/delete-pdr-s3/.gitignore b/tasks/.not_CMA_compliant/delete-pdr-s3/.gitignore similarity index 100% rename from cumulus/tasks/delete-pdr-s3/.gitignore rename to tasks/.not_CMA_compliant/delete-pdr-s3/.gitignore diff --git a/cumulus/tasks/delete-pdr-s3/README.md b/tasks/.not_CMA_compliant/delete-pdr-s3/README.md similarity index 100% rename from cumulus/tasks/delete-pdr-s3/README.md rename to tasks/.not_CMA_compliant/delete-pdr-s3/README.md diff --git a/cumulus/tasks/delete-pdr-s3/config/cloudformation.yml b/tasks/.not_CMA_compliant/delete-pdr-s3/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/delete-pdr-s3/config/cloudformation.yml rename to tasks/.not_CMA_compliant/delete-pdr-s3/config/cloudformation.yml diff --git a/cumulus/tasks/delete-pdr-s3/index.js b/tasks/.not_CMA_compliant/delete-pdr-s3/index.js similarity index 100% rename from cumulus/tasks/delete-pdr-s3/index.js rename to tasks/.not_CMA_compliant/delete-pdr-s3/index.js diff --git a/cumulus/tasks/delete-pdr-s3/package.json b/tasks/.not_CMA_compliant/delete-pdr-s3/package.json similarity index 100% rename from cumulus/tasks/delete-pdr-s3/package.json rename to tasks/.not_CMA_compliant/delete-pdr-s3/package.json diff --git a/cumulus/tasks/delete-pdr-s3/test/delete-pdr-s3.test.js b/tasks/.not_CMA_compliant/delete-pdr-s3/test/delete-pdr-s3.test.js similarity index 100% rename from cumulus/tasks/delete-pdr-s3/test/delete-pdr-s3.test.js rename to tasks/.not_CMA_compliant/delete-pdr-s3/test/delete-pdr-s3.test.js diff --git a/cumulus/tasks/discover-cmr-granules/README.md b/tasks/.not_CMA_compliant/discover-cmr-granules/README.md similarity index 100% rename from cumulus/tasks/discover-cmr-granules/README.md rename to tasks/.not_CMA_compliant/discover-cmr-granules/README.md diff --git a/cumulus/tasks/discover-cmr-granules/config/cloudformation.yml b/tasks/.not_CMA_compliant/discover-cmr-granules/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/discover-cmr-granules/config/cloudformation.yml rename to tasks/.not_CMA_compliant/discover-cmr-granules/config/cloudformation.yml diff --git a/cumulus/tasks/discover-cmr-granules/index.js b/tasks/.not_CMA_compliant/discover-cmr-granules/index.js similarity index 100% rename from cumulus/tasks/discover-cmr-granules/index.js rename to tasks/.not_CMA_compliant/discover-cmr-granules/index.js diff --git a/cumulus/tasks/discover-cmr-granules/package.json b/tasks/.not_CMA_compliant/discover-cmr-granules/package.json similarity index 100% rename from cumulus/tasks/discover-cmr-granules/package.json rename to tasks/.not_CMA_compliant/discover-cmr-granules/package.json diff --git a/cumulus/tasks/discover-cmr-granules/test/discover-cmr-granules-spec.js b/tasks/.not_CMA_compliant/discover-cmr-granules/test/discover-cmr-granules-spec.js similarity index 100% rename from cumulus/tasks/discover-cmr-granules/test/discover-cmr-granules-spec.js rename to tasks/.not_CMA_compliant/discover-cmr-granules/test/discover-cmr-granules-spec.js diff --git a/cumulus/tasks/discover-http-tiles/README.md b/tasks/.not_CMA_compliant/discover-http-tiles/README.md similarity index 100% rename from cumulus/tasks/discover-http-tiles/README.md rename to tasks/.not_CMA_compliant/discover-http-tiles/README.md diff --git a/cumulus/tasks/discover-http-tiles/apache-index-tile-crawler.js b/tasks/.not_CMA_compliant/discover-http-tiles/apache-index-tile-crawler.js similarity index 100% rename from cumulus/tasks/discover-http-tiles/apache-index-tile-crawler.js rename to tasks/.not_CMA_compliant/discover-http-tiles/apache-index-tile-crawler.js diff --git a/cumulus/tasks/discover-http-tiles/config/cloudformation.yml b/tasks/.not_CMA_compliant/discover-http-tiles/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/discover-http-tiles/config/cloudformation.yml rename to tasks/.not_CMA_compliant/discover-http-tiles/config/cloudformation.yml diff --git a/cumulus/tasks/discover-http-tiles/http-tile-crawler.js b/tasks/.not_CMA_compliant/discover-http-tiles/http-tile-crawler.js similarity index 100% rename from cumulus/tasks/discover-http-tiles/http-tile-crawler.js rename to tasks/.not_CMA_compliant/discover-http-tiles/http-tile-crawler.js diff --git a/cumulus/tasks/discover-http-tiles/index.js b/tasks/.not_CMA_compliant/discover-http-tiles/index.js similarity index 100% rename from cumulus/tasks/discover-http-tiles/index.js rename to tasks/.not_CMA_compliant/discover-http-tiles/index.js diff --git a/cumulus/tasks/discover-http-tiles/package.json b/tasks/.not_CMA_compliant/discover-http-tiles/package.json similarity index 100% rename from cumulus/tasks/discover-http-tiles/package.json rename to tasks/.not_CMA_compliant/discover-http-tiles/package.json diff --git a/cumulus/tasks/discover-http-tiles/test/discover-http-tiles-spec.js b/tasks/.not_CMA_compliant/discover-http-tiles/test/discover-http-tiles-spec.js similarity index 100% rename from cumulus/tasks/discover-http-tiles/test/discover-http-tiles-spec.js rename to tasks/.not_CMA_compliant/discover-http-tiles/test/discover-http-tiles-spec.js diff --git a/cumulus/tasks/discover-pdr/.babelrc b/tasks/.not_CMA_compliant/discover-pdr/.babelrc similarity index 100% rename from cumulus/tasks/discover-pdr/.babelrc rename to tasks/.not_CMA_compliant/discover-pdr/.babelrc diff --git a/cumulus/tasks/discover-pdr/.gitignore b/tasks/.not_CMA_compliant/discover-pdr/.gitignore similarity index 100% rename from cumulus/tasks/discover-pdr/.gitignore rename to tasks/.not_CMA_compliant/discover-pdr/.gitignore diff --git a/cumulus/tasks/discover-pdr/README.md b/tasks/.not_CMA_compliant/discover-pdr/README.md similarity index 100% rename from cumulus/tasks/discover-pdr/README.md rename to tasks/.not_CMA_compliant/discover-pdr/README.md diff --git a/cumulus/tasks/discover-pdr/config/cloudformation.yml b/tasks/.not_CMA_compliant/discover-pdr/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/discover-pdr/config/cloudformation.yml rename to tasks/.not_CMA_compliant/discover-pdr/config/cloudformation.yml diff --git a/cumulus/tasks/discover-pdr/index.js b/tasks/.not_CMA_compliant/discover-pdr/index.js similarity index 100% rename from cumulus/tasks/discover-pdr/index.js rename to tasks/.not_CMA_compliant/discover-pdr/index.js diff --git a/cumulus/tasks/discover-pdr/package.json b/tasks/.not_CMA_compliant/discover-pdr/package.json similarity index 100% rename from cumulus/tasks/discover-pdr/package.json rename to tasks/.not_CMA_compliant/discover-pdr/package.json diff --git a/cumulus/tasks/discover-pdr/pdr.js b/tasks/.not_CMA_compliant/discover-pdr/pdr.js similarity index 100% rename from cumulus/tasks/discover-pdr/pdr.js rename to tasks/.not_CMA_compliant/discover-pdr/pdr.js diff --git a/cumulus/tasks/discover-pdr/test/discover-pdr-spec.js b/tasks/.not_CMA_compliant/discover-pdr/test/discover-pdr-spec.js similarity index 100% rename from cumulus/tasks/discover-pdr/test/discover-pdr-spec.js rename to tasks/.not_CMA_compliant/discover-pdr/test/discover-pdr-spec.js diff --git a/cumulus/tasks/download-activity-mock/.babelrc b/tasks/.not_CMA_compliant/download-activity-mock/.babelrc similarity index 100% rename from cumulus/tasks/download-activity-mock/.babelrc rename to tasks/.not_CMA_compliant/download-activity-mock/.babelrc diff --git a/cumulus/tasks/download-activity-mock/.gitignore b/tasks/.not_CMA_compliant/download-activity-mock/.gitignore similarity index 100% rename from cumulus/tasks/download-activity-mock/.gitignore rename to tasks/.not_CMA_compliant/download-activity-mock/.gitignore diff --git a/cumulus/tasks/download-activity-mock/README.md b/tasks/.not_CMA_compliant/download-activity-mock/README.md similarity index 100% rename from cumulus/tasks/download-activity-mock/README.md rename to tasks/.not_CMA_compliant/download-activity-mock/README.md diff --git a/cumulus/tasks/download-activity-mock/index.js b/tasks/.not_CMA_compliant/download-activity-mock/index.js similarity index 100% rename from cumulus/tasks/download-activity-mock/index.js rename to tasks/.not_CMA_compliant/download-activity-mock/index.js diff --git a/cumulus/tasks/download-activity-mock/package.json b/tasks/.not_CMA_compliant/download-activity-mock/package.json similarity index 100% rename from cumulus/tasks/download-activity-mock/package.json rename to tasks/.not_CMA_compliant/download-activity-mock/package.json diff --git a/cumulus/tasks/download-activity-mock/sips.js b/tasks/.not_CMA_compliant/download-activity-mock/sips.js similarity index 100% rename from cumulus/tasks/download-activity-mock/sips.js rename to tasks/.not_CMA_compliant/download-activity-mock/sips.js diff --git a/cumulus/tasks/download-activity-mock/test/download-activity-mock-spec.js b/tasks/.not_CMA_compliant/download-activity-mock/test/download-activity-mock-spec.js similarity index 100% rename from cumulus/tasks/download-activity-mock/test/download-activity-mock-spec.js rename to tasks/.not_CMA_compliant/download-activity-mock/test/download-activity-mock-spec.js diff --git a/cumulus/tasks/filter-payload/README.md b/tasks/.not_CMA_compliant/filter-payload/README.md similarity index 100% rename from cumulus/tasks/filter-payload/README.md rename to tasks/.not_CMA_compliant/filter-payload/README.md diff --git a/cumulus/tasks/filter-payload/config/cloudformation.yml b/tasks/.not_CMA_compliant/filter-payload/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/filter-payload/config/cloudformation.yml rename to tasks/.not_CMA_compliant/filter-payload/config/cloudformation.yml diff --git a/cumulus/tasks/filter-payload/index.js b/tasks/.not_CMA_compliant/filter-payload/index.js similarity index 100% rename from cumulus/tasks/filter-payload/index.js rename to tasks/.not_CMA_compliant/filter-payload/index.js diff --git a/cumulus/tasks/filter-payload/package.json b/tasks/.not_CMA_compliant/filter-payload/package.json similarity index 100% rename from cumulus/tasks/filter-payload/package.json rename to tasks/.not_CMA_compliant/filter-payload/package.json diff --git a/cumulus/tasks/filter-payload/test/filter-payload-spec.js b/tasks/.not_CMA_compliant/filter-payload/test/filter-payload-spec.js similarity index 100% rename from cumulus/tasks/filter-payload/test/filter-payload-spec.js rename to tasks/.not_CMA_compliant/filter-payload/test/filter-payload-spec.js diff --git a/cumulus/tasks/generate-mrf/README.md b/tasks/.not_CMA_compliant/generate-mrf/README.md similarity index 100% rename from cumulus/tasks/generate-mrf/README.md rename to tasks/.not_CMA_compliant/generate-mrf/README.md diff --git a/cumulus/tasks/generate-mrf/config-gen.js b/tasks/.not_CMA_compliant/generate-mrf/config-gen.js similarity index 100% rename from cumulus/tasks/generate-mrf/config-gen.js rename to tasks/.not_CMA_compliant/generate-mrf/config-gen.js diff --git a/cumulus/tasks/generate-mrf/config/cloudformation.yml b/tasks/.not_CMA_compliant/generate-mrf/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/generate-mrf/config/cloudformation.yml rename to tasks/.not_CMA_compliant/generate-mrf/config/cloudformation.yml diff --git a/cumulus/tasks/generate-mrf/index.js b/tasks/.not_CMA_compliant/generate-mrf/index.js similarity index 100% rename from cumulus/tasks/generate-mrf/index.js rename to tasks/.not_CMA_compliant/generate-mrf/index.js diff --git a/cumulus/tasks/generate-mrf/package.json b/tasks/.not_CMA_compliant/generate-mrf/package.json similarity index 100% rename from cumulus/tasks/generate-mrf/package.json rename to tasks/.not_CMA_compliant/generate-mrf/package.json diff --git a/cumulus/tasks/generate-mrf/templates/empty-tiles/empty256.jpg b/tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty256.jpg similarity index 100% rename from cumulus/tasks/generate-mrf/templates/empty-tiles/empty256.jpg rename to tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty256.jpg diff --git a/cumulus/tasks/generate-mrf/templates/empty-tiles/empty256.png b/tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty256.png similarity index 100% rename from cumulus/tasks/generate-mrf/templates/empty-tiles/empty256.png rename to tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty256.png diff --git a/cumulus/tasks/generate-mrf/templates/empty-tiles/empty512.jpg b/tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty512.jpg similarity index 100% rename from cumulus/tasks/generate-mrf/templates/empty-tiles/empty512.jpg rename to tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty512.jpg diff --git a/cumulus/tasks/generate-mrf/templates/empty-tiles/empty512.png b/tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty512.png similarity index 100% rename from cumulus/tasks/generate-mrf/templates/empty-tiles/empty512.png rename to tasks/.not_CMA_compliant/generate-mrf/templates/empty-tiles/empty512.png diff --git a/cumulus/tasks/generate-mrf/templates/mrfgen_config.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/mrfgen_config.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/mrfgen_config.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/mrfgen_config.xml diff --git a/cumulus/tasks/generate-mrf/templates/products/_viirs.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/products/_viirs.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/products/_viirs.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/products/_viirs.xml diff --git a/cumulus/tasks/generate-mrf/templates/source-projections/_epsg3031.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/source-projections/_epsg3031.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/source-projections/_epsg3031.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/source-projections/_epsg3031.xml diff --git a/cumulus/tasks/generate-mrf/templates/source-projections/_epsg3413.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/source-projections/_epsg3413.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/source-projections/_epsg3413.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/source-projections/_epsg3413.xml diff --git a/cumulus/tasks/generate-mrf/templates/source-projections/_epsg4326.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/source-projections/_epsg4326.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/source-projections/_epsg4326.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/source-projections/_epsg4326.xml diff --git a/cumulus/tasks/generate-mrf/templates/target-projections/_epsg3031.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/target-projections/_epsg3031.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/target-projections/_epsg3031.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/target-projections/_epsg3031.xml diff --git a/cumulus/tasks/generate-mrf/templates/target-projections/_epsg3413.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/target-projections/_epsg3413.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/target-projections/_epsg3413.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/target-projections/_epsg3413.xml diff --git a/cumulus/tasks/generate-mrf/templates/target-projections/_epsg4326.xml b/tasks/.not_CMA_compliant/generate-mrf/templates/target-projections/_epsg4326.xml similarity index 100% rename from cumulus/tasks/generate-mrf/templates/target-projections/_epsg4326.xml rename to tasks/.not_CMA_compliant/generate-mrf/templates/target-projections/_epsg4326.xml diff --git a/cumulus/tasks/generate-mrf/test/generate-mrf-spec.js b/tasks/.not_CMA_compliant/generate-mrf/test/generate-mrf-spec.js similarity index 100% rename from cumulus/tasks/generate-mrf/test/generate-mrf-spec.js rename to tasks/.not_CMA_compliant/generate-mrf/test/generate-mrf-spec.js diff --git a/cumulus/tasks/generate-pan/.babelrc b/tasks/.not_CMA_compliant/generate-pan/.babelrc similarity index 100% rename from cumulus/tasks/generate-pan/.babelrc rename to tasks/.not_CMA_compliant/generate-pan/.babelrc diff --git a/cumulus/tasks/generate-pan/.gitignore b/tasks/.not_CMA_compliant/generate-pan/.gitignore similarity index 100% rename from cumulus/tasks/generate-pan/.gitignore rename to tasks/.not_CMA_compliant/generate-pan/.gitignore diff --git a/cumulus/tasks/generate-pan/README.md b/tasks/.not_CMA_compliant/generate-pan/README.md similarity index 100% rename from cumulus/tasks/generate-pan/README.md rename to tasks/.not_CMA_compliant/generate-pan/README.md diff --git a/cumulus/tasks/generate-pan/config/cloudformation.yml b/tasks/.not_CMA_compliant/generate-pan/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/generate-pan/config/cloudformation.yml rename to tasks/.not_CMA_compliant/generate-pan/config/cloudformation.yml diff --git a/cumulus/tasks/generate-pan/ftp_util.js b/tasks/.not_CMA_compliant/generate-pan/ftp_util.js similarity index 100% rename from cumulus/tasks/generate-pan/ftp_util.js rename to tasks/.not_CMA_compliant/generate-pan/ftp_util.js diff --git a/cumulus/tasks/generate-pan/index.js b/tasks/.not_CMA_compliant/generate-pan/index.js similarity index 100% rename from cumulus/tasks/generate-pan/index.js rename to tasks/.not_CMA_compliant/generate-pan/index.js diff --git a/cumulus/tasks/generate-pan/package.json b/tasks/.not_CMA_compliant/generate-pan/package.json similarity index 100% rename from cumulus/tasks/generate-pan/package.json rename to tasks/.not_CMA_compliant/generate-pan/package.json diff --git a/cumulus/tasks/generate-pan/pan.js b/tasks/.not_CMA_compliant/generate-pan/pan.js similarity index 100% rename from cumulus/tasks/generate-pan/pan.js rename to tasks/.not_CMA_compliant/generate-pan/pan.js diff --git a/cumulus/tasks/generate-pan/test/fixtures/all-success-fixture.js b/tasks/.not_CMA_compliant/generate-pan/test/fixtures/all-success-fixture.js similarity index 100% rename from cumulus/tasks/generate-pan/test/fixtures/all-success-fixture.js rename to tasks/.not_CMA_compliant/generate-pan/test/fixtures/all-success-fixture.js diff --git a/cumulus/tasks/generate-pan/test/fixtures/missing-file-fixture.js b/tasks/.not_CMA_compliant/generate-pan/test/fixtures/missing-file-fixture.js similarity index 100% rename from cumulus/tasks/generate-pan/test/fixtures/missing-file-fixture.js rename to tasks/.not_CMA_compliant/generate-pan/test/fixtures/missing-file-fixture.js diff --git a/cumulus/tasks/generate-pan/test/generate-pan-spec.js b/tasks/.not_CMA_compliant/generate-pan/test/generate-pan-spec.js similarity index 100% rename from cumulus/tasks/generate-pan/test/generate-pan-spec.js rename to tasks/.not_CMA_compliant/generate-pan/test/generate-pan-spec.js diff --git a/cumulus/tasks/generate-pdr-file-list/README.md b/tasks/.not_CMA_compliant/generate-pdr-file-list/README.md similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/README.md rename to tasks/.not_CMA_compliant/generate-pdr-file-list/README.md diff --git a/cumulus/tasks/generate-pdr-file-list/config/cloudformation.yml b/tasks/.not_CMA_compliant/generate-pdr-file-list/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/config/cloudformation.yml rename to tasks/.not_CMA_compliant/generate-pdr-file-list/config/cloudformation.yml diff --git a/cumulus/tasks/generate-pdr-file-list/index.js b/tasks/.not_CMA_compliant/generate-pdr-file-list/index.js similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/index.js rename to tasks/.not_CMA_compliant/generate-pdr-file-list/index.js diff --git a/cumulus/tasks/generate-pdr-file-list/package.json b/tasks/.not_CMA_compliant/generate-pdr-file-list/package.json similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/package.json rename to tasks/.not_CMA_compliant/generate-pdr-file-list/package.json diff --git a/cumulus/tasks/generate-pdr-file-list/pdr.js b/tasks/.not_CMA_compliant/generate-pdr-file-list/pdr.js similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/pdr.js rename to tasks/.not_CMA_compliant/generate-pdr-file-list/pdr.js diff --git a/cumulus/tasks/generate-pdr-file-list/test/fixtures/bad-pdr-fixture.js b/tasks/.not_CMA_compliant/generate-pdr-file-list/test/fixtures/bad-pdr-fixture.js similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/test/fixtures/bad-pdr-fixture.js rename to tasks/.not_CMA_compliant/generate-pdr-file-list/test/fixtures/bad-pdr-fixture.js diff --git a/cumulus/tasks/generate-pdr-file-list/test/fixtures/good-pdr-fixture.js b/tasks/.not_CMA_compliant/generate-pdr-file-list/test/fixtures/good-pdr-fixture.js similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/test/fixtures/good-pdr-fixture.js rename to tasks/.not_CMA_compliant/generate-pdr-file-list/test/fixtures/good-pdr-fixture.js diff --git a/cumulus/tasks/generate-pdr-file-list/test/generate-pdr-file-list-spec.js b/tasks/.not_CMA_compliant/generate-pdr-file-list/test/generate-pdr-file-list-spec.js similarity index 100% rename from cumulus/tasks/generate-pdr-file-list/test/generate-pdr-file-list-spec.js rename to tasks/.not_CMA_compliant/generate-pdr-file-list/test/generate-pdr-file-list-spec.js diff --git a/cumulus/tasks/generate-pdrd/.babelrc b/tasks/.not_CMA_compliant/generate-pdrd/.babelrc similarity index 100% rename from cumulus/tasks/generate-pdrd/.babelrc rename to tasks/.not_CMA_compliant/generate-pdrd/.babelrc diff --git a/cumulus/tasks/generate-pdrd/.gitignore b/tasks/.not_CMA_compliant/generate-pdrd/.gitignore similarity index 100% rename from cumulus/tasks/generate-pdrd/.gitignore rename to tasks/.not_CMA_compliant/generate-pdrd/.gitignore diff --git a/cumulus/tasks/generate-pdrd/README.md b/tasks/.not_CMA_compliant/generate-pdrd/README.md similarity index 100% rename from cumulus/tasks/generate-pdrd/README.md rename to tasks/.not_CMA_compliant/generate-pdrd/README.md diff --git a/cumulus/tasks/generate-pdrd/config/cloudformation.yml b/tasks/.not_CMA_compliant/generate-pdrd/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/generate-pdrd/config/cloudformation.yml rename to tasks/.not_CMA_compliant/generate-pdrd/config/cloudformation.yml diff --git a/cumulus/tasks/generate-pdrd/ftp_util.js b/tasks/.not_CMA_compliant/generate-pdrd/ftp_util.js similarity index 100% rename from cumulus/tasks/generate-pdrd/ftp_util.js rename to tasks/.not_CMA_compliant/generate-pdrd/ftp_util.js diff --git a/cumulus/tasks/generate-pdrd/index.js b/tasks/.not_CMA_compliant/generate-pdrd/index.js similarity index 100% rename from cumulus/tasks/generate-pdrd/index.js rename to tasks/.not_CMA_compliant/generate-pdrd/index.js diff --git a/cumulus/tasks/generate-pdrd/package.json b/tasks/.not_CMA_compliant/generate-pdrd/package.json similarity index 100% rename from cumulus/tasks/generate-pdrd/package.json rename to tasks/.not_CMA_compliant/generate-pdrd/package.json diff --git a/cumulus/tasks/generate-pdrd/pdrd.js b/tasks/.not_CMA_compliant/generate-pdrd/pdrd.js similarity index 100% rename from cumulus/tasks/generate-pdrd/pdrd.js rename to tasks/.not_CMA_compliant/generate-pdrd/pdrd.js diff --git a/cumulus/tasks/generate-pdrd/test/fixtures/bad-file-entry-fixture.js b/tasks/.not_CMA_compliant/generate-pdrd/test/fixtures/bad-file-entry-fixture.js similarity index 100% rename from cumulus/tasks/generate-pdrd/test/fixtures/bad-file-entry-fixture.js rename to tasks/.not_CMA_compliant/generate-pdrd/test/fixtures/bad-file-entry-fixture.js diff --git a/cumulus/tasks/generate-pdrd/test/fixtures/invalid-pvl-fixture.js b/tasks/.not_CMA_compliant/generate-pdrd/test/fixtures/invalid-pvl-fixture.js similarity index 100% rename from cumulus/tasks/generate-pdrd/test/fixtures/invalid-pvl-fixture.js rename to tasks/.not_CMA_compliant/generate-pdrd/test/fixtures/invalid-pvl-fixture.js diff --git a/cumulus/tasks/generate-pdrd/test/fixtures/missing-fields-fixture.js b/tasks/.not_CMA_compliant/generate-pdrd/test/fixtures/missing-fields-fixture.js similarity index 100% rename from cumulus/tasks/generate-pdrd/test/fixtures/missing-fields-fixture.js rename to tasks/.not_CMA_compliant/generate-pdrd/test/fixtures/missing-fields-fixture.js diff --git a/cumulus/tasks/generate-pdrd/test/generate-pdrd-spec.js b/tasks/.not_CMA_compliant/generate-pdrd/test/generate-pdrd-spec.js similarity index 100% rename from cumulus/tasks/generate-pdrd/test/generate-pdrd-spec.js rename to tasks/.not_CMA_compliant/generate-pdrd/test/generate-pdrd-spec.js diff --git a/cumulus/tasks/run-gdal/README.md b/tasks/.not_CMA_compliant/run-gdal/README.md similarity index 100% rename from cumulus/tasks/run-gdal/README.md rename to tasks/.not_CMA_compliant/run-gdal/README.md diff --git a/cumulus/tasks/run-gdal/build-gdal/.gitignore b/tasks/.not_CMA_compliant/run-gdal/build-gdal/.gitignore similarity index 100% rename from cumulus/tasks/run-gdal/build-gdal/.gitignore rename to tasks/.not_CMA_compliant/run-gdal/build-gdal/.gitignore diff --git a/cumulus/tasks/run-gdal/build-gdal/Dockerfile b/tasks/.not_CMA_compliant/run-gdal/build-gdal/Dockerfile similarity index 100% rename from cumulus/tasks/run-gdal/build-gdal/Dockerfile rename to tasks/.not_CMA_compliant/run-gdal/build-gdal/Dockerfile diff --git a/cumulus/tasks/run-gdal/build-gdal/Makefile b/tasks/.not_CMA_compliant/run-gdal/build-gdal/Makefile similarity index 100% rename from cumulus/tasks/run-gdal/build-gdal/Makefile rename to tasks/.not_CMA_compliant/run-gdal/build-gdal/Makefile diff --git a/cumulus/tasks/run-gdal/config/cloudformation.yml b/tasks/.not_CMA_compliant/run-gdal/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/run-gdal/config/cloudformation.yml rename to tasks/.not_CMA_compliant/run-gdal/config/cloudformation.yml diff --git a/cumulus/tasks/run-gdal/deps/lambda-gdal.zip b/tasks/.not_CMA_compliant/run-gdal/deps/lambda-gdal.zip similarity index 100% rename from cumulus/tasks/run-gdal/deps/lambda-gdal.zip rename to tasks/.not_CMA_compliant/run-gdal/deps/lambda-gdal.zip diff --git a/cumulus/tasks/run-gdal/example/ast_l1t-to-mrf.json b/tasks/.not_CMA_compliant/run-gdal/example/ast_l1t-to-mrf.json similarity index 100% rename from cumulus/tasks/run-gdal/example/ast_l1t-to-mrf.json rename to tasks/.not_CMA_compliant/run-gdal/example/ast_l1t-to-mrf.json diff --git a/cumulus/tasks/run-gdal/example/ast_l1t-to-png.json b/tasks/.not_CMA_compliant/run-gdal/example/ast_l1t-to-png.json similarity index 100% rename from cumulus/tasks/run-gdal/example/ast_l1t-to-png.json rename to tasks/.not_CMA_compliant/run-gdal/example/ast_l1t-to-png.json diff --git a/cumulus/tasks/run-gdal/example/event.json b/tasks/.not_CMA_compliant/run-gdal/example/event.json similarity index 100% rename from cumulus/tasks/run-gdal/example/event.json rename to tasks/.not_CMA_compliant/run-gdal/example/event.json diff --git a/cumulus/tasks/run-gdal/index.js b/tasks/.not_CMA_compliant/run-gdal/index.js similarity index 100% rename from cumulus/tasks/run-gdal/index.js rename to tasks/.not_CMA_compliant/run-gdal/index.js diff --git a/cumulus/tasks/run-gdal/package.json b/tasks/.not_CMA_compliant/run-gdal/package.json similarity index 100% rename from cumulus/tasks/run-gdal/package.json rename to tasks/.not_CMA_compliant/run-gdal/package.json diff --git a/cumulus/tasks/run-gdal/webpack.config.js b/tasks/.not_CMA_compliant/run-gdal/webpack.config.js similarity index 100% rename from cumulus/tasks/run-gdal/webpack.config.js rename to tasks/.not_CMA_compliant/run-gdal/webpack.config.js diff --git a/cumulus/tasks/sync-http-urls/README.md b/tasks/.not_CMA_compliant/sync-http-urls/README.md similarity index 100% rename from cumulus/tasks/sync-http-urls/README.md rename to tasks/.not_CMA_compliant/sync-http-urls/README.md diff --git a/cumulus/tasks/sync-http-urls/config/cloudformation.yml b/tasks/.not_CMA_compliant/sync-http-urls/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/sync-http-urls/config/cloudformation.yml rename to tasks/.not_CMA_compliant/sync-http-urls/config/cloudformation.yml diff --git a/cumulus/tasks/sync-http-urls/index.js b/tasks/.not_CMA_compliant/sync-http-urls/index.js similarity index 100% rename from cumulus/tasks/sync-http-urls/index.js rename to tasks/.not_CMA_compliant/sync-http-urls/index.js diff --git a/cumulus/tasks/sync-http-urls/package.json b/tasks/.not_CMA_compliant/sync-http-urls/package.json similarity index 100% rename from cumulus/tasks/sync-http-urls/package.json rename to tasks/.not_CMA_compliant/sync-http-urls/package.json diff --git a/cumulus/tasks/sync-http-urls/test/sync-http-urls-spec.js b/tasks/.not_CMA_compliant/sync-http-urls/test/sync-http-urls-spec.js similarity index 100% rename from cumulus/tasks/sync-http-urls/test/sync-http-urls-spec.js rename to tasks/.not_CMA_compliant/sync-http-urls/test/sync-http-urls-spec.js diff --git a/cumulus/tasks/sync-wms/README.md b/tasks/.not_CMA_compliant/sync-wms/README.md similarity index 100% rename from cumulus/tasks/sync-wms/README.md rename to tasks/.not_CMA_compliant/sync-wms/README.md diff --git a/cumulus/tasks/sync-wms/config/cloudformation.yml b/tasks/.not_CMA_compliant/sync-wms/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/sync-wms/config/cloudformation.yml rename to tasks/.not_CMA_compliant/sync-wms/config/cloudformation.yml diff --git a/cumulus/tasks/sync-wms/index.js b/tasks/.not_CMA_compliant/sync-wms/index.js similarity index 100% rename from cumulus/tasks/sync-wms/index.js rename to tasks/.not_CMA_compliant/sync-wms/index.js diff --git a/cumulus/tasks/sync-wms/package.json b/tasks/.not_CMA_compliant/sync-wms/package.json similarity index 100% rename from cumulus/tasks/sync-wms/package.json rename to tasks/.not_CMA_compliant/sync-wms/package.json diff --git a/cumulus/tasks/sync-wms/test/sync-wms-spec.js b/tasks/.not_CMA_compliant/sync-wms/test/sync-wms-spec.js similarity index 100% rename from cumulus/tasks/sync-wms/test/sync-wms-spec.js rename to tasks/.not_CMA_compliant/sync-wms/test/sync-wms-spec.js diff --git a/cumulus/tasks/tee/README.md b/tasks/.not_CMA_compliant/tee/README.md similarity index 100% rename from cumulus/tasks/tee/README.md rename to tasks/.not_CMA_compliant/tee/README.md diff --git a/cumulus/tasks/tee/config/cloudformation.yml b/tasks/.not_CMA_compliant/tee/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/tee/config/cloudformation.yml rename to tasks/.not_CMA_compliant/tee/config/cloudformation.yml diff --git a/cumulus/tasks/tee/index.js b/tasks/.not_CMA_compliant/tee/index.js similarity index 100% rename from cumulus/tasks/tee/index.js rename to tasks/.not_CMA_compliant/tee/index.js diff --git a/cumulus/tasks/tee/package.json b/tasks/.not_CMA_compliant/tee/package.json similarity index 100% rename from cumulus/tasks/tee/package.json rename to tasks/.not_CMA_compliant/tee/package.json diff --git a/cumulus/tasks/trigger-ingest/README.md b/tasks/.not_CMA_compliant/trigger-ingest/README.md similarity index 100% rename from cumulus/tasks/trigger-ingest/README.md rename to tasks/.not_CMA_compliant/trigger-ingest/README.md diff --git a/cumulus/tasks/trigger-ingest/config/cloudformation.yml b/tasks/.not_CMA_compliant/trigger-ingest/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/trigger-ingest/config/cloudformation.yml rename to tasks/.not_CMA_compliant/trigger-ingest/config/cloudformation.yml diff --git a/cumulus/tasks/trigger-ingest/index.js b/tasks/.not_CMA_compliant/trigger-ingest/index.js similarity index 100% rename from cumulus/tasks/trigger-ingest/index.js rename to tasks/.not_CMA_compliant/trigger-ingest/index.js diff --git a/cumulus/tasks/trigger-ingest/package.json b/tasks/.not_CMA_compliant/trigger-ingest/package.json similarity index 100% rename from cumulus/tasks/trigger-ingest/package.json rename to tasks/.not_CMA_compliant/trigger-ingest/package.json diff --git a/cumulus/tasks/trigger-ingest/test/trigger-ingest-spec.js b/tasks/.not_CMA_compliant/trigger-ingest/test/trigger-ingest-spec.js similarity index 100% rename from cumulus/tasks/trigger-ingest/test/trigger-ingest-spec.js rename to tasks/.not_CMA_compliant/trigger-ingest/test/trigger-ingest-spec.js diff --git a/cumulus/tasks/trigger-mrf-gen/README.md b/tasks/.not_CMA_compliant/trigger-mrf-gen/README.md similarity index 100% rename from cumulus/tasks/trigger-mrf-gen/README.md rename to tasks/.not_CMA_compliant/trigger-mrf-gen/README.md diff --git a/cumulus/tasks/trigger-mrf-gen/config/cloudformation.yml b/tasks/.not_CMA_compliant/trigger-mrf-gen/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/trigger-mrf-gen/config/cloudformation.yml rename to tasks/.not_CMA_compliant/trigger-mrf-gen/config/cloudformation.yml diff --git a/cumulus/tasks/trigger-mrf-gen/index.js b/tasks/.not_CMA_compliant/trigger-mrf-gen/index.js similarity index 100% rename from cumulus/tasks/trigger-mrf-gen/index.js rename to tasks/.not_CMA_compliant/trigger-mrf-gen/index.js diff --git a/cumulus/tasks/trigger-mrf-gen/package.json b/tasks/.not_CMA_compliant/trigger-mrf-gen/package.json similarity index 100% rename from cumulus/tasks/trigger-mrf-gen/package.json rename to tasks/.not_CMA_compliant/trigger-mrf-gen/package.json diff --git a/cumulus/tasks/trigger-process-pdrs/README.md b/tasks/.not_CMA_compliant/trigger-process-pdrs/README.md similarity index 100% rename from cumulus/tasks/trigger-process-pdrs/README.md rename to tasks/.not_CMA_compliant/trigger-process-pdrs/README.md diff --git a/cumulus/tasks/trigger-process-pdrs/config/cloudformation.yml b/tasks/.not_CMA_compliant/trigger-process-pdrs/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/trigger-process-pdrs/config/cloudformation.yml rename to tasks/.not_CMA_compliant/trigger-process-pdrs/config/cloudformation.yml diff --git a/cumulus/tasks/trigger-process-pdrs/index.js b/tasks/.not_CMA_compliant/trigger-process-pdrs/index.js similarity index 100% rename from cumulus/tasks/trigger-process-pdrs/index.js rename to tasks/.not_CMA_compliant/trigger-process-pdrs/index.js diff --git a/cumulus/tasks/trigger-process-pdrs/package.json b/tasks/.not_CMA_compliant/trigger-process-pdrs/package.json similarity index 100% rename from cumulus/tasks/trigger-process-pdrs/package.json rename to tasks/.not_CMA_compliant/trigger-process-pdrs/package.json diff --git a/cumulus/tasks/trigger-process-pdrs/test/trigger-process-pdrs-spec.js b/tasks/.not_CMA_compliant/trigger-process-pdrs/test/trigger-process-pdrs-spec.js similarity index 100% rename from cumulus/tasks/trigger-process-pdrs/test/trigger-process-pdrs-spec.js rename to tasks/.not_CMA_compliant/trigger-process-pdrs/test/trigger-process-pdrs-spec.js diff --git a/cumulus/tasks/validate-archives/README.md b/tasks/.not_CMA_compliant/validate-archives/README.md similarity index 100% rename from cumulus/tasks/validate-archives/README.md rename to tasks/.not_CMA_compliant/validate-archives/README.md diff --git a/cumulus/tasks/validate-archives/archive-validations.js b/tasks/.not_CMA_compliant/validate-archives/archive-validations.js similarity index 100% rename from cumulus/tasks/validate-archives/archive-validations.js rename to tasks/.not_CMA_compliant/validate-archives/archive-validations.js diff --git a/cumulus/tasks/validate-archives/config/cloudformation.yml b/tasks/.not_CMA_compliant/validate-archives/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/validate-archives/config/cloudformation.yml rename to tasks/.not_CMA_compliant/validate-archives/config/cloudformation.yml diff --git a/cumulus/tasks/validate-archives/index.js b/tasks/.not_CMA_compliant/validate-archives/index.js similarity index 100% rename from cumulus/tasks/validate-archives/index.js rename to tasks/.not_CMA_compliant/validate-archives/index.js diff --git a/cumulus/tasks/validate-archives/package.json b/tasks/.not_CMA_compliant/validate-archives/package.json similarity index 100% rename from cumulus/tasks/validate-archives/package.json rename to tasks/.not_CMA_compliant/validate-archives/package.json diff --git a/cumulus/tasks/validate-archives/test/fixtures/all-success-fixture.js b/tasks/.not_CMA_compliant/validate-archives/test/fixtures/all-success-fixture.js similarity index 100% rename from cumulus/tasks/validate-archives/test/fixtures/all-success-fixture.js rename to tasks/.not_CMA_compliant/validate-archives/test/fixtures/all-success-fixture.js diff --git a/cumulus/tasks/validate-archives/test/fixtures/missing-file-fixture.js b/tasks/.not_CMA_compliant/validate-archives/test/fixtures/missing-file-fixture.js similarity index 100% rename from cumulus/tasks/validate-archives/test/fixtures/missing-file-fixture.js rename to tasks/.not_CMA_compliant/validate-archives/test/fixtures/missing-file-fixture.js diff --git a/cumulus/tasks/validate-archives/test/vaidate-archives-spec.js b/tasks/.not_CMA_compliant/validate-archives/test/vaidate-archives-spec.js similarity index 100% rename from cumulus/tasks/validate-archives/test/vaidate-archives-spec.js rename to tasks/.not_CMA_compliant/validate-archives/test/vaidate-archives-spec.js diff --git a/cumulus/tasks/validate-pdr/.babelrc b/tasks/.not_CMA_compliant/validate-pdr/.babelrc similarity index 100% rename from cumulus/tasks/validate-pdr/.babelrc rename to tasks/.not_CMA_compliant/validate-pdr/.babelrc diff --git a/cumulus/tasks/validate-pdr/.gitignore b/tasks/.not_CMA_compliant/validate-pdr/.gitignore similarity index 100% rename from cumulus/tasks/validate-pdr/.gitignore rename to tasks/.not_CMA_compliant/validate-pdr/.gitignore diff --git a/cumulus/tasks/validate-pdr/README.md b/tasks/.not_CMA_compliant/validate-pdr/README.md similarity index 100% rename from cumulus/tasks/validate-pdr/README.md rename to tasks/.not_CMA_compliant/validate-pdr/README.md diff --git a/cumulus/tasks/validate-pdr/config/cloudformation.yml b/tasks/.not_CMA_compliant/validate-pdr/config/cloudformation.yml similarity index 100% rename from cumulus/tasks/validate-pdr/config/cloudformation.yml rename to tasks/.not_CMA_compliant/validate-pdr/config/cloudformation.yml diff --git a/cumulus/tasks/validate-pdr/index.js b/tasks/.not_CMA_compliant/validate-pdr/index.js similarity index 100% rename from cumulus/tasks/validate-pdr/index.js rename to tasks/.not_CMA_compliant/validate-pdr/index.js diff --git a/cumulus/tasks/validate-pdr/package.json b/tasks/.not_CMA_compliant/validate-pdr/package.json similarity index 100% rename from cumulus/tasks/validate-pdr/package.json rename to tasks/.not_CMA_compliant/validate-pdr/package.json diff --git a/cumulus/tasks/validate-pdr/pdr-validations.js b/tasks/.not_CMA_compliant/validate-pdr/pdr-validations.js similarity index 100% rename from cumulus/tasks/validate-pdr/pdr-validations.js rename to tasks/.not_CMA_compliant/validate-pdr/pdr-validations.js diff --git a/cumulus/tasks/validate-pdr/pdr.js b/tasks/.not_CMA_compliant/validate-pdr/pdr.js similarity index 100% rename from cumulus/tasks/validate-pdr/pdr.js rename to tasks/.not_CMA_compliant/validate-pdr/pdr.js diff --git a/cumulus/tasks/validate-pdr/test/fixtures/file-errors-fixture.js b/tasks/.not_CMA_compliant/validate-pdr/test/fixtures/file-errors-fixture.js similarity index 100% rename from cumulus/tasks/validate-pdr/test/fixtures/file-errors-fixture.js rename to tasks/.not_CMA_compliant/validate-pdr/test/fixtures/file-errors-fixture.js diff --git a/cumulus/tasks/validate-pdr/test/fixtures/invalid-pvl-fixture.js b/tasks/.not_CMA_compliant/validate-pdr/test/fixtures/invalid-pvl-fixture.js similarity index 100% rename from cumulus/tasks/validate-pdr/test/fixtures/invalid-pvl-fixture.js rename to tasks/.not_CMA_compliant/validate-pdr/test/fixtures/invalid-pvl-fixture.js diff --git a/cumulus/tasks/validate-pdr/test/fixtures/missing-fields-fixture.js b/tasks/.not_CMA_compliant/validate-pdr/test/fixtures/missing-fields-fixture.js similarity index 100% rename from cumulus/tasks/validate-pdr/test/fixtures/missing-fields-fixture.js rename to tasks/.not_CMA_compliant/validate-pdr/test/fixtures/missing-fields-fixture.js diff --git a/cumulus/tasks/validate-pdr/test/fixtures/success-fixture.js b/tasks/.not_CMA_compliant/validate-pdr/test/fixtures/success-fixture.js similarity index 100% rename from cumulus/tasks/validate-pdr/test/fixtures/success-fixture.js rename to tasks/.not_CMA_compliant/validate-pdr/test/fixtures/success-fixture.js diff --git a/cumulus/tasks/validate-pdr/test/pdr-validations.test.js b/tasks/.not_CMA_compliant/validate-pdr/test/pdr-validations.test.js similarity index 100% rename from cumulus/tasks/validate-pdr/test/pdr-validations.test.js rename to tasks/.not_CMA_compliant/validate-pdr/test/pdr-validations.test.js diff --git a/cumulus/tasks/validate-pdr/test/validate-pdr.test.js b/tasks/.not_CMA_compliant/validate-pdr/test/validate-pdr.test.js similarity index 100% rename from cumulus/tasks/validate-pdr/test/validate-pdr.test.js rename to tasks/.not_CMA_compliant/validate-pdr/test/validate-pdr.test.js diff --git a/cumulus/tasks/discover-granules/README.md b/tasks/discover-granules/README.md similarity index 100% rename from cumulus/tasks/discover-granules/README.md rename to tasks/discover-granules/README.md diff --git a/cumulus/tasks/discover-granules/cumulus.json b/tasks/discover-granules/cumulus.json similarity index 100% rename from cumulus/tasks/discover-granules/cumulus.json rename to tasks/discover-granules/cumulus.json diff --git a/cumulus/tasks/discover-granules/index.js b/tasks/discover-granules/index.js similarity index 100% rename from cumulus/tasks/discover-granules/index.js rename to tasks/discover-granules/index.js diff --git a/cumulus/tasks/discover-granules/package.json b/tasks/discover-granules/package.json similarity index 79% rename from cumulus/tasks/discover-granules/package.json rename to tasks/discover-granules/package.json index b9583a1a641..7fc853b84c2 100644 --- a/cumulus/tasks/discover-granules/package.json +++ b/tasks/discover-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-granules", - "version": "1.2.0", + "version": "1.3.0", "description": "Discover Granules in FTP/HTTP/SFTP endpoints", "main": "index.js", "directories": { @@ -13,8 +13,8 @@ "scripts": { "test": "ava", "local": "node index.js | pino", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "publishConfig": { @@ -37,10 +37,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-granules/schemas/config.json b/tasks/discover-granules/schemas/config.json similarity index 100% rename from cumulus/tasks/discover-granules/schemas/config.json rename to tasks/discover-granules/schemas/config.json diff --git a/cumulus/tasks/discover-granules/schemas/output.json b/tasks/discover-granules/schemas/output.json similarity index 100% rename from cumulus/tasks/discover-granules/schemas/output.json rename to tasks/discover-granules/schemas/output.json diff --git a/cumulus/tasks/discover-granules/tests/.eslintrc.json b/tasks/discover-granules/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/discover-granules/tests/.eslintrc.json rename to tasks/discover-granules/tests/.eslintrc.json diff --git a/cumulus/tasks/discover-granules/tests/fixtures/mur.json b/tasks/discover-granules/tests/fixtures/mur.json similarity index 100% rename from cumulus/tasks/discover-granules/tests/fixtures/mur.json rename to tasks/discover-granules/tests/fixtures/mur.json diff --git a/cumulus/tasks/discover-granules/tests/index.js b/tasks/discover-granules/tests/index.js similarity index 74% rename from cumulus/tasks/discover-granules/tests/index.js rename to tasks/discover-granules/tests/index.js index 7689048a1c4..b1c84ac94d3 100644 --- a/cumulus/tasks/discover-granules/tests/index.js +++ b/tasks/discover-granules/tests/index.js @@ -1,13 +1,10 @@ 'use strict'; -const fs = require('fs-extra'); -const path = require('path'); const test = require('ava'); const mur = require('./fixtures/mur.json'); const { cloneDeep } = require('lodash'); const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); const { - findTmpTestDataDirectory, randomString, validateConfig, validateOutput @@ -17,9 +14,21 @@ const { discoverGranules } = require('../index'); // This test is broken and will be fixed by CUMULUS-427 test.skip('discover granules using FTP', async (t) => { const event = cloneDeep(mur); + event.config.bucket = randomString(); + event.config.collection.provider_path = '/granules/fake_granules'; + event.config.useList = true; + event.config.provider = { + id: 'MODAPS', + protocol: 'ftp', + host: 'localhost', + username: 'testuser', + password: 'testpass' + }; await validateConfig(t, event.config); + await s3().createBucket({ Bucket: event.config.bucket }).promise(); + try { const output = await discoverGranules(event); @@ -33,6 +42,10 @@ test.skip('discover granules using FTP', async (t) => { } else t.fail(e); } + finally { + // Clean up + await recursivelyDeleteS3Bucket(event.config.bucket); + } }); test('discover granules using SFTP', async (t) => { @@ -73,29 +86,9 @@ test('discover granules using SFTP', async (t) => { }); test('discover granules using HTTP', async (t) => { - const internalBucketName = randomString(); - const providerPath = randomString(); - - // Figure out the directory paths that we're working with - const providerPathDirectory = path.join(await findTmpTestDataDirectory(), providerPath); - - // Create providerPathDirectory and internal bucket - await Promise.all([ - fs.ensureDir(providerPathDirectory), - s3().createBucket({ Bucket: internalBucketName }).promise() - ]); - - // State sample files - const files = [ - 'granule-1.nc', 'granule-1.nc.md5', - 'granule-2.nc', 'granule-2.nc.md5', - 'granule-3.nc', 'granule-3.nc.md5' - ]; - await Promise.all(files.map((file) => - fs.outputFile(path.join(providerPathDirectory, file), `This is ${file}`))); - const event = cloneDeep(mur); - event.config.collection.provider_path = providerPath; + event.config.bucket = randomString(); + event.config.collection.provider_path = '/granules/fake_granules'; event.config.provider = { id: 'MODAPS', protocol: 'http', @@ -103,6 +96,7 @@ test('discover granules using HTTP', async (t) => { }; await validateConfig(t, event.config); + await s3().createBucket({ Bucket: event.config.bucket }).promise(); try { const output = await discoverGranules(event); @@ -118,10 +112,7 @@ test('discover granules using HTTP', async (t) => { } finally { // Clean up - await Promise.all([ - recursivelyDeleteS3Bucket(internalBucketName), - fs.remove(providerPathDirectory) - ]); + await recursivelyDeleteS3Bucket(event.config.bucket); } }); @@ -130,12 +121,8 @@ test('discover granules using S3', async (t) => { const sourceBucketName = randomString(); const providerPath = randomString(); - // Figure out the directory paths that we're working with - const providerPathDirectory = path.join(await findTmpTestDataDirectory(), providerPath); - // Create providerPathDirectory and internal bucket await Promise.all([ - fs.ensureDir(providerPathDirectory), s3().createBucket({ Bucket: internalBucketName }).promise(), s3().createBucket({ Bucket: sourceBucketName }).promise() ]); @@ -173,8 +160,7 @@ test('discover granules using S3', async (t) => { // Clean up await Promise.all([ recursivelyDeleteS3Bucket(internalBucketName), - recursivelyDeleteS3Bucket(sourceBucketName), - fs.remove(providerPathDirectory) + recursivelyDeleteS3Bucket(sourceBucketName) ]); } }); diff --git a/cumulus/tasks/discover-s3-granules/webpack.config.js b/tasks/discover-granules/webpack.config.js similarity index 100% rename from cumulus/tasks/discover-s3-granules/webpack.config.js rename to tasks/discover-granules/webpack.config.js diff --git a/cumulus/tasks/discover-pdrs/README.md b/tasks/discover-pdrs/README.md similarity index 100% rename from cumulus/tasks/discover-pdrs/README.md rename to tasks/discover-pdrs/README.md diff --git a/cumulus/tasks/discover-pdrs/cumulus.json b/tasks/discover-pdrs/cumulus.json similarity index 100% rename from cumulus/tasks/discover-pdrs/cumulus.json rename to tasks/discover-pdrs/cumulus.json diff --git a/cumulus/tasks/discover-pdrs/index.js b/tasks/discover-pdrs/index.js similarity index 100% rename from cumulus/tasks/discover-pdrs/index.js rename to tasks/discover-pdrs/index.js diff --git a/cumulus/tasks/discover-pdrs/package.json b/tasks/discover-pdrs/package.json similarity index 79% rename from cumulus/tasks/discover-pdrs/package.json rename to tasks/discover-pdrs/package.json index 2a5f41da51a..8020e9a6033 100644 --- a/cumulus/tasks/discover-pdrs/package.json +++ b/tasks/discover-pdrs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-pdrs", - "version": "1.2.0", + "version": "1.3.0", "description": "Discover PDRs in FTP and HTTP endpoints", "main": "index.js", "directories": { @@ -12,8 +12,8 @@ }, "scripts": { "test": "ava", - "build": "mkdir -p dist && cp cumulus.json dist/ && webpack --progress", - "watch": "mkdir -p dist && cp cumulus.json dist/ && webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "publishConfig": { @@ -36,10 +36,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-pdrs/schemas/config.json b/tasks/discover-pdrs/schemas/config.json similarity index 100% rename from cumulus/tasks/discover-pdrs/schemas/config.json rename to tasks/discover-pdrs/schemas/config.json diff --git a/cumulus/tasks/discover-pdrs/schemas/output.json b/tasks/discover-pdrs/schemas/output.json similarity index 100% rename from cumulus/tasks/discover-pdrs/schemas/output.json rename to tasks/discover-pdrs/schemas/output.json diff --git a/cumulus/tasks/discover-pdrs/tests/.eslintrc.json b/tasks/discover-pdrs/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/discover-pdrs/tests/.eslintrc.json rename to tasks/discover-pdrs/tests/.eslintrc.json diff --git a/cumulus/tasks/discover-pdrs/tests/fixtures/input.json b/tasks/discover-pdrs/tests/fixtures/input.json similarity index 100% rename from cumulus/tasks/discover-pdrs/tests/fixtures/input.json rename to tasks/discover-pdrs/tests/fixtures/input.json diff --git a/cumulus/tasks/discover-pdrs/tests/index.js b/tasks/discover-pdrs/tests/index.js similarity index 89% rename from cumulus/tasks/discover-pdrs/tests/index.js rename to tasks/discover-pdrs/tests/index.js index 6c5bd31bd50..26c44669ade 100644 --- a/cumulus/tasks/discover-pdrs/tests/index.js +++ b/tasks/discover-pdrs/tests/index.js @@ -12,7 +12,6 @@ const input = require('./fixtures/input.json'); const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); const { findTestDataDirectory, - findTmpTestDataDirectory, randomString, validateConfig, validateOutput @@ -153,29 +152,14 @@ test('test pdr discovery with FTP assuming some PDRs are new', async (t) => { test('test pdr discovery with HTTP assuming some PDRs are new', async (t) => { const internalBucketName = randomString(); - const providerPath = randomString(); - - // Figure out the directory paths that we're working with - const testDataDirectory = path.join(await findTestDataDirectory(), 'pdrs'); - const providerPathDirectory = path.join(await findTmpTestDataDirectory(), providerPath); - - // Create providerPathDirectory and internal bucket - await Promise.all([ - fs.ensureDir(providerPathDirectory), - s3().createBucket({ Bucket: internalBucketName }).promise() - ]); try { - // Copy the PDRs to the HTTP directory + await s3().createBucket({ Bucket: internalBucketName }).promise(); + const testDataDirectory = path.join(await findTestDataDirectory(), 'pdrs'); const pdrFilenames = await fs.readdir(testDataDirectory); - const oldPdr = pdrFilenames[0]; const newPdrs = pdrFilenames.slice(1); - await Promise.all(pdrFilenames.map((pdrFilename) => fs.copy( - path.join(testDataDirectory, pdrFilename), - path.join(providerPathDirectory, pdrFilename)))); - // Build the event const event = cloneDeep(input); event.config.bucket = internalBucketName; @@ -184,7 +168,7 @@ test('test pdr discovery with HTTP assuming some PDRs are new', async (t) => { protocol: 'http', host: 'http://localhost:3030' }; - event.config.collection.provider_path = providerPath; + event.config.collection.provider_path = '/pdrs'; event.input = {}; // Mark one of the PDRs as not new @@ -215,10 +199,7 @@ test('test pdr discovery with HTTP assuming some PDRs are new', async (t) => { } finally { // Clean up - await Promise.all([ - recursivelyDeleteS3Bucket(internalBucketName), - fs.remove(providerPathDirectory) - ]); + await recursivelyDeleteS3Bucket(internalBucketName); } }); diff --git a/cumulus/tasks/discover-pdrs/tests/s3.js b/tasks/discover-pdrs/tests/s3.js similarity index 100% rename from cumulus/tasks/discover-pdrs/tests/s3.js rename to tasks/discover-pdrs/tests/s3.js diff --git a/cumulus/tasks/discover-pdrs/webpack.config.js b/tasks/discover-pdrs/webpack.config.js similarity index 100% rename from cumulus/tasks/discover-pdrs/webpack.config.js rename to tasks/discover-pdrs/webpack.config.js diff --git a/cumulus/tasks/hello-world/README.md b/tasks/hello-world/README.md similarity index 100% rename from cumulus/tasks/hello-world/README.md rename to tasks/hello-world/README.md diff --git a/cumulus/tasks/hello-world/index.js b/tasks/hello-world/index.js similarity index 100% rename from cumulus/tasks/hello-world/index.js rename to tasks/hello-world/index.js diff --git a/cumulus/tasks/hello-world/package.json b/tasks/hello-world/package.json similarity index 85% rename from cumulus/tasks/hello-world/package.json rename to tasks/hello-world/package.json index 5c5efc30f58..5ca554df175 100644 --- a/cumulus/tasks/hello-world/package.json +++ b/tasks/hello-world/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/hello-world", - "version": "1.2.0", + "version": "1.3.0", "description": "Example task", "main": "index.js", "directories": { @@ -12,8 +12,8 @@ }, "scripts": { "test": "ava tests/*.js --serial --no-color", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "publishConfig": { diff --git a/tasks/hello-world/schemas/output.json b/tasks/hello-world/schemas/output.json new file mode 100644 index 00000000000..7d548dce6d2 --- /dev/null +++ b/tasks/hello-world/schemas/output.json @@ -0,0 +1,12 @@ +{ + "title": "HelloWorldOutput", + "description": "Describes the output produced by the hello-world task", + "type": "object", + "required": ["hello"], + "additionalProperties": false, + "properties": { + "hello": { + "type": "string" + } + } +} diff --git a/cumulus/tasks/hello-world/tests/hello_world_test.js b/tasks/hello-world/tests/hello_world_test.js similarity index 100% rename from cumulus/tasks/hello-world/tests/hello_world_test.js rename to tasks/hello-world/tests/hello_world_test.js diff --git a/cumulus/tasks/hello-world/webpack.config.js b/tasks/hello-world/webpack.config.js similarity index 100% rename from cumulus/tasks/hello-world/webpack.config.js rename to tasks/hello-world/webpack.config.js diff --git a/cumulus/tasks/parse-pdr/README.md b/tasks/parse-pdr/README.md similarity index 100% rename from cumulus/tasks/parse-pdr/README.md rename to tasks/parse-pdr/README.md diff --git a/cumulus/tasks/parse-pdr/index.js b/tasks/parse-pdr/index.js similarity index 100% rename from cumulus/tasks/parse-pdr/index.js rename to tasks/parse-pdr/index.js diff --git a/cumulus/tasks/parse-pdr/package.json b/tasks/parse-pdr/package.json similarity index 81% rename from cumulus/tasks/parse-pdr/package.json rename to tasks/parse-pdr/package.json index b9a282125b2..f8ab352b5a2 100644 --- a/cumulus/tasks/parse-pdr/package.json +++ b/tasks/parse-pdr/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/parse-pdr", - "version": "1.2.0", + "version": "1.3.0", "description": "Download and Parse a given PDR", "main": "index.js", "directories": { @@ -15,8 +15,8 @@ }, "scripts": { "test": "ava", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "author": "Cumulus Authors", @@ -39,10 +39,10 @@ ] }, "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.24.1", diff --git a/cumulus/tasks/parse-pdr/schemas/config.json b/tasks/parse-pdr/schemas/config.json similarity index 100% rename from cumulus/tasks/parse-pdr/schemas/config.json rename to tasks/parse-pdr/schemas/config.json diff --git a/cumulus/tasks/parse-pdr/schemas/input.json b/tasks/parse-pdr/schemas/input.json similarity index 100% rename from cumulus/tasks/parse-pdr/schemas/input.json rename to tasks/parse-pdr/schemas/input.json diff --git a/cumulus/tasks/parse-pdr/schemas/output.json b/tasks/parse-pdr/schemas/output.json similarity index 100% rename from cumulus/tasks/parse-pdr/schemas/output.json rename to tasks/parse-pdr/schemas/output.json diff --git a/cumulus/tasks/parse-pdr/tests/parse_pdrs_test.js b/tasks/parse-pdr/tests/parse_pdrs_test.js similarity index 88% rename from cumulus/tasks/parse-pdr/tests/parse_pdrs_test.js rename to tasks/parse-pdr/tests/parse_pdrs_test.js index 0cb3ff3d98d..900627ffc6a 100644 --- a/cumulus/tasks/parse-pdr/tests/parse_pdrs_test.js +++ b/tasks/parse-pdr/tests/parse_pdrs_test.js @@ -10,7 +10,6 @@ const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); const { cloneDeep } = require('lodash'); const { findTestDataDirectory, - findTmpTestDataDirectory, randomString, validateConfig, validateInput, @@ -57,24 +56,15 @@ test('parse PDR from FTP endpoint', async (t) => { test('parse PDR from HTTP endpoint', async (t) => { const internalBucketName = randomString(); - const providerPath = randomString(); // Figure out the directory paths that we're working with const testDataDirectory = path.join(await findTestDataDirectory(), 'pdrs'); - const providerPathDirectory = path.join(await findTmpTestDataDirectory(), providerPath); // Create providerPathDirectory and internal bucket - await Promise.all([ - fs.ensureDir(providerPathDirectory), - s3().createBucket({ Bucket: internalBucketName }).promise() - ]); + await s3().createBucket({ Bucket: internalBucketName }).promise(); const pdrName = 'MOD09GQ.PDR'; - await fs.copy( - path.join(testDataDirectory, pdrName), - path.join(providerPathDirectory, pdrName)); - const newPayload = cloneDeep(modis); newPayload.config.bucket = internalBucketName; newPayload.config.provider = { @@ -85,7 +75,7 @@ test('parse PDR from HTTP endpoint', async (t) => { newPayload.input = { pdr: { name: pdrName, - path: `/${providerPath}` + path: `/pdrs` } }; @@ -107,10 +97,7 @@ test('parse PDR from HTTP endpoint', async (t) => { } finally { // Clean up - await Promise.all([ - recursivelyDeleteS3Bucket(internalBucketName), - fs.remove(providerPathDirectory) - ]); + await recursivelyDeleteS3Bucket(internalBucketName); } }); @@ -175,7 +162,7 @@ test('Parse a PDR from an S3 provider', async (t) => { await s3().putObject({ Bucket: bucket, Key: pdrName, - Body: fs.createReadStream('../../../packages/test-data/pdrs/MOD09GQ.PDR') + Body: fs.createReadStream('../../packages/test-data/pdrs/MOD09GQ.PDR') }).promise(); const event = cloneDeep(modis); diff --git a/cumulus/tasks/parse-pdr/webpack.config.js b/tasks/parse-pdr/webpack.config.js similarity index 100% rename from cumulus/tasks/parse-pdr/webpack.config.js rename to tasks/parse-pdr/webpack.config.js diff --git a/cumulus/tasks/pdr-status-check/README.md b/tasks/pdr-status-check/README.md similarity index 82% rename from cumulus/tasks/pdr-status-check/README.md rename to tasks/pdr-status-check/README.md index 3f31041f437..273d629d841 100644 --- a/cumulus/tasks/pdr-status-check/README.md +++ b/tasks/pdr-status-check/README.md @@ -3,6 +3,7 @@ [![CircleCI](https://circleci.com/gh/cumulus-nasa/cumulus.svg?style=svg)](https://circleci.com/gh/cumulus-nasa/cumulus) Lambda function handler for checking the status of a workflow (step function) execution. Expects a payload object which includes the name of a PDR. +The concurrency of SFN API calls is set to 10 by default, and it's configurable by setting the Lambda environment variable CONCURRENCY. ## What is Cumulus? diff --git a/cumulus/tasks/pdr-status-check/index.js b/tasks/pdr-status-check/index.js similarity index 79% rename from cumulus/tasks/pdr-status-check/index.js rename to tasks/pdr-status-check/index.js index 74847119843..d9eea082247 100644 --- a/cumulus/tasks/pdr-status-check/index.js +++ b/tasks/pdr-status-check/index.js @@ -5,6 +5,7 @@ const aws = require('@cumulus/common/aws'); const { IncompleteError } = require('@cumulus/common/errors'); const log = require('@cumulus/common/log'); const { justLocalRun } = require('@cumulus/common/local-helpers'); +const pLimit = require('p-limit'); // The default number of times to re-check for completion const defaultRetryLimit = 30; @@ -130,6 +131,21 @@ function buildOutput(event, groupedExecutions) { return output; } +/** + * check the status of a step funciton execution + * + * @param {string} executionArn - step function execution arn + * @returns {Promise.} - an object describing the status of the exection + */ +function describeExecutionStatus(executionArn) { + return aws.sfn().describeExecution({ executionArn }).promise() + .catch((e) => { + if (e.code === 'ExecutionDoesNotExist') { + return { executionArn: executionArn, status: 'RUNNING' }; + } + throw e; + }); +} /** * Checks a list of Step Function Executions to see if they are all in * terminal states. @@ -141,34 +157,28 @@ function buildOutput(event, groupedExecutions) { */ async function checkPdrStatuses(event) { const runningExecutionArns = event.input.running || []; + const concurrencyLimit = process.env.CONCURRENCY || 10; + const limit = pLimit(concurrencyLimit); - const executions = []; - for (const executionArn of runningExecutionArns) { - try { - const execution = await aws.sfn().describeExecution({ executionArn }).promise(); - executions.push(execution); - } - catch (e) { - // it's ok if a execution is still in the queue and has not be executed - if (e.code === 'ExecutionDoesNotExist') { - executions.push({ executionArn: executionArn, status: 'RUNNING' }); - } - else throw e; - } - } + const promisedExecutionDescriptions = runningExecutionArns.map((executionArn) => + limit(() => describeExecutionStatus(executionArn))); - const groupedExecutions = groupExecutionsByStatus(executions); - const counter = getCounterFromEvent(event) + 1; - const exceededLimit = counter >= getLimitFromEvent(event); + return Promise.all(promisedExecutionDescriptions) + .then(groupExecutionsByStatus) + .then((groupedExecutions) => { + const counter = getCounterFromEvent(event) + 1; + const exceededLimit = counter >= getLimitFromEvent(event); - const executionsAllDone = groupedExecutions.running.length === 0; - if (!executionsAllDone && exceededLimit) { - throw new IncompleteError(`PDR didn't complete after ${counter} checks`); - } + const executionsAllDone = groupedExecutions.running.length === 0; - const output = buildOutput(event, groupedExecutions); - if (!output.isFinished) logStatus(output); - return output; + if (!executionsAllDone && exceededLimit) { + throw new IncompleteError(`PDR didn't complete after ${counter} checks`); + } + + const output = buildOutput(event, groupedExecutions); + if (!output.isFinished) logStatus(output); + return output; + }); } exports.checkPdrStatuses = checkPdrStatuses; diff --git a/cumulus/tasks/pdr-status-check/package.json b/tasks/pdr-status-check/package.json similarity index 78% rename from cumulus/tasks/pdr-status-check/package.json rename to tasks/pdr-status-check/package.json index bace424943f..faee5feb30e 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/tasks/pdr-status-check/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/pdr-status-check", - "version": "1.2.0", + "version": "1.3.0", "description": "Checks execution status of granules in a PDR", "main": "index.js", "directories": { @@ -15,8 +15,8 @@ }, "scripts": { "test": "ava", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "author": "Cumulus Authors", @@ -40,10 +40,10 @@ ] }, "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.24.1", @@ -52,13 +52,16 @@ "babel-preset-es2017": "^6.24.1", "json-loader": "^0.5.7", "lodash.get": "^4.4.2", + "p-limit": "^1.1.0", "webpack": "^1.12.13" }, "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", "ava": "^0.23.0", + "delay": "^2.0.0", "lodash": "^4.17.5", + "moment": "^2.21.0", "proxyquire": "^1.8.0", "sinon": "^2.0.0-pre.5" } diff --git a/cumulus/tasks/pdr-status-check/schemas/input.json b/tasks/pdr-status-check/schemas/input.json similarity index 100% rename from cumulus/tasks/pdr-status-check/schemas/input.json rename to tasks/pdr-status-check/schemas/input.json diff --git a/cumulus/tasks/pdr-status-check/schemas/output.json b/tasks/pdr-status-check/schemas/output.json similarity index 100% rename from cumulus/tasks/pdr-status-check/schemas/output.json rename to tasks/pdr-status-check/schemas/output.json diff --git a/cumulus/tasks/pdr-status-check/tests/index.js b/tasks/pdr-status-check/tests/index.js similarity index 71% rename from cumulus/tasks/pdr-status-check/tests/index.js rename to tasks/pdr-status-check/tests/index.js index 4c8edc8f416..c4cc285e423 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/tasks/pdr-status-check/tests/index.js @@ -3,8 +3,11 @@ const _ = require('lodash'); const test = require('ava'); const sinon = require('sinon'); +const delay = require('delay'); +const moment = require('moment'); const aws = require('@cumulus/common/aws'); const { checkPdrStatuses } = require('../index'); +const { randomString } = require('@cumulus/common/test-utils'); test('valid output when no running executions', (t) => { const event = { @@ -122,3 +125,40 @@ test('returns the correct results in the nominal case', (t) => { }); }); }); + +test('test concurrency limit setting on sfn api calls', (t) => { + _.set(process, 'env.CONCURRENCY', 20); + const stubSfnClient = { + describeExecution: ({ executionArn }) => ({ + promise: () => delay(100) + .then(() => Promise.resolve({ executionArn, status: 'SUCCEEDED' })) + }) + }; + const stub = sinon.stub(aws, 'sfn').returns(stubSfnClient); + + const running = []; + const uuid = randomString(); + for (let i = 0; i < 200; i++) running[i] = `${uuid}:${i}`; + + const event = { + input: { + running, + pdr: { name: 'test.PDR', path: 'test-path' } + } + }; + const startTime = moment(); + return checkPdrStatuses(event) + .then((output) => { + stub.restore(); + + t.true(output.isFinished); + + // the sf api execution time would be approximately: + // ((# of executions)/(# of concurrency) ) * (function execution time) + // (200/20) * 100 = 1000 + // add 100ms for other operations + const endTime = moment(); + const timeEscaped = moment.duration(endTime.diff(startTime)).as('milliseconds'); + t.true(timeEscaped >= 900 && timeEscaped <= 1100); + }); +}); diff --git a/cumulus/tasks/pdr-status-check/webpack.config.js b/tasks/pdr-status-check/webpack.config.js similarity index 100% rename from cumulus/tasks/pdr-status-check/webpack.config.js rename to tasks/pdr-status-check/webpack.config.js diff --git a/cumulus/tasks/post-to-cmr/README.md b/tasks/post-to-cmr/README.md similarity index 100% rename from cumulus/tasks/post-to-cmr/README.md rename to tasks/post-to-cmr/README.md diff --git a/cumulus/tasks/post-to-cmr/index.js b/tasks/post-to-cmr/index.js similarity index 100% rename from cumulus/tasks/post-to-cmr/index.js rename to tasks/post-to-cmr/index.js diff --git a/cumulus/tasks/post-to-cmr/package.json b/tasks/post-to-cmr/package.json similarity index 79% rename from cumulus/tasks/post-to-cmr/package.json rename to tasks/post-to-cmr/package.json index 311975ed78c..284906d962e 100644 --- a/cumulus/tasks/post-to-cmr/package.json +++ b/tasks/post-to-cmr/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/post-to-cmr", - "version": "1.2.0", + "version": "1.3.0", "description": "Post a given granule to CMR", "main": "index.js", "directories": { @@ -15,8 +15,8 @@ }, "scripts": { "test": "ava", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "ava": { @@ -41,11 +41,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/cmrjs": "^1.2.0", - "@cumulus/common": "^1.2.0", + "@cumulus/cmrjs": "^1.3.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.24.1", diff --git a/cumulus/tasks/post-to-cmr/schemas/config.json b/tasks/post-to-cmr/schemas/config.json similarity index 100% rename from cumulus/tasks/post-to-cmr/schemas/config.json rename to tasks/post-to-cmr/schemas/config.json diff --git a/cumulus/tasks/post-to-cmr/schemas/input.json b/tasks/post-to-cmr/schemas/input.json similarity index 100% rename from cumulus/tasks/post-to-cmr/schemas/input.json rename to tasks/post-to-cmr/schemas/input.json diff --git a/cumulus/tasks/post-to-cmr/schemas/output.json b/tasks/post-to-cmr/schemas/output.json similarity index 100% rename from cumulus/tasks/post-to-cmr/schemas/output.json rename to tasks/post-to-cmr/schemas/output.json diff --git a/cumulus/tasks/post-to-cmr/tests/cmr_test.js b/tasks/post-to-cmr/tests/cmr_test.js similarity index 100% rename from cumulus/tasks/post-to-cmr/tests/cmr_test.js rename to tasks/post-to-cmr/tests/cmr_test.js diff --git a/cumulus/tasks/post-to-cmr/tests/data/meta.xml b/tasks/post-to-cmr/tests/data/meta.xml similarity index 100% rename from cumulus/tasks/post-to-cmr/tests/data/meta.xml rename to tasks/post-to-cmr/tests/data/meta.xml diff --git a/cumulus/tasks/post-to-cmr/tests/data/payload.json b/tasks/post-to-cmr/tests/data/payload.json similarity index 100% rename from cumulus/tasks/post-to-cmr/tests/data/payload.json rename to tasks/post-to-cmr/tests/data/payload.json diff --git a/cumulus/tasks/post-to-cmr/webpack.config.js b/tasks/post-to-cmr/webpack.config.js similarity index 100% rename from cumulus/tasks/post-to-cmr/webpack.config.js rename to tasks/post-to-cmr/webpack.config.js diff --git a/cumulus/tasks/queue-granules/README.md b/tasks/queue-granules/README.md similarity index 100% rename from cumulus/tasks/queue-granules/README.md rename to tasks/queue-granules/README.md diff --git a/cumulus/tasks/queue-granules/index.js b/tasks/queue-granules/index.js similarity index 100% rename from cumulus/tasks/queue-granules/index.js rename to tasks/queue-granules/index.js diff --git a/cumulus/tasks/queue-granules/package.json b/tasks/queue-granules/package.json similarity index 81% rename from cumulus/tasks/queue-granules/package.json rename to tasks/queue-granules/package.json index a25280af232..868639cf604 100644 --- a/cumulus/tasks/queue-granules/package.json +++ b/tasks/queue-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-granules", - "version": "1.2.0", + "version": "1.3.0", "description": "Add discovered granules to the queue", "main": "index.js", "directories": { @@ -15,8 +15,8 @@ }, "scripts": { "test": "ava", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "ava": { @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", + "@cumulus/ingest": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.24.1", diff --git a/cumulus/tasks/queue-granules/schemas/config.json b/tasks/queue-granules/schemas/config.json similarity index 100% rename from cumulus/tasks/queue-granules/schemas/config.json rename to tasks/queue-granules/schemas/config.json diff --git a/cumulus/tasks/queue-granules/schemas/input.json b/tasks/queue-granules/schemas/input.json similarity index 100% rename from cumulus/tasks/queue-granules/schemas/input.json rename to tasks/queue-granules/schemas/input.json diff --git a/cumulus/tasks/queue-granules/schemas/output.json b/tasks/queue-granules/schemas/output.json similarity index 100% rename from cumulus/tasks/queue-granules/schemas/output.json rename to tasks/queue-granules/schemas/output.json diff --git a/cumulus/tasks/queue-granules/tests/.eslintrc.json b/tasks/queue-granules/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/queue-granules/tests/.eslintrc.json rename to tasks/queue-granules/tests/.eslintrc.json diff --git a/cumulus/tasks/queue-granules/tests/fixtures/input.json b/tasks/queue-granules/tests/fixtures/input.json similarity index 100% rename from cumulus/tasks/queue-granules/tests/fixtures/input.json rename to tasks/queue-granules/tests/fixtures/input.json diff --git a/cumulus/tasks/queue-granules/tests/fixtures/workflow-template.json b/tasks/queue-granules/tests/fixtures/workflow-template.json similarity index 100% rename from cumulus/tasks/queue-granules/tests/fixtures/workflow-template.json rename to tasks/queue-granules/tests/fixtures/workflow-template.json diff --git a/cumulus/tasks/queue-granules/tests/index.js b/tasks/queue-granules/tests/index.js similarity index 100% rename from cumulus/tasks/queue-granules/tests/index.js rename to tasks/queue-granules/tests/index.js diff --git a/cumulus/tasks/queue-granules/webpack.config.js b/tasks/queue-granules/webpack.config.js similarity index 100% rename from cumulus/tasks/queue-granules/webpack.config.js rename to tasks/queue-granules/webpack.config.js diff --git a/cumulus/tasks/queue-pdrs/README.md b/tasks/queue-pdrs/README.md similarity index 100% rename from cumulus/tasks/queue-pdrs/README.md rename to tasks/queue-pdrs/README.md diff --git a/cumulus/tasks/queue-pdrs/index.js b/tasks/queue-pdrs/index.js similarity index 100% rename from cumulus/tasks/queue-pdrs/index.js rename to tasks/queue-pdrs/index.js diff --git a/cumulus/tasks/queue-pdrs/package.json b/tasks/queue-pdrs/package.json similarity index 80% rename from cumulus/tasks/queue-pdrs/package.json rename to tasks/queue-pdrs/package.json index 8a942046557..1c95bcc736f 100644 --- a/cumulus/tasks/queue-pdrs/package.json +++ b/tasks/queue-pdrs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-pdrs", - "version": "1.2.0", + "version": "1.3.0", "description": "Add discovered PDRs to a queue", "main": "index.js", "directories": { @@ -15,8 +15,8 @@ }, "scripts": { "test": "ava", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "ava": { @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", + "@cumulus/ingest": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.24.1", diff --git a/cumulus/tasks/queue-pdrs/schemas/config.json b/tasks/queue-pdrs/schemas/config.json similarity index 100% rename from cumulus/tasks/queue-pdrs/schemas/config.json rename to tasks/queue-pdrs/schemas/config.json diff --git a/cumulus/tasks/queue-pdrs/schemas/input.json b/tasks/queue-pdrs/schemas/input.json similarity index 100% rename from cumulus/tasks/queue-pdrs/schemas/input.json rename to tasks/queue-pdrs/schemas/input.json diff --git a/cumulus/tasks/queue-pdrs/schemas/output.json b/tasks/queue-pdrs/schemas/output.json similarity index 100% rename from cumulus/tasks/queue-pdrs/schemas/output.json rename to tasks/queue-pdrs/schemas/output.json diff --git a/cumulus/tasks/queue-pdrs/tests/.eslintrc.json b/tasks/queue-pdrs/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/queue-pdrs/tests/.eslintrc.json rename to tasks/queue-pdrs/tests/.eslintrc.json diff --git a/cumulus/tasks/queue-pdrs/tests/fixtures/input.json b/tasks/queue-pdrs/tests/fixtures/input.json similarity index 100% rename from cumulus/tasks/queue-pdrs/tests/fixtures/input.json rename to tasks/queue-pdrs/tests/fixtures/input.json diff --git a/cumulus/tasks/queue-pdrs/tests/fixtures/workflow-template.json b/tasks/queue-pdrs/tests/fixtures/workflow-template.json similarity index 100% rename from cumulus/tasks/queue-pdrs/tests/fixtures/workflow-template.json rename to tasks/queue-pdrs/tests/fixtures/workflow-template.json diff --git a/cumulus/tasks/queue-pdrs/tests/index.js b/tasks/queue-pdrs/tests/index.js similarity index 100% rename from cumulus/tasks/queue-pdrs/tests/index.js rename to tasks/queue-pdrs/tests/index.js diff --git a/cumulus/tasks/queue-pdrs/webpack.config.js b/tasks/queue-pdrs/webpack.config.js similarity index 100% rename from cumulus/tasks/queue-pdrs/webpack.config.js rename to tasks/queue-pdrs/webpack.config.js diff --git a/tasks/sf-sns-report/README.md b/tasks/sf-sns-report/README.md new file mode 100644 index 00000000000..3461c4a83bf --- /dev/null +++ b/tasks/sf-sns-report/README.md @@ -0,0 +1,52 @@ +# @cumulus/sf-sns-report + +[![CircleCI](https://circleci.com/gh/cumulus-nasa/cumulus.svg?style=svg)](https://circleci.com/gh/cumulus-nasa/cumulus) + +Broadcast an incoming Cumulus message to SNS. This lambda function works with Cumulus Message Adapter, and it can be used anywhere in a step function workflow to report granule and PDR status. + +To report the PDR's progress as it's being processed, add the following step after the pdr-status-check: + + PdrStatusReport: + CumulusConfig: + cumulus_message: + input: '{$}' + ResultPath: null + Type: Task + Resource: ${SfSnsReportLambdaFunction.Arn} + +To report the start status of the step function: + + StartAt: StatusReport + States: + StatusReport: + CumulusConfig: + cumulus_message: + input: '{$}' + ResultPath: null + Type: Task + Resource: ${SfSnsReportLambdaFunction.Arn} + +To report the final status of the step function: + + StopStatus: + CumulusConfig: + sfnEnd: true + stack: '{$.meta.stack}' + bucket: '{$.meta.buckets.internal}' + stateMachine: '{$.cumulus_meta.state_machine}' + executionName: '{$.cumulus_meta.execution_name}' + cumulus_message: + input: '{$}' + ResultPath: null + Type: Task + Resource: ${SfSnsReportLambdaFunction.Arn} + +## What is Cumulus? + +Cumulus is a cloud-based data ingest, archive, distribution and management prototype for NASA's future Earth science data streams. + +[Cumulus Documentation](https://cumulus-nasa.github.io/) + +## Contributing + +See [Cumulus README](https://github.com/cumulus-nasa/cumulus/blob/master/README.md#installing-and-deploying) diff --git a/tasks/sf-sns-report/index.js b/tasks/sf-sns-report/index.js new file mode 100644 index 00000000000..c30341e1102 --- /dev/null +++ b/tasks/sf-sns-report/index.js @@ -0,0 +1,131 @@ +'use strict'; + +const get = require('lodash.get'); +const { setGranuleStatus, sns } = require('@cumulus/common/aws'); +const errors = require('@cumulus/common/errors'); +const cumulusMessageAdapter = require('@cumulus/cumulus-message-adapter-js'); + +/** + * Determines if there was a valid exception in the input message + * + * @param {Object} event - aws event object + * @returns {boolean} true if there was an exception, false otherwise + */ +function eventFailed(event) { + // event has exception + // and it is needed to avoid flagging cases like "exception: {}" or "exception: 'none'" + if ((event.exception) && (typeof event.exception === 'object') && + (Object.keys(event.exception).length > 0)) return true; + + // Error and error keys are not part of the cumulus message + // and if they appear in the message something is seriously wrong + else if (event.Error || event.error) return true; + + return false; +} + +/** + * Builds error object based on error type + * + * @param {string} type - error type + * @param {string} cause - error cause + * @returns {Object} the error object + */ +function buildError(type, cause) { + let ErrorClass; + + if (Object.keys(errors).includes(type)) ErrorClass = errors[type]; + else if (type === 'TypeError') ErrorClass = TypeError; + else ErrorClass = Error; + + return new ErrorClass(cause); +} + +/** + * If the cumulus message shows that a previous step failed, + * this function extracts the error message from the cumulus message + * and fails the function with that information. This ensures that the + * Step Function workflow fails with the correct error info + * + * @param {Object} event - aws event object + * @returns {undefined} throws an error and does not return anything + */ +function makeLambdaFunctionFail(event) { + const error = event.exception || event.error; + + if (error) throw buildError(error.Error, error.Cause); + + throw new Error('Step Function failed for an unknown reason.'); +} + +/** + * Publishes incoming Cumulus Message in its entirety to + * a given SNS topic + * + * @param {Object} event - a Cumulus Message that has been sent through the + * Cumulus Message Adapter. See schemas/input.json for detailed input schema. + * @param {Object} event.config - configuration object for the task + * @param {Object} event.config.sfnEnd - indicate if it's the last step of the step function + * @param {string} event.config.stack - the name of the deployment stack + * @param {string} event.config.bucket - S3 bucket + * @param {string} event.config.stateMachine - current state machine + * @param {string} event.config.executionName - execution name + * @returns {Promise.} - AWS SNS response or error in case of step function + * failure. + */ +async function publishSnsMessage(event) { + const config = get(event, 'config'); + const message = get(event, 'input'); + + const finished = get(config, 'sfnEnd', false); + const topicArn = get(message, 'meta.topic_arn', null); + const failed = eventFailed(message); + + let response = {}; + if (topicArn) { + // if this is the sns call at the end of the execution + if (finished) { + message.meta.status = failed ? 'failed' : 'completed'; + const granuleId = get(message, 'meta.granuleId', null); + if (granuleId) { + await setGranuleStatus( + granuleId, + config.stack, + config.bucket, + config.stateMachine, + config.executionName, + message.meta.status + ); + } + } + else { + message.meta.status = 'running'; + } + + response = await sns().publish({ + TopicArn: topicArn, + Message: JSON.stringify(message) + }).promise(); + } + + if (failed) { + makeLambdaFunctionFail(message); + } + + return response; +} + +exports.publishSnsMessage = publishSnsMessage; + +/** + * Lambda handler. It broadcasts an incoming Cumulus message to SNS + * + * @param {Object} event - a Cumulus Message + * @param {Object} context - an AWS Lambda context object + * @param {Function} callback - an AWS Lambda call back + * @returns {undefined} - does not return a value + */ +function handler(event, context, callback) { + cumulusMessageAdapter.runCumulusTask(publishSnsMessage, event, context, callback); +} +exports.handler = handler; diff --git a/tasks/sf-sns-report/package.json b/tasks/sf-sns-report/package.json new file mode 100644 index 00000000000..4c5ca7e3761 --- /dev/null +++ b/tasks/sf-sns-report/package.json @@ -0,0 +1,56 @@ +{ + "name": "@cumulus/sf-sns-report", + "version": "1.3.0", + "description": "Broadcasts an incoming Cumulus message to SNS", + "main": "index.js", + "directories": { + "test": "tests" + }, + "repository": { + "type": "git", + "url": "https://github.com/cumulus-nasa/cumulus" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "test": "ava", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", + "postinstall": "npm run build" + }, + "ava": { + "files": "tests", + "babel": "inherit", + "require": [ + "babel-polyfill", + "babel-register" + ] + }, + "babel": { + "presets": [ + "es2015" + ], + "plugins": [ + "transform-async-to-generator" + ] + }, + "author": "Cumulus Authors", + "license": "Apache-2.0", + "dependencies": { + "@cumulus/common": "^1.3.0", + "@cumulus/cumulus-message-adapter-js": "^1.0.1", + "@cumulus/ingest": "^1.3.0", + "babel-core": "^6.25.0", + "babel-loader": "^6.2.4", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.24.1", + "json-loader": "~0.5.7", + "lodash.get": "^4.4.2", + "webpack": "~1.12.13" + }, + "devDependencies": { + "ava": "^0.23.0" + } +} diff --git a/tasks/sf-sns-report/schemas/config.json b/tasks/sf-sns-report/schemas/config.json new file mode 100644 index 00000000000..588d3df1dae --- /dev/null +++ b/tasks/sf-sns-report/schemas/config.json @@ -0,0 +1,36 @@ +{ + "title": "SfSnsReportConfig", + "description": "Describes the config used by the sf-sns-report task", + "type": "object", + "additionalProperties": false, + "properties": { + "sfnEnd": { + "description": "indicate if it's the last step of the step function.", + "type": "boolean" + }, + "stack": { + "description": "the name of the deployment stack (from meta.stack). Required when sfnEnd is true and granule status is reported.", + "type": "string" + }, + "bucket": { + "description": "S3 bucket (from meta.buckets.internal). Required when sfnEnd is true and granule status is reported.", + "type": "string" + }, + "stateMachine": { + "description": "current state machine (from cumulus_meta.state_machine). Required when sfnEnd is true and granule status is reported.", + "type": "string" + }, + "executionName": { + "description": "execution name (from cumulus_meta.execution_name). Required when sfnEnd is true and granule status is reported.", + "type": "string" + } + }, + "oneOf": [ + { + "required": ["stack", "bucket", "stateMachine", "executionName"] + }, + { + "required": [] + } + ] +} diff --git a/cumulus/tasks/sync-granule/tests/.eslintrc.json b/tasks/sf-sns-report/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/sync-granule/tests/.eslintrc.json rename to tasks/sf-sns-report/tests/.eslintrc.json diff --git a/tasks/sf-sns-report/tests/index.js b/tasks/sf-sns-report/tests/index.js new file mode 100644 index 00000000000..d34c7282b0a --- /dev/null +++ b/tasks/sf-sns-report/tests/index.js @@ -0,0 +1,102 @@ +'use strict'; + +const test = require('ava'); +const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); +const { publishSnsMessage } = require('../index'); +const { cloneDeep, get } = require('lodash'); +const { randomString } = require('@cumulus/common/test-utils'); + +test('send report when sfn is running', (t) => { + const event = { + input: { + meta: { topic_arn: 'test_topic_arn' }, + anykey: 'anyvalue' + } + }; + + return publishSnsMessage(cloneDeep(event)) + .then((output) => { + t.not(get(output, 'MessageId', null)); + }); +}); + +test('send report when sfn is running with exception', (t) => { + const event = { + input: { + meta: { topic_arn: 'test_topic_arn' }, + exception: { + Error: 'TheError', + Cause: 'bucket not found' + }, + anykey: 'anyvalue' + } + }; + + return publishSnsMessage(cloneDeep(event)) + .catch((e) => { + t.is(e.message, event.input.exception.Cause); + }); +}); + +test('send report when sfn is running with TypeError', (t) => { + const event = { + input: { + meta: { topic_arn: 'test_topic_arn' }, + error: { + Error: 'TypeError', + Cause: 'resource not found' + }, + anykey: 'anyvalue' + } + }; + + return publishSnsMessage(cloneDeep(event)) + .catch((e) => { + t.is(e.message, event.input.error.Cause); + }); +}); + +test('send report when sfn is running with known error type', (t) => { + const event = { + input: { + meta: { topic_arn: 'test_topic_arn' }, + error: { + Error: 'PDRParsingError', + Cause: 'format error' + }, + anykey: 'anyvalue' + } + }; + + return publishSnsMessage(cloneDeep(event)) + .catch((e) => { + t.is(e.message, event.input.error.Cause); + }); +}); + +test('send report when sfn is finished and granule has succeeded', async (t) => { + const input = { + meta: { + topic_arn: 'test_topic_arn', + granuleId: randomString() + }, + anykey: 'anyvalue' + }; + const event = {}; + event.input = input; + event.config = {}; + event.config.sfnEnd = true; + event.config.stack = 'test_stack'; + event.config.bucket = randomString(); + event.config.stateMachine = + 'arn:aws:states:us-east-1:596205514787:stateMachine:TestCumulusParsePdrStateMach-K5Qk90fc8w4U'; + event.config.executionName = '7c543392-1da9-47f0-9c34-f43f6519412a'; + + await s3().createBucket({ Bucket: event.config.bucket }).promise(); + return publishSnsMessage(cloneDeep(event)) + .then((output) => { + t.not(get(output, 'MessageId', null)); + }) + .then(() => recursivelyDeleteS3Bucket(event.config.bucket)) + .catch(() => recursivelyDeleteS3Bucket(event.config.bucket).then(t.fail)); +}); diff --git a/tasks/sf-sns-report/webpack.config.js b/tasks/sf-sns-report/webpack.config.js new file mode 100644 index 00000000000..f0d512ee35d --- /dev/null +++ b/tasks/sf-sns-report/webpack.config.js @@ -0,0 +1,19 @@ +module.exports = { + entry: ['babel-polyfill', './index.js'], + output: { + libraryTarget: 'commonjs2', + filename: 'dist/index.js' + }, + target: 'node', + devtool: 'sourcemap', + module: { + loaders: [{ + test: /\.js?$/, + exclude: /node_modules(?!\/@cumulus)/, + loader: 'babel' + }, { + test: /\.json$/, + loader: 'json' + }] + } +}; diff --git a/cumulus/tasks/sync-granule/README.md b/tasks/sync-granule/README.md similarity index 100% rename from cumulus/tasks/sync-granule/README.md rename to tasks/sync-granule/README.md diff --git a/cumulus/tasks/sync-granule/index.js b/tasks/sync-granule/index.js similarity index 100% rename from cumulus/tasks/sync-granule/index.js rename to tasks/sync-granule/index.js diff --git a/cumulus/tasks/sync-granule/package.json b/tasks/sync-granule/package.json similarity index 80% rename from cumulus/tasks/sync-granule/package.json rename to tasks/sync-granule/package.json index aed87eb41c6..eb698b7a301 100644 --- a/cumulus/tasks/sync-granule/package.json +++ b/tasks/sync-granule/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sync-granule", - "version": "1.2.0", + "version": "1.3.0", "description": "Download a given granule", "main": "index.js", "directories": { @@ -15,8 +15,8 @@ }, "scripts": { "test": "ava", - "build": "webpack --progress", - "watch": "webpack --progress -w", + "build": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress", + "watch": "rm -rf dist && mkdir dist && cp -R schemas dist/ && webpack --progress -w", "postinstall": "npm run build" }, "author": "Cumulus Authors", @@ -41,10 +41,10 @@ ] }, "dependencies": { - "@cumulus/common": "^1.2.0", + "@cumulus/common": "^1.3.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.2.0", - "@cumulus/test-data": "^1.2.0", + "@cumulus/ingest": "^1.3.0", + "@cumulus/test-data": "^1.3.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/sync-granule/schemas/config.json b/tasks/sync-granule/schemas/config.json similarity index 100% rename from cumulus/tasks/sync-granule/schemas/config.json rename to tasks/sync-granule/schemas/config.json diff --git a/cumulus/tasks/sync-granule/schemas/input.json b/tasks/sync-granule/schemas/input.json similarity index 100% rename from cumulus/tasks/sync-granule/schemas/input.json rename to tasks/sync-granule/schemas/input.json diff --git a/cumulus/tasks/sync-granule/schemas/output.json b/tasks/sync-granule/schemas/output.json similarity index 100% rename from cumulus/tasks/sync-granule/schemas/output.json rename to tasks/sync-granule/schemas/output.json diff --git a/tasks/sync-granule/tests/.eslintrc.json b/tasks/sync-granule/tests/.eslintrc.json new file mode 100644 index 00000000000..ada42bca77f --- /dev/null +++ b/tasks/sync-granule/tests/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "rules": { + "no-param-reassign": "off" + } +} diff --git a/cumulus/tasks/sync-granule/tests/sync_granule_test.js b/tasks/sync-granule/tests/sync_granule_test.js similarity index 87% rename from cumulus/tasks/sync-granule/tests/sync_granule_test.js rename to tasks/sync-granule/tests/sync_granule_test.js index 2abfd3daa0f..ab7fb179898 100644 --- a/cumulus/tasks/sync-granule/tests/sync_granule_test.js +++ b/tasks/sync-granule/tests/sync_granule_test.js @@ -11,7 +11,6 @@ const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); const { cloneDeep } = require('lodash'); const { findTestDataDirectory, - findTmpTestDataDirectory, randomString, validateConfig, validateInput, @@ -90,29 +89,20 @@ test('download Granule from FTP endpoint', async (t) => { }); test('download Granule from HTTP endpoint', async (t) => { - const granulePath = randomString(); - const localGranulePath = path.join(await findTmpTestDataDirectory(), granulePath); - t.context.event.config.provider = { id: 'MODAPS', protocol: 'http', host: 'http://localhost:3030' }; - t.context.event.input.granules[0].files[0].path = `/${granulePath}`; + t.context.event.input.granules[0].files[0].path = '/granules'; validateConfig(t, t.context.event.config); validateInput(t, t.context.event.input); - await fs.mkdir(localGranulePath); + // await fs.mkdir(localGranulePath); try { const granuleFilename = t.context.event.input.granules[0].files[0].name; - // Stage the file to be downloaded - await fs.copy( - path.join(await findTestDataDirectory(), 'granules', granuleFilename), - path.join(localGranulePath, granuleFilename) - ); - const output = await syncGranule(t.context.event); validateOutput(t, output); @@ -130,9 +120,6 @@ test('download Granule from HTTP endpoint', async (t) => { } else throw e; } - finally { - fs.remove(localGranulePath); - } }); test('download Granule from SFTP endpoint', async (t) => { @@ -194,7 +181,7 @@ test('download granule from S3 provider', async (t) => { await s3().putObject({ Bucket: t.context.event.config.provider.host, Key: `${granuleFilePath}/${granuleFileName}`, - Body: fs.createReadStream(`../../../packages/test-data/granules/${granuleFileName}`) + Body: fs.createReadStream(`../../packages/test-data/granules/${granuleFileName}`) }).promise(); const output = await syncGranule(t.context.event); @@ -227,25 +214,17 @@ test('download granule with checksum in file from an HTTP endpoint', async (t) = }; const granulePath = randomString(); - event.input.granules[0].files[0].path = `/${granulePath}`; - event.input.granules[0].files[1].path = `/${granulePath}`; + event.input.granules[0].files[0].path = '/granules'; + event.input.granules[0].files[1].path = '/granules'; validateConfig(t, event.config); validateInput(t, event.input); - const localGranulePath = path.join(await findTmpTestDataDirectory(), granulePath); - await fs.mkdir(localGranulePath); try { // Stage the files to be downloaded const sourceDir = path.join(await findTestDataDirectory(), 'granules'); const granuleFilename = event.input.granules[0].files[0].name; const checksumFilename = event.input.granules[0].files[1].name; - await Promise.all([ - fs.copy(path.join(sourceDir, granuleFilename), - path.join(localGranulePath, granuleFilename)), - fs.copy(path.join(sourceDir, checksumFilename), - path.join(localGranulePath, checksumFilename)) - ]); const output = await syncGranule(event); @@ -262,10 +241,6 @@ test('download granule with checksum in file from an HTTP endpoint', async (t) = } else throw e; } - finally { - // Clean up - fs.remove(localGranulePath); - } }); // TODO Fix this test as part of https://bugs.earthdata.nasa.gov/browse/CUMULUS-272 diff --git a/cumulus/tasks/sync-granule/webpack.config.js b/tasks/sync-granule/webpack.config.js similarity index 100% rename from cumulus/tasks/sync-granule/webpack.config.js rename to tasks/sync-granule/webpack.config.js diff --git a/tests/fixtures/workflows/pdr_parse_ingest.json b/tests/fixtures/workflows/pdr_parse_ingest.json index 14dc893c40a..70c03187bb5 100644 --- a/tests/fixtures/workflows/pdr_parse_ingest.json +++ b/tests/fixtures/workflows/pdr_parse_ingest.json @@ -6,7 +6,7 @@ "steps": [ { "name": "DiscoverPdrs", - "lambda": "cumulus/tasks/discover-pdrs", + "lambda": "tasks/discover-pdrs", "handler": "index.handler", "cumulusConfig": { "templateUri": "{{$.meta.templates.ParsePdr}}", @@ -20,7 +20,7 @@ }, { "name": "QueuePdrs", - "lambda": "cumulus/tasks/queue-pdrs", + "lambda": "tasks/queue-pdrs", "handler": "index.handler", "cumulusConfig": { "provider": "{{$.meta.provider}}", @@ -38,7 +38,7 @@ "steps": [ { "name": "ParsePdr", - "lambda": "cumulus/tasks/parse-pdr", + "lambda": "tasks/parse-pdr", "handler": "index.handler", "cumulusConfig": { "useQueue": true,