From e5747551284b0ce23467a2df9438dc74bf850914 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Tue, 6 Mar 2018 15:13:23 -0500 Subject: [PATCH 01/94] update pdr stats --- cumulus/tasks/pdr-status-check/index.js | 3 ++- cumulus/tasks/pdr-status-check/schemas/input.json | 10 +++++++++- cumulus/tasks/pdr-status-check/schemas/output.json | 10 +++++++++- cumulus/tasks/pdr-status-check/tests/index.js | 6 ++++-- .../test-data/cumulus_messages/pdr-status-check.json | 6 +++++- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/cumulus/tasks/pdr-status-check/index.js b/cumulus/tasks/pdr-status-check/index.js index 75f06f25815..5d90281fd28 100644 --- a/cumulus/tasks/pdr-status-check/index.js +++ b/cumulus/tasks/pdr-status-check/index.js @@ -117,7 +117,8 @@ function buildOutput(event, groupedExecutions) { isFinished: groupedExecutions.running.length === 0, running, failed, - completed + completed, + pdr: event.input.pdr }; if (!output.isFinished) { diff --git a/cumulus/tasks/pdr-status-check/schemas/input.json b/cumulus/tasks/pdr-status-check/schemas/input.json index 82fe1fe8e52..afdd94941de 100644 --- a/cumulus/tasks/pdr-status-check/schemas/input.json +++ b/cumulus/tasks/pdr-status-check/schemas/input.json @@ -23,6 +23,14 @@ }, "counter": { "type": "integer" }, "limit": { "type": "integer" }, - "isFinished": { "type": "boolean" } + "isFinished": { "type": "boolean" }, + "pdr": { + "type": "object", + "required": ["name", "path"], + "properties": { + "name": { "type": "string" }, + "path": { "type": "string" } + } + } } } diff --git a/cumulus/tasks/pdr-status-check/schemas/output.json b/cumulus/tasks/pdr-status-check/schemas/output.json index 7bcc74594a3..df4142e27c7 100644 --- a/cumulus/tasks/pdr-status-check/schemas/output.json +++ b/cumulus/tasks/pdr-status-check/schemas/output.json @@ -23,6 +23,14 @@ }, "counter": { "type": "integer" }, "limit": { "type": "integer" }, - "isFinished": { "type": "boolean" } + "isFinished": { "type": "boolean" }, + "pdr": { + "type": "object", + "required": ["name", "path"], + "properties": { + "name": { "type": "string" }, + "path": { "type": "string" } + } + } } } diff --git a/cumulus/tasks/pdr-status-check/tests/index.js b/cumulus/tasks/pdr-status-check/tests/index.js index 9b3d5b11fc6..0ee7350b2ef 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/cumulus/tasks/pdr-status-check/tests/index.js @@ -9,7 +9,8 @@ const { checkPdrStatuses } = require('../index'); test('valid output when no running executions', (t) => { const event = { input: { - running: [] + running: [], + pdr: { name: 'test.PDR', path: 'test-path' } } }; @@ -19,7 +20,8 @@ test('valid output when no running executions', (t) => { isFinished: true, running: [], failed: [], - completed: [] + completed: [], + pdr: { name: 'test.PDR', path: 'test-path' } }; t.deepEqual(output, expectedOutput); diff --git a/packages/test-data/cumulus_messages/pdr-status-check.json b/packages/test-data/cumulus_messages/pdr-status-check.json index fa0f578d9ea..55fdb8c90be 100644 --- a/packages/test-data/cumulus_messages/pdr-status-check.json +++ b/packages/test-data/cumulus_messages/pdr-status-check.json @@ -85,7 +85,11 @@ "running": [ "arn:aws:states:us-east-1:000000000000:execution:LpdaacCumulusIngestGranuleS-pOyNXh5jeR4h:d5b6344a-36eb-4c97-a5cf-3f6e83f0692a" ], - "limit": 30 + "limit": 30, + "pdr": { + "name": "MOD09GQ_1granule_v2.PDR", + "path": "/" + } }, "exception": "None", "workflow_config": { From ca5634dcf1dad30f68ee94caddd69acbbe676f48 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Fri, 9 Mar 2018 09:52:52 -0500 Subject: [PATCH 02/94] update pdr stats --- CHANGELOG.md | 5 ++ cumulus/tasks/pdr-status-check/index.js | 61 +++++++++++++------ cumulus/tasks/pdr-status-check/package.json | 1 + cumulus/tasks/pdr-status-check/tests/index.js | 38 ++++++++---- 4 files changed, 77 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fba62c472e8..515cd22db23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `@cumulus/deployment` deploys DynamoDB streams for the Collections, Providers and Rules tables as well as a new lambda function called `dbIndexer`. The `dbIndexer` lambda has an event source mapping which listens to each of the DynamoDB streams. The dbIndexer lambda receives events referencing operations on the DynamoDB table and updates the elasticsearch cluster accordingly. - The `@cumulus/api` endpoints for collections, providers and rules _only_ query DynamoDB, with the exception of LIST endpoints and the collections' GET endpoint. +- **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. + - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. + - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. Added code to update pdr stats in pdr-status-check task. + - It's possible a execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. + ### Updated - Broke up `kes.override.js` of @cumulus/deployment to multiple modules and moved to a new location - Expanded @cumulus/deployment test coverage diff --git a/cumulus/tasks/pdr-status-check/index.js b/cumulus/tasks/pdr-status-check/index.js index 5d90281fd28..4d80a49396f 100644 --- a/cumulus/tasks/pdr-status-check/index.js +++ b/cumulus/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 indexer = require('@cumulus/api/es/indexer'); // The default number of times to re-check for completion const defaultRetryLimit = 30; @@ -129,6 +130,20 @@ function buildOutput(event, groupedExecutions) { return output; } +/** + * update stats of the pdr in elasticsearch + * + * @param {Object} payload - the result of the pdr-status-check + * @returns {Promise.} - elasticsearch update response + */ +async function updatePdrStatuses(payload) { + const stats = { + processing: payload.running.length, + completed: payload.completed.length, + failed: payload.failed.length + }; + await indexer.partialRecordUpdate(null, payload.pdr.name, 'pdr', { stats }); +} /** * Checks a list of Step Function Executions to see if they are all in * terminal states. @@ -138,28 +153,40 @@ function buildOutput(event, groupedExecutions) { * @returns {Promise.} - an object describing the status of Step * Function executions related to a PDR */ -function checkPdrStatuses(event) { +async function checkPdrStatuses(event) { const runningExecutionArns = event.input.running || []; - const promisedExecutionDescriptions = runningExecutionArns.map((executionArn) => - aws.sfn().describeExecution({ executionArn }).promise()); - - return Promise.all(promisedExecutionDescriptions) - .then(groupExecutionsByStatus) - .then((groupedExecutions) => { - const counter = getCounterFromEvent(event) + 1; - const exceededLimit = counter >= getLimitFromEvent(event); + const executions = []; + for (const executionArn of runningExecutionArns) { + try { + const execution = await aws.sfn().describeExecution({ executionArn }).promise(); + executions.push(execution); + } + catch (e) { + log.debug(e); + // it's ok if a execution is still in the queue and has not be executed + if (e.errorType === 'ExecutionDoesNotExist') { + executions.push({ executionArn: executionArn, status: 'RUNNING' }); + } + else throw e; + } + } - const executionsAllDone = groupedExecutions.running.length === 0; + const groupedExecutions = groupExecutionsByStatus(executions); + const counter = getCounterFromEvent(event) + 1; + const exceededLimit = counter >= getLimitFromEvent(event); - if (!executionsAllDone && exceededLimit) { - throw new IncompleteError(`PDR didn't complete after ${counter} checks`); - } + const executionsAllDone = groupedExecutions.running.length === 0; + 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; - }); + const output = buildOutput(event, groupedExecutions); + if (!output.isFinished) logStatus(output); + const response = await updatePdrStatuses(output); + log.debug(response); + //await updatePdrStatuses(output); + return output; } exports.checkPdrStatuses = checkPdrStatuses; diff --git a/cumulus/tasks/pdr-status-check/package.json b/cumulus/tasks/pdr-status-check/package.json index 9afd90c5a48..6eb49b94d83 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/cumulus/tasks/pdr-status-check/package.json @@ -40,6 +40,7 @@ ] }, "dependencies": { + "@cumulus/api": "^1.1.1", "@cumulus/common": "^1.1.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", "@cumulus/ingest": "^1.1.1", diff --git a/cumulus/tasks/pdr-status-check/tests/index.js b/cumulus/tasks/pdr-status-check/tests/index.js index 0ee7350b2ef..e597b1014f6 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/cumulus/tasks/pdr-status-check/tests/index.js @@ -4,8 +4,13 @@ const _ = require('lodash'); const test = require('ava'); const sinon = require('sinon'); const aws = require('@cumulus/common/aws'); +const indexer = require('@cumulus/api/es/indexer'); const { checkPdrStatuses } = require('../index'); +test.before(() => { + sinon.stub(indexer, 'partialRecordUpdate'); +}); + test('valid output when no running executions', (t) => { const event = { input: { @@ -43,7 +48,8 @@ test('error thrown when limit exceeded', (t) => { input: { running: ['arn:123'], counter: 2, - limit: 3 + limit: 3, + pdr: { name: 'test.PDR', path: 'test-path' } } }; @@ -63,38 +69,48 @@ test('returns the correct results in the nominal case', (t) => { 'arn:1': 'RUNNING', 'arn:2': 'SUCCEEDED', 'arn:3': 'FAILED', - 'arn:4': 'ABORTED' + 'arn:4': 'ABORTED', + 'arn:7': null + }; + const error = { + errorMessage: 'Execution Does Not Exist:arn', + errorType: 'ExecutionDoesNotExist', + stackTrace: [] }; const stubSfnClient = { describeExecution: ({ executionArn }) => ({ - promise: () => Promise.resolve({ - executionArn, - status: executionStatuses[executionArn] - }) + promise: () => { + if (executionStatuses[executionArn] === null) return Promise.reject(error); + return Promise.resolve({ + executionArn, + status: executionStatuses[executionArn] + }); + } }) }; - const stub = sinon.stub(aws, 'sfn').returns(stubSfnClient); + const stubsf = sinon.stub(aws, 'sfn').returns(stubSfnClient); const event = { input: { - running: ['arn:1', 'arn:2', 'arn:3', 'arn:4'], + running: ['arn:1', 'arn:2', 'arn:3', 'arn:4', 'arn:7'], completed: ['arn:5'], failed: [{ arn: 'arn:6', reason: 'OutOfCheese' }], counter: 5, - limit: 10 + limit: 10, + pdr: { name: 'test.PDR', path: 'test-path' } } }; return checkPdrStatuses(event) .then((output) => { - stub.restore(); + stubsf.restore(); t.false(output.isFinished); t.is(output.counter, 6); t.is(output.limit, 10); - t.deepEqual(output.running, ['arn:1']); + t.deepEqual(output.running, ['arn:1', 'arn:7']); t.deepEqual(output.completed.sort(), ['arn:2', 'arn:5'].sort()); t.is(output.failed.length, 3); From 893478743fc614e691a47f8a21511b155fbf9964 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 9 Mar 2018 10:21:31 -0500 Subject: [PATCH 03/94] Add eslint-ratchet --- .circleci/config.yml | 14 +++++++---- .eslint-ratchet-high-water-mark | 1 + .eslintignore | 2 ++ bin/eslint-ratchet | 32 ++++++++++++++++++++++++ cumulus/tasks/discover-pdrs/package.json | 2 ++ 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 .eslint-ratchet-high-water-mark create mode 100644 .eslintignore create mode 100755 bin/eslint-ratchet diff --git a/.circleci/config.yml b/.circleci/config.yml index 4d979ab9076..f265b326ca1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -59,11 +59,15 @@ jobs: - ./cumulus/packages/deployment/node_modules key: dependencies-{{ checksum "lerna.json" }}-{{ checksum "package.json" }} + # - run: + # name: Running Test + # environment: + # LOCALSTACK_HOST: localstack + # command: yarn test + - run: - name: Running Test - environment: - LOCALSTACK_HOST: localstack - command: yarn test + name: Running eslint-ratchet + command: ./bin/eslint-ratchet build_and_publish: docker: @@ -98,4 +102,4 @@ workflows: - build_and_test filters: branches: - only: master \ No newline at end of file + only: master diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark new file mode 100644 index 00000000000..8cd333f5398 --- /dev/null +++ b/.eslint-ratchet-high-water-mark @@ -0,0 +1 @@ +1860 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000000..cb3fd15fc3d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +**/node_modules/** +**/dist/** diff --git a/bin/eslint-ratchet b/bin/eslint-ratchet new file mode 100755 index 00000000000..8e085f0d576 --- /dev/null +++ b/bin/eslint-ratchet @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +# Only valid option is "ci" +ARG="$1" +if [ "$ARG" != "" ] && [ "$ARG" != "ci" ]; then + echo "ERROR: Invalid argument - ${ARG}" >&2 + exit 1; +fi + +PREV=$(< .eslint-ratchet-high-water-mark) +NOW=$(eslint --format unix . | tail -n 1 | awk '{ print $1 }') + +# If there are more errors now than there used to be, fail +if (( NOW > PREV )); then + DELTA=$(( NOW - PREV)) + echo "ERROR: ESLint errors have increased by ${DELTA}" >&2 + exit 1 +elif (( NOW < PREV )); then + if [ "$ARG" == "ci" ]; then + echo "ERROR: Found fewer ESLint errors than expected. Run './bin/eslint-ratchet' and commit .eslint-ratchet-high-water-mark file" >&2 + exit 2 + else + echo "WIN: ESLint errors have decreased from ${PREV} to ${NOW}. Ratcheting down ..." + echo "$NOW" > .eslint-ratchet-high-water-mark + exit 0 + fi +else + echo "No change in number of ESLint errors" + exit 0 +fi diff --git a/cumulus/tasks/discover-pdrs/package.json b/cumulus/tasks/discover-pdrs/package.json index f2c56829d10..c6699ddd190 100644 --- a/cumulus/tasks/discover-pdrs/package.json +++ b/cumulus/tasks/discover-pdrs/package.json @@ -52,6 +52,8 @@ "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", "ava": "^0.21.0", + "eslint": "^4.18.2", + "eslint-plugin-jsdoc": "^3.5.0", "fs-extra": "^5.0.0", "lodash": "^4.17.5" } From 1326f36d0249aaaa12afaf87a64557e3c48f8757 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 9 Mar 2018 10:45:08 -0500 Subject: [PATCH 04/94] Fix eslint-ratchet --- .circleci/config.yml | 2 +- bin/eslint-ratchet | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f265b326ca1..a1c0da13191 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -67,7 +67,7 @@ jobs: - run: name: Running eslint-ratchet - command: ./bin/eslint-ratchet + command: ./bin/eslint-ratchet ci build_and_publish: docker: diff --git a/bin/eslint-ratchet b/bin/eslint-ratchet index 8e085f0d576..f62ca2ed7e1 100755 --- a/bin/eslint-ratchet +++ b/bin/eslint-ratchet @@ -10,7 +10,7 @@ if [ "$ARG" != "" ] && [ "$ARG" != "ci" ]; then fi PREV=$(< .eslint-ratchet-high-water-mark) -NOW=$(eslint --format unix . | tail -n 1 | awk '{ print $1 }') +NOW=$(./node_modules/.bin/eslint --format unix . | tail -n 1 | awk '{ print $1 }') # If there are more errors now than there used to be, fail if (( NOW > PREV )); then From e5edd4f619c2a9696637b0a541922167da02f9fe Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 9 Mar 2018 11:10:51 -0500 Subject: [PATCH 05/94] Print number of errors in eslint-ratchet --- bin/eslint-ratchet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/eslint-ratchet b/bin/eslint-ratchet index f62ca2ed7e1..8be4943e026 100755 --- a/bin/eslint-ratchet +++ b/bin/eslint-ratchet @@ -19,7 +19,7 @@ if (( NOW > PREV )); then exit 1 elif (( NOW < PREV )); then if [ "$ARG" == "ci" ]; then - echo "ERROR: Found fewer ESLint errors than expected. Run './bin/eslint-ratchet' and commit .eslint-ratchet-high-water-mark file" >&2 + echo "ERROR: Expected ${PREV} errors but found ${NOW}. Run './bin/eslint-ratchet' and commit .eslint-ratchet-high-water-mark file" >&2 exit 2 else echo "WIN: ESLint errors have decreased from ${PREV} to ${NOW}. Ratcheting down ..." From ff23e5df216413a94fe3f1c98a8a51bfa641d8e4 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Fri, 9 Mar 2018 12:16:27 -0500 Subject: [PATCH 06/94] remove update pdr stats from pdr-status-check --- cumulus/tasks/pdr-status-check/index.js | 24 +++---------------- cumulus/tasks/pdr-status-check/tests/index.js | 10 ++------ 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/cumulus/tasks/pdr-status-check/index.js b/cumulus/tasks/pdr-status-check/index.js index 4d80a49396f..74847119843 100644 --- a/cumulus/tasks/pdr-status-check/index.js +++ b/cumulus/tasks/pdr-status-check/index.js @@ -5,7 +5,6 @@ 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 indexer = require('@cumulus/api/es/indexer'); // The default number of times to re-check for completion const defaultRetryLimit = 30; @@ -79,7 +78,8 @@ function logStatus(output) { * failed: [ * { arn: 'arn:456', reason: 'Workflow Aborted' } * ], - * completed: [] + * completed: [], + * pdr: {} * } * * @param {Object} event - the event that came into checkPdrStatuses @@ -130,20 +130,6 @@ function buildOutput(event, groupedExecutions) { return output; } -/** - * update stats of the pdr in elasticsearch - * - * @param {Object} payload - the result of the pdr-status-check - * @returns {Promise.} - elasticsearch update response - */ -async function updatePdrStatuses(payload) { - const stats = { - processing: payload.running.length, - completed: payload.completed.length, - failed: payload.failed.length - }; - await indexer.partialRecordUpdate(null, payload.pdr.name, 'pdr', { stats }); -} /** * Checks a list of Step Function Executions to see if they are all in * terminal states. @@ -163,9 +149,8 @@ async function checkPdrStatuses(event) { executions.push(execution); } catch (e) { - log.debug(e); // it's ok if a execution is still in the queue and has not be executed - if (e.errorType === 'ExecutionDoesNotExist') { + if (e.code === 'ExecutionDoesNotExist') { executions.push({ executionArn: executionArn, status: 'RUNNING' }); } else throw e; @@ -183,9 +168,6 @@ async function checkPdrStatuses(event) { const output = buildOutput(event, groupedExecutions); if (!output.isFinished) logStatus(output); - const response = await updatePdrStatuses(output); - log.debug(response); - //await updatePdrStatuses(output); return output; } exports.checkPdrStatuses = checkPdrStatuses; diff --git a/cumulus/tasks/pdr-status-check/tests/index.js b/cumulus/tasks/pdr-status-check/tests/index.js index e597b1014f6..474f1cf2592 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/cumulus/tasks/pdr-status-check/tests/index.js @@ -4,13 +4,8 @@ const _ = require('lodash'); const test = require('ava'); const sinon = require('sinon'); const aws = require('@cumulus/common/aws'); -const indexer = require('@cumulus/api/es/indexer'); const { checkPdrStatuses } = require('../index'); -test.before(() => { - sinon.stub(indexer, 'partialRecordUpdate'); -}); - test('valid output when no running executions', (t) => { const event = { input: { @@ -73,9 +68,8 @@ test('returns the correct results in the nominal case', (t) => { 'arn:7': null }; const error = { - errorMessage: 'Execution Does Not Exist:arn', - errorType: 'ExecutionDoesNotExist', - stackTrace: [] + message: 'Execution Does Not Exist: arn', + code: 'ExecutionDoesNotExist' }; const stubSfnClient = { From 1237272fbe80869a84f8efbb9806e336dc803256 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 9 Mar 2018 13:27:45 -0500 Subject: [PATCH 07/94] Fix eslint-ratchet --- .eslint-ratchet-high-water-mark | 2 +- .eslintignore | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 8cd333f5398..23f6521b133 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1860 +1775 diff --git a/.eslintignore b/.eslintignore index cb3fd15fc3d..f8d56b13bdf 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ **/node_modules/** **/dist/** +packages/deployment/app/*.js From f9f3f173e0848ebe7db07828fb744641ba5a27fb Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 9 Mar 2018 13:37:00 -0500 Subject: [PATCH 08/94] Re-enable tests in Circle CI --- .circleci/config.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4e27659e04d..77082c9ae51 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,12 +16,12 @@ jobs: - core- - run: - name: core installation + name: core installation command: | yarn install # generate global hash - ./node_modules/.bin/lerna exec --concurrency 1 -- sha1sum package.json | awk '{print $1}' '' >> /home/circleci/project/global-hash + ./node_modules/.bin/lerna exec --concurrency 1 -- sha1sum package.json | awk '{print $1}' '' >> /home/circleci/project/global-hash - save_cache: paths: @@ -115,18 +115,18 @@ jobs: - ./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 - # - run: - # name: Running Test - # environment: - # LOCALSTACK_HOST: localstack - # command: yarn test + - run: + name: Running Test + environment: + LOCALSTACK_HOST: localstack + command: yarn test - run: name: Running eslint-ratchet From 1f3a8abb07327c67f3d3abdced9d136af01676da Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Mon, 12 Mar 2018 20:22:55 -0400 Subject: [PATCH 09/94] use cumulus-message-adapter --- cumulus/tasks/pdr-status-check/tests/index.js | 4 +- cumulus/tasks/sf-sns-report/README.md | 27 ++++ cumulus/tasks/sf-sns-report/index.js | 127 ++++++++++++++++++ cumulus/tasks/sf-sns-report/package.json | 55 ++++++++ .../tasks/sf-sns-report/schemas/config.json | 28 ++++ .../tasks/sf-sns-report/tests/.eslintrc.json | 5 + cumulus/tasks/sf-sns-report/tests/index.js | 68 ++++++++++ cumulus/tasks/sf-sns-report/webpack.config.js | 19 +++ packages/common/aws.js | 18 ++- 9 files changed, 342 insertions(+), 9 deletions(-) create mode 100644 cumulus/tasks/sf-sns-report/README.md create mode 100644 cumulus/tasks/sf-sns-report/index.js create mode 100644 cumulus/tasks/sf-sns-report/package.json create mode 100644 cumulus/tasks/sf-sns-report/schemas/config.json create mode 100644 cumulus/tasks/sf-sns-report/tests/.eslintrc.json create mode 100644 cumulus/tasks/sf-sns-report/tests/index.js create mode 100644 cumulus/tasks/sf-sns-report/webpack.config.js diff --git a/cumulus/tasks/pdr-status-check/tests/index.js b/cumulus/tasks/pdr-status-check/tests/index.js index 474f1cf2592..d926496ef11 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/cumulus/tasks/pdr-status-check/tests/index.js @@ -83,7 +83,7 @@ test('returns the correct results in the nominal case', (t) => { } }) }; - const stubsf = sinon.stub(aws, 'sfn').returns(stubSfnClient); + const stub = sinon.stub(aws, 'sfn').returns(stubSfnClient); const event = { input: { @@ -98,7 +98,7 @@ test('returns the correct results in the nominal case', (t) => { return checkPdrStatuses(event) .then((output) => { - stubsf.restore(); + stub.restore(); t.false(output.isFinished); t.is(output.counter, 6); diff --git a/cumulus/tasks/sf-sns-report/README.md b/cumulus/tasks/sf-sns-report/README.md new file mode 100644 index 00000000000..76f259532d6 --- /dev/null +++ b/cumulus/tasks/sf-sns-report/README.md @@ -0,0 +1,27 @@ +# @cumulus/queue-pdrs + +[![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 each pdr-status-check: +` PdrStatusReport: + CumulusConfig: + cumulus_message: + input: '{$}' + outputs: + - source: '{$.payload}' + destination: '{$.payload}' + 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/cumulus/tasks/sf-sns-report/index.js b/cumulus/tasks/sf-sns-report/index.js new file mode 100644 index 00000000000..1ada2428d65 --- /dev/null +++ b/cumulus/tasks/sf-sns-report/index.js @@ -0,0 +1,127 @@ +'use strict'; + +const get = require('lodash.get'); +const { StepFunction } = require('@cumulus/ingest/aws'); +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) { + if (event.exception) { + if (typeof event.exception === 'object') { + // this is needed to avoid flagging cases like "exception: {}" or "exception: 'none'" + if (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; +} + +/** + * if the cumulus message shows that a previous step failed, + * this function extract the error message from the cumulus message + * and fail 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 = get(event, 'exception.Error', get(event, 'error.Error')); + const cause = get(event, 'exception.Cause', get(event, 'error.Cause')); + if (error) { + if (errors[error]) { + throw new errors[error](cause); + } + else if (error === 'TypeError') { + throw new TypeError(cause); + } + throw new 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.executionTime - execution time + * @returns {Promise.} - AWS SNS response. see schemas/output.json for detailed output + * schema that is passed to the next task in the workflow + */ +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); + + 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, + get(config, 'stack', null), + get(config, 'bucket', null), + get(config, 'stateMachine', null), + get(config, 'executionName', null), + message.meta.status + ); + } + } + else { + message.meta.status = 'running'; + } + + await sns().publish({ + TopicArn: topicArn, + Message: JSON.stringify(message) + }).promise(); + } + + if (failed) { + makeLambdaFunctionFail(message); + } + + return message; +} + +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 {Promise} updated event object + */ +function handler(event, context, callback) { + return StepFunction.pullEvent(event).then((message) => + cumulusMessageAdapter.runCumulusTask(publishSnsMessage, message, context, callback)); +} +exports.handler = handler; diff --git a/cumulus/tasks/sf-sns-report/package.json b/cumulus/tasks/sf-sns-report/package.json new file mode 100644 index 00000000000..ccd80bfcd59 --- /dev/null +++ b/cumulus/tasks/sf-sns-report/package.json @@ -0,0 +1,55 @@ +{ + "name": "@cumulus/sf-sns-report", + "version": "1.1.1", + "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": "env TEST=true ava tests/*.js", + "build": "webpack --progress", + "watch": "webpack --progress -w", + "postinstall": "npm run build" + }, + "ava": { + "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.1.0", + "@cumulus/cumulus-message-adapter-js": "^1.0.1", + "@cumulus/ingest": "^1.1.1", + "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.21.0" + } +} diff --git a/cumulus/tasks/sf-sns-report/schemas/config.json b/cumulus/tasks/sf-sns-report/schemas/config.json new file mode 100644 index 00000000000..7ab81fe80ea --- /dev/null +++ b/cumulus/tasks/sf-sns-report/schemas/config.json @@ -0,0 +1,28 @@ +{ + "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" + }, + "executionTime": { + "description": "execution time (from cumulus_meta.execution_name). Required when sfnEnd is true and granule status is reported.", + "type": "string" + } + } +} diff --git a/cumulus/tasks/sf-sns-report/tests/.eslintrc.json b/cumulus/tasks/sf-sns-report/tests/.eslintrc.json new file mode 100644 index 00000000000..ada42bca77f --- /dev/null +++ b/cumulus/tasks/sf-sns-report/tests/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "rules": { + "no-param-reassign": "off" + } +} diff --git a/cumulus/tasks/sf-sns-report/tests/index.js b/cumulus/tasks/sf-sns-report/tests/index.js new file mode 100644 index 00000000000..59093ef5e7f --- /dev/null +++ b/cumulus/tasks/sf-sns-report/tests/index.js @@ -0,0 +1,68 @@ +'use strict'; + +const test = require('ava'); +const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); +const { publishSnsMessage } = require('../index'); +const { cloneDeep } = 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) => { + event.input.meta.status = 'running'; + t.deepEqual(output, event.input); + }); +}); + +test('send report when sfn is running and lamda function fails', (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 finished and granule succeed', 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) => { + event.input.meta.status = 'completed'; + t.deepEqual(output, event.input); + }) + .then(() => recursivelyDeleteS3Bucket(event.config.bucket)) + .catch(() => recursivelyDeleteS3Bucket(event.config.bucket).then(t.fail)); +}); diff --git a/cumulus/tasks/sf-sns-report/webpack.config.js b/cumulus/tasks/sf-sns-report/webpack.config.js new file mode 100644 index 00000000000..f0d512ee35d --- /dev/null +++ b/cumulus/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/packages/common/aws.js b/packages/common/aws.js index 5477bbd89c7..1e85acecc52 100644 --- a/packages/common/aws.js +++ b/packages/common/aws.js @@ -64,6 +64,7 @@ exports.dynamodbstreams = awsClient(AWS.DynamoDBStreams, '2012-08-10'); exports.dynamodbDocClient = awsClient(AWS.DynamoDB.DocumentClient, '2012-08-10'); exports.sfn = awsClient(AWS.StepFunctions, '2016-11-23'); exports.cf = awsClient(AWS.CloudFormation, '2010-05-15'); +exports.sns = awsClient(AWS.SNS, '2010-03-31'); /** * Describes the resources belonging to a given CloudFormation stack @@ -529,14 +530,15 @@ exports.getGranuleS3Params = (granuleId, stack, bucket) => { /** * Set the status of a granule +* * @name setGranuleStatus -* @param {string} granuleId -* @param {string} stack = the deployment stackname +* @param {string} granuleId - granule id +* @param {string} stack - the deployment stackname * @param {string} bucket - the deployment bucket name -* @param {string} stateMachineArn -* @param {string} executionName -* @param {string} status -* @return {promise} returns the response from `S3.put` as a promise +* @param {string} stateMachineArn - statemachine arn +* @param {string} executionName - execution name +* @param {string} status - granule status +* @returns {Promise} returns the response from `S3.put` as a promise **/ exports.setGranuleStatus = async ( granuleId, @@ -548,5 +550,7 @@ exports.setGranuleStatus = async ( ) => { const key = exports.getGranuleS3Params(granuleId, stack, bucket); const executionArn = exports.getExecutionArn(stateMachineArn, executionName); - await exports.s3().putObject(bucket, key, '', null, { executionArn, status }).promise(); + const params = { Bucket: bucket, Key: key }; + params.Metadata = { executionArn, status }; + await exports.s3().putObject(params).promise(); }; From cd14fd01dc8219502fcd91553ef00c94a2a64ce4 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Tue, 13 Mar 2018 09:29:28 -0400 Subject: [PATCH 10/94] update readme --- CHANGELOG.md | 2 +- cumulus/tasks/sf-sns-report/README.md | 34 ++++++++++++++++++++-- cumulus/tasks/sf-sns-report/tests/index.js | 21 ++++++++++++- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 515cd22db23..69996ac03dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. - - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. Added code to update pdr stats in pdr-status-check task. + - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcase with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - It's possible a execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. ### Updated diff --git a/cumulus/tasks/sf-sns-report/README.md b/cumulus/tasks/sf-sns-report/README.md index 76f259532d6..4b8636dce76 100644 --- a/cumulus/tasks/sf-sns-report/README.md +++ b/cumulus/tasks/sf-sns-report/README.md @@ -4,8 +4,23 @@ 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 each pdr-status-check: -` PdrStatusReport: +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: '{$}' + outputs: + - source: '{$.payload}' + destination: '{$.payload}' + Type: Task + Resource: ${SfSnsReportLambdaFunction.Arn} + +To report the start status of the step function: + + StartAt: StatusReport + States: + StatusReport: CumulusConfig: cumulus_message: input: '{$}' @@ -14,7 +29,20 @@ To report the PDR's progress as it's being processed, add the following step aft destination: '{$.payload}' 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}' + executionTime: '{$.cumulus_meta.execution_name}' + cumulus_message: + input: '{$}' + Type: Task + Resource: ${SfSnsReportLambdaFunction.Arn} ## What is Cumulus? diff --git a/cumulus/tasks/sf-sns-report/tests/index.js b/cumulus/tasks/sf-sns-report/tests/index.js index 59093ef5e7f..bd0ac7f676f 100644 --- a/cumulus/tasks/sf-sns-report/tests/index.js +++ b/cumulus/tasks/sf-sns-report/tests/index.js @@ -21,7 +21,7 @@ test('send report when sfn is running', (t) => { }); }); -test('send report when sfn is running and lamda function fails', (t) => { +test('send report when sfn is running with exception', (t) => { const event = { input: { meta: { topic_arn: 'test_topic_arn' }, @@ -39,6 +39,25 @@ test('send report when sfn is running and lamda function fails', (t) => { }); }); +test('send report when sfn is running with error', (t) => { + const event = { + input: { + meta: { topic_arn: 'test_topic_arn' }, + error: { + Error: 'TypeError', + Cause: 'bucket not found' + }, + 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 succeed', async (t) => { const input = { meta: { From d93903039a5b9820d86de8f8b2e259f8ede81104 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Tue, 13 Mar 2018 11:46:06 -0400 Subject: [PATCH 11/94] fixes --- CHANGELOG.md | 2 +- cumulus/tasks/pdr-status-check/package.json | 1 - cumulus/tasks/sf-sns-report/README.md | 2 +- cumulus/tasks/sf-sns-report/index.js | 21 ++++++++++----------- cumulus/tasks/sf-sns-report/tests/index.js | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60aa4d92a9d..2e6e88949f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcase with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - - It's possible a execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. + - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. ### Updated - Broke up `kes.override.js` of @cumulus/deployment to multiple modules and moved to a new location diff --git a/cumulus/tasks/pdr-status-check/package.json b/cumulus/tasks/pdr-status-check/package.json index 6eb49b94d83..9afd90c5a48 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/cumulus/tasks/pdr-status-check/package.json @@ -40,7 +40,6 @@ ] }, "dependencies": { - "@cumulus/api": "^1.1.1", "@cumulus/common": "^1.1.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", "@cumulus/ingest": "^1.1.1", diff --git a/cumulus/tasks/sf-sns-report/README.md b/cumulus/tasks/sf-sns-report/README.md index 4b8636dce76..9bed835e460 100644 --- a/cumulus/tasks/sf-sns-report/README.md +++ b/cumulus/tasks/sf-sns-report/README.md @@ -1,4 +1,4 @@ -# @cumulus/queue-pdrs +# @cumulus/sf-sns-report [![CircleCI](https://circleci.com/gh/cumulus-nasa/cumulus.svg?style=svg)](https://circleci.com/gh/cumulus-nasa/cumulus) diff --git a/cumulus/tasks/sf-sns-report/index.js b/cumulus/tasks/sf-sns-report/index.js index 1ada2428d65..bb3ca58d1fb 100644 --- a/cumulus/tasks/sf-sns-report/index.js +++ b/cumulus/tasks/sf-sns-report/index.js @@ -13,13 +13,11 @@ const cumulusMessageAdapter = require('@cumulus/cumulus-message-adapter-js'); * @returns {boolean} true if there was an exception, false otherwise */ function eventFailed(event) { - if (event.exception) { - if (typeof event.exception === 'object') { - // this is needed to avoid flagging cases like "exception: {}" or "exception: 'none'" - if (Object.keys(event.exception).length > 0) { - return true; - } - } + // 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 @@ -31,8 +29,8 @@ function eventFailed(event) { /** * if the cumulus message shows that a previous step failed, - * this function extract the error message from the cumulus message - * and fail the function with that information. This ensures that the + * 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 @@ -121,7 +119,8 @@ exports.publishSnsMessage = publishSnsMessage; * @returns {Promise} updated event object */ function handler(event, context, callback) { - return StepFunction.pullEvent(event).then((message) => - cumulusMessageAdapter.runCumulusTask(publishSnsMessage, message, context, callback)); + return StepFunction.pullEvent(event).then((message) => { + cumulusMessageAdapter.runCumulusTask(publishSnsMessage, message, context, callback); + }); } exports.handler = handler; diff --git a/cumulus/tasks/sf-sns-report/tests/index.js b/cumulus/tasks/sf-sns-report/tests/index.js index bd0ac7f676f..94da140047f 100644 --- a/cumulus/tasks/sf-sns-report/tests/index.js +++ b/cumulus/tasks/sf-sns-report/tests/index.js @@ -58,7 +58,7 @@ test('send report when sfn is running with error', (t) => { }); -test('send report when sfn is finished and granule succeed', async (t) => { +test('send report when sfn is finished and granule has succeeded', async (t) => { const input = { meta: { topic_arn: 'test_topic_arn', From 0edd3dadb59f171950dc14a317411be788113da9 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Wed, 14 Mar 2018 09:33:15 -0400 Subject: [PATCH 12/94] pr updates --- cumulus/tasks/pdr-status-check/schemas/input.json | 7 ++++++- cumulus/tasks/pdr-status-check/schemas/output.json | 7 ++++++- cumulus/tasks/pdr-status-check/tests/index.js | 10 +++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cumulus/tasks/pdr-status-check/schemas/input.json b/cumulus/tasks/pdr-status-check/schemas/input.json index afdd94941de..7c8d82d1ba9 100644 --- a/cumulus/tasks/pdr-status-check/schemas/input.json +++ b/cumulus/tasks/pdr-status-check/schemas/input.json @@ -2,6 +2,7 @@ "title": "PdrStatusCheckInput", "description": "Describes the input expected by the pdr-status-check task", "type": "object", + "required": ["running", "pdr"], "properties": { "running": { "type": "array", @@ -23,8 +24,12 @@ }, "counter": { "type": "integer" }, "limit": { "type": "integer" }, - "isFinished": { "type": "boolean" }, + "isFinished": { + "description": "Indicates whether all the step function executions of the PDR are in terminal states", + "type": "boolean" + }, "pdr": { + "description": "Product Delivery Record", "type": "object", "required": ["name", "path"], "properties": { diff --git a/cumulus/tasks/pdr-status-check/schemas/output.json b/cumulus/tasks/pdr-status-check/schemas/output.json index df4142e27c7..0a9d4bfd381 100644 --- a/cumulus/tasks/pdr-status-check/schemas/output.json +++ b/cumulus/tasks/pdr-status-check/schemas/output.json @@ -2,6 +2,7 @@ "title": "PdrStatusCheckOutput", "description": "Describes the output produced by the pdr-status-check task", "type": "object", + "required": ["running", "completed", "failed", "isFinished", "pdr"], "properties": { "running": { "type": "array", @@ -23,8 +24,12 @@ }, "counter": { "type": "integer" }, "limit": { "type": "integer" }, - "isFinished": { "type": "boolean" }, + "isFinished": { + "description": "Indicates whether all the step function executions of the PDR are in terminal states", + "type": "boolean" + }, "pdr": { + "description": "Product Delivery Record", "type": "object", "required": ["name", "path"], "properties": { diff --git a/cumulus/tasks/pdr-status-check/tests/index.js b/cumulus/tasks/pdr-status-check/tests/index.js index d926496ef11..4c8edc8f416 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/cumulus/tasks/pdr-status-check/tests/index.js @@ -67,15 +67,15 @@ test('returns the correct results in the nominal case', (t) => { 'arn:4': 'ABORTED', 'arn:7': null }; - const error = { - message: 'Execution Does Not Exist: arn', - code: 'ExecutionDoesNotExist' - }; const stubSfnClient = { describeExecution: ({ executionArn }) => ({ promise: () => { - if (executionStatuses[executionArn] === null) return Promise.reject(error); + if (!executionStatuses[executionArn]) { + const error = new Error(`Execution does not exist: ${executionArn}`); + error.code = 'ExecutionDoesNotExist'; + return Promise.reject(error); + } return Promise.resolve({ executionArn, status: executionStatuses[executionArn] From 96d3bba9b1c1c5ca2bd01e2cc1ae6762728a83c9 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Wed, 14 Mar 2018 15:46:58 -0400 Subject: [PATCH 13/94] Update error messages in eslint-ratchet --- bin/eslint-ratchet | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/eslint-ratchet b/bin/eslint-ratchet index 8be4943e026..d255f665bc7 100755 --- a/bin/eslint-ratchet +++ b/bin/eslint-ratchet @@ -15,18 +15,18 @@ NOW=$(./node_modules/.bin/eslint --format unix . | tail -n 1 | awk '{ print $1 } # If there are more errors now than there used to be, fail if (( NOW > PREV )); then DELTA=$(( NOW - PREV)) - echo "ERROR: ESLint errors have increased by ${DELTA}" >&2 + echo "eslint-ratchet error: eslint errors have increased by ${DELTA}" >&2 exit 1 elif (( NOW < PREV )); then if [ "$ARG" == "ci" ]; then - echo "ERROR: Expected ${PREV} errors but found ${NOW}. Run './bin/eslint-ratchet' and commit .eslint-ratchet-high-water-mark file" >&2 + echo "eslint-ratchet error: Expected ${PREV} errors but found ${NOW}. Run './bin/eslint-ratchet' and commit .eslint-ratchet-high-water-mark file" >&2 exit 2 else echo "WIN: ESLint errors have decreased from ${PREV} to ${NOW}. Ratcheting down ..." + echo "Make sure to commit .eslint-ratchet-high-water-mark" echo "$NOW" > .eslint-ratchet-high-water-mark exit 0 fi else - echo "No change in number of ESLint errors" exit 0 fi From e17b6cbab4fa64ea01acd0a0aa7e5e686596da7b Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Wed, 14 Mar 2018 15:47:33 -0400 Subject: [PATCH 14/94] Update README to describe eslint-ratchet --- README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/README.md b/README.md index 5e24e96d5a9..e5815588578 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,36 @@ Run end to end tests by $ yarn e2e +## Code quality checking + +This project uses [eslint](https://eslint.org/) to check code style and quality. +The configured eslint rules can be found in the project's +[.eslintrc.json](https://github.com/cumulus-nasa/cumulus/blob/master/.eslintrc.json) +file. + +In an effort to gradually reduce the number of eslint errors in our codebase, +we are using a script called `eslint-ratchet`. It runs `eslint` against the +repo and compares the number of errors to the previous number of errors. The +previous number of errors is stored in the `.eslint-ratchet-high-water-mark` +file, and tracked in git. If the script is run and the number of errors has +been reduced, the new, lower score is stored in +`.eslint-ratchet-high-water-mark` and should be committed into git. If the +number of errors has increased, the script will fail and tell you that the +number of errors has increased. + +To run the script, simply run `./bin/eslint-ratchet` from the top of the +cumulus repository. + +The `eslint-ratchet` script is also part of our CircleCI build. If the number +of eslint errors that CircleCI finds has increased, it will fail the build. If +the number of errors has *decreased* from what is stored in +`.eslint-ratchet-high-water-mark`, it will also fail the build. In that case, +run `./bin/eslint-ratchet` and commit the new-and-improved +`.eslint-ratchet-high-water-mark` file. + +This idea of ratcheting down the number of errors came from Vince Broz's +excellent [quality](https://github.com/apiology/quality) gem. + ## Adding New Packages Create a new folder under `packages` if it is a common library or create folder under `cumulus/tasks` if it is a lambda task. `cd` to the folder and run `npm init`. From d4901cba5a5a1f4f12f67bd4cd4cab7c942b66b6 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Wed, 14 Mar 2018 15:50:02 -0400 Subject: [PATCH 15/94] Updating .eslint-ratchet score --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 23f6521b133..9bbb4748627 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1775 +1785 From 9e40fcb3cdfba9375c73ed4417fb904b0e509297 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Wed, 14 Mar 2018 15:53:48 -0400 Subject: [PATCH 16/94] Update README with git hook information --- README.md | 17 +++++++++++++++++ bin/eslint-ratchet | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e5815588578..1aee8f3ee97 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,23 @@ the number of errors has *decreased* from what is stored in run `./bin/eslint-ratchet` and commit the new-and-improved `.eslint-ratchet-high-water-mark` file. +To help prevent unexpected build failures in CircleCI, I suggest adding a +local post-commit hook that will run eslint-ratchet after every commit. This +will not cause your commits to fail if the score has increased, but it will +let you know that there is a problem. To set up the post-commit hook, create a +file called `.git/hooks/post-commit` which contains: + +``` +#!/bin/sh + +set -e + +echo "Running ./bin/eslint-ratchet" +./bin/eslint-ratchet +``` + +Make sure the hook is executable with `chmod +x .git/hooks/post-commit` + This idea of ratcheting down the number of errors came from Vince Broz's excellent [quality](https://github.com/apiology/quality) gem. diff --git a/bin/eslint-ratchet b/bin/eslint-ratchet index d255f665bc7..e79558bce15 100755 --- a/bin/eslint-ratchet +++ b/bin/eslint-ratchet @@ -23,7 +23,7 @@ elif (( NOW < PREV )); then exit 2 else echo "WIN: ESLint errors have decreased from ${PREV} to ${NOW}. Ratcheting down ..." - echo "Make sure to commit .eslint-ratchet-high-water-mark" + echo " Make sure to commit .eslint-ratchet-high-water-mark" echo "$NOW" > .eslint-ratchet-high-water-mark exit 0 fi From f0e87d55c279a8bc791f3bf7fc339db3746dc4ec Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Wed, 14 Mar 2018 15:56:52 -0400 Subject: [PATCH 17/94] Update github PR template to mention eslint-ratchet --- .github/pull_request_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d3f21a3919a..4f4c19464ba 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,6 +13,8 @@ Things that should succeed before merging. - [ ] Unit tests - [ ] Adhoc testing - [ ] Update CHANGELOG +- [ ] Run `./bin/eslint-ratchet` and verify that eslint errors have not increased + - [ ] Commit `.eslint-ratchet-high-water-mark` if the score has improved ## Release PR From b2507ce25330312499b5e3687e3db3549e894d96 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Wed, 14 Mar 2018 22:55:55 -0400 Subject: [PATCH 18/94] more fixes --- CHANGELOG.md | 2 +- cumulus/tasks/sf-sns-report/README.md | 9 +-- cumulus/tasks/sf-sns-report/index.js | 73 ++++++++++--------- .../tasks/sf-sns-report/schemas/config.json | 10 ++- cumulus/tasks/sf-sns-report/tests/index.js | 29 ++++++-- 5 files changed, 74 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1964f4686f8..d28ed7cdae7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. - - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcase with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. + - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. ### Updated diff --git a/cumulus/tasks/sf-sns-report/README.md b/cumulus/tasks/sf-sns-report/README.md index 9bed835e460..bb0d882e777 100644 --- a/cumulus/tasks/sf-sns-report/README.md +++ b/cumulus/tasks/sf-sns-report/README.md @@ -10,9 +10,7 @@ To report the PDR's progress as it's being processed, add the following step aft CumulusConfig: cumulus_message: input: '{$}' - outputs: - - source: '{$.payload}' - destination: '{$.payload}' + ResultPath: null Type: Task Resource: ${SfSnsReportLambdaFunction.Arn} @@ -24,9 +22,7 @@ To report the start status of the step function: CumulusConfig: cumulus_message: input: '{$}' - outputs: - - source: '{$.payload}' - destination: '{$.payload}' + ResultPath: null Type: Task Resource: ${SfSnsReportLambdaFunction.Arn} @@ -41,6 +37,7 @@ To report the final status of the step function: executionTime: '{$.cumulus_meta.execution_name}' cumulus_message: input: '{$}' + ResultPath: null Type: Task Resource: ${SfSnsReportLambdaFunction.Arn} diff --git a/cumulus/tasks/sf-sns-report/index.js b/cumulus/tasks/sf-sns-report/index.js index bb3ca58d1fb..772e163f26f 100644 --- a/cumulus/tasks/sf-sns-report/index.js +++ b/cumulus/tasks/sf-sns-report/index.js @@ -1,7 +1,6 @@ 'use strict'; const get = require('lodash.get'); -const { StepFunction } = require('@cumulus/ingest/aws'); const { setGranuleStatus, sns } = require('@cumulus/common/aws'); const errors = require('@cumulus/common/errors'); const cumulusMessageAdapter = require('@cumulus/cumulus-message-adapter-js'); @@ -15,20 +14,35 @@ const cumulusMessageAdapter = require('@cumulus/cumulus-message-adapter-js'); 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; - } + 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; - } + else if (event.Error || event.error) return true; + return false; } /** - * if the cumulus message shows that a previous step failed, + * 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 @@ -37,17 +51,9 @@ function eventFailed(event) { * @returns {undefined} throws an error and does not return anything */ function makeLambdaFunctionFail(event) { - const error = get(event, 'exception.Error', get(event, 'error.Error')); - const cause = get(event, 'exception.Cause', get(event, 'error.Cause')); - if (error) { - if (errors[error]) { - throw new errors[error](cause); - } - else if (error === 'TypeError') { - throw new TypeError(cause); - } - throw new Error(cause); - } + const error = event.exception || event.error; + + if (error) throw buildError(error.Error, error.Cause); throw new Error('Step Function failed for an unknown reason.'); } @@ -64,17 +70,18 @@ function makeLambdaFunctionFail(event) { * @param {string} event.config.bucket - S3 bucket * @param {string} event.config.stateMachine - current state machine * @param {string} event.config.executionTime - execution time - * @returns {Promise.} - AWS SNS response. see schemas/output.json for detailed output - * schema that is passed to the next task in the workflow + * @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 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) { @@ -83,10 +90,10 @@ async function publishSnsMessage(event) { if (granuleId) { await setGranuleStatus( granuleId, - get(config, 'stack', null), - get(config, 'bucket', null), - get(config, 'stateMachine', null), - get(config, 'executionName', null), + get(config, 'stack'), + get(config, 'bucket'), + get(config, 'stateMachine'), + get(config, 'executionName'), message.meta.status ); } @@ -95,7 +102,7 @@ async function publishSnsMessage(event) { message.meta.status = 'running'; } - await sns().publish({ + response = await sns().publish({ TopicArn: topicArn, Message: JSON.stringify(message) }).promise(); @@ -105,7 +112,7 @@ async function publishSnsMessage(event) { makeLambdaFunctionFail(message); } - return message; + return response; } exports.publishSnsMessage = publishSnsMessage; @@ -116,11 +123,9 @@ exports.publishSnsMessage = publishSnsMessage; * @param {Object} event - a Cumulus Message * @param {Object} context - an AWS Lambda context object * @param {Function} callback - an AWS Lambda call back - * @returns {Promise} updated event object + * @returns {undefined} - does not return a value */ function handler(event, context, callback) { - return StepFunction.pullEvent(event).then((message) => { - cumulusMessageAdapter.runCumulusTask(publishSnsMessage, message, context, callback); - }); + cumulusMessageAdapter.runCumulusTask(publishSnsMessage, event, context, callback); } exports.handler = handler; diff --git a/cumulus/tasks/sf-sns-report/schemas/config.json b/cumulus/tasks/sf-sns-report/schemas/config.json index 7ab81fe80ea..fc5e02565e7 100644 --- a/cumulus/tasks/sf-sns-report/schemas/config.json +++ b/cumulus/tasks/sf-sns-report/schemas/config.json @@ -24,5 +24,13 @@ "description": "execution time (from cumulus_meta.execution_name). Required when sfnEnd is true and granule status is reported.", "type": "string" } - } + }, + "oneOf": [ + { + "required": ["stack", "bucket", "stateMachine", "executionTime"] + }, + { + "required": [] + } + ] } diff --git a/cumulus/tasks/sf-sns-report/tests/index.js b/cumulus/tasks/sf-sns-report/tests/index.js index 94da140047f..d34c7282b0a 100644 --- a/cumulus/tasks/sf-sns-report/tests/index.js +++ b/cumulus/tasks/sf-sns-report/tests/index.js @@ -3,7 +3,7 @@ const test = require('ava'); const { recursivelyDeleteS3Bucket, s3 } = require('@cumulus/common/aws'); const { publishSnsMessage } = require('../index'); -const { cloneDeep } = require('lodash'); +const { cloneDeep, get } = require('lodash'); const { randomString } = require('@cumulus/common/test-utils'); test('send report when sfn is running', (t) => { @@ -16,8 +16,7 @@ test('send report when sfn is running', (t) => { return publishSnsMessage(cloneDeep(event)) .then((output) => { - event.input.meta.status = 'running'; - t.deepEqual(output, event.input); + t.not(get(output, 'MessageId', null)); }); }); @@ -39,13 +38,13 @@ test('send report when sfn is running with exception', (t) => { }); }); -test('send report when sfn is running with error', (t) => { +test('send report when sfn is running with TypeError', (t) => { const event = { input: { meta: { topic_arn: 'test_topic_arn' }, error: { Error: 'TypeError', - Cause: 'bucket not found' + Cause: 'resource not found' }, anykey: 'anyvalue' } @@ -57,6 +56,23 @@ test('send report when sfn is running with error', (t) => { }); }); +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 = { @@ -79,8 +95,7 @@ test('send report when sfn is finished and granule has succeeded', async (t) => await s3().createBucket({ Bucket: event.config.bucket }).promise(); return publishSnsMessage(cloneDeep(event)) .then((output) => { - event.input.meta.status = 'completed'; - t.deepEqual(output, event.input); + t.not(get(output, 'MessageId', null)); }) .then(() => recursivelyDeleteS3Bucket(event.config.bucket)) .catch(() => recursivelyDeleteS3Bucket(event.config.bucket).then(t.fail)); From a9c446d45a92e2026c418a1adb4e2d0a7ecf8d7a Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Thu, 15 Mar 2018 09:36:30 -0400 Subject: [PATCH 19/94] more fix --- cumulus/tasks/sf-sns-report/README.md | 2 +- cumulus/tasks/sf-sns-report/index.js | 10 +++++----- cumulus/tasks/sf-sns-report/schemas/config.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cumulus/tasks/sf-sns-report/README.md b/cumulus/tasks/sf-sns-report/README.md index bb0d882e777..3461c4a83bf 100644 --- a/cumulus/tasks/sf-sns-report/README.md +++ b/cumulus/tasks/sf-sns-report/README.md @@ -34,7 +34,7 @@ To report the final status of the step function: stack: '{$.meta.stack}' bucket: '{$.meta.buckets.internal}' stateMachine: '{$.cumulus_meta.state_machine}' - executionTime: '{$.cumulus_meta.execution_name}' + executionName: '{$.cumulus_meta.execution_name}' cumulus_message: input: '{$}' ResultPath: null diff --git a/cumulus/tasks/sf-sns-report/index.js b/cumulus/tasks/sf-sns-report/index.js index 772e163f26f..c30341e1102 100644 --- a/cumulus/tasks/sf-sns-report/index.js +++ b/cumulus/tasks/sf-sns-report/index.js @@ -69,7 +69,7 @@ function makeLambdaFunctionFail(event) { * @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.executionTime - execution time + * @param {string} event.config.executionName - execution name * @returns {Promise.} - AWS SNS response or error in case of step function * failure. */ @@ -90,10 +90,10 @@ async function publishSnsMessage(event) { if (granuleId) { await setGranuleStatus( granuleId, - get(config, 'stack'), - get(config, 'bucket'), - get(config, 'stateMachine'), - get(config, 'executionName'), + config.stack, + config.bucket, + config.stateMachine, + config.executionName, message.meta.status ); } diff --git a/cumulus/tasks/sf-sns-report/schemas/config.json b/cumulus/tasks/sf-sns-report/schemas/config.json index fc5e02565e7..588d3df1dae 100644 --- a/cumulus/tasks/sf-sns-report/schemas/config.json +++ b/cumulus/tasks/sf-sns-report/schemas/config.json @@ -20,14 +20,14 @@ "description": "current state machine (from cumulus_meta.state_machine). Required when sfnEnd is true and granule status is reported.", "type": "string" }, - "executionTime": { - "description": "execution time (from cumulus_meta.execution_name). Required when sfnEnd is true and granule status is reported.", + "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", "executionTime"] + "required": ["stack", "bucket", "stateMachine", "executionName"] }, { "required": [] From 3f8a879489f27e9041c63de89f3db9ccc829544b Mon Sep 17 00:00:00 2001 From: Scisco Date: Thu, 15 Mar 2018 10:57:20 -0400 Subject: [PATCH 20/94] upgrade moment to fix known vulnerability --- cumulus/tasks/discover-cmr-granules/package.json | 2 +- cumulus/tasks/discover-s3-granules/package.json | 2 +- packages/api/package.json | 2 +- packages/ingest/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cumulus/tasks/discover-cmr-granules/package.json b/cumulus/tasks/discover-cmr-granules/package.json index 425cdd803cc..8cdb5dc5e00 100644 --- a/cumulus/tasks/discover-cmr-granules/package.json +++ b/cumulus/tasks/discover-cmr-granules/package.json @@ -20,7 +20,7 @@ "license": "Apache-2.0", "dependencies": { "@cumulus/common": "^1.1.3", - "moment": "^2.19.2", + "moment": "^2.21.0", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1" }, diff --git a/cumulus/tasks/discover-s3-granules/package.json b/cumulus/tasks/discover-s3-granules/package.json index 5ed7e9242a9..2138ed2f14e 100644 --- a/cumulus/tasks/discover-s3-granules/package.json +++ b/cumulus/tasks/discover-s3-granules/package.json @@ -45,7 +45,7 @@ "babel-preset-es2017": "^6.24.1", "json-loader": "~0.5.7", "lodash.get": "^4.4.2", - "moment": "2.18.1", + "moment": "^2.21.0", "webpack": "~1.12.13" }, "devDependencies": { diff --git a/packages/api/package.json b/packages/api/package.json index bc9709e293c..6f0d5091287 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -57,7 +57,7 @@ "lodash.merge": "^4.5.0", "lodash.omit": "^4.5.0", "lodash.uniqby": "^4.7.0", - "moment": "^2.18.1", + "moment": "^2.21.0", "node-forge": "^0.7.1", "p-limit": "^1.1.0", "querystring": "^0.2.0", diff --git a/packages/ingest/package.json b/packages/ingest/package.json index 8bbbe4946c7..3fe1c3023ca 100644 --- a/packages/ingest/package.json +++ b/packages/ingest/package.json @@ -57,7 +57,7 @@ "lodash": "^4.17.5", "lodash.get": "^4.4.2", "mkdirp": "^0.5.1", - "moment": "^2.6.0", + "moment": "^2.21.0", "node-forge": "^0.7.1", "pino": "^4.7.1", "pump": "^1.0.2", From b122af815ff551ef771d706c57c8ff4201d93907 Mon Sep 17 00:00:00 2001 From: Scisco Date: Thu, 15 Mar 2018 11:27:55 -0400 Subject: [PATCH 21/94] update eslint and mocha --- cumulus/services/sfn-throttler/package.json | 2 +- package.json | 2 +- packages/common/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cumulus/services/sfn-throttler/package.json b/cumulus/services/sfn-throttler/package.json index 081d9886e82..d812879937d 100644 --- a/cumulus/services/sfn-throttler/package.json +++ b/cumulus/services/sfn-throttler/package.json @@ -18,7 +18,7 @@ "lodash": "^4.17.4" }, "devDependencies": { - "eslint": "^4.10.0", + "eslint": "^4.18.2", "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.8.0" } diff --git a/package.json b/package.json index 43ea36231c9..2a2e86b2265 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "babel-preset-es2015": "^6.13.2", "babel-preset-es2017": "^6.24.1", "copy-webpack-plugin": "^4.0.1", - "eslint": "^3.2.2", + "eslint": "^4.18.2", "eslint-config-airbnb": "^10.0.0", "eslint-plugin-import": "^1.13.0", "eslint-plugin-jsdoc": "^3.3.1", diff --git a/packages/common/package.json b/packages/common/package.json index 0ec87400263..d599c3d031a 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -54,7 +54,7 @@ "babel-polyfill": "^6.13.0", "babel-preset-env": "^1.6.1", "cwait": "^1.0.0", - "eslint": "^3.2.2", + "eslint": "^4.18.2", "eslint-config-airbnb": "^10.0.0", "eslint-plugin-import": "^1.13.0", "eslint-plugin-jsx-a11y": "^2.1.0", @@ -66,7 +66,7 @@ "glob": "^7.1.1", "js-yaml": "^3.8.3", "lodash": "^4.13.1", - "mocha": "^2.5.3", + "mocha": "^5.0.4", "mocha-junit-reporter": "^1.11.1", "mocha-webpack": "^0.7.0", "prepend-loader": "0.0.2", From b10f12e5595d649202a618bd3909d6f38af62a8b Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 15 Mar 2018 11:35:14 -0400 Subject: [PATCH 22/94] Remove eslint packages that were causing test failures --- cumulus/tasks/discover-pdrs/package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/cumulus/tasks/discover-pdrs/package.json b/cumulus/tasks/discover-pdrs/package.json index a99fbbb081d..b1eacbb81da 100644 --- a/cumulus/tasks/discover-pdrs/package.json +++ b/cumulus/tasks/discover-pdrs/package.json @@ -52,8 +52,6 @@ "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", "ava": "^0.21.0", - "eslint": "^4.18.2", - "eslint-plugin-jsdoc": "^3.5.0", "fs-extra": "^5.0.0", "lodash": "^4.17.5" } From 6168372eff613304cb288c9d991446728584fc3b Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 15 Mar 2018 11:35:54 -0400 Subject: [PATCH 23/94] Storing improved eslint score --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 9bbb4748627..7e8e81804fe 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1785 +1783 From 55a1e3882a8a547b2ff90feb1a6efcd74963ee63 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 15 Mar 2018 11:50:57 -0400 Subject: [PATCH 24/94] Storing improved eslint score --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 7e8e81804fe..65b78cf3041 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1783 +1770 From e67ef8db4ec55c542a04a0465cf04e5c4060e865 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Thu, 15 Mar 2018 12:13:26 -0400 Subject: [PATCH 25/94] moved to unreleased --- CHANGELOG.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e9a2934427..41fa5fc87a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] +- **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. + - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. + - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. + - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. ## [v1.1.3] - 2018-03-14 ### Fixed @@ -23,11 +27,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `@cumulus/deployment` deploys DynamoDB streams for the Collections, Providers and Rules tables as well as a new lambda function called `dbIndexer`. The `dbIndexer` lambda has an event source mapping which listens to each of the DynamoDB streams. The dbIndexer lambda receives events referencing operations on the DynamoDB table and updates the elasticsearch cluster accordingly. - The `@cumulus/api` endpoints for collections, providers and rules _only_ query DynamoDB, with the exception of LIST endpoints and the collections' GET endpoint. -- **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. - - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. - - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. - ### Updated - Broke up `kes.override.js` of @cumulus/deployment to multiple modules and moved to a new location - Expanded @cumulus/deployment test coverage From 95c390c80e97706f8573916a4baa398a392cf97c Mon Sep 17 00:00:00 2001 From: Scisco Date: Thu, 15 Mar 2018 12:42:39 -0400 Subject: [PATCH 26/94] publish only on release --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 47fb0327f17..130eddf0dac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -201,4 +201,4 @@ workflows: - build_and_test filters: branches: - only: master + only: release From bd8f3958e7778b08a058fd079f28b4a89b83c1b6 Mon Sep 17 00:00:00 2001 From: Scisco Date: Thu, 15 Mar 2018 12:57:40 -0400 Subject: [PATCH 27/94] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fed1b32e041..d8c3ddaceff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- Update vulnerable npm packages [CUMULUS-425] ## [v1.1.4] - 2018-03-15 ### Added From 2a8ded9455aa421e4fbe439e68dcdca51ac45d4e Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Thu, 15 Mar 2018 14:39:06 -0400 Subject: [PATCH 28/94] Added concurrency limit on SFN API calls --- CHANGELOG.md | 2 + cumulus/tasks/pdr-status-check/README.md | 1 + cumulus/tasks/pdr-status-check/index.js | 58 +++++++++++-------- cumulus/tasks/pdr-status-check/package.json | 3 + cumulus/tasks/pdr-status-check/tests/index.js | 40 +++++++++++++ 5 files changed, 80 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41fa5fc87a0..97522fe6e4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. +- **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. + ## [v1.1.3] - 2018-03-14 ### Fixed - Changed @cumulus/deployment package install behavior. The build process will happen after installation diff --git a/cumulus/tasks/pdr-status-check/README.md b/cumulus/tasks/pdr-status-check/README.md index 3f31041f437..273d629d841 100644 --- a/cumulus/tasks/pdr-status-check/README.md +++ b/cumulus/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/cumulus/tasks/pdr-status-check/index.js index 74847119843..d9eea082247 100644 --- a/cumulus/tasks/pdr-status-check/index.js +++ b/cumulus/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/cumulus/tasks/pdr-status-check/package.json index 61135fba05e..a4a67f31e4f 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/cumulus/tasks/pdr-status-check/package.json @@ -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.21.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/tests/index.js b/cumulus/tasks/pdr-status-check/tests/index.js index 4c8edc8f416..c4cc285e423 100644 --- a/cumulus/tasks/pdr-status-check/tests/index.js +++ b/cumulus/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); + }); +}); From a6ff6371335fbe86ae3b7ea3e3dbd046121db68c Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 15 Mar 2018 15:39:47 -0400 Subject: [PATCH 29/94] CUMULUS-337 Use NODE_ENV=test instead of TEST=true --- cumulus/tasks/copy-idx-from-s3-to-efs/package.json | 2 +- cumulus/tasks/delete-ingest-tracking-data/package.json | 2 +- cumulus/tasks/delete-pdr-ftp/package.json | 2 +- cumulus/tasks/delete-pdr-s3/package.json | 4 ++-- cumulus/tasks/discover-cmr-granules/package.json | 2 +- cumulus/tasks/discover-granules/package.json | 4 ++-- cumulus/tasks/discover-granules/tests/index.js | 3 ++- cumulus/tasks/discover-pdr/package.json | 2 +- cumulus/tasks/discover-pdrs/package.json | 4 ++-- cumulus/tasks/discover-s3-granules/package.json | 8 +++++--- cumulus/tasks/download-activity-mock/package.json | 2 +- cumulus/tasks/filter-payload/package.json | 2 +- cumulus/tasks/generate-pan/package.json | 2 +- cumulus/tasks/generate-pdr-file-list/package.json | 2 +- cumulus/tasks/generate-pdrd/package.json | 2 +- cumulus/tasks/hello-world/package.json | 2 +- cumulus/tasks/parse-pdr/package.json | 4 ++-- cumulus/tasks/pdr-status-check/package.json | 4 ++-- cumulus/tasks/post-to-cmr/package.json | 4 ++-- cumulus/tasks/queue-granules/package.json | 4 ++-- cumulus/tasks/queue-pdrs/package.json | 5 +++-- cumulus/tasks/run-gdal/package.json | 2 +- cumulus/tasks/sf-sns-report/package.json | 5 +++-- cumulus/tasks/sync-granule/package.json | 4 ++-- cumulus/tasks/trigger-mrf-gen/package.json | 2 +- cumulus/tasks/trigger-process-pdrs/package.json | 2 +- cumulus/tasks/validate-archives/package.json | 2 +- cumulus/tasks/validate-pdr/package.json | 8 +++----- package.json | 2 +- packages/api/endpoints/collections.js | 3 ++- packages/api/endpoints/providers.js | 3 ++- packages/api/endpoints/rules.js | 3 ++- packages/api/es/search.js | 3 ++- packages/api/package.json | 9 +++++---- packages/api/tests/test-db-indexer.js | 1 - packages/common/aws.js | 6 +++--- packages/common/package.json | 2 +- packages/common/test-utils.js | 2 ++ packages/ingest/aws.js | 3 ++- packages/ingest/package.json | 2 +- packages/pvl/package.json | 2 +- packages/task-debug/package.json | 2 +- 42 files changed, 72 insertions(+), 62 deletions(-) diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/package.json b/cumulus/tasks/copy-idx-from-s3-to-efs/package.json index d38e610d533..54d012e358f 100644 --- a/cumulus/tasks/copy-idx-from-s3-to-efs/package.json +++ b/cumulus/tasks/copy-idx-from-s3-to-efs/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.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/delete-ingest-tracking-data/package.json b/cumulus/tasks/delete-ingest-tracking-data/package.json index fb48d737f05..36747bcd6dc 100644 --- a/cumulus/tasks/delete-ingest-tracking-data/package.json +++ b/cumulus/tasks/delete-ingest-tracking-data/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/delete-pdr-ftp/package.json b/cumulus/tasks/delete-pdr-ftp/package.json index b8d2b8affac..16c6cb6e1cb 100644 --- a/cumulus/tasks/delete-pdr-ftp/package.json +++ b/cumulus/tasks/delete-pdr-ftp/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/delete-pdr-s3/package.json b/cumulus/tasks/delete-pdr-s3/package.json index f18da8212e7..61bb8ea8a1f 100644 --- a/cumulus/tasks/delete-pdr-s3/package.json +++ b/cumulus/tasks/delete-pdr-s3/package.json @@ -18,7 +18,7 @@ "test": "test" }, "scripts": { - "test": "env TEST=true ava" + "test": "ava" }, "ava": { "files": [ @@ -51,7 +51,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-cmr-granules/package.json b/cumulus/tasks/discover-cmr-granules/package.json index 425cdd803cc..478e4c4c2c6 100644 --- a/cumulus/tasks/discover-cmr-granules/package.json +++ b/cumulus/tasks/discover-cmr-granules/package.json @@ -39,7 +39,7 @@ ] }, "devDependencies": { - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-granules/package.json b/cumulus/tasks/discover-granules/package.json index bfcaaaaf987..804005dff87 100644 --- a/cumulus/tasks/discover-granules/package.json +++ b/cumulus/tasks/discover-granules/package.json @@ -11,7 +11,7 @@ "url": "https://github.com/cumulus-nasa/cumulus" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "local": "node index.js | pino", "build": "webpack --progress", "watch": "webpack --progress -w", @@ -52,7 +52,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "fs-extra": "^5.0.0", "lodash.clonedeep": "^4.5.0" } diff --git a/cumulus/tasks/discover-granules/tests/index.js b/cumulus/tasks/discover-granules/tests/index.js index fd6f16100ab..7689048a1c4 100644 --- a/cumulus/tasks/discover-granules/tests/index.js +++ b/cumulus/tasks/discover-granules/tests/index.js @@ -14,7 +14,8 @@ const { } = require('@cumulus/common/test-utils'); const { discoverGranules } = require('../index'); -test('discover granules using FTP', async (t) => { +// This test is broken and will be fixed by CUMULUS-427 +test.skip('discover granules using FTP', async (t) => { const event = cloneDeep(mur); await validateConfig(t, event.config); diff --git a/cumulus/tasks/discover-pdr/package.json b/cumulus/tasks/discover-pdr/package.json index 949771f38f2..9b3472a1dfa 100644 --- a/cumulus/tasks/discover-pdr/package.json +++ b/cumulus/tasks/discover-pdr/package.json @@ -50,7 +50,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-pdrs/package.json b/cumulus/tasks/discover-pdrs/package.json index b1eacbb81da..ab819649376 100644 --- a/cumulus/tasks/discover-pdrs/package.json +++ b/cumulus/tasks/discover-pdrs/package.json @@ -11,7 +11,7 @@ "url": "https://github.com/cumulus-nasa/cumulus" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "build": "mkdir -p dist && cp cumulus.json dist/ && webpack --progress", "watch": "mkdir -p dist && cp cumulus.json dist/ && webpack --progress -w", "postinstall": "npm run build" @@ -51,7 +51,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "fs-extra": "^5.0.0", "lodash": "^4.17.5" } diff --git a/cumulus/tasks/discover-s3-granules/package.json b/cumulus/tasks/discover-s3-granules/package.json index 5ed7e9242a9..2d5685f8567 100644 --- a/cumulus/tasks/discover-s3-granules/package.json +++ b/cumulus/tasks/discover-s3-granules/package.json @@ -14,18 +14,20 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava tests/*.js --serial", + "test": "ava", "local": "node index.js | pino", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" }, "ava": { + "files": "tests", "babel": "inherit", "require": [ "babel-polyfill", "babel-register" - ] + ], + "serial": true }, "babel": { "presets": [ @@ -51,6 +53,6 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0" + "ava": "^0.23.0" } } diff --git a/cumulus/tasks/download-activity-mock/package.json b/cumulus/tasks/download-activity-mock/package.json index 1552ed00bbf..1daa0d9cd38 100644 --- a/cumulus/tasks/download-activity-mock/package.json +++ b/cumulus/tasks/download-activity-mock/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/filter-payload/package.json b/cumulus/tasks/filter-payload/package.json index d840b4dfb3e..f83aa6b342a 100644 --- a/cumulus/tasks/filter-payload/package.json +++ b/cumulus/tasks/filter-payload/package.json @@ -40,7 +40,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/generate-pan/package.json b/cumulus/tasks/generate-pan/package.json index c8ad6dd8331..51403be61a9 100644 --- a/cumulus/tasks/generate-pan/package.json +++ b/cumulus/tasks/generate-pan/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/generate-pdr-file-list/package.json b/cumulus/tasks/generate-pdr-file-list/package.json index 06b6c922d9a..479c287a570 100644 --- a/cumulus/tasks/generate-pdr-file-list/package.json +++ b/cumulus/tasks/generate-pdr-file-list/package.json @@ -49,7 +49,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/generate-pdrd/package.json b/cumulus/tasks/generate-pdrd/package.json index 1c5a4397ef6..2912293fe23 100644 --- a/cumulus/tasks/generate-pdrd/package.json +++ b/cumulus/tasks/generate-pdrd/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/hello-world/package.json b/cumulus/tasks/hello-world/package.json index f8a1f309dbe..37ffef69393 100644 --- a/cumulus/tasks/hello-world/package.json +++ b/cumulus/tasks/hello-world/package.json @@ -49,7 +49,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "proxyquire": "^1.8.0" } } diff --git a/cumulus/tasks/parse-pdr/package.json b/cumulus/tasks/parse-pdr/package.json index 654fa73b2fc..36941134171 100644 --- a/cumulus/tasks/parse-pdr/package.json +++ b/cumulus/tasks/parse-pdr/package.json @@ -14,7 +14,7 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" @@ -55,7 +55,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "fs-extra": "^5.0.0", "lodash.clonedeep": "^4.5.0", "proxyquire": "^1.8.0" diff --git a/cumulus/tasks/pdr-status-check/package.json b/cumulus/tasks/pdr-status-check/package.json index 61135fba05e..223740e9cb1 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/cumulus/tasks/pdr-status-check/package.json @@ -14,7 +14,7 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" @@ -57,7 +57,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "lodash": "^4.17.5", "proxyquire": "^1.8.0", "sinon": "^2.0.0-pre.5" diff --git a/cumulus/tasks/post-to-cmr/package.json b/cumulus/tasks/post-to-cmr/package.json index 14e3415a9a2..c9800df70fb 100644 --- a/cumulus/tasks/post-to-cmr/package.json +++ b/cumulus/tasks/post-to-cmr/package.json @@ -14,7 +14,7 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" @@ -59,7 +59,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "proxyquire": "^1.8.0", "sinon": "^2.0.0-pre.5" } diff --git a/cumulus/tasks/queue-granules/package.json b/cumulus/tasks/queue-granules/package.json index f45c0375269..52a1971cc9d 100644 --- a/cumulus/tasks/queue-granules/package.json +++ b/cumulus/tasks/queue-granules/package.json @@ -14,7 +14,7 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" @@ -52,7 +52,7 @@ }, "devDependencies": { "@mapbox/mock-aws-sdk-js": "0.0.5", - "ava": "^0.21.0", + "ava": "^0.23.0", "lodash": "^4.17.5" } } diff --git a/cumulus/tasks/queue-pdrs/package.json b/cumulus/tasks/queue-pdrs/package.json index e92e2e1dc8c..a89664cb509 100644 --- a/cumulus/tasks/queue-pdrs/package.json +++ b/cumulus/tasks/queue-pdrs/package.json @@ -14,12 +14,13 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava tests/*.js", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" }, "ava": { + "files": "tests", "babel": "inherit", "require": [ "babel-polyfill", @@ -51,6 +52,6 @@ }, "devDependencies": { "@mapbox/mock-aws-sdk-js": "0.0.5", - "ava": "^0.21.0" + "ava": "^0.23.0" } } diff --git a/cumulus/tasks/run-gdal/package.json b/cumulus/tasks/run-gdal/package.json index a2dd4b1e7c2..f6571ec12d3 100644 --- a/cumulus/tasks/run-gdal/package.json +++ b/cumulus/tasks/run-gdal/package.json @@ -20,7 +20,7 @@ "clean": "rm -rf dist" }, "devDependencies": { - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/sf-sns-report/package.json b/cumulus/tasks/sf-sns-report/package.json index ccd80bfcd59..a756fb4aada 100644 --- a/cumulus/tasks/sf-sns-report/package.json +++ b/cumulus/tasks/sf-sns-report/package.json @@ -14,12 +14,13 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava tests/*.js", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" }, "ava": { + "files": "tests", "babel": "inherit", "require": [ "babel-polyfill", @@ -50,6 +51,6 @@ "webpack": "~1.12.13" }, "devDependencies": { - "ava": "^0.21.0" + "ava": "^0.23.0" } } diff --git a/cumulus/tasks/sync-granule/package.json b/cumulus/tasks/sync-granule/package.json index 867531427af..8d1ccacb191 100644 --- a/cumulus/tasks/sync-granule/package.json +++ b/cumulus/tasks/sync-granule/package.json @@ -14,7 +14,7 @@ "access": "public" }, "scripts": { - "test": "env TEST=true ava", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" @@ -55,7 +55,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "fs-extra": "^5.0.0", "lodash": "^4.17.5", "proxyquire": "^1.8.0", diff --git a/cumulus/tasks/trigger-mrf-gen/package.json b/cumulus/tasks/trigger-mrf-gen/package.json index e9a6b832683..a10b1aae751 100644 --- a/cumulus/tasks/trigger-mrf-gen/package.json +++ b/cumulus/tasks/trigger-mrf-gen/package.json @@ -37,7 +37,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/trigger-process-pdrs/package.json b/cumulus/tasks/trigger-process-pdrs/package.json index 885ef579140..457dcd2d956 100644 --- a/cumulus/tasks/trigger-process-pdrs/package.json +++ b/cumulus/tasks/trigger-process-pdrs/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/validate-archives/package.json b/cumulus/tasks/validate-archives/package.json index 2c6907c404c..f538be76f08 100644 --- a/cumulus/tasks/validate-archives/package.json +++ b/cumulus/tasks/validate-archives/package.json @@ -50,7 +50,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/validate-pdr/package.json b/cumulus/tasks/validate-pdr/package.json index 7e1ec2f07e5..0f630d171be 100644 --- a/cumulus/tasks/validate-pdr/package.json +++ b/cumulus/tasks/validate-pdr/package.json @@ -18,12 +18,10 @@ "test": "test" }, "scripts": { - "test": "env TEST=true ava" + "test": "ava" }, "ava": { - "files": [ - "test" - ], + "files": "test", "babel": "inherit", "require": [ "babel-polyfill", @@ -53,7 +51,7 @@ "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", "@ava/babel-preset-transform-test-files": "^3.0.0", - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/package.json b/package.json index 43ea36231c9..084677c1d2a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "Cumulus Framework for ingesting and processing Nasa Earth data streams", "scripts": { - "e2e": "env TEST=true ava tests/*.js --serial", + "e2e": "ava tests/*.js --serial", "test": "lerna run test", "bootstrap": "lerna bootstrap", "ybootstrap": "lerna bootstrap --npm-client=yarn", diff --git a/packages/api/endpoints/collections.js b/packages/api/endpoints/collections.js index ddd8f3b7bcc..c9161be8ae5 100644 --- a/packages/api/endpoints/collections.js +++ b/packages/api/endpoints/collections.js @@ -2,6 +2,7 @@ const _get = require('lodash.get'); const { justLocalRun } = require('@cumulus/common/local-helpers'); +const { inTestMode } = require('@cumulus/common/test-utils'); const log = require('@cumulus/common/log'); const { handle } = require('../lib/response'); const models = require('../models'); @@ -122,7 +123,7 @@ function handler(event, context) { return context.fail('HttpMethod is missing'); } - return handle(event, context, !process.env.TEST /* authCheck */, cb => { + return handle(event, context, !inTestMode() /* authCheck */, cb => { if (event.httpMethod === 'GET' && event.pathParameters) { get(event, cb); } diff --git a/packages/api/endpoints/providers.js b/packages/api/endpoints/providers.js index 0fa506e4e8d..46e8bf3b4b9 100644 --- a/packages/api/endpoints/providers.js +++ b/packages/api/endpoints/providers.js @@ -2,6 +2,7 @@ 'use strict'; const _get = require('lodash.get'); +const { inTestMode } = require('@cumulus/common/test-utils'); const { handle } = require('../lib/response'); const models = require('../models'); const RecordDoesNotExist = require('../lib/errors').RecordDoesNotExist; @@ -104,7 +105,7 @@ function del(event, cb) { } function handler(event, context) { - handle(event, context, !process.env.TEST /* authCheck */, (cb) => { + handle(event, context, !inTestMode() /* authCheck */, (cb) => { if (event.httpMethod === 'GET' && event.pathParameters) { get(event, cb); } diff --git a/packages/api/endpoints/rules.js b/packages/api/endpoints/rules.js index 5c78f005d02..394f93d4d23 100644 --- a/packages/api/endpoints/rules.js +++ b/packages/api/endpoints/rules.js @@ -3,6 +3,7 @@ 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'); const { RecordDoesNotExist } = require('../lib/errors'); @@ -118,7 +119,7 @@ async function del(event) { } function handler(event, context) { - return handle(event, context, !process.env.TEST /* authCheck */, cb => { + return handle(event, context, !inTestMode() /* authCheck */, cb => { if (event.httpMethod === 'GET' && event.pathParameters) { get(event, cb); } diff --git a/packages/api/es/search.js b/packages/api/es/search.js index b2e00297c19..7f576c414e9 100644 --- a/packages/api/es/search.js +++ b/packages/api/es/search.js @@ -10,6 +10,7 @@ const omit = require('lodash.omit'); const aws = require('aws-sdk'); const httpAwsEs = require('http-aws-es'); const elasticsearch = require('elasticsearch'); +const { inTestMode } = require('@cumulus/common/test-utils'); const queries = require('./queries'); const aggs = require('./aggregations'); @@ -23,7 +24,7 @@ class BaseSearch { let esConfig; // this is needed for getting temporary credentials from IAM role - if (process.env.TEST) { + if (inTestMode()) { if (!process.env.LOCALSTACK_HOST) { throw new Error('The LOCALSTACK_HOST environment variable is not set.'); } diff --git a/packages/api/package.json b/packages/api/package.json index bc9709e293c..ed92dc074f5 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -4,18 +4,19 @@ "description": "Lambda functions for handling all daac's API operations", "main": "index.js", "scripts": { - "test": "TEST=true ava tests/test-*.js --serial", + "test": "ava", "build": "webpack --progress", "watch": "webpack --progress -w", "postinstall": "npm run build" }, "ava": { - "files": "tests", + "files": "tests/test-*.js", "babel": "inherit", "require": [ "babel-polyfill", "babel-register" - ] + ], + "serial": true }, "publishConfig": { "access": "public" @@ -65,7 +66,7 @@ "webpack": "^1.15.0" }, "devDependencies": { - "ava": "^0.21.0", + "ava": "^0.23.0", "sinon": "^2.0.0-pre.5" } } diff --git a/packages/api/tests/test-db-indexer.js b/packages/api/tests/test-db-indexer.js index 60306c98221..ce82353b773 100644 --- a/packages/api/tests/test-db-indexer.js +++ b/packages/api/tests/test-db-indexer.js @@ -74,7 +74,6 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { }, Environment: { Variables: { - 'TEST': 'true', 'LOCALSTACK_HOST': process.env.DOCKERHOST, 'stackName': process.env.stackName } diff --git a/packages/common/aws.js b/packages/common/aws.js index 9b5d25925e1..2b17526adc9 100644 --- a/packages/common/aws.js +++ b/packages/common/aws.js @@ -8,7 +8,7 @@ const path = require('path'); const url = require('url'); const log = require('./log'); const string = require('./string'); -const testUtils = require('./test-utils'); +const { inTestMode, testAwsClient } = require('./test-utils'); const promiseRetry = require('promise-retry'); const region = exports.region = process.env.AWS_DEFAULT_REGION || 'us-east-1'; @@ -44,11 +44,11 @@ const awsClient = (Service, version = null) => { const options = {}; if (version) options.apiVersion = version; - if (process.env.TEST) { + if (inTestMode()) { if (AWS.DynamoDB.DocumentClient.serviceIdentifier === undefined) { AWS.DynamoDB.DocumentClient.serviceIdentifier = 'dynamodb'; } - return memoize(() => testUtils.testAwsClient(Service, options)); + return memoize(() => testAwsClient(Service, options)); } return memoize(() => new Service(options)); }; diff --git a/packages/common/package.json b/packages/common/package.json index 0ec87400263..8a4f0e15644 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -18,7 +18,7 @@ "lint": "eslint .", "mocha": "mocha-webpack test/**/*.js", "mocha-junit": "npm run mocha -- --reporter mocha-junit-reporter --reporter-options mochaFile=test-results.xml", - "test": "npm run mocha && env TEST=true ava", + "test": "npm run mocha && ava", "test-ci": "npm run lint && npm run mocha-junit" }, "ava": { diff --git a/packages/common/test-utils.js b/packages/common/test-utils.js index 0aed764495a..a3afc38acd8 100644 --- a/packages/common/test-utils.js +++ b/packages/common/test-utils.js @@ -8,6 +8,8 @@ const url = require('url'); const aws = require('./aws'); const fs = require('fs-extra'); +exports.inTestMode = () => process.env.NODE_ENV === 'test'; + /** * Generate a 40-character random string * diff --git a/packages/ingest/aws.js b/packages/ingest/aws.js index 95affd51c15..e24c95297a9 100644 --- a/packages/ingest/aws.js +++ b/packages/ingest/aws.js @@ -7,6 +7,7 @@ const AWS = require('aws-sdk'); const moment = require('moment'); const log = require('@cumulus/common/log'); const errors = require('@cumulus/common/errors'); +const { inTestMode } = require('@cumulus/common/test-utils'); /** * getEndpoint returns proper AWS arguments for various @@ -67,7 +68,7 @@ function getExecutionUrl(executionArn) { } async function invoke(name, payload, type = 'Event') { - if (process.env.IS_LOCAL || process.env.TEST) { + if (process.env.IS_LOCAL || inTestMode()) { log.info(`Faking Lambda invocation for ${name}`); return false; } diff --git a/packages/ingest/package.json b/packages/ingest/package.json index 8bbbe4946c7..a7b5dbda592 100644 --- a/packages/ingest/package.json +++ b/packages/ingest/package.json @@ -3,7 +3,7 @@ "version": "1.1.3", "description": "Ingest utilities", "scripts": { - "test": "env TEST=true ava" + "test": "ava" }, "publishConfig": { "access": "public" diff --git a/packages/pvl/package.json b/packages/pvl/package.json index e86c502def3..fe506704e94 100644 --- a/packages/pvl/package.json +++ b/packages/pvl/package.json @@ -18,6 +18,6 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "ava": "^0.17.0" + "ava": "^0.23.0" } } diff --git a/packages/task-debug/package.json b/packages/task-debug/package.json index 381be64f3ef..c34248bbfaa 100644 --- a/packages/task-debug/package.json +++ b/packages/task-debug/package.json @@ -22,7 +22,7 @@ "commander": "^2.11.0" }, "devDependencies": { - "ava": "^0.21.0", + "ava": "^0.23.0", "babel-cli": "^6.26.0", "babel-core": "^6.25.0", "babel-preset-env": "^1.6.0", From d033193085f00ad34fb59c5135bdd834b81cbed6 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 15 Mar 2018 15:40:23 -0400 Subject: [PATCH 30/94] Storing improved eslint score --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 65b78cf3041..ff5a5069a75 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1770 +1769 From 33ba69811fda8430ad8c528f16852efacff5af9d Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 15 Mar 2018 17:14:16 -0400 Subject: [PATCH 31/94] CUMULUS-337 Move createQueue to common/aws to fix circular dependency --- .eslint-ratchet-high-water-mark | 2 +- .gitignore | 5 ++-- cumulus/tasks/queue-granules/tests/index.js | 3 +-- cumulus/tasks/queue-pdrs/tests/index.js | 3 +-- packages/api/tests/test-kinesis-consumer.js | 4 +-- packages/common/aws.js | 30 ++++++++++++++++++++- packages/common/test-utils.js | 30 +++------------------ packages/ingest/test/queue.js | 6 ++--- tests/ftp_pdr_parse_ingest.js | 3 ++- tests/sftp_pdr_parse_ingest.js | 4 +-- 10 files changed, 48 insertions(+), 42 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index ff5a5069a75..1351198febb 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1769 +1762 diff --git a/.gitignore b/.gitignore index 5882eb1a119..1491bcfcd5f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ package-lock.json yarn.lock +yarn-error.log node_modules build/ dist/ @@ -13,6 +14,6 @@ packaged-* .vscode *-debug.log profiles.clj -*.map +*.map .DS_Store -packages/deployment/app/*.js \ No newline at end of file +packages/deployment/app/*.js diff --git a/cumulus/tasks/queue-granules/tests/index.js b/cumulus/tasks/queue-granules/tests/index.js index 8ed631aa4d7..774f04d3081 100644 --- a/cumulus/tasks/queue-granules/tests/index.js +++ b/cumulus/tasks/queue-granules/tests/index.js @@ -2,9 +2,8 @@ const test = require('ava'); -const { s3, sqs, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); +const { createQueue, s3, sqs, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); const { - createQueue, randomString, validateConfig, validateInput, diff --git a/cumulus/tasks/queue-pdrs/tests/index.js b/cumulus/tasks/queue-pdrs/tests/index.js index 6f94fa69b35..99e0f022061 100644 --- a/cumulus/tasks/queue-pdrs/tests/index.js +++ b/cumulus/tasks/queue-pdrs/tests/index.js @@ -2,9 +2,8 @@ const test = require('ava'); -const { s3, sqs, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); +const { createQueue, s3, sqs, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); const { - createQueue, randomString, validateConfig, validateInput, diff --git a/packages/api/tests/test-kinesis-consumer.js b/packages/api/tests/test-kinesis-consumer.js index 9418bd50e97..4b8579b78b6 100644 --- a/packages/api/tests/test-kinesis-consumer.js +++ b/packages/api/tests/test-kinesis-consumer.js @@ -3,8 +3,8 @@ const test = require('ava'); const sinon = require('sinon'); const get = require('lodash.get'); -const { sqs, s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); -const { createQueue, randomString } = require('@cumulus/common/test-utils'); +const { createQueue, sqs, s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); +const { randomString } = require('@cumulus/common/test-utils'); const { getKinesisRules, handler } = require('../lambdas/kinesis-consumer'); const manager = require('../models/base'); diff --git a/packages/common/aws.js b/packages/common/aws.js index 2b17526adc9..702bdb84343 100644 --- a/packages/common/aws.js +++ b/packages/common/aws.js @@ -8,7 +8,7 @@ const path = require('path'); const url = require('url'); const log = require('./log'); const string = require('./string'); -const { inTestMode, testAwsClient } = require('./test-utils'); +const { inTestMode, randomString, testAwsClient } = require('./test-utils'); const promiseRetry = require('promise-retry'); const region = exports.region = process.env.AWS_DEFAULT_REGION || 'us-east-1'; @@ -481,6 +481,34 @@ exports.fromSfnExecutionName = (str, delimiter = '__') => .map((s) => s.replace(/!/g, '\\').replace('"', '\\"')) .map((s) => JSON.parse(`"${s}"`)); +/** + * Create an SQS Queue. Properly handles localstack queue URLs + * + * @param {string} queueName - defaults to a random string + * @returns {Promise.} the Queue URL + */ +async function createQueue(queueName) { + const actualQueueName = queueName || randomString(); + + const createQueueResponse = await exports.sqs().createQueue({ + QueueName: actualQueueName + }).promise(); + + if (inTestMode()) { + // Properly set the Queue URL. This is needed because LocalStack always + // returns the QueueUrl as "localhost", even if that is not where it should + // actually be found. CircleCI breaks without this. + const returnedQueueUrl = url.parse(createQueueResponse.QueueUrl); + returnedQueueUrl.host = undefined; + returnedQueueUrl.hostname = process.env.LOCALSTACK_HOST; + + return url.format(returnedQueueUrl); + } + + return createQueueResponse.QueueUrl; +} +exports.createQueue = createQueue; + /** * Send a message to AWS SQS * diff --git a/packages/common/test-utils.js b/packages/common/test-utils.js index a3afc38acd8..cab19fee7bf 100644 --- a/packages/common/test-utils.js +++ b/packages/common/test-utils.js @@ -4,8 +4,6 @@ const Ajv = require('ajv'); const crypto = require('crypto'); const path = require('path'); -const url = require('url'); -const aws = require('./aws'); const fs = require('fs-extra'); exports.inTestMode = () => process.env.NODE_ENV === 'test'; @@ -42,7 +40,8 @@ const localStackPorts = { * Test if a given AWS service is supported by LocalStack. * * @param {Function} Service - an AWS service object constructor function - * @returns {boolean} + * @returns {boolean} true or false depending on whether the service is + * supported by LocalStack */ function localstackSupportedService(Service) { const serviceIdentifier = Service.serviceIdentifier; @@ -80,8 +79,6 @@ function localStackAwsClient(Service, options) { /** * Create an AWS service object that does not actually talk to AWS. * - * @todo Update this to return a mock AWS client if not supported by localstack - * * @param {Function} Service - an AWS service object constructor function * @param {Object} options - options to pass to the service object constructor function * @returns {Object} - an AWS service object @@ -94,27 +91,6 @@ function testAwsClient(Service, options) { } exports.testAwsClient = testAwsClient; -/** - * Create an SQS queue for testing - * - * @returns {string} - an SQS queue URL - */ -async function createQueue() { - const createQueueResponse = await aws.sqs().createQueue({ - QueueName: exports.randomString() - }).promise(); - - // Properly set the Queue URL. This is needed because LocalStack always - // returns the QueueUrl as "localhost", even if that is not where it should - // actually be found. CircleCI breaks without this. - const returnedQueueUrl = url.parse(createQueueResponse.QueueUrl); - returnedQueueUrl.host = undefined; - returnedQueueUrl.hostname = process.env.LOCALSTACK_HOST; - - return url.format(returnedQueueUrl); -} -exports.createQueue = createQueue; - /** * Validate an object using json-schema * @@ -185,6 +161,8 @@ exports.validateOutput = validateOutput; /** * Determine the path of the current git repo * + * @param {string} dirname - the directory that you're trying to find the git + * root for * @returns {Promise.} - the filesystem path of the current git repo */ async function findGitRepoRootDirectory(dirname) { diff --git a/packages/ingest/test/queue.js b/packages/ingest/test/queue.js index 3e5c089b15f..4ad64c9ea89 100644 --- a/packages/ingest/test/queue.js +++ b/packages/ingest/test/queue.js @@ -2,8 +2,8 @@ const test = require('ava'); const queue = require('../queue'); -const { sqs, s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); -const { createQueue, randomString } = require('@cumulus/common/test-utils'); +const { createQueue, sqs, s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); +const { randomString } = require('@cumulus/common/test-utils'); test.beforeEach(async (t) => { t.context.templateBucket = randomString(); @@ -19,7 +19,7 @@ test.beforeEach(async (t) => { }, meta: { queues: { startSF: t.context.queueUrl } } }; - + const messageTemplateKey = `${randomString()}/template.json`; await s3().putObject({ Bucket: t.context.templateBucket, diff --git a/tests/ftp_pdr_parse_ingest.js b/tests/ftp_pdr_parse_ingest.js index 63397eeecee..b7f9b31f771 100644 --- a/tests/ftp_pdr_parse_ingest.js +++ b/tests/ftp_pdr_parse_ingest.js @@ -11,8 +11,9 @@ const { deleteCMAFromTasks, messageBuilder } = require('../packages/integration-tests/local'); -const { randomString, createQueue } = require('../packages/common/test-utils'); +const { randomString } = require('../packages/common/test-utils'); const { + createQueue, recursivelyDeleteS3Bucket, s3, sqs, diff --git a/tests/sftp_pdr_parse_ingest.js b/tests/sftp_pdr_parse_ingest.js index 8cc4c3b1fb4..eccac52b338 100644 --- a/tests/sftp_pdr_parse_ingest.js +++ b/tests/sftp_pdr_parse_ingest.js @@ -1,6 +1,5 @@ 'use strict'; -const path = require('path'); const test = require('ava'); const fs = require('fs-extra'); const { @@ -10,8 +9,9 @@ const { deleteCMAFromTasks, messageBuilder } = require('../packages/integration-tests/local'); -const { randomString, createQueue } = require('../packages/common/test-utils'); +const { randomString } = require('../packages/common/test-utils'); const { + createQueue, recursivelyDeleteS3Bucket, s3, sqs, From 3b6df311084964b3381b0c622debdb0e244a87f4 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 16 Mar 2018 11:04:56 -0400 Subject: [PATCH 32/94] Fixed jsdoc for crypto's decrypt function --- packages/ingest/crypto.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ingest/crypto.js b/packages/ingest/crypto.js index b11cda060a5..fdadb835755 100644 --- a/packages/ingest/crypto.js +++ b/packages/ingest/crypto.js @@ -33,15 +33,15 @@ class S3KeyPairProvider { } /** - * Decrypt the given string using the given private key stored in the internal bucket + * Decrypt the given string using a private key stored in S3 * - * @param {string} str - The string to encrypt - * @param {string} keyId - The name of the public key to use for encryption - * @param {string} bucket - the optional bucket name. if not provided will - * use env variable "internal" - * @param {stack} stack - the optional stack name. if not provided will - * use env variable "stackName" - * @returns {Promise} the encrypted string + * @param {string} str - The string to decrypt + * @param {string} keyId - The name of the public key to use for decryption + * @param {string} bucket - the optional bucket name. Defaults to the value of + * the "internal" environment variable + * @param {string} stack - the optional stack name. Defaults to the value of + * the "stackName" environment variable + * @returns {Promise.} the decrypted string */ static async decrypt(str, keyId = 'private.pem', bucket = null, stack = null) { const pki = forge.pki; From ea0a278c8724fb536026d149a9a99f2c795f8591 Mon Sep 17 00:00:00 2001 From: Scisco Date: Fri, 16 Mar 2018 13:29:06 -0400 Subject: [PATCH 33/94] upgrade babel-eslint --- package.json | 2 +- packages/common/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2a2e86b2265..8113ff36f7f 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "devDependencies": { "ava": "^0.25.0", "babel-core": "^6.13.2", - "babel-eslint": "^6.1.2", + "babel-eslint": "^8.2.2", "babel-loader": "^6.2.4", "babel-plugin-transform-async-to-generator": "^6.8.0", "babel-polyfill": "^6.13.0", diff --git a/packages/common/package.json b/packages/common/package.json index d599c3d031a..137cde0e7bc 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -50,7 +50,7 @@ "async": "^2.0.0", "aws-sdk": "^2.4.11", "babel-core": "^6.13.2", - "babel-eslint": "^6.1.2", + "babel-eslint": "^8.2.2", "babel-polyfill": "^6.13.0", "babel-preset-env": "^1.6.1", "cwait": "^1.0.0", From 5a104f0ce7dce25fd2268e91af6e03fdc1f3aa11 Mon Sep 17 00:00:00 2001 From: Scisco Date: Fri, 16 Mar 2018 13:47:07 -0400 Subject: [PATCH 34/94] increase rachet number --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 65b78cf3041..07c2bc82aaa 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1770 +1459 From 35f781888ea8a4d6a79ac46972237ed51f2a6af5 Mon Sep 17 00:00:00 2001 From: Scisco Date: Fri, 16 Mar 2018 13:55:00 -0400 Subject: [PATCH 35/94] change error number --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 07c2bc82aaa..a4ea6e7a770 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1459 +2059 From 46aeb8fbcc25ae67cb95aae0bf9b81ba6ed22d2e Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 16 Mar 2018 14:27:34 -0400 Subject: [PATCH 36/94] CUMULUS-423 Detect empty PDR file --- packages/ingest/parse-pdr.js | 9 ++++++--- packages/ingest/pdr.js | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/ingest/parse-pdr.js b/packages/ingest/parse-pdr.js index 07e5c0acf37..53b70951443 100644 --- a/packages/ingest/parse-pdr.js +++ b/packages/ingest/parse-pdr.js @@ -5,7 +5,7 @@ 'use strict'; -const fs = require('fs'); +const fs = require('fs-extra'); const pvl = require('@cumulus/pvl/t'); const { PDRParsingError } = require('@cumulus/common/errors'); @@ -83,9 +83,12 @@ function extractGranuleId(fileName, regex) { return fileName; } -module.exports.parsePdr = function parsePdr(pdrFilePath, collection, pdrName) { +module.exports.parsePdr = async function parsePdr(pdrFilePath, collection, pdrName) { // then read the file and and pass it to parser - const pdrFile = fs.readFileSync(pdrFilePath, 'utf8'); + const pdrFile = await fs.readFile(pdrFilePath, 'utf8'); + + // Investigating CUMULUS-423 + if (pdrFile.trim().length === 0) throw new Error(`PDR file had no contents: ${pdrFilePath}`); const obj = { granules: [] diff --git a/packages/ingest/pdr.js b/packages/ingest/pdr.js index 0d93dd36288..97481633096 100644 --- a/packages/ingest/pdr.js +++ b/packages/ingest/pdr.js @@ -179,10 +179,10 @@ class Parse { * @return {Promise} * @public */ - parse(pdrLocalPath) { + async parse(pdrLocalPath) { // catching all parse errors here to mark the pdr as failed // if any error occured - const parsed = parsePdr(pdrLocalPath, this.collection, this.pdr.name); + const parsed = await parsePdr(pdrLocalPath, this.collection, this.pdr.name); // each group represents a Granule record. // After adding all the files in the group to the Queue From a53dfa66a655ebecef56b83d2e6f88dd76737a3c Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 16 Mar 2018 15:29:38 -0400 Subject: [PATCH 37/94] Update eslint rules to match our existing style rules --- .eslint-ratchet-high-water-mark | 2 +- .eslintrc.json | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index a4ea6e7a770..31006eb0c12 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -2059 +1918 diff --git a/.eslintrc.json b/.eslintrc.json index 8cb2fb5368f..a401ce8cf0d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -78,8 +78,12 @@ "guard-for-in": "off", "object-shorthand": "off", "space-before-function-paren": [ - "warn", - "never" + "error", + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } ], "brace-style": [ 2, From 29ee29c06813b8b37600795b1a9fb4a2e0930323 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 16 Mar 2018 16:13:14 -0400 Subject: [PATCH 38/94] Fix eslint high water mark --- .eslint-ratchet-high-water-mark | 2 +- bin/eslint-ratchet | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 1351198febb..fc2748e2649 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1762 +1910 diff --git a/bin/eslint-ratchet b/bin/eslint-ratchet index e79558bce15..6d9893618b5 100755 --- a/bin/eslint-ratchet +++ b/bin/eslint-ratchet @@ -15,7 +15,7 @@ NOW=$(./node_modules/.bin/eslint --format unix . | tail -n 1 | awk '{ print $1 } # If there are more errors now than there used to be, fail if (( NOW > PREV )); then DELTA=$(( NOW - PREV)) - echo "eslint-ratchet error: eslint errors have increased by ${DELTA}" >&2 + echo "eslint-ratchet error: eslint errors have increased from ${PREV} to ${NOW}" >&2 exit 1 elif (( NOW < PREV )); then if [ "$ARG" == "ci" ]; then From d26efe4c3598363711a0731936cd1d0c8ef1091d Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 16 Mar 2018 16:53:24 -0400 Subject: [PATCH 39/94] Fix arrow-parens eslint errors --- .eslint-ratchet-high-water-mark | 2 +- .../test/filter-payload-spec.js | 2 +- .../test/delete-pdr-ftp-spec.js | 2 +- cumulus/tasks/discover-cmr-granules/index.js | 2 +- cumulus/tasks/discover-http-tiles/index.js | 4 +- cumulus/tasks/discover-pdr/index.js | 2 +- cumulus/tasks/discover-pdr/pdr.js | 2 +- .../discover-pdr/test/discover-pdr-spec.js | 2 +- .../test/download-activity-mock-spec.js | 2 +- .../test/filter-payload-spec.js | 2 +- cumulus/tasks/generate-pan/pan.js | 2 +- .../generate-pan/test/generate-pan-spec.js | 10 ++--- cumulus/tasks/generate-pdr-file-list/pdr.js | 2 +- .../test/generate-pdr-file-list-spec.js | 4 +- cumulus/tasks/generate-pdrd/pdrd.js | 2 +- .../generate-pdrd/test/generate-pdrd-spec.js | 8 ++-- .../test/trigger-process-pdrs-spec.js | 2 +- .../validate-archives/archive-validations.js | 4 +- cumulus/tasks/validate-archives/index.js | 14 +++---- cumulus/tasks/validate-pdr/index.js | 2 +- cumulus/tasks/validate-pdr/pdr-validations.js | 40 +++++++++---------- cumulus/tasks/validate-pdr/pdr.js | 2 +- .../validate-pdr/test/pdr-validations.test.js | 8 ++-- packages/api/endpoints/collections.js | 10 ++--- packages/api/endpoints/distribution.js | 2 +- packages/api/endpoints/executions.js | 2 +- packages/api/endpoints/granules.js | 6 +-- packages/api/endpoints/pdrs.js | 4 +- packages/api/endpoints/providers.js | 8 ++-- packages/api/endpoints/rules.js | 16 ++++---- packages/api/endpoints/stats.js | 8 ++-- packages/api/endpoints/token.js | 4 +- packages/api/endpoints/workflows.js | 8 ++-- packages/api/es/collections.js | 4 +- packages/api/es/queries.js | 10 ++--- packages/api/es/search.js | 2 +- packages/api/es/stats.js | 4 +- packages/api/lambdas/bootstrap.js | 8 ++-- packages/api/lambdas/jobs.js | 8 ++-- packages/api/lambdas/sf-scheduler.js | 2 +- packages/api/lib/response.js | 4 +- packages/api/models/base.js | 2 +- packages/api/models/collections.js | 2 +- packages/api/tests/test-db-indexer.js | 8 ++-- .../api/tests/test-endpoints-collections.js | 10 ++--- .../api/tests/test-endpoints-providers.js | 10 ++--- packages/api/tests/test-endpoints-rules.js | 10 ++--- packages/api/tests/testUtils.js | 4 +- packages/common/aws.js | 2 +- packages/common/errors.js | 2 +- packages/ingest/consumer.js | 2 +- packages/ingest/ftp.js | 2 +- packages/ingest/granule.js | 16 ++++---- packages/ingest/pdr.js | 4 +- packages/ingest/recursion.js | 4 +- packages/pvl/lib/models.js | 10 ++--- packages/pvl/t.js | 12 +++--- packages/pvl/test/parsing.js | 32 +++++++-------- packages/pvl/test/serializing.js | 18 ++++----- packages/pvl/test/utils.js | 4 +- packages/task-debug/src/workflow.js | 6 +-- 61 files changed, 196 insertions(+), 196 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index fc2748e2649..1d25bf7a627 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1910 +1702 diff --git a/cumulus/tasks/delete-ingest-tracking-data/test/filter-payload-spec.js b/cumulus/tasks/delete-ingest-tracking-data/test/filter-payload-spec.js index e00a57f7b1a..44ca014f5be 100644 --- a/cumulus/tasks/delete-ingest-tracking-data/test/filter-payload-spec.js +++ b/cumulus/tasks/delete-ingest-tracking-data/test/filter-payload-spec.js @@ -3,6 +3,6 @@ const test = require('ava'); const filter = require('../index'); // Nothing really to test here - just a placeholder for future -test('Dummy test', t => { +test('Dummy test', (t) => { t.is(1, 1); }); diff --git a/cumulus/tasks/delete-pdr-ftp/test/delete-pdr-ftp-spec.js b/cumulus/tasks/delete-pdr-ftp/test/delete-pdr-ftp-spec.js index 67373cdd636..73c823e96ce 100644 --- a/cumulus/tasks/delete-pdr-ftp/test/delete-pdr-ftp-spec.js +++ b/cumulus/tasks/delete-pdr-ftp/test/delete-pdr-ftp-spec.js @@ -1,6 +1,6 @@ 'use strict'; const test = require('ava'); -test('TODO - add test', t => { +test('TODO - add test', (t) => { t.is(1, 1); }); diff --git a/cumulus/tasks/discover-cmr-granules/index.js b/cumulus/tasks/discover-cmr-granules/index.js index 6fe98035bd5..d533686f2f2 100644 --- a/cumulus/tasks/discover-cmr-granules/index.js +++ b/cumulus/tasks/discover-cmr-granules/index.js @@ -62,7 +62,7 @@ module.exports = class DiscoverCmrGranulesTask extends Task { const filtered = this.excludeFiltered(messages, this.config.filtered_granule_keys); // Write the messages to a DynamoDB table so we can track ingest failures - const messagePromises = filtered.map(msg => { + const messagePromises = filtered.map((msg) => { const { granuleId, version, collection } = msg.meta; const params = { TableName: this.config.ingest_tracking_table, diff --git a/cumulus/tasks/discover-http-tiles/index.js b/cumulus/tasks/discover-http-tiles/index.js index f2d0fe9904b..1dbffb819ab 100644 --- a/cumulus/tasks/discover-http-tiles/index.js +++ b/cumulus/tasks/discover-http-tiles/index.js @@ -48,12 +48,12 @@ module.exports = class DiscoverHttpTilesTask extends Task { if (granuleFilter) { if (granuleFilter.filtered_granule_keys) { const keySet = new Set(granuleFilter.filtered_granule_keys); - filterFn = msg => keySet.has(msg.meta.key); + filterFn = (msg) => keySet.has(msg.meta.key); } else if (granuleFilter.filtered_granule_key_start) { const start = granuleFilter.filtered_granule_key_start; const end = granuleFilter.filtered_granule_key_end; - filterFn = msg => msg.meta.key >= start && msg.meta.key <= end; + filterFn = (msg) => msg.meta.key >= start && msg.meta.key <= end; } } return messages.filter(filterFn); diff --git a/cumulus/tasks/discover-pdr/index.js b/cumulus/tasks/discover-pdr/index.js index 31a72c873e6..00668c43b57 100644 --- a/cumulus/tasks/discover-pdr/index.js +++ b/cumulus/tasks/discover-pdr/index.js @@ -53,7 +53,7 @@ module.exports = class DiscoverPdr extends Task { // Get the list of PDRs const pdrList = await pdrMod.getPdrList(client, folder, bucket, keyPrefix); - const S3UploadPromises = pdrList.map(async pdrEntry => { + const S3UploadPromises = pdrList.map(async (pdrEntry) => { const fileName = pdrEntry.name; log.info(`FILE: ${fileName}`); // Get the file contents diff --git a/cumulus/tasks/discover-pdr/pdr.js b/cumulus/tasks/discover-pdr/pdr.js index bbf7eae59f2..8b4945a5c4b 100644 --- a/cumulus/tasks/discover-pdr/pdr.js +++ b/cumulus/tasks/discover-pdr/pdr.js @@ -17,7 +17,7 @@ exports.getPdrList = async (client, folder, bucket, keyPrefix) => { const pdrs = await listSync(folder); // Check to see which files we already have in S3 - const fileExistsPromises = pdrs.map(async pdr => { + const fileExistsPromises = pdrs.map(async (pdr) => { const fileName = pdr.name; return S3.fileExists(bucket, `${keyPrefix}/${fileName}`); }); diff --git a/cumulus/tasks/discover-pdr/test/discover-pdr-spec.js b/cumulus/tasks/discover-pdr/test/discover-pdr-spec.js index 67373cdd636..73c823e96ce 100644 --- a/cumulus/tasks/discover-pdr/test/discover-pdr-spec.js +++ b/cumulus/tasks/discover-pdr/test/discover-pdr-spec.js @@ -1,6 +1,6 @@ 'use strict'; const test = require('ava'); -test('TODO - add test', t => { +test('TODO - add test', (t) => { t.is(1, 1); }); diff --git a/cumulus/tasks/download-activity-mock/test/download-activity-mock-spec.js b/cumulus/tasks/download-activity-mock/test/download-activity-mock-spec.js index 67373cdd636..73c823e96ce 100644 --- a/cumulus/tasks/download-activity-mock/test/download-activity-mock-spec.js +++ b/cumulus/tasks/download-activity-mock/test/download-activity-mock-spec.js @@ -1,6 +1,6 @@ 'use strict'; const test = require('ava'); -test('TODO - add test', t => { +test('TODO - add test', (t) => { t.is(1, 1); }); diff --git a/cumulus/tasks/filter-payload/test/filter-payload-spec.js b/cumulus/tasks/filter-payload/test/filter-payload-spec.js index e00a57f7b1a..44ca014f5be 100644 --- a/cumulus/tasks/filter-payload/test/filter-payload-spec.js +++ b/cumulus/tasks/filter-payload/test/filter-payload-spec.js @@ -3,6 +3,6 @@ const test = require('ava'); const filter = require('../index'); // Nothing really to test here - just a placeholder for future -test('Dummy test', t => { +test('Dummy test', (t) => { t.is(1, 1); }); diff --git a/cumulus/tasks/generate-pan/pan.js b/cumulus/tasks/generate-pan/pan.js index f3e1c4a97fd..efb31f1c06d 100644 --- a/cumulus/tasks/generate-pan/pan.js +++ b/cumulus/tasks/generate-pan/pan.js @@ -22,7 +22,7 @@ exports.generatePan = (files, timeStamp) => { pan += `NO_OF_FILES = ${files.length};\n`; - files.forEach(file => { + files.forEach((file) => { const fileName = file.source.url.substring(file.source.url.lastIndexOf('/') + 1); const filePath = file.source.url.substring(file.source.url.lastIndexOf(':') + 3); const fileDirectory = path.dirname(filePath); diff --git a/cumulus/tasks/generate-pan/test/generate-pan-spec.js b/cumulus/tasks/generate-pan/test/generate-pan-spec.js index c63e5311f91..78c78eb731d 100644 --- a/cumulus/tasks/generate-pan/test/generate-pan-spec.js +++ b/cumulus/tasks/generate-pan/test/generate-pan-spec.js @@ -11,7 +11,7 @@ const shortPan = (dateTime) => DISPOSITION = "SUCCESSFUL"; TIME_STAMP = ${timeStamp(dateTime)};`; -test('generates a short PAN if all files succeed', t => { +test('generates a short PAN if all files succeed', (t) => { const input = allSuccessFixture.input; const now = new Date(); const timeStampStr = timeStamp(now); @@ -19,7 +19,7 @@ test('generates a short PAN if all files succeed', t => { t.is(result, shortPan(now)); }); -test('generates a long pan with an entry for the number of files (NO_OF_FILES)', t => { +test('generates a long pan with an entry for the number of files (NO_OF_FILES)', (t) => { const input = missingFileFixture.input; const now = new Date(); const timeStampStr = timeStamp(now); @@ -28,7 +28,7 @@ test('generates a long pan with an entry for the number of files (NO_OF_FILES)', t.is(parseInt(numFilesEntry, 10), input.length); }); -test('generates a disposition message for each file in a long PAN', t => { +test('generates a disposition message for each file in a long PAN', (t) => { const input = missingFileFixture.input; const now = new Date(); const timeStampStr = timeStamp(now); @@ -37,7 +37,7 @@ test('generates a disposition message for each file in a long PAN', t => { t.is(dispositions.length, 2); }); -test('generates a timestamp for each file entry', t => { +test('generates a timestamp for each file entry', (t) => { const input = missingFileFixture.input; const now = new Date(); const timeStampStr = timeStamp(now); @@ -48,7 +48,7 @@ test('generates a timestamp for each file entry', t => { t.is(timeStampCount, input.length); }); -test('generates an error message for each missing file', t => { +test('generates an error message for each missing file', (t) => { const input = missingFileFixture.input; const now = new Date(); const timeStampStr = timeStamp(now); diff --git a/cumulus/tasks/generate-pdr-file-list/pdr.js b/cumulus/tasks/generate-pdr-file-list/pdr.js index fa0b94325a6..cff940cf4dc 100644 --- a/cumulus/tasks/generate-pdr-file-list/pdr.js +++ b/cumulus/tasks/generate-pdr-file-list/pdr.js @@ -11,7 +11,7 @@ const fileSpecFields = * @return {PVLRoot} An object representing a PDR * @throws {Error} Throws an Error if parsing fails */ -exports.parsePdr = pdr => pvl.pvlToJS(pdr); +exports.parsePdr = (pdr) => pvl.pvlToJS(pdr); /** * Convert a PVL FILE_SPEC entry into an object with enough information to download the diff --git a/cumulus/tasks/generate-pdr-file-list/test/generate-pdr-file-list-spec.js b/cumulus/tasks/generate-pdr-file-list/test/generate-pdr-file-list-spec.js index 335252fa0ba..44dce28deec 100644 --- a/cumulus/tasks/generate-pdr-file-list/test/generate-pdr-file-list-spec.js +++ b/cumulus/tasks/generate-pdr-file-list/test/generate-pdr-file-list-spec.js @@ -4,12 +4,12 @@ const pdr = require('../pdr'); const goodFileFixture = require('./fixtures/good-pdr-fixture'); -test('pdrToFileList() - generates an entry for each file', t => { +test('pdrToFileList() - generates an entry for each file', (t) => { const files = pdr.pdrToFileList(goodFileFixture.input, 'localhost', 21); t.is(files.length, 3); }); -test('fileSpecToFileEntry() - generates proper fields', t => { +test('fileSpecToFileEntry() - generates proper fields', (t) => { const pdrObj = pdr.parsePdr(goodFileFixture.input); const fileGroups = pdrObj.objects('FILE_GROUP'); const host = 'localhost'; diff --git a/cumulus/tasks/generate-pdrd/pdrd.js b/cumulus/tasks/generate-pdrd/pdrd.js index 92b550786b0..86d8f3f4145 100644 --- a/cumulus/tasks/generate-pdrd/pdrd.js +++ b/cumulus/tasks/generate-pdrd/pdrd.js @@ -12,7 +12,7 @@ ${topLevelErrors[0]}`; pdrd = 'MESSAGE_TYPE = LONGPDRD;\n'; pdrd += `NO_FILE_GRPS = ${fileGroupErrors.length}\n`; - fileGroupErrors.forEach(errors => { + fileGroupErrors.forEach((errors) => { if (errors.length > 0) { pdrd += errors[0]; } diff --git a/cumulus/tasks/generate-pdrd/test/generate-pdrd-spec.js b/cumulus/tasks/generate-pdrd/test/generate-pdrd-spec.js index c1087395e22..8fba176fd2a 100644 --- a/cumulus/tasks/generate-pdrd/test/generate-pdrd-spec.js +++ b/cumulus/tasks/generate-pdrd/test/generate-pdrd-spec.js @@ -7,7 +7,7 @@ const badFileEntryFixture = require('./fixtures/bad-file-entry-fixture'); const invalidPvlFixture = require('./fixtures/invalid-pvl-fixture'); const missingFieldsFixture = require('./fixtures/missing-fields-fixture'); -test('generatePdrd() - invalid PVL gets a short PDRD', t => { +test('generatePdrd() - invalid PVL gets a short PDRD', (t) => { const pdrdStr = pdrd.generatePdrd( invalidPvlFixture.topLevelErrors, invalidPvlFixture.fileGroupErrors @@ -20,7 +20,7 @@ test('generatePdrd() - invalid PVL gets a short PDRD', t => { t.is(errMsg, 'INVALID PVL STATEMENT'); }); -test('generatePdrd() - missing TOTAL_FILE_COUNT gets a short PDRD', t => { +test('generatePdrd() - missing TOTAL_FILE_COUNT gets a short PDRD', (t) => { const pdrdStr = pdrd.generatePdrd( missingFieldsFixture.invalidFileCount.input.topLevelErrors, missingFieldsFixture.invalidFileCount.input.fileGroupErrors @@ -52,7 +52,7 @@ const testMacro = (t, fixture) => { t.is(errMsg, fixture.error); }; -test('generatePdrd() - missing file fields gets a long PDRD', t => { - badFileEntryFixture.fixtures.forEach(fixture => testMacro(t, fixture)); +test('generatePdrd() - missing file fields gets a long PDRD', (t) => { + badFileEntryFixture.fixtures.forEach((fixture) => testMacro(t, fixture)); }); diff --git a/cumulus/tasks/trigger-process-pdrs/test/trigger-process-pdrs-spec.js b/cumulus/tasks/trigger-process-pdrs/test/trigger-process-pdrs-spec.js index be9b414fffc..8de72c9c3d4 100644 --- a/cumulus/tasks/trigger-process-pdrs/test/trigger-process-pdrs-spec.js +++ b/cumulus/tasks/trigger-process-pdrs/test/trigger-process-pdrs-spec.js @@ -3,7 +3,7 @@ const test = require('ava'); const helpers = require('@cumulus/common/test-helpers'); const TriggerProcessPdrs = require('../index'); -test('trigger process PDRs', async t => { +test('trigger process PDRs', async (t) => { const payload = [ { s3_key: '123' }, { s3_key: 'ABC' } diff --git a/cumulus/tasks/validate-archives/archive-validations.js b/cumulus/tasks/validate-archives/archive-validations.js index f26806ed859..bcc5609fcde 100644 --- a/cumulus/tasks/validate-archives/archive-validations.js +++ b/cumulus/tasks/validate-archives/archive-validations.js @@ -39,14 +39,14 @@ exports.validateArchiveContents = (archiveDirPath) => { // out here. const unarchivedFiles = fs .readdirSync(archiveDirPath) - .filter(fileName => !fileName.startsWith('._')); + .filter((fileName) => !fileName.startsWith('._')); log.debug(`UNARCHIVED FILES: ${JSON.stringify(unarchivedFiles)}`); let hasImage = false; let hasWorldFile = false; let hasMetadata = false; - unarchivedFiles.forEach(filePath => { + unarchivedFiles.forEach((filePath) => { log.debug(filePath); const ext = path.extname(filePath).toUpperCase(); if (ext === '.JPG' || ext === '.PNG') hasImage = true; diff --git a/cumulus/tasks/validate-archives/index.js b/cumulus/tasks/validate-archives/index.js index e90342f5bdc..d2d7b40191a 100644 --- a/cumulus/tasks/validate-archives/index.js +++ b/cumulus/tasks/validate-archives/index.js @@ -20,7 +20,7 @@ const decompress = promisify(tarGz.decompress); * @param {string} archiveFilePath * @return {string} The un-archive directory */ -const archiveDir = archiveFilePath => { +const archiveDir = (archiveFilePath) => { // archive files must be .tgz or .tar.gz files const segments = archiveFilePath.match(/(.*?)(\.tar\.gz|\.tgz)/i); return segments[1]; @@ -33,7 +33,7 @@ const archiveDir = archiveFilePath => { * @param {Object} fileAttrs An object that contains attributes about the archive file */ const uploadArchiveFilesToS3 = async (unarchivedFiles, archiveDirPath, fileAttrs) => { - const fullFilePaths = unarchivedFiles.map(fileName => path.join(archiveDirPath, fileName)); + const fullFilePaths = unarchivedFiles.map((fileName) => path.join(archiveDirPath, fileName)); const s3DirKey = archiveDir(fileAttrs.target.key); return aws.uploadS3Files(fullFilePaths, fileAttrs.target.bucket, s3DirKey); }; @@ -59,7 +59,7 @@ const extractArchive = async (tmpDir, archiveFilePath) => { * @param {string} archiveDirPath The path where the files were extracted */ const deleteExpandedFiles = async (unarchivedFiles, archiveDirPath) => { - unarchivedFiles.forEach(fileName => { + unarchivedFiles.forEach((fileName) => { const fullPath = path.join(archiveDirPath, fileName); fs.unlinkSync(fullPath); }); @@ -88,8 +88,8 @@ module.exports = class ValidateArchives extends Task { // Only files that were successfully downloaded by the provider gateway will be processed const archiveFiles = files - .filter(file => file.success) - .map(file => [file.target.bucket, file.target.key]); + .filter((file) => file.success) + .map((file) => [file.target.bucket, file.target.key]); const downloadRequest = archiveFiles.map(([s3Bucket, s3Key]) => ({ Bucket: s3Bucket, @@ -107,7 +107,7 @@ module.exports = class ValidateArchives extends Task { // Compute the dispositions (status) for each file downloaded successfully by // the provider gateway - const dispositionPromises = files.map(async fileAttrs => { + const dispositionPromises = files.map(async (fileAttrs) => { // Only process archives that were downloaded successfully by the provider gateway if (fileAttrs.success) { const archiveFileName = path.basename(fileAttrs.target.key); @@ -152,7 +152,7 @@ module.exports = class ValidateArchives extends Task { log.info('S3 FILES:'); log.info(JSON.stringify(s3Files)); - const imgFiles = s3Files.map(s3File => ({ Bucket: s3File.bucket, Key: s3File.key })); + const imgFiles = s3Files.map((s3File) => ({ Bucket: s3File.bucket, Key: s3File.key })); if (imgFiles.length > 0) { imageSources.push({ archive: archiveFileName, images: imgFiles }); diff --git a/cumulus/tasks/validate-pdr/index.js b/cumulus/tasks/validate-pdr/index.js index bbb7990539b..26730925404 100644 --- a/cumulus/tasks/validate-pdr/index.js +++ b/cumulus/tasks/validate-pdr/index.js @@ -14,7 +14,7 @@ function fetchPdr(bucket, key) { } function isPdrValid(topLevelErrors, fileGroupErrors) { - return topLevelErrors.length > 0 || fileGroupErrors.some(errors => errors.length > 0); + return topLevelErrors.length > 0 || fileGroupErrors.some((errors) => errors.length > 0); } async function handler(event, context, callback) { diff --git a/cumulus/tasks/validate-pdr/pdr-validations.js b/cumulus/tasks/validate-pdr/pdr-validations.js index c3dad2f63ee..5509f95d460 100644 --- a/cumulus/tasks/validate-pdr/pdr-validations.js +++ b/cumulus/tasks/validate-pdr/pdr-validations.js @@ -16,7 +16,7 @@ const pdrMod = require('./pdr'); * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const directoryIdValidation = fileSpec => { +const directoryIdValidation = (fileSpec) => { const directoryId = fileSpec.get('DIRECTORY_ID'); return !directoryId || directoryId.value === '' ? 'INVALID DIRECTORY' : null; @@ -27,7 +27,7 @@ const directoryIdValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileSizeValidation = fileSpec => { +const fileSizeValidation = (fileSpec) => { const fileSize = fileSpec.get('FILE_SIZE'); return !fileSize || fileSize.value < 1 ? 'INVALID FILE SIZE' : null; @@ -38,7 +38,7 @@ const fileSizeValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileIdValidation = fileSpec => { +const fileIdValidation = (fileSpec) => { const fileId = fileSpec.get('FILE_ID'); return !fileId || fileId.value === '' ? 'INVALID FILE ID' : null; @@ -49,7 +49,7 @@ const fileIdValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileTypeValidation = fileSpec => { +const fileTypeValidation = (fileSpec) => { const fileType = fileSpec.get('FILE_TYPE'); return !fileType || fileType.value === '' ? 'INVALID FILE TYPE' : null; @@ -60,7 +60,7 @@ const fileTypeValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileCksumTypeMissingValidation = fileSpec => { +const fileCksumTypeMissingValidation = (fileSpec) => { const cksumType = fileSpec.get('FILE_CKSUM_TYPE'); return !cksumType || cksumType.value === '' ? 'MISSING FILE_CKSUM_TYPE PARAMETER' : null; @@ -71,7 +71,7 @@ const fileCksumTypeMissingValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileCksumTypeValidation = fileSpec => { +const fileCksumTypeValidation = (fileSpec) => { const cksumTypeEntry = fileSpec.get('FILE_CKSUM_TYPE'); const cksumType = cksumTypeEntry ? cksumTypeEntry.value : null; return cksumType === 'MD5' || cksumType === 'SHA1' ? null : 'UNSUPPORTED CHECKSUM TYPE'; @@ -82,7 +82,7 @@ const fileCksumTypeValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileCksumValueMissingValidation = fileSpec => { +const fileCksumValueMissingValidation = (fileSpec) => { const cksum = fileSpec.get('FILE_CKSUM_VALUE'); return (!cksum || cksum.value === '') ? 'MISSING FILE_CKSUM_VALUE PARAMETER' : null; @@ -93,7 +93,7 @@ const fileCksumValueMissingValidation = fileSpec => { * @param {PVLObject} fileSpec * @return {string} An error string or null */ -const fileCksumValueValidation = fileSpec => { +const fileCksumValueValidation = (fileSpec) => { const cksumEntry = fileSpec.get('FILE_CKSUM_VALUE'); const cksum = cksumEntry ? cksumEntry.value : ''; const cksumType = fileSpec.get('FILE_CKSUM_TYPE'); @@ -121,8 +121,8 @@ const fileSpecValidations = [ * @param {PVLObject} fileGroup A `PVLObject` object representing a file group entry * @return {Array} An (possibly empty) array of error strings. */ -const validateFileSpec = fileSpec => - fileSpecValidations.map(validationFn => validationFn(fileSpec)).filter(err => err); +const validateFileSpec = (fileSpec) => + fileSpecValidations.map((validationFn) => validationFn(fileSpec)).filter((err) => err); /** * File group validations @@ -133,7 +133,7 @@ const validateFileSpec = fileSpec => * @param {PVLObject} fileGroup A `PVLObject` object representing a file group entry * @return {string} An error string or null */ -const dataTypeValidation = fileGroup => { +const dataTypeValidation = (fileGroup) => { const dataType = fileGroup.get('DATA_TYPE'); let rval = null; @@ -149,7 +149,7 @@ const dataTypeValidation = fileGroup => { * @param {PVLObject} fileGroup A `PVLObject` object representing a file group entry * @return {string} An error string or null */ -const versionIdValidation = fileGroup => { +const versionIdValidation = (fileGroup) => { const versionId = fileGroup.get('VERSION_ID') || fileGroup.get('DATA_VERSION'); let rval = null; @@ -168,16 +168,16 @@ const fileGroupValidations = [dataTypeValidation, versionIdValidation]; * @param {PVLObject} fileGroup A `PVLObject` object representing a file group entry * @return {Array} An (possibly empty) array of error strings. */ -const validateFileGroup = fileGroup => { - const fileGroupErrors = fileGroupValidations.map(validationFn => validationFn(fileGroup)) - .filter(err => err); +const validateFileGroup = (fileGroup) => { + const fileGroupErrors = fileGroupValidations.map((validationFn) => validationFn(fileGroup)) + .filter((err) => err); if (fileGroupErrors.length > 0) { return fileGroupErrors; } // No errors in file group parameters, so validate each FILE_SPEC in the FILE_GROUP const fileSpecs = fileGroup.objects('FILE_SPEC'); const fileSpecErrors = []; - fileSpecs.forEach(fileSpec => { + fileSpecs.forEach((fileSpec) => { const fileErrors = validateFileSpec(fileSpec); if (fileErrors.length > 0) { // Only need one error @@ -197,7 +197,7 @@ const validateFileGroup = fileGroup => { * @param {PVLRoot} pdr The `PVLRoot` object for the PDR * @return An error string or null */ -const fileCountValidation = pdr => { +const fileCountValidation = (pdr) => { let rval = null; if (!pdr.get('TOTAL_FILE_COUNT') || pdr.get('TOTAL_FILE_COUNT').value < 1) { rval = 'INVALID FILE COUNT'; @@ -211,11 +211,11 @@ const pdrTopLevelValidations = [fileCountValidation]; /** * Performs a series of top-level validations on a PDR */ -const validateTopLevelPdr = pdr => - pdrTopLevelValidations.map(validationFn => validationFn(pdr)).filter(err => err); +const validateTopLevelPdr = (pdr) => + pdrTopLevelValidations.map((validationFn) => validationFn(pdr)).filter((err) => err); -exports.validatePdr = pdr => { +exports.validatePdr = (pdr) => { // Parse the PDR and do a preliminary validation let pdrObj; let topLevelErrors = []; diff --git a/cumulus/tasks/validate-pdr/pdr.js b/cumulus/tasks/validate-pdr/pdr.js index 03f0a8a6ec3..0ffbcf510ae 100644 --- a/cumulus/tasks/validate-pdr/pdr.js +++ b/cumulus/tasks/validate-pdr/pdr.js @@ -8,4 +8,4 @@ const pvl = require('@cumulus/pvl/t'); * @return {PVLRoot} An object representing a PDR * @throws {Error} Throws an Error if parsing fails */ -exports.parsePdr = pdr => pvl.pvlToJS(pdr); +exports.parsePdr = (pdr) => pvl.pvlToJS(pdr); diff --git a/cumulus/tasks/validate-pdr/test/pdr-validations.test.js b/cumulus/tasks/validate-pdr/test/pdr-validations.test.js index b347e712670..d831ae83244 100644 --- a/cumulus/tasks/validate-pdr/test/pdr-validations.test.js +++ b/cumulus/tasks/validate-pdr/test/pdr-validations.test.js @@ -19,21 +19,21 @@ const testMacro = (t, fixture) => { }; // Good PDR gets no errors -test('validatePdr() - success', t => { +test('validatePdr() - success', (t) => { testMacro(t, successFixture); }); // Bad PVL in PDR -test('validatePdr() - invalid PVL', t => { +test('validatePdr() - invalid PVL', (t) => { testMacro(t, invalidPvlFixture); }); // High level missing field -test('validatePdr() - top level missing field', t => { +test('validatePdr() - top level missing field', (t) => { testMacro(t, missingFieldsFixture); }); // File group and file spec errors -test('validatePdr() - file group / file spec errors', t => { +test('validatePdr() - file group / file spec errors', (t) => { testMacro(t, fileErrorsFixture); }); diff --git a/packages/api/endpoints/collections.js b/packages/api/endpoints/collections.js index c9161be8ae5..f676aa0e705 100644 --- a/packages/api/endpoints/collections.js +++ b/packages/api/endpoints/collections.js @@ -18,7 +18,7 @@ const examplePayload = require('../tests/data/collections_post.json'); */ function list(event, cb) { const collection = new Collection(event); - collection.query().then(res => cb(null, res)).catch(cb); + collection.query().then((res) => cb(null, res)).catch(cb); } /** @@ -36,7 +36,7 @@ function get(event, cb) { const collection = new Collection(event); return collection.getStats([res], [res.name]); }) - .then(res => cb(null, res[0])) + .then((res) => cb(null, res[0])) .catch(cb); } @@ -123,7 +123,7 @@ function handler(event, context) { return context.fail('HttpMethod is missing'); } - return handle(event, context, !inTestMode() /* authCheck */, cb => { + return handle(event, context, !inTestMode() /* authCheck */, (cb) => { if (event.httpMethod === 'GET' && event.pathParameters) { get(event, cb); } @@ -146,7 +146,7 @@ module.exports = handler; justLocalRun(() => { handler(examplePayload, { - succeed: r => log.error(r), - failed: e => log.error(e) + succeed: (r) => log.error(r), + failed: (e) => log.error(e) }, (e, r) => log.error(e, r)); }); diff --git a/packages/api/endpoints/distribution.js b/packages/api/endpoints/distribution.js index 4f51abd19e4..e1aa8916d0b 100644 --- a/packages/api/endpoints/distribution.js +++ b/packages/api/endpoints/distribution.js @@ -100,7 +100,7 @@ function handler(event, context, cb) { 'Strict-Transport-Security': 'max-age=31536000' } }); - }).catch(e => cb(e)); + }).catch((e) => cb(e)); } // ending up here means that user was not login diff --git a/packages/api/endpoints/executions.js b/packages/api/endpoints/executions.js index f3908b47ec7..1094c84a5cb 100644 --- a/packages/api/endpoints/executions.js +++ b/packages/api/endpoints/executions.js @@ -13,7 +13,7 @@ const Search = require('../es/search').Search; */ function list(event, cb) { const search = new Search(event, 'execution'); - search.query().then(response => cb(null, response)).catch((e) => { + search.query().then((response) => cb(null, response)).catch((e) => { cb(e); }); } diff --git a/packages/api/endpoints/granules.js b/packages/api/endpoints/granules.js index fcd9a3ef5e5..1656a2d97d4 100644 --- a/packages/api/endpoints/granules.js +++ b/packages/api/endpoints/granules.js @@ -37,7 +37,7 @@ async function removeGranuleFromCmr(granuleId, collectionId) { */ function list(event, cb) { const search = new Search(event, 'granule'); - search.query().then(response => cb(null, response)).catch((e) => { + search.query().then((response) => cb(null, response)).catch((e) => { cb(e); }); } @@ -131,10 +131,10 @@ function handler(event, context) { get(event, cb); } else if (event.httpMethod === 'PUT' && event.pathParameters) { - put(event).then(r => cb(null, r)).catch(e => cb(e)); + put(event).then((r) => cb(null, r)).catch((e) => cb(e)); } else if (event.httpMethod === 'DELETE' && event.pathParameters) { - del(event).then(r => cb(null, r)).catch(e => cb(e)); + del(event).then((r) => cb(null, r)).catch((e) => cb(e)); } else { list(event, cb); diff --git a/packages/api/endpoints/pdrs.js b/packages/api/endpoints/pdrs.js index 2b00183d9c2..c7e0c55e4ea 100644 --- a/packages/api/endpoints/pdrs.js +++ b/packages/api/endpoints/pdrs.js @@ -15,7 +15,7 @@ const Search = require('../es/search').Search; */ function list(event, cb) { const search = new Search(event, 'pdr'); - search.query().then(response => cb(null, response)).catch((e) => { + search.query().then((response) => cb(null, response)).catch((e) => { cb(e); }); } @@ -61,7 +61,7 @@ function handler(event, context) { get(event, cb); } else if (event.httpMethod === 'DELETE' && event.pathParameters) { - del(event).then(r => cb(null, r)).catch(e => cb(e)); + del(event).then((r) => cb(null, r)).catch((e) => cb(e)); } else { list(event, cb); diff --git a/packages/api/endpoints/providers.js b/packages/api/endpoints/providers.js index 46e8bf3b4b9..7cb7ad0b926 100644 --- a/packages/api/endpoints/providers.js +++ b/packages/api/endpoints/providers.js @@ -16,7 +16,7 @@ const { Search } = require('../es/search'); */ function list(event, cb) { const search = new Search(event, 'provider'); - search.query().then(response => cb(null, response)).catch(cb); + search.query().then((response) => cb(null, response)).catch(cb); } /** @@ -57,8 +57,8 @@ function post(event, cb) { .catch((e) => { if (e instanceof RecordDoesNotExist) { return p.create(data) - .then(data => cb(null, { message: 'Record saved', record: data })) - .catch(err => cb(err)); + .then((data) => cb(null, { message: 'Record saved', record: data })) + .catch((err) => cb(err)); } return cb(e); }); @@ -87,7 +87,7 @@ function put(event, cb) { originalData = d; return p.update({ id }, data); }) - .then(data => cb(null, data)) + .then((data) => cb(null, data)) .catch((err) => { if (err instanceof RecordDoesNotExist) cb({ message: 'Record does not exist' }); return cb(err); diff --git a/packages/api/endpoints/rules.js b/packages/api/endpoints/rules.js index 394f93d4d23..46a5c87960c 100644 --- a/packages/api/endpoints/rules.js +++ b/packages/api/endpoints/rules.js @@ -17,7 +17,7 @@ const { Search } = require('../es/search'); */ function list(event, cb) { const search = new Search(event, 'rule'); - search.query().then(response => cb(null, response)).catch(cb); + search.query().then((response) => cb(null, response)).catch(cb); } /** @@ -55,7 +55,7 @@ function post(event, cb) { .catch((e) => { if (e instanceof RecordDoesNotExist) { return model.create(data) - .then(r => cb(null, { message: 'Record saved', record: r })) + .then((r) => cb(null, { message: 'Record saved', record: r })) .catch(cb); } return cb(e); @@ -79,9 +79,9 @@ async function put(event) { // if the data includes any fields other than state and rule.value // throw error if (action && action !== 'rerun') { - let check = Object.keys(data).filter(f => (f !== 'state' && f !== 'rule')); + 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')); + 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'); @@ -114,12 +114,12 @@ async function del(event) { name = name.replace(/%20/g, ' '); - await model.get({ name }).then(record => model.delete(record)); + await model.get({ name }).then((record) => model.delete(record)); return { message: 'Record deleted' }; } function handler(event, context) { - return handle(event, context, !inTestMode() /* authCheck */, cb => { + return handle(event, context, !inTestMode() /* authCheck */, (cb) => { if (event.httpMethod === 'GET' && event.pathParameters) { get(event, cb); } @@ -127,10 +127,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).then((r) => cb(null, r)).catch((e) => cb(JSON.stringify(e))); } else if (event.httpMethod === 'DELETE' && event.pathParameters) { - del(event).then(r => cb(null, r)).catch(e => cb(JSON.stringify(e))); + del(event).then((r) => cb(null, r)).catch((e) => cb(JSON.stringify(e))); } else { list(event, cb); diff --git a/packages/api/endpoints/stats.js b/packages/api/endpoints/stats.js index 18b5bf96119..6dafb37b255 100644 --- a/packages/api/endpoints/stats.js +++ b/packages/api/endpoints/stats.js @@ -37,28 +37,28 @@ function summary(event, cb) { params.timestamp__to = _get(params, 'timestamp__to', Date.now()); const stats = new Stats({ queryStringParameters: params }); - stats.query().then(r => cb(null, r)).catch(e => cb(e)); + stats.query().then((r) => cb(null, r)).catch((e) => cb(e)); } function histogram(event, cb) { const type = getType(event); const stats = new Stats(event, type.type, type.index); - stats.histogram().then(r => cb(null, r)).catch(e => cb(e)); + stats.histogram().then((r) => cb(null, r)).catch((e) => cb(e)); } function count(event, cb) { const type = getType(event); const stats = new Stats(event, type.type, type.index); - stats.count().then(r => cb(null, r)).catch(e => cb(e)); + stats.count().then((r) => cb(null, r)).catch((e) => cb(e)); } function average(event, cb) { const type = getType(event); const stats = new Stats(event, type.type, type.index); - stats.avg().then(r => cb(null, r)).catch(e => cb(e)); + stats.avg().then((r) => cb(null, r)).catch((e) => cb(e)); } function handler(event, context) { diff --git a/packages/api/endpoints/token.js b/packages/api/endpoints/token.js index ad4e37e2ea1..b76ee906912 100644 --- a/packages/api/endpoints/token.js +++ b/packages/api/endpoints/token.js @@ -57,14 +57,14 @@ function token(event, context) { }); } return resp(context, null, JSON.stringify({ token: accessToken }), 200); - }).catch(e => { + }).catch((e) => { log.error('User is not authorized', e); if (e.message.includes('No record found for')) { return resp(context, new Error('User is not authorized to access this site')); } return resp(context, e); }); - }).catch(e => { + }).catch((e) => { log.error('Error caught when checking code:', e); resp(context, e); }); diff --git a/packages/api/endpoints/workflows.js b/packages/api/endpoints/workflows.js index f334e8dc7ab..1c28bfa2f30 100644 --- a/packages/api/endpoints/workflows.js +++ b/packages/api/endpoints/workflows.js @@ -13,10 +13,10 @@ const handle = require('../lib/response').handle; */ function list(event, cb) { const key = `${process.env.stackName}/workflows/list.json`; - S3.get(process.env.bucket, key).then(file => { + S3.get(process.env.bucket, key).then((file) => { const workflows = JSON.parse(file.Body.toString()); return cb(null, workflows); - }).catch(e => cb(e)); + }).catch((e) => cb(e)); } /** @@ -29,7 +29,7 @@ function get(event, cb) { const name = _get(event.pathParameters, 'name'); const key = `${process.env.stackName}/workflows/list.json`; - S3.get(process.env.bucket, key).then(file => { + S3.get(process.env.bucket, key).then((file) => { const workflows = JSON.parse(file.Body.toString()); for (const w of workflows) { if (w.name === name) { @@ -37,7 +37,7 @@ function get(event, cb) { } } return cb({ message: `A record already exists for ${name}` }); - }).catch(e => cb(e)); + }).catch((e) => cb(e)); } function handler(event, context) { diff --git a/packages/api/es/collections.js b/packages/api/es/collections.js index 4baa87b26f1..efb9b2cc56f 100644 --- a/packages/api/es/collections.js +++ b/packages/api/es/collections.js @@ -53,7 +53,7 @@ class Collection extends BaseSearch { }); // add aggs to res - records = records.map(r => { + records = records.map((r) => { r.stats = { running: 0, completed: 0, @@ -63,7 +63,7 @@ class Collection extends BaseSearch { for (const b of aggs.aggregations.hashes.buckets) { if (b.key === r.name) { r.stats.total = b.stats.doc_count; - b.stats.count.buckets.forEach(s => { + b.stats.count.buckets.forEach((s) => { r.stats[s.key] = s.doc_count; }); return r; diff --git a/packages/api/es/queries.js b/packages/api/es/queries.js index d70f8f329f5..9120511d71d 100644 --- a/packages/api/es/queries.js +++ b/packages/api/es/queries.js @@ -17,7 +17,7 @@ const regexes = { }; const build = { - general: params => ({ + general: (params) => ({ query_string: { query: params.q } @@ -34,7 +34,7 @@ const build = { 'name' ]; - terms = terms.map(f => f.name); + terms = terms.map((f) => f.name); // remove fields that are included in the termFields fields = fields.filter((field) => { @@ -44,7 +44,7 @@ const build = { return false; }); - const results = fields.map(f => ({ + const results = fields.map((f) => ({ prefix: { [`${f}`]: _prefix } @@ -98,7 +98,7 @@ const build = { // because elasticsearch doesn't support multiple // fields in range query, make it an erray - const results = Object.keys(fields).map(k => ({ + const results = Object.keys(fields).map((k) => ({ range: { [k]: fields[k] } } )); @@ -202,7 +202,7 @@ module.exports = function(params) { // determine which search strategy should be applied // options are term, terms, range, exists and not in - const fields = Object.keys(params).map(k => ({ name: k, value: params[k] })); + const fields = Object.keys(params).map((k) => ({ name: k, value: params[k] })); Object.keys(regexes).forEach((k) => { const f = selectParams(fields, regexes[k]); diff --git a/packages/api/es/search.js b/packages/api/es/search.js index 7f576c414e9..4878ac029a0 100644 --- a/packages/api/es/search.js +++ b/packages/api/es/search.js @@ -266,7 +266,7 @@ class BaseSearch { } const result = await this.client.search(searchParams); - const response = result.hits.hits.map(s => s._source); + const response = result.hits.hits.map((s) => s._source); const meta = this._metaTemplate(); meta.limit = this.size; diff --git a/packages/api/es/stats.js b/packages/api/es/stats.js index 86171486a21..252553e23fd 100644 --- a/packages/api/es/stats.js +++ b/packages/api/es/stats.js @@ -107,7 +107,7 @@ class Stats extends BaseSearch { count: hist.hits.total, criteria }, - histogram: hist.aggregations.histogram.buckets.map(b => ({ + histogram: hist.aggregations.histogram.buckets.map((b) => ({ date: b.key_as_string, count: b.doc_count })) @@ -137,7 +137,7 @@ class Stats extends BaseSearch { count: count.hits.total, field: field }, - count: count.aggregations.count.buckets.map(b => ({ + count: count.aggregations.count.buckets.map((b) => ({ key: b.key, count: b.doc_count })) diff --git a/packages/api/lambdas/bootstrap.js b/packages/api/lambdas/bootstrap.js index d505e335b2a..e017bdaf6a0 100644 --- a/packages/api/lambdas/bootstrap.js +++ b/packages/api/lambdas/bootstrap.js @@ -50,13 +50,13 @@ async function bootstrapElasticSearch(host, index = 'cumulus') { async function bootstrapUsers(table, records) { if (!table) { - return new Promise(resolve => resolve()); + return new Promise((resolve) => resolve()); } const user = new Manager(table); // delete all user records const existingUsers = await user.scan(); - await Promise.all(existingUsers.Items.map(u => user.delete({ userName: u.userName }))); + await Promise.all(existingUsers.Items.map((u) => user.delete({ userName: u.userName }))); // add new ones const additions = records.map((record) => user.create({ userName: record.username, @@ -69,7 +69,7 @@ async function bootstrapUsers(table, records) { async function bootstrapCmrProvider(password) { if (!password) { - return new Promise(resolve => resolve('nopassword')); + return new Promise((resolve) => resolve('nopassword')); } return DefaultProvider.encrypt(password); } @@ -140,7 +140,7 @@ function handler(event, context, cb) { }; return sendResponse(event, 'SUCCESS', data, cb); - }).catch(e => { + }).catch((e) => { log.error(e); return sendResponse(event, 'FAILED', null, cb); }); diff --git a/packages/api/lambdas/jobs.js b/packages/api/lambdas/jobs.js index 1cd80f4d82c..4e04b5c7a45 100644 --- a/packages/api/lambdas/jobs.js +++ b/packages/api/lambdas/jobs.js @@ -29,14 +29,14 @@ async function updateGranulesAndPdrs(esClient, url, error) { // find related granule and update their status let searchTerm = `execution:"${url}"`; const granules = await findStaleRecords('granule', searchTerm, 100); - await Promise.all(granules.map(g => partialRecordUpdate( + await Promise.all(granules.map((g) => partialRecordUpdate( esClient, g.granuleId, 'granule', { status: 'failed', error }, g.collectionId ))); // find related pdrs and update their status searchTerm = `execution:"${url}"`; const pdrs = await findStaleRecords('pdr', searchTerm, 100); - await Promise.all(pdrs.map(p => partialRecordUpdate( + await Promise.all(pdrs.map((p) => partialRecordUpdate( esClient, p.pdrName, 'pdr', { status: 'failed', error } ))); } @@ -135,7 +135,7 @@ async function cleanup() { await Promise.all( executions.slice(0, 400).map( - ex => limit( + (ex) => limit( () => checkExecution(ex.arn, ex.execution, ex.timestamp, esClient) ) ) @@ -143,7 +143,7 @@ async function cleanup() { } function handler(event, context, cb) { - cleanup().then(() => cb()).catch(e => { + cleanup().then(() => cb()).catch((e) => { log.error(e); cb(e); }); diff --git a/packages/api/lambdas/sf-scheduler.js b/packages/api/lambdas/sf-scheduler.js index 9b6b9257e41..e8a41b090a3 100644 --- a/packages/api/lambdas/sf-scheduler.js +++ b/packages/api/lambdas/sf-scheduler.js @@ -55,7 +55,7 @@ function schedule(event, context, cb) { }) .then(() => SQS.sendMessage(message.meta.queues.startSF, message)) .then((r) => cb(null, r)) - .catch(e => cb(e)); + .catch((e) => cb(e)); } module.exports = schedule; diff --git a/packages/api/lib/response.js b/packages/api/lib/response.js index ca7e975db41..a061d8651e5 100644 --- a/packages/api/lib/response.js +++ b/packages/api/lib/response.js @@ -55,7 +55,7 @@ function resp(context, err, body, status = null, headers = null) { const res = new proxy.Response({ cors: true, statusCode: status }); res.set('Strict-Transport-Security', 'max-age=31536000'); if (headers) { - Object.keys(headers).forEach(h => res.set(h, headers[h])); + Object.keys(headers).forEach((h) => res.set(h, headers[h])); } return context.succeed(res.send(body)); } @@ -93,7 +93,7 @@ function handle(event, context, authCheck, func) { return cb('Session expired'); } return func(cb); - }).catch(e => cb('Invalid Authorization token', e)); + }).catch((e) => cb('Invalid Authorization token', e)); } return func(cb); } diff --git a/packages/api/models/base.js b/packages/api/models/base.js index 29f9ab1eb16..d7b072920d7 100644 --- a/packages/api/models/base.js +++ b/packages/api/models/base.js @@ -131,7 +131,7 @@ class Manager { async batchWrite(_deletes, _puts) { let deletes = _deletes; let puts = _puts; - deletes = deletes ? deletes.map(d => ({ DeleteRequest: { Key: d } })) : []; + deletes = deletes ? deletes.map((d) => ({ DeleteRequest: { Key: d } })) : []; puts = puts ? puts.map((_d) => { const d = _d; d.updatedAt = Date.now(); diff --git a/packages/api/models/collections.js b/packages/api/models/collections.js index 64821a24255..dade1517021 100644 --- a/packages/api/models/collections.js +++ b/packages/api/models/collections.js @@ -36,7 +36,7 @@ class Collection extends Manager { checkRegex(item.granuleId, match[1]); // then check all the files - item.files.forEach(i => checkRegex(i.regex, i.sampleFileName)); + item.files.forEach((i) => checkRegex(i.regex, i.sampleFileName)); } constructor() { diff --git a/packages/api/tests/test-db-indexer.js b/packages/api/tests/test-db-indexer.js index ce82353b773..fdf56aff166 100644 --- a/packages/api/tests/test-db-indexer.js +++ b/packages/api/tests/test-db-indexer.js @@ -96,7 +96,7 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { await new Promise((resolve, reject) => { aws.dynamodbstreams().listStreams({TableName: process.env.CollectionsTable}, (err, data) => { if (err) reject(err); - const collectionsTableStreamArn = data.Streams.find(s => s.TableName === 'test-stack-CollectionsTable').StreamArn; + const collectionsTableStreamArn = data.Streams.find((s) => s.TableName === 'test-stack-CollectionsTable').StreamArn; const eventSourceMappingParams = { EventSourceArn: collectionsTableStreamArn, FunctionName: dbIndexerFnName, @@ -119,7 +119,7 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { await aws.recursivelyDeleteS3Bucket(process.env.internal); }); - test.skip('creates a collection in dynamodb and es', async t => { + test.skip('creates a collection in dynamodb and es', async (t) => { const { name } = testCollection; await collections.create(testCollection) .then(() => { @@ -134,7 +134,7 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { .catch(console.log); }); - test.skip('thrown error is caught', async t => { + test.skip('thrown error is caught', async (t) => { const { name } = collectionOnlyInDynamo; await collections.delete({ name }) .then((result) => { @@ -144,7 +144,7 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { .catch(console.log); }); } else { - test('db-indexer TODO test', t => { + test('db-indexer TODO test', (t) => { t.is(1+1, 2); }); } diff --git a/packages/api/tests/test-endpoints-collections.js b/packages/api/tests/test-endpoints-collections.js index 49604510ccf..572a6cf04cc 100755 --- a/packages/api/tests/test-endpoints-collections.js +++ b/packages/api/tests/test-endpoints-collections.js @@ -47,7 +47,7 @@ test.after.always(async () => teardown()); // TODO(aimee): Debug why this is _passing_ - we don't expect to already have a // collection in ES. -test('default returns list of collections', t => { +test('default returns list of collections', (t) => { const listEvent = { httpMethod: 'list' }; return testEndpoint(collectionsEndpoint, listEvent, (response) => { const { results } = JSON.parse(response.body); @@ -55,7 +55,7 @@ test('default returns list of collections', t => { }); }); -test('GET returns an existing collection', t => { +test('GET returns an existing collection', (t) => { const getEvent = { httpMethod: 'GET', pathParameters: { @@ -69,7 +69,7 @@ test('GET returns an existing collection', t => { }); }); -test('POST creates a new collection', t => { +test('POST creates a new collection', (t) => { const newCollection = Object.assign({}, testCollection, {name: 'collection-post'}); const postEvent = { httpMethod: 'POST', @@ -82,7 +82,7 @@ test('POST creates a new collection', t => { }); }); -test('PUT updates an existing collection', t => { +test('PUT updates an existing collection', (t) => { const newPath = '/new_path'; const updateEvent = { body: JSON.stringify({ @@ -102,7 +102,7 @@ test('PUT updates an existing collection', t => { }); }); -test('DELETE deletes an existing collection', t => { +test('DELETE deletes an existing collection', (t) => { const deleteEvent = { httpMethod: 'DELETE', pathParameters: { diff --git a/packages/api/tests/test-endpoints-providers.js b/packages/api/tests/test-endpoints-providers.js index a404199a773..188e0077b8e 100644 --- a/packages/api/tests/test-endpoints-providers.js +++ b/packages/api/tests/test-endpoints-providers.js @@ -38,7 +38,7 @@ test.before(async () => setup()); test.after.always(async () => teardown()); // TODO(aimee): Add a provider to ES. List uses ES and we don't have any providers in ES. -test('default returns list of providers', t => { +test('default returns list of providers', (t) => { const listEvent = { httpMethod: 'list' }; return testEndpoint(providerEndpoint, listEvent, (response) => { const { results } = JSON.parse(response.body); @@ -46,7 +46,7 @@ test('default returns list of providers', t => { }); }); -test('GET returns an existing provider', t => { +test('GET returns an existing provider', (t) => { const getEvent = { httpMethod: 'GET', pathParameters: { id: testProvider.id } @@ -56,7 +56,7 @@ test('GET returns an existing provider', t => { }); }); -test('POST creates a new provider', t => { +test('POST creates a new provider', (t) => { const newProviderId = 'AQUA'; const newProvider = Object.assign({}, testProvider, { id: newProviderId }); const postEvent = { @@ -70,7 +70,7 @@ test('POST creates a new provider', t => { }); }); -test('PUT updates an existing provider', t => { +test('PUT updates an existing provider', (t) => { const updatedLimit = 2; const putEvent = { httpMethod: 'PUT', @@ -83,7 +83,7 @@ test('PUT updates an existing provider', t => { }); }); -test('DELETE deletes an existing provider', t => { +test('DELETE deletes an existing provider', (t) => { const deleteEvent = { httpMethod: 'DELETE', pathParameters: { id: testProvider.id } diff --git a/packages/api/tests/test-endpoints-rules.js b/packages/api/tests/test-endpoints-rules.js index 21d7a849cf5..84ee86b11a0 100644 --- a/packages/api/tests/test-endpoints-rules.js +++ b/packages/api/tests/test-endpoints-rules.js @@ -52,7 +52,7 @@ test.before(async () => setup()); test.after.always(async () => teardown()); // TODO(aimee): Add a rule to ES. List uses ES and we don't have any rules in ES. -test('default returns list of rules', t => { +test('default returns list of rules', (t) => { const listEvent = { httpMethod: 'list ' }; return testEndpoint(rulesEndpoint, listEvent, (response) => { const { results } = JSON.parse(response.body); @@ -60,7 +60,7 @@ test('default returns list of rules', t => { }); }); -test('GET gets a rule', t => { +test('GET gets a rule', (t) => { const getEvent = { pathParameters: { name: testRule.name @@ -73,7 +73,7 @@ test('GET gets a rule', t => { }); }); -test('POST creates a rule', t => { +test('POST creates a rule', (t) => { const newRule = Object.assign({}, testRule, {name: 'make_waffles'}); const postEvent = { httpMethod: 'POST', @@ -86,7 +86,7 @@ test('POST creates a rule', t => { }); }); -test('PUT updates a rule', t => { +test('PUT updates a rule', (t) => { const updateEvent = { body: JSON.stringify({state: 'ENABLED'}), pathParameters: { @@ -100,7 +100,7 @@ test('PUT updates a rule', t => { }); }); -test('DELETE deletes a rule', t => { +test('DELETE deletes a rule', (t) => { const deleteEvent = { pathParameters: { name: testRule.name diff --git a/packages/api/tests/testUtils.js b/packages/api/tests/testUtils.js index 17b1dfb2810..b857a454061 100644 --- a/packages/api/tests/testUtils.js +++ b/packages/api/tests/testUtils.js @@ -3,8 +3,8 @@ function testEndpoint(endpoint, event, testCallback) { return new Promise((resolve, reject) => { endpoint(event, { - succeed: response => resolve(testCallback(response)), - fail: e => reject(e) + succeed: (response) => resolve(testCallback(response)), + fail: (e) => reject(e) }); }); } diff --git a/packages/common/aws.js b/packages/common/aws.js index 702bdb84343..5fb2dca9846 100644 --- a/packages/common/aws.js +++ b/packages/common/aws.js @@ -202,7 +202,7 @@ exports.fileExists = async (bucket, key) => { exports.downloadS3Files = (s3Objs, dir, s3opts = {}) => { // Scrub s3Ojbs to avoid errors from the AWS SDK - const scrubbedS3Objs = s3Objs.map(s3Obj => ({ + const scrubbedS3Objs = s3Objs.map((s3Obj) => ({ Bucket: s3Obj.Bucket, Key: s3Obj.Key })); diff --git a/packages/common/errors.js b/packages/common/errors.js index 0afcefa204a..caeca59cef6 100644 --- a/packages/common/errors.js +++ b/packages/common/errors.js @@ -24,7 +24,7 @@ const WorkflowError = createErrorType('WorkflowError'); * Returns true if the error is a resource error. * This is used because for some reason instanceof WorkflowError is not working when deployed. */ -const isWorkflowError = error => error.name.includes('WorkflowError'); +const isWorkflowError = (error) => error.name.includes('WorkflowError'); module.exports = { diff --git a/packages/ingest/consumer.js b/packages/ingest/consumer.js index e9c11214d0c..930000b3692 100644 --- a/packages/ingest/consumer.js +++ b/packages/ingest/consumer.js @@ -29,7 +29,7 @@ class Consume { counter += messages.length; if (messages.length > 0) { - const processes = messages.map(message => this.processMessage(message, fn)); + const processes = messages.map((message) => this.processMessage(message, fn)); await Promise.all(processes); } diff --git a/packages/ingest/ftp.js b/packages/ingest/ftp.js index 7822963794e..f45d03cc7dd 100644 --- a/packages/ingest/ftp.js +++ b/packages/ingest/ftp.js @@ -107,7 +107,7 @@ module.exports.ftpMixin = (superclass) => class extends superclass { return this._list(path, counter).then((r) => { log.info(`${counter} retry suceeded`); return resolve(r); - }).catch(e => reject(e)); + }).catch((e) => reject(e)); } return reject(err); } diff --git a/packages/ingest/granule.js b/packages/ingest/granule.js index fa9635834da..9d2a1e65b1f 100644 --- a/packages/ingest/granule.js +++ b/packages/ingest/granule.js @@ -39,7 +39,7 @@ class Discover { // create hash with file regex as key this.regexes = {}; - this.collection.files.forEach(f => { + this.collection.files.forEach((f) => { this.regexes[f.regex] = { collection: this.collection.name, bucket: this.buckets[f.bucket] @@ -109,13 +109,13 @@ class Discover { } async findNewGranules(files) { - const checkFiles = files.map(f => this.fileIsNew(f)); + const checkFiles = files.map((f) => this.fileIsNew(f)); const t = await Promise.all(checkFiles); - const newFiles = t.filter(f => f); + const newFiles = t.filter((f) => f); // reorganize by granule const granules = {}; - newFiles.forEach(_f => { + newFiles.forEach((_f) => { const f = _f; const granuleId = f.granuleId; delete f.granuleId; @@ -130,7 +130,7 @@ class Discover { } }); - return Object.keys(granules).map(k => granules[k]); + return Object.keys(granules).map((k) => granules[k]); } } @@ -172,9 +172,9 @@ class Granule { // download / verify checksum / upload const downloadFiles = granule.files - .map(f => this.getBucket(f)) - .filter(f => this.filterChecksumFiles(f)) - .map(f => this.ingestFile(f, this.collection.duplicateHandling)); + .map((f) => this.getBucket(f)) + .filter((f) => this.filterChecksumFiles(f)) + .map((f) => this.ingestFile(f, this.collection.duplicateHandling)); const files = await Promise.all(downloadFiles); diff --git a/packages/ingest/pdr.js b/packages/ingest/pdr.js index 97481633096..06231f25c63 100644 --- a/packages/ingest/pdr.js +++ b/packages/ingest/pdr.js @@ -84,10 +84,10 @@ class Discover { * @private */ async findNewPdrs(pdrs) { - const checkPdrs = pdrs.map(pdr => this.pdrIsNew(pdr)); + const checkPdrs = pdrs.map((pdr) => this.pdrIsNew(pdr)); const _pdrs = await Promise.all(checkPdrs); - const newPdrs = _pdrs.filter(p => p); + const newPdrs = _pdrs.filter((p) => p); return newPdrs; } } diff --git a/packages/ingest/recursion.js b/packages/ingest/recursion.js index d9e31c052e4..09d6c86c177 100644 --- a/packages/ingest/recursion.js +++ b/packages/ingest/recursion.js @@ -18,8 +18,8 @@ const log = require('@cumulus/common/log'); async function recursion(fn, originalPath, currentPath = null, position = 0) { // build the recursion path object const regex = /(\(.*?\))/g; - const rules = originalPath.split(regex).map(i => i.replace(/\\\\/g, '\\')); - const map = rules.map(r => (r.match(regex) !== null)); + const rules = originalPath.split(regex).map((i) => i.replace(/\\\\/g, '\\')); + const map = rules.map((r) => (r.match(regex) !== null)); let files = []; let path = currentPath; diff --git a/packages/pvl/lib/models.js b/packages/pvl/lib/models.js index b11705ab0b1..b0a87bcc710 100644 --- a/packages/pvl/lib/models.js +++ b/packages/pvl/lib/models.js @@ -11,17 +11,17 @@ class PVLAggregate { this.store.push([key, value]); return this; } - get (key) { return this.store.find(item => item[0] === key) ? this.store.find(item => item[0] === key)[1] : null; } - getAll (key) { return this.store.filter(item => item[0] === key).map(item => item[1]); } - removeAll (key) { this.store = this.store.filter(item => item[0] !== key); } + get (key) { return this.store.find((item) => item[0] === key) ? this.store.find((item) => item[0] === key)[1] : null; } + getAll (key) { return this.store.filter((item) => item[0] === key).map((item) => item[1]); } + removeAll (key) { this.store = this.store.filter((item) => item[0] !== key); } // Since OBJECT and GROUP are reserved keywords, this won't collide with attribute keys addAggregate (aggregate) { this.store.push([aggregate.type, aggregate]); return this; } - objects (key) { return this.getAll('OBJECT').filter(o => key ? areIDsSame(o.identifier, key) : true); } - groups (key) { return this.getAll('GROUP').filter(g => key ? areIDsSame(g.identifier, key) : true); } + objects (key) { return this.getAll('OBJECT').filter((o) => key ? areIDsSame(o.identifier, key) : true); } + groups (key) { return this.getAll('GROUP').filter((g) => key ? areIDsSame(g.identifier, key) : true); } aggregates (key) { return this.objects(key).concat(this.groups(key)); } toPVL () { diff --git a/packages/pvl/t.js b/packages/pvl/t.js index 3386e4e92fe..a8b6ebd1bd4 100644 --- a/packages/pvl/t.js +++ b/packages/pvl/t.js @@ -35,15 +35,15 @@ function pvlToJS (pvlString) { // Currently assumes single-line statements, not allowing multi-line values let pvlStatements = pvlString .split('\n') - .map(s => s.trim()) + .map((s) => s.trim()) // Strip statement-ending semicolons - .map(s => s.replace(/;$/, '')) + .map((s) => s.replace(/;$/, '')) // Ignore blank lines - .filter(s => s !== '') + .filter((s) => s !== '') // Ignore full-line comments - .filter(s => !(s.startsWith('/*') && s.endsWith('*/'))); + .filter((s) => !(s.startsWith('/*') && s.endsWith('*/'))); - pvlStatements.forEach(s => { + pvlStatements.forEach((s) => { if (s === 'END') { return result; } @@ -75,7 +75,7 @@ function jsToPVL (pvlObject) { // Spec doesn't require indentation, but does highly recommended it let depth = 0; - const indented = stringified.split('\n').map(s => { + const indented = stringified.split('\n').map((s) => { if (s.match(/^END_(GROUP|OBJECT)( = .+)?$/)) { depth -= 1; } const thisLine = `${' '.repeat(depth * INDENTATION_WIDTH)}${s}`; if (s.match(/^(BEGIN_)?(GROUP|OBJECT) = .+$/)) { depth += 1; } diff --git a/packages/pvl/test/parsing.js b/packages/pvl/test/parsing.js index 98067378970..e22e5883595 100644 --- a/packages/pvl/test/parsing.js +++ b/packages/pvl/test/parsing.js @@ -8,11 +8,11 @@ const PVLNumeric = require('../lib/models').PVLNumeric; const PVLDateTime = require('../lib/models').PVLDateTime; const PVLTextString = require('../lib/models').PVLTextString; -test('parsing empty string returns empty object', t => { +test('parsing empty string returns empty object', (t) => { t.deepEqual(pvlToJS(''), new PVLRoot()); }); -test('parsing non-nested items', t => { +test('parsing non-nested items', (t) => { const input = 'THIS = THAT;\n' + 'HERE = THERE;'; @@ -22,7 +22,7 @@ test('parsing non-nested items', t => { t.deepEqual(pvlToJS(input), expected); }); -test('ignore full-line comment when parsing', t => { +test('ignore full-line comment when parsing', (t) => { const input = '/*Comment*/\n' + 'THIS = THAT;\n' + @@ -33,7 +33,7 @@ test('ignore full-line comment when parsing', t => { t.deepEqual(pvlToJS(input), expected); }); -test('ignore leading white space when parsing', t => { +test('ignore leading white space when parsing', (t) => { const input = ' THIS = THAT;\n' + ' HERE = THERE;'; @@ -43,7 +43,7 @@ test('ignore leading white space when parsing', t => { t.deepEqual(pvlToJS(input), expected); }); -test('ignore trailing white space when parsing', t => { +test('ignore trailing white space when parsing', (t) => { const input = 'THIS = THAT; \n' + 'HERE = THERE; '; @@ -53,7 +53,7 @@ test('ignore trailing white space when parsing', t => { t.deepEqual(pvlToJS(input), expected); }); -test('allow duplicate keys when parsing', t => { +test('allow duplicate keys when parsing', (t) => { const input = 'THIS = THAT;\n' + 'THIS = THERE;'; @@ -61,7 +61,7 @@ test('allow duplicate keys when parsing', t => { t.deepEqual(pvlToJS(input).store, expectedStore); }); -test('parsing a singly-nested item', t => { +test('parsing a singly-nested item', (t) => { const input = 'GROUP = THAT;\n' + ' HERE = THERE;\n' + @@ -73,7 +73,7 @@ test('parsing a singly-nested item', t => { t.deepEqual(pvlToJS(input), expected); }); -test('parsing a singly-nested item with a named end-aggregate', t => { +test('parsing a singly-nested item with a named end-aggregate', (t) => { const input = 'OBJECT = THAT;\n' + ' HERE = THERE;\n' + @@ -85,7 +85,7 @@ test('parsing a singly-nested item with a named end-aggregate', t => { t.deepEqual(pvlToJS(input), expected); }); -test('parsing a doubly-nested item', t => { +test('parsing a doubly-nested item', (t) => { const input = 'GROUP = THAT;\n' + ' GROUP = THOSE;\n' + @@ -101,7 +101,7 @@ test('parsing a doubly-nested item', t => { t.deepEqual(pvlToJS(input), expected); }); -test('parsing Objects within a Group', t => { +test('parsing Objects within a Group', (t) => { const input = 'GROUP = THAT;\n' + ' OBJECT = THOSE;\n' + @@ -123,7 +123,7 @@ test('parsing Objects within a Group', t => { t.deepEqual(pvlToJS(input), expected); }); -test('parsing nested item with attribute', t => { +test('parsing nested item with attribute', (t) => { const input = 'GROUP = THAT;\n' + ' PROP = YEAH_IT_EXISTS;\n' + @@ -141,7 +141,7 @@ test('parsing nested item with attribute', t => { t.deepEqual(pvlToJS(input), expected); }); -test('parsing an aggregate name wrapped in quotes', t => { +test('parsing an aggregate name wrapped in quotes', (t) => { const inputSimple = "OBJECT = 'THAT';\n" + ' FOO = BAR;\n' + @@ -169,18 +169,18 @@ test('parsing an aggregate name wrapped in quotes', t => { t.deepEqual(pvlToJS(inputComplex), expectedComplex); }); -test('parsing Numeric value', t => { +test('parsing Numeric value', (t) => { t.deepEqual(parseValue('12345'), new PVLNumeric('12345')); t.deepEqual(parseValue('12345'), new PVLNumeric(12345)); t.is(parseValue('12345').value, 12345); }); -test('parsing DateTime value', t => { +test('parsing DateTime value', (t) => { t.deepEqual(parseValue('1990-07-04T12:00'), new PVLDateTime('1990-07-04T12:00')); t.deepEqual(parseValue('1990-07-04T12:00').value, new Date('1990-07-04T12:00')); }); -test('parsing quoted TextString value', t => { +test('parsing quoted TextString value', (t) => { t.deepEqual(parseValue('foobar'), new PVLTextString('foobar')); t.is(parseValue('foobar').value, 'foobar'); @@ -193,7 +193,7 @@ test('parsing quoted TextString value', t => { t.deepEqual(parseValue('"FO\'obaR\'"'), new PVLTextString("FO'obaR'")); }); -test('parsing unquoted TextString value', t => { +test('parsing unquoted TextString value', (t) => { t.deepEqual(parseValue('FOOBAR'), new PVLTextString('FOOBAR')); t.deepEqual(parseValue('foobAR'), new PVLTextString('foobAR')); }); diff --git a/packages/pvl/test/serializing.js b/packages/pvl/test/serializing.js index 901a04d274f..ad46727da0d 100644 --- a/packages/pvl/test/serializing.js +++ b/packages/pvl/test/serializing.js @@ -7,14 +7,14 @@ const PVLNumeric = require('../lib/models').PVLNumeric; const PVLDateTime = require('../lib/models').PVLDateTime; const PVLTextString = require('../lib/models').PVLTextString; -test('write one attribute', t => { +test('write one attribute', (t) => { const input = new PVLRoot() .add('FOO', new PVLTextString('BAR')); const expected = 'FOO = "BAR";\n'; t.deepEqual(jsToPVL(input), expected); }); -test('write multiple attributes', t => { +test('write multiple attributes', (t) => { const input = new PVLRoot() .add('FOO', new PVLTextString('BAR')) .add('BAZ', new PVLTextString('QUX')) @@ -26,7 +26,7 @@ test('write multiple attributes', t => { t.deepEqual(jsToPVL(input), expected); }); -test('write one group', t => { +test('write one group', (t) => { const input = new PVLRoot() .addAggregate(new PVLGroup('FOO') .add('BAR', new PVLTextString('BAZ')) @@ -38,7 +38,7 @@ test('write one group', t => { t.deepEqual(jsToPVL(input), expected); }); -test('write multiple groups', t => { +test('write multiple groups', (t) => { const input = new PVLRoot() .addAggregate(new PVLGroup('FOO') .add('BAR', new PVLTextString('BAZ')) @@ -56,7 +56,7 @@ test('write multiple groups', t => { t.deepEqual(jsToPVL(input), expected); }); -test('write nested groups', t => { +test('write nested groups', (t) => { const input = new PVLRoot() .addAggregate(new PVLGroup('FOO') .addAggregate(new PVLObject('QUX') @@ -72,28 +72,28 @@ test('write nested groups', t => { t.deepEqual(jsToPVL(input), expected); }); -test('write Numeric', t => { +test('write Numeric', (t) => { const input = new PVLRoot() .add('FOO', new PVLNumeric(12345)); const expected = 'FOO = 12345;\n'; t.is(jsToPVL(input), expected); }); -test('write DateTime', t => { +test('write DateTime', (t) => { const input = new PVLRoot() .add('FOO', new PVLDateTime('2016-12-05T23:24Z')); const expected = 'FOO = 2016-12-05T23:24:00.000Z;\n'; t.is(jsToPVL(input), expected); }); -test('write TextString', t => { +test('write TextString', (t) => { const input = new PVLRoot() .add('FOO', new PVLTextString('201612-BAZ')); const expected = 'FOO = "201612-BAZ";\n'; t.is(jsToPVL(input), expected); }); -test('write TextString with embedded double-quote', t => { +test('write TextString with embedded double-quote', (t) => { const input = new PVLRoot() .add('FOO', new PVLTextString('Dwayne "The Rock" Johnson')); const expected = "FOO = 'Dwayne \"The Rock\" Johnson';\n"; diff --git a/packages/pvl/test/utils.js b/packages/pvl/test/utils.js index 05dfdeee960..ab732bbaa8e 100644 --- a/packages/pvl/test/utils.js +++ b/packages/pvl/test/utils.js @@ -2,7 +2,7 @@ const test = require('ava').test; const pvlToJS = require('../t').pvlToJS; const PVLTextString = require('../lib/models').PVLTextString; -test('accessing aggregates', t => { +test('accessing aggregates', (t) => { const input = pvlToJS( 'GROUP = THAT;\n' + ' OBJECT = THOSE;\n' + @@ -32,7 +32,7 @@ test('accessing aggregates', t => { t.is(input.objects("'thOse'").length, 0); }); -test('parsing non-nested items', t => { +test('parsing non-nested items', (t) => { const input = pvlToJS( 'THIS = THAT;\n' + 'HERE = THERE;' diff --git a/packages/task-debug/src/workflow.js b/packages/task-debug/src/workflow.js index a13795a7710..09052cbc2de 100644 --- a/packages/task-debug/src/workflow.js +++ b/packages/task-debug/src/workflow.js @@ -11,7 +11,7 @@ const taskMap = { * @param {string} taskName The name of the task * @return {string} The path to the module */ -const requirePathForTask = taskName => { +const requirePathForTask = (taskName) => { const moduleName = taskMap[taskName]; return `../../../cumulus/tasks/${moduleName}`; }; @@ -22,7 +22,7 @@ const requirePathForTask = taskName => { * @param {Function} invocation Function that returns the message for a task * @return {*} The result from the execution */ -exports.runTask = (handler, invocation) => handler(invocation(), {}, result => result); +exports.runTask = (handler, invocation) => handler(invocation(), {}, (result) => result); /** * Returns a function that provides the message for a task @@ -37,7 +37,7 @@ exports.genMessage = (collectionId, taskName, resources = {}, payload = null, co local.collectionMessageInput( collectionId, taskName, - o => + (o) => Object.assign({}, o, { resources: resources, payload: payload From 4384ab27f8377c82a0e4bbe916683d30bff78f38 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Fri, 16 Mar 2018 17:22:06 -0400 Subject: [PATCH 40/94] Automatically resolve eslint indent errors --- .eslint-ratchet-high-water-mark | 2 +- .eslintrc.json | 1 + cumulus/lib/cf-template.js | 2 +- cumulus/tasks/discover-cmr-granules/index.js | 10 +-- cumulus/tasks/discover-pdr/index.js | 2 +- cumulus/tasks/download-activity-mock/sips.js | 2 +- cumulus/tasks/generate-pan/ftp_util.js | 2 +- .../generate-pan/test/generate-pan-spec.js | 2 +- cumulus/tasks/generate-pdrd/ftp_util.js | 2 +- .../sync-granule/tests/sync_granule_test.js | 6 +- cumulus/tasks/sync-http-urls/index.js | 12 +-- .../test/sync-http-urls-spec.js | 6 +- cumulus/tasks/trigger-ingest/index.js | 4 +- cumulus/tasks/validate-pdr/pdr-validations.js | 4 +- packages/api/endpoints/providers.js | 10 +-- packages/api/lambdas/bootstrap.js | 6 +- packages/api/lambdas/jobs.js | 4 +- packages/api/models/pdrs.js | 20 ++--- packages/api/models/rules.js | 80 +++++++++---------- packages/api/tests/test-db-indexer.js | 14 ++-- packages/api/tests/test-kinesis-consumer.js | 12 +-- packages/cmrjs/utils.js | 54 ++++++------- packages/common/aws.js | 20 ++--- packages/common/concurrency.js | 12 +-- packages/common/message-source.js | 4 +- packages/common/task.js | 14 ++-- packages/common/webpack.config-test.js | 4 +- packages/deployment/lib/adapter.js | 8 +- packages/deployment/lib/kes.js | 20 ++--- packages/ingest/ftp.js | 2 +- packages/ingest/granule.js | 42 +++++----- packages/ingest/http.js | 2 +- packages/ingest/pdr.js | 40 +++++----- packages/ingest/s3.js | 2 +- packages/ingest/sftp.js | 2 +- packages/ingest/test/queue.js | 18 ++--- packages/integration-tests/bin/cli.js | 8 +- packages/integration-tests/index.js | 2 +- packages/integration-tests/lambda.js | 4 +- packages/pvl/t.js | 4 +- 40 files changed, 233 insertions(+), 232 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 1d25bf7a627..5882485b119 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1702 +1585 diff --git a/.eslintrc.json b/.eslintrc.json index a401ce8cf0d..b63e3371ba3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,6 +8,7 @@ "mocha": true }, "rules": { + "indent": [ "error", 2 ], "require-jsdoc": ["error", { "require": { "FunctionDeclaration": true, diff --git a/cumulus/lib/cf-template.js b/cumulus/lib/cf-template.js index 87427b35e7d..06ab5717b50 100644 --- a/cumulus/lib/cf-template.js +++ b/cumulus/lib/cf-template.js @@ -62,7 +62,7 @@ const parseTemplate = (templateStr, prefix, context) => const dumpTemplate = (template) => yaml.safeDump(template, { schema: buildSchema() }) - .replace(/!]+)>/g, '!$1'); + .replace(/!]+)>/g, '!$1'); const mergeTemplates = (templates) => deepAssign(...templates); diff --git a/cumulus/tasks/discover-cmr-granules/index.js b/cumulus/tasks/discover-cmr-granules/index.js index d533686f2f2..b44a2d1e35d 100644 --- a/cumulus/tasks/discover-cmr-granules/index.js +++ b/cumulus/tasks/discover-cmr-granules/index.js @@ -41,7 +41,7 @@ function validateParameters(config) { * for each discovered granule */ module.exports = class DiscoverCmrGranulesTask extends Task { - /** + /** * Main task entrypoint * * @returns {Array} -- An array of CMR granules that need ingest @@ -136,11 +136,11 @@ module.exports = class DiscoverCmrGranulesTask extends Task { log.info(json); granules.push(...json.feed.entry); log.info(`scrollID:${scrollID}`, - `cmr-scroll-id:${response.headers._headers['cmr-scroll-id']}`, - `json.feed.entry.length:${json.feed.entry.length}`); + `cmr-scroll-id:${response.headers._headers['cmr-scroll-id']}`, + `json.feed.entry.length:${json.feed.entry.length}`); const nextScrollID = (json.feed.entry.length === 0) ? - false : - response.headers._headers['cmr-scroll-id']; + false : + response.headers._headers['cmr-scroll-id']; log.info(`nextScrollID:${nextScrollID}`); log.info('----TOTAL----: ', granules.length); return { granules: granules, scrollID: nextScrollID }; diff --git a/cumulus/tasks/discover-pdr/index.js b/cumulus/tasks/discover-pdr/index.js index 00668c43b57..b6a07cee5a5 100644 --- a/cumulus/tasks/discover-pdr/index.js +++ b/cumulus/tasks/discover-pdr/index.js @@ -56,7 +56,7 @@ module.exports = class DiscoverPdr extends Task { const S3UploadPromises = pdrList.map(async (pdrEntry) => { const fileName = pdrEntry.name; log.info(`FILE: ${fileName}`); - // Get the file contents + // Get the file contents const pdr = await pdrMod.getPdr(client, folder, fileName); log.debug('SUCCESSFULLY RETRIEVED PDR FROM SIPS SERVER'); // Write the contents out to S3 diff --git a/cumulus/tasks/download-activity-mock/sips.js b/cumulus/tasks/download-activity-mock/sips.js index 840c0c8a387..62a5a795572 100644 --- a/cumulus/tasks/download-activity-mock/sips.js +++ b/cumulus/tasks/download-activity-mock/sips.js @@ -10,7 +10,7 @@ const path = require('path'); const promisify = require('util.promisify'); const Client = require('ftp'); - /** +/** * Upload a file to a SIPS server. * @param {Client} client The client connected to the SIPS server * @param {string} destinationDir The directory in which to put the file. diff --git a/cumulus/tasks/generate-pan/ftp_util.js b/cumulus/tasks/generate-pan/ftp_util.js index 20ea82dad0f..8e397725f94 100644 --- a/cumulus/tasks/generate-pan/ftp_util.js +++ b/cumulus/tasks/generate-pan/ftp_util.js @@ -8,7 +8,7 @@ const log = require('@cumulus/common/log'); const path = require('path'); const promisify = require('util.promisify'); - /** +/** * Upload a file to a SIPS server. * @param {Client} client The client connected to the SIPS server * @param {string} destinationDir The directory in which to put the file. diff --git a/cumulus/tasks/generate-pan/test/generate-pan-spec.js b/cumulus/tasks/generate-pan/test/generate-pan-spec.js index 78c78eb731d..47ceb117591 100644 --- a/cumulus/tasks/generate-pan/test/generate-pan-spec.js +++ b/cumulus/tasks/generate-pan/test/generate-pan-spec.js @@ -7,7 +7,7 @@ const missingFileFixture = require('./fixtures/missing-file-fixture'); const timeStamp = (dateTime) => dateTime.toISOString().replace(/\.\d\d\dZ/, 'Z'); const shortPan = (dateTime) => -`MESSAGE_TYPE = SHORTPAN; + `MESSAGE_TYPE = SHORTPAN; DISPOSITION = "SUCCESSFUL"; TIME_STAMP = ${timeStamp(dateTime)};`; diff --git a/cumulus/tasks/generate-pdrd/ftp_util.js b/cumulus/tasks/generate-pdrd/ftp_util.js index 109e1ba6997..6740c7daf6c 100644 --- a/cumulus/tasks/generate-pdrd/ftp_util.js +++ b/cumulus/tasks/generate-pdrd/ftp_util.js @@ -9,7 +9,7 @@ const fs = require('fs'); const path = require('path'); const promisify = require('util.promisify'); - /** +/** * Upload a file to a SIPS server. * @param {Client} client The client connected to the SIPS server * @param {string} destinationDir The directory in which to put the file. diff --git a/cumulus/tasks/sync-granule/tests/sync_granule_test.js b/cumulus/tasks/sync-granule/tests/sync_granule_test.js index d4050ec6110..2abfd3daa0f 100644 --- a/cumulus/tasks/sync-granule/tests/sync_granule_test.js +++ b/cumulus/tasks/sync-granule/tests/sync_granule_test.js @@ -242,9 +242,9 @@ test('download granule with checksum in file from an HTTP endpoint', async (t) = const checksumFilename = event.input.granules[0].files[1].name; await Promise.all([ fs.copy(path.join(sourceDir, granuleFilename), - path.join(localGranulePath, granuleFilename)), + path.join(localGranulePath, granuleFilename)), fs.copy(path.join(sourceDir, checksumFilename), - path.join(localGranulePath, checksumFilename)) + path.join(localGranulePath, checksumFilename)) ]); const output = await syncGranule(event); @@ -254,7 +254,7 @@ test('download granule with checksum in file from an HTTP endpoint', async (t) = t.is(output.granules.length, 1); t.is(output.granules[0].files.length, 1); t.is(output.granules[0].files[0].filename, - `s3://${t.context.privateBucketName}/${granuleFilename}`); + `s3://${t.context.privateBucketName}/${granuleFilename}`); } catch (e) { if (e instanceof errors.RemoteResourceError) { diff --git a/cumulus/tasks/sync-http-urls/index.js b/cumulus/tasks/sync-http-urls/index.js index 6bd2d539805..53e5f632c98 100644 --- a/cumulus/tasks/sync-http-urls/index.js +++ b/cumulus/tasks/sync-http-urls/index.js @@ -216,12 +216,12 @@ module.exports = class SyncHttpUrlsTask extends Task { syncFiles(files, bucket, keypath, simulate = false) { const syncIfTimeLeft = _.partial(concurrency.unless, - () => this.endsWithin(TIMEOUT_TIME_MS), - syncFile, - bucket, - keypath, - simulate, - this.config.auth); + () => this.endsWithin(TIMEOUT_TIME_MS), + syncFile, + bucket, + keypath, + simulate, + this.config.auth); const syncLimited = concurrency.limit(this.config.connections || 5, syncIfTimeLeft); return concurrency.mapTolerant(files, syncLimited); } diff --git a/cumulus/tasks/sync-http-urls/test/sync-http-urls-spec.js b/cumulus/tasks/sync-http-urls/test/sync-http-urls-spec.js index 8f6b59a3ebc..c200bd2137e 100644 --- a/cumulus/tasks/sync-http-urls/test/sync-http-urls-spec.js +++ b/cumulus/tasks/sync-http-urls/test/sync-http-urls-spec.js @@ -72,10 +72,10 @@ describe('sync-http-urls.handler', () => { beforeEach(() => { sinon.stub(aws.s3(), 'upload') - .yieldsAsync(null, null); + .yieldsAsync(null, null); sinon.stub(https, 'get') - .yieldsAsync({ statusCode: 200, body: 'fake-data' }) - .returns({ on: () => {} }); + .yieldsAsync({ statusCode: 200, body: 'fake-data' }) + .returns({ on: () => {} }); }); afterEach(() => { diff --git a/cumulus/tasks/trigger-ingest/index.js b/cumulus/tasks/trigger-ingest/index.js index 21f39f02b87..780e001c096 100644 --- a/cumulus/tasks/trigger-ingest/index.js +++ b/cumulus/tasks/trigger-ingest/index.js @@ -64,8 +64,8 @@ module.exports = class TriggerIngestTask extends Task { fullMessageData.ingest_meta = Object.assign({}, originalIngestMeta, newIngestMeta); const s3Params = Object.assign({}, - payload, - { Body: JSON.stringify(fullMessageData.payload) }); + payload, + { Body: JSON.stringify(fullMessageData.payload) }); const sfnMessageData = Object.assign({}, fullMessageData); if (!isSfnExecution) { diff --git a/cumulus/tasks/validate-pdr/pdr-validations.js b/cumulus/tasks/validate-pdr/pdr-validations.js index 5509f95d460..75e4181b935 100644 --- a/cumulus/tasks/validate-pdr/pdr-validations.js +++ b/cumulus/tasks/validate-pdr/pdr-validations.js @@ -7,7 +7,7 @@ const pdrMod = require('./pdr'); * Validations for PDR entries */ - /** +/** * File spec validations - validations for individual files */ @@ -192,7 +192,7 @@ const validateFileGroup = (fileGroup) => { * Top level (non file group) PDR validations */ - /** +/** * Validate that the TOTAL_FILE_COUNT entry for the PDR is neither missing nor less than one * @param {PVLRoot} pdr The `PVLRoot` object for the PDR * @return An error string or null diff --git a/packages/api/endpoints/providers.js b/packages/api/endpoints/providers.js index 7cb7ad0b926..4e75aab84a6 100644 --- a/packages/api/endpoints/providers.js +++ b/packages/api/endpoints/providers.js @@ -87,11 +87,11 @@ function put(event, cb) { originalData = d; return p.update({ id }, data); }) - .then((data) => cb(null, data)) - .catch((err) => { - if (err instanceof RecordDoesNotExist) cb({ message: 'Record does not exist' }); - return cb(err); - }); + .then((data) => cb(null, data)) + .catch((err) => { + if (err instanceof RecordDoesNotExist) cb({ message: 'Record does not exist' }); + return cb(err); + }); } function del(event, cb) { diff --git a/packages/api/lambdas/bootstrap.js b/packages/api/lambdas/bootstrap.js index e017bdaf6a0..eb05f423710 100644 --- a/packages/api/lambdas/bootstrap.js +++ b/packages/api/lambdas/bootstrap.js @@ -155,8 +155,8 @@ justLocalRun(() => { //const a = {}; //handler(a, {}, (e, r) => console.log(e, r)); //bootstrapCmrProvider('testing').then(r => { - //console.log(r) - //return DefaultProvider.decrypt(r) + //console.log(r) + //return DefaultProvider.decrypt(r) //}).then(r => console.log(r)) - //.catch(e => console.log(e)); + //.catch(e => console.log(e)); }); diff --git a/packages/api/lambdas/jobs.js b/packages/api/lambdas/jobs.js index 4e04b5c7a45..63da5cfb6f1 100644 --- a/packages/api/lambdas/jobs.js +++ b/packages/api/lambdas/jobs.js @@ -19,8 +19,8 @@ async function findStaleRecords(type, q, limit = 100, page = 1) { const response = await search.query(); //if (response.results.length >= limit) { - //const more = await findStaleRecords(type, q, limit, page + 1); - //return response.results.concat(more); + //const more = await findStaleRecords(type, q, limit, page + 1); + //return response.results.concat(more); //} return response.results; } diff --git a/packages/api/models/pdrs.js b/packages/api/models/pdrs.js index d6070358bbd..2fb81a054d6 100644 --- a/packages/api/models/pdrs.js +++ b/packages/api/models/pdrs.js @@ -41,9 +41,9 @@ class Pdr extends Manager { // generate PDRD message const pan = pvl.jsToPVL( new pvl.models.PVLRoot() - .add('MESSAGE_TYPE', new pvl.models.PVLTextString('SHORTPAN')) - .add('DISPOSITION', new pvl.models.PVLTextString('SUCCESSFUL')) - .add('TIME_STAMP', new pvl.models.PVLDateTime(new Date())) + .add('MESSAGE_TYPE', new pvl.models.PVLTextString('SHORTPAN')) + .add('DISPOSITION', new pvl.models.PVLTextString('SUCCESSFUL')) + .add('TIME_STAMP', new pvl.models.PVLDateTime(new Date())) ); obj.PAN = pan; @@ -56,11 +56,11 @@ class Pdr extends Manager { //const provider = await pr.get({ name: pdr.provider }); //if (provider.panFolder && provider.protocol === 'ftp') { - //const password = await pr.decryptPassword(provider.config.password); + //const password = await pr.decryptPassword(provider.config.password); - //const w = new FtpPan(provider, pdrName, provider.config.username, password); - //await w.write(pan, 'PAN'); - //obj.PANSent = true; + //const w = new FtpPan(provider, pdrName, provider.config.username, password); + //await w.write(pan, 'PAN'); + //obj.PANSent = true; //} //else { obj.PANSent = false; @@ -89,9 +89,9 @@ class Pdr extends Manager { //if (err instanceof PDRParsingError) { //// generate PDRD message //const pdrd = pvl.jsToPVL( - //new pvl.models.PVLRoot() - //.add('MESSAGE_TYPE', new pvl.models.PVLTextString('SHORTPDRD')) - //.add('DISPOSITION', new pvl.models.PVLTextString(err.message)) + //new pvl.models.PVLRoot() + //.add('MESSAGE_TYPE', new pvl.models.PVLTextString('SHORTPDRD')) + //.add('DISPOSITION', new pvl.models.PVLTextString(err.message)) //); //values.PDRD = pdrd; diff --git a/packages/api/models/rules.js b/packages/api/models/rules.js index 0b379da5953..06802a51a64 100644 --- a/packages/api/models/rules.js +++ b/packages/api/models/rules.js @@ -28,17 +28,17 @@ class Rule extends Manager { async delete(item) { switch (item.rule.type) { - case 'scheduled': { - const name = `${process.env.stackName}-custom-${item.name}`; - await Events.deleteTarget(this.targetId, name); - await Events.deleteEvent(name); - break; - } - case 'kinesis': - await this.deleteKinesisEventSource(item); - break; - default: - break; + case 'scheduled': { + const name = `${process.env.stackName}-custom-${item.name}`; + await Events.deleteTarget(this.targetId, name); + await Events.deleteEvent(name); + break; + } + case 'kinesis': + await this.deleteKinesisEventSource(item); + break; + default: + break; } return super.delete({ name: item.name }); } @@ -63,23 +63,23 @@ class Rule extends Manager { } switch (original.rule.type) { - case 'scheduled': { - const payload = await Rule.buildPayload(original); - await this.addRule(original, payload); - break; + case 'scheduled': { + const payload = await Rule.buildPayload(original); + await this.addRule(original, payload); + break; + } + case 'kinesis': + if (valueUpdated) { + await this.deleteKinesisEventSource(original); + await this.addKinesisEventSource(original); + updated.rule.arn = original.rule.arn; + } + else { + await this.updateKinesisEventSource(original); } - case 'kinesis': - if (valueUpdated) { - await this.deleteKinesisEventSource(original); - await this.addKinesisEventSource(original); - updated.rule.arn = original.rule.arn; - } - else { - await this.updateKinesisEventSource(original); - } - break; - default: - break; + break; + default: + break; } return super.update({ name: original.name }, updated); @@ -125,19 +125,19 @@ class Rule extends Manager { const payload = await Rule.buildPayload(item); switch (item.rule.type) { - case 'onetime': { - await invoke(process.env.invoke, payload); - break; - } - case 'scheduled': { - await this.addRule(item, payload); - break; - } - case 'kinesis': - await this.addKinesisEventSource(item); - break; - default: - throw new Error('Type not supported'); + case 'onetime': { + await invoke(process.env.invoke, payload); + break; + } + case 'scheduled': { + await this.addRule(item, payload); + break; + } + case 'kinesis': + await this.addKinesisEventSource(item); + break; + default: + throw new Error('Type not supported'); } // save diff --git a/packages/api/tests/test-db-indexer.js b/packages/api/tests/test-db-indexer.js index fdf56aff166..f92d05d7d33 100644 --- a/packages/api/tests/test-db-indexer.js +++ b/packages/api/tests/test-db-indexer.js @@ -79,18 +79,18 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { } } }) - .promise() - .then((res) => { - fs.unlinkSync(tmpZipFile); - resolve(res); - }); + .promise() + .then((res) => { + fs.unlinkSync(tmpZipFile); + resolve(res); + }); }); archive.pipe(output) archive.directory(codeDirectory, false); archive.finalize() }) - .catch(console.log); + .catch(console.log); //get the dynamo collections table stream arn and add it as an event source to the lambda await new Promise((resolve, reject) => { @@ -110,7 +110,7 @@ if (process.env.LOCALSTACK_HOST === 'localhost') { }); }); }) - .catch(console.log); + .catch(console.log); }); test.skip.after.always(async () => { diff --git a/packages/api/tests/test-kinesis-consumer.js b/packages/api/tests/test-kinesis-consumer.js index 4b8579b78b6..c3965a79ba5 100644 --- a/packages/api/tests/test-kinesis-consumer.js +++ b/packages/api/tests/test-kinesis-consumer.js @@ -138,12 +138,12 @@ test('it should enqueue a message for each associated workflow', async (t) => { MaxNumberOfMessages: 10, WaitTimeSeconds: 1 }).promise() - .then((receiveMessageResponse) => { - t.is(receiveMessageResponse.Messages.length, 4); - receiveMessageResponse.Messages.map((message) => ( - t.is(JSON.stringify(JSON.parse(message.Body).payload), JSON.stringify({ collection: 'test-collection' })) - )); - }); + .then((receiveMessageResponse) => { + t.is(receiveMessageResponse.Messages.length, 4); + receiveMessageResponse.Messages.map((message) => ( + t.is(JSON.stringify(JSON.parse(message.Body).payload), JSON.stringify({ collection: 'test-collection' })) + )); + }); }); test('it should throw an error if message does not include a collection', (t) => { diff --git a/packages/cmrjs/utils.js b/packages/cmrjs/utils.js index 0010ce7809d..660bad76383 100644 --- a/packages/cmrjs/utils.js +++ b/packages/cmrjs/utils.js @@ -55,28 +55,28 @@ function getUrl(type, cmrProvider) { const provider = cmrProvider; switch (type) { - case 'token': - if (env === 'OPS') { - url = 'https://api.echo.nasa.gov/echo-rest/tokens/'; - } - else if (env === 'SIT') { - url = 'https://testbed.echo.nasa.gov/echo-rest/tokens/'; - } - else { - url = 'https://api-test.echo.nasa.gov/echo-rest/tokens/'; - } - break; - case 'search': - url = `https://${host}/search/`; - break; - case 'validate': - url = `https://${host}/ingest/providers/${provider}/validate/`; - break; - case 'ingest': - url = `https://${host}/ingest/providers/${provider}/`; - break; - default: - url = null; + case 'token': + if (env === 'OPS') { + url = 'https://api.echo.nasa.gov/echo-rest/tokens/'; + } + else if (env === 'SIT') { + url = 'https://testbed.echo.nasa.gov/echo-rest/tokens/'; + } + else { + url = 'https://api-test.echo.nasa.gov/echo-rest/tokens/'; + } + break; + case 'search': + url = `https://${host}/search/`; + break; + case 'validate': + url = `https://${host}/ingest/providers/${provider}/validate/`; + break; + case 'ingest': + url = `https://${host}/ingest/providers/${provider}/`; + break; + default: + url = null; } return url; @@ -174,9 +174,9 @@ async function tokenIsValid(token) { } module.exports = { - validate, - ValidationError, - updateToken, - getUrl, - xmlParseOptions + validate, + ValidationError, + updateToken, + getUrl, + xmlParseOptions } diff --git a/packages/common/aws.js b/packages/common/aws.js index 5fb2dca9846..08ef45fcd2f 100644 --- a/packages/common/aws.js +++ b/packages/common/aws.js @@ -273,8 +273,8 @@ exports.uploadS3Files = (files, defaultBucket, keyPath, s3opts = {}) => { const filename = fileInfo; fileInfo = { key: (typeof keyPath === 'string') ? - path.join(keyPath, path.basename(filename)) : - keyPath(filename), + path.join(keyPath, path.basename(filename)) : + keyPath(filename), filename: filename }; } @@ -284,10 +284,10 @@ exports.uploadS3Files = (files, defaultBucket, keyPath, s3opts = {}) => { const body = fs.createReadStream(filename); const opts = Object.assign({ Bucket: bucket, Key: key, Body: body }, s3opts); return exports.promiseS3Upload(opts) - .then(() => { - log.info(`Progress: [${++i} of ${n}] ${filename} -> s3://${bucket}/${key}`); - return { key: key, bucket: bucket }; - }); + .then(() => { + log.info(`Progress: [${++i} of ${n}] ${filename} -> s3://${bucket}/${key}`); + return { key: key, bucket: bucket }; + }); }; const limitedUpload = concurrency.limit(S3_RATE_LIMIT, promiseUpload); return Promise.all(files.map(limitedUpload)); @@ -460,8 +460,8 @@ exports.toSfnExecutionName = (fields, delimiter = '__') => { } const regex = new RegExp(sfnUnsafeChars, 'g'); return fields.map((s) => s.replace(regex, string.unicodeEscape).replace(/\\/g, '!')) - .join(delimiter) - .substring(0, 80); + .join(delimiter) + .substring(0, 80); }; /** @@ -478,8 +478,8 @@ exports.toSfnExecutionName = (fields, delimiter = '__') => { */ exports.fromSfnExecutionName = (str, delimiter = '__') => str.split(delimiter) - .map((s) => s.replace(/!/g, '\\').replace('"', '\\"')) - .map((s) => JSON.parse(`"${s}"`)); + .map((s) => s.replace(/!/g, '\\').replace('"', '\\"')) + .map((s) => JSON.parse(`"${s}"`)); /** * Create an SQS Queue. Properly handles localstack queue URLs diff --git a/packages/common/concurrency.js b/packages/common/concurrency.js index 0cd0e944ba5..b0a01e6ea08 100644 --- a/packages/common/concurrency.js +++ b/packages/common/concurrency.js @@ -25,12 +25,12 @@ const mapTolerant = (arr, fn) => { .catch((err) => tolerate(item, err)); return Promise.all(arr.map(tolerantCall)) - .then((items) => { //eslint-disable-line arrow-body-style - return { - completed: _.compact(items), - errors: errors.length === 0 ? null : errors - }; - }); + .then((items) => { //eslint-disable-line arrow-body-style + return { + completed: _.compact(items), + errors: errors.length === 0 ? null : errors + }; + }); }; const toPromise = (fn, ...args) => diff --git a/packages/common/message-source.js b/packages/common/message-source.js index 8428d4e6951..4cb9d7612d9 100644 --- a/packages/common/message-source.js +++ b/packages/common/message-source.js @@ -180,8 +180,8 @@ class StateMachineS3MessageSource extends MessageSource { const promise = aws.promiseS3Upload(params).then(() => { const payload = { Bucket: params.Bucket, Key: params.Key }; const messageData = Object.assign({}, - this.originalMessage, - { payload: payload, exception: 'None' }); + this.originalMessage, + { payload: payload, exception: 'None' }); log.info('Complete. Config uploaded to ', params.Key); callback(null, messageData); }); diff --git a/packages/common/task.js b/packages/common/task.js index ecee3258cd0..622fdb7d421 100644 --- a/packages/common/task.js +++ b/packages/common/task.js @@ -59,10 +59,10 @@ module.exports = class Task { return fn(); } const semaphore = new concurrency.Semaphore(aws.dynamodbDocClient(), - config.connection_table); + config.connection_table); return semaphore.checkout(config.connection_group, - config.connections, - config.max_group_connections, fn); + config.connections, + config.max_group_connections, fn); } run() { @@ -110,11 +110,11 @@ module.exports = class Task { static logTaskCompletion(response, startDate, limit = 2000) { const duration = (new Date() - startDate) / 1000; const responseStr = (response === null || response === undefined) ? - '(no response)' : - JSON.stringify(response, null, 2); + '(no response)' : + JSON.stringify(response, null, 2); log.info(`Processing Completed (${duration}s)`, - responseStr.substring(0, limit), - responseStr.length > limit ? '...' : ''); + responseStr.substring(0, limit), + responseStr.length > limit ? '...' : ''); } /** * Logs a fatal task error diff --git a/packages/common/webpack.config-test.js b/packages/common/webpack.config-test.js index 4c4be0cdf57..a750915d119 100644 --- a/packages/common/webpack.config-test.js +++ b/packages/common/webpack.config-test.js @@ -31,8 +31,8 @@ module.exports = { }, { include: glob.sync('{*.js,test/*.js}', - { realpath: true }) - .map((filename) => path.resolve(__dirname, filename)), + { realpath: true }) + .map((filename) => path.resolve(__dirname, filename)), exclude: /node_modules/, loader: 'prepend', query: { diff --git a/packages/deployment/lib/adapter.js b/packages/deployment/lib/adapter.js index d1dd236e83d..65bb86b71a3 100644 --- a/packages/deployment/lib/adapter.js +++ b/packages/deployment/lib/adapter.js @@ -27,15 +27,15 @@ function downloadZipfile(fileUrl, localFilename) { request(options, (err) => { if (err) reject(err); }) - .pipe(file); + .pipe(file); file.on('finish', () => { console.log(`Completed download of ${fileUrl} to ${localFilename}`); resolve(); }) - .on('error', (err) => { - reject(err); - }); + .on('error', (err) => { + reject(err); + }); }); } diff --git a/packages/deployment/lib/kes.js b/packages/deployment/lib/kes.js index 176970936b0..1a5cc32a953 100644 --- a/packages/deployment/lib/kes.js +++ b/packages/deployment/lib/kes.js @@ -198,16 +198,16 @@ class UpdatedKes extends Kes { } switch (o.OutputKey) { - case 'ApiId': - apis.api = o.OutputValue; - break; - case 'DistributionId': - apis.distribution = o.OutputValue; - break; - case 'ApiStage': - apis.stageName = o.OutputValue; - break; - default: + case 'ApiId': + apis.api = o.OutputValue; + break; + case 'DistributionId': + apis.distribution = o.OutputValue; + break; + case 'ApiStage': + apis.stageName = o.OutputValue; + break; + default: //nothing } }); diff --git a/packages/ingest/ftp.js b/packages/ingest/ftp.js index f45d03cc7dd..470aae66098 100644 --- a/packages/ingest/ftp.js +++ b/packages/ingest/ftp.js @@ -41,7 +41,7 @@ module.exports.ftpMixin = (superclass) => class extends superclass { } } - /** + /** * Download a remote file to disk * * @param {string} remotePath - the full path to the remote file to be fetched diff --git a/packages/ingest/granule.js b/packages/ingest/granule.js index 9d2a1e65b1f..6587d1defbb 100644 --- a/packages/ingest/granule.js +++ b/packages/ingest/granule.js @@ -393,31 +393,31 @@ class S3Granule extends s3Mixin(baseProtocol(Granule)) {} function selector(type, protocol) { if (type === 'discover') { switch (protocol) { - case 'sftp': - return SftpDiscoverGranules; - case 'ftp': - return FtpDiscoverGranules; - case 'http': - case 'https': - return HttpDiscoverGranules; - case 's3': - return S3DiscoverGranules; - default: - throw new Error(`Protocol ${protocol} is not supported.`); + case 'sftp': + return SftpDiscoverGranules; + case 'ftp': + return FtpDiscoverGranules; + case 'http': + case 'https': + return HttpDiscoverGranules; + case 's3': + return S3DiscoverGranules; + default: + throw new Error(`Protocol ${protocol} is not supported.`); } } else if (type === 'ingest') { switch (protocol) { - case 'sftp': - return SftpGranule; - case 'ftp': - return FtpGranule; - case 'http': - return HttpGranule; - case 's3': - return S3Granule; - default: - throw new Error(`Protocol ${protocol} is not supported.`); + case 'sftp': + return SftpGranule; + case 'ftp': + return FtpGranule; + case 'http': + return HttpGranule; + case 's3': + return S3Granule; + default: + throw new Error(`Protocol ${protocol} is not supported.`); } } diff --git a/packages/ingest/http.js b/packages/ingest/http.js index 496e6826681..68b829e4d6d 100644 --- a/packages/ingest/http.js +++ b/packages/ingest/http.js @@ -96,7 +96,7 @@ module.exports.httpMixin = (superclass) => class extends superclass { }); } - /** + /** * Download a remote file to disk * * @param {string} remotePath - the full path to the remote file to be fetched diff --git a/packages/ingest/pdr.js b/packages/ingest/pdr.js index 06231f25c63..28b5a9f9372 100644 --- a/packages/ingest/pdr.js +++ b/packages/ingest/pdr.js @@ -273,30 +273,30 @@ class S3Parse extends s3Mixin(baseProtocol(Parse)) {} function selector(type, protocol) { if (type === 'discover') { switch (protocol) { - case 'http': - return HttpDiscover; - case 'ftp': - return FtpDiscover; - case 'sftp': - return SftpDiscover; - case 's3': - return S3Discover; - default: - throw new Error(`Protocol ${protocol} is not supported.`); + case 'http': + return HttpDiscover; + case 'ftp': + return FtpDiscover; + case 'sftp': + return SftpDiscover; + case 's3': + return S3Discover; + default: + throw new Error(`Protocol ${protocol} is not supported.`); } } else if (type === 'parse') { switch (protocol) { - case 'http': - return HttpParse; - case 'ftp': - return FtpParse; - case 'sftp': - return SftpParse; - case 's3': - return S3Parse; - default: - throw new Error(`Protocol ${protocol} is not supported.`); + case 'http': + return HttpParse; + case 'ftp': + return FtpParse; + case 'sftp': + return SftpParse; + case 's3': + return S3Parse; + default: + throw new Error(`Protocol ${protocol} is not supported.`); } } diff --git a/packages/ingest/s3.js b/packages/ingest/s3.js index 04e68584b1d..555e41ba5de 100644 --- a/packages/ingest/s3.js +++ b/packages/ingest/s3.js @@ -7,7 +7,7 @@ const os = require('os'); const path = require('path'); module.exports.s3Mixin = (superclass) => class extends superclass { - /** + /** * Download a remote file to disk * * @param {string} remotePath - the full path to the remote file to be fetched diff --git a/packages/ingest/sftp.js b/packages/ingest/sftp.js index 40e95e5e00c..63e6f6229ad 100644 --- a/packages/ingest/sftp.js +++ b/packages/ingest/sftp.js @@ -58,7 +58,7 @@ module.exports = (superclass) => class extends superclass { return this.client.end(); } - /** + /** * Download a remote file to disk * * @param {string} remotePath - the full path to the remote file to be fetched diff --git a/packages/ingest/test/queue.js b/packages/ingest/test/queue.js index 4ad64c9ea89..9ec629422a3 100644 --- a/packages/ingest/test/queue.js +++ b/packages/ingest/test/queue.js @@ -51,13 +51,13 @@ test('the queue receives a correctly formatted workflow message', async (t) => { MaxNumberOfMessages: 10, WaitTimeSeconds: 1 }).promise() - .then((receiveMessageResponse) => { - t.is(receiveMessageResponse.Messages.length, 1); - - const message = JSON.parse(receiveMessageResponse.Messages[0].Body); - t.is(message.meta.provider, 'PROV1'); - t.is(JSON.stringify(message.meta.collection), JSON.stringify({ name: 'test-collection' })); - t.is(JSON.stringify(message.payload), JSON.stringify({ test: 'test payload' })); - t.is(message.cumulus_meta.state_machine, t.context.stateMachineArn); - }); + .then((receiveMessageResponse) => { + t.is(receiveMessageResponse.Messages.length, 1); + + const message = JSON.parse(receiveMessageResponse.Messages[0].Body); + t.is(message.meta.provider, 'PROV1'); + t.is(JSON.stringify(message.meta.collection), JSON.stringify({ name: 'test-collection' })); + t.is(JSON.stringify(message.payload), JSON.stringify({ test: 'test payload' })); + t.is(message.cumulus_meta.state_machine, t.context.stateMachineArn); + }); }); diff --git a/packages/integration-tests/bin/cli.js b/packages/integration-tests/bin/cli.js index 54e38a1d026..7a8f9a6eeeb 100755 --- a/packages/integration-tests/bin/cli.js +++ b/packages/integration-tests/bin/cli.js @@ -45,11 +45,11 @@ program .description('Execute a workflow and determine if the workflow completes successfully') .action(() => { if (verifyWorkflowParameters([{ name: 'stack-name', value: program.stackName }, - { name: 'bucket-name', value: program.bucketName }, - { name: 'workflow', value: program.workflow }, - { name: 'input-file', value: program.inputFile }])) { + { 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); + program.workflow, program.inputFile); } }); diff --git a/packages/integration-tests/index.js b/packages/integration-tests/index.js index d644c6a3d52..b8a731f0633 100644 --- a/packages/integration-tests/index.js +++ b/packages/integration-tests/index.js @@ -43,7 +43,7 @@ function getWorkflowTemplate(stackName, bucketName, workflowName) { */ function getWorkflowArn(stackName, bucketName, workflowName) { return getWorkflowTemplate(stackName, bucketName, workflowName) - .then((template) => template.cumulus_meta.state_machine); + .then((template) => template.cumulus_meta.state_machine); } /** diff --git a/packages/integration-tests/lambda.js b/packages/integration-tests/lambda.js index dc5401e2815..de454dab22a 100644 --- a/packages/integration-tests/lambda.js +++ b/packages/integration-tests/lambda.js @@ -48,12 +48,12 @@ async function getLambdaExecution(workflowExecutionArn, lambdaName) { if (scheduleEvent.type !== 'LambdaFunctionScheduleFailed') { startEvent = executionHistory.events.find((event) => - (lambdaStartedEvents.includes(event.type)) && + (lambdaStartedEvents.includes(event.type)) && (event.previousEventId === scheduleEvent.id)); if (startEvent !== null && startEvent.type !== 'LambdaFunctionStartFailed') { completeEvent = executionHistory.events.find((event) => - (lambdaCompletedEvents.includes(event.type)) && + (lambdaCompletedEvents.includes(event.type)) && (event.previousEventId === startEvent.id)); } } diff --git a/packages/pvl/t.js b/packages/pvl/t.js index a8b6ebd1bd4..74af78ec682 100644 --- a/packages/pvl/t.js +++ b/packages/pvl/t.js @@ -16,8 +16,8 @@ function parseValue (value, key) { const parsed = numericValue !== null ? new PVLNumeric(numericValue) : dateTimeValue !== null ? new PVLDateTime(dateTimeValue) - : textStringValue !== null ? new PVLTextString(textStringValue) - : null; + : textStringValue !== null ? new PVLTextString(textStringValue) + : null; if (parsed) { return parsed; } else { From 566a429954ebd4ee08a818487b704432ffe92f0f Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Mon, 19 Mar 2018 11:57:54 -0400 Subject: [PATCH 41/94] CUMULUS-359 kinesis consumer users sf-scheduler (#262) **Summary:** Kinesis consumer users sf-scheduler Closes #262 Addresses [CUMULUS-359](https://bugs.earthdata.nasa.gov/browse/CUMULUS-359) ## Detailed Changes * kinesis consumer now calls sf-scheduler function schedule * updated tests * kinesis consumer lambda now requires env variables for the collections and providers table used in sf-scheduler#schedule * (unrelated) fixes eslint errors in `packages/api/lambdas` ## Test Plan - [x] Unit tests - [x] Adhoc testing Reviewers: @laurenfrederick --- .eslint-ratchet-high-water-mark | 2 +- CHANGELOG.md | 9 ++ packages/api/config/lambdas.yml | 7 +- packages/api/lambdas/bootstrap.js | 17 ++- packages/api/lambdas/db-indexer.js | 13 +- packages/api/lambdas/jobs.js | 23 ++-- packages/api/lambdas/kinesis-consumer.js | 25 ++-- packages/api/lambdas/sf-scheduler.js | 13 +- packages/api/tests/test-kinesis-consumer.js | 130 +++++++++++--------- packages/ingest/README.md | 10 ++ packages/ingest/aws.js | 4 +- packages/ingest/queue.js | 29 +---- packages/ingest/test/queue.js | 47 ++++--- 13 files changed, 176 insertions(+), 153 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index fc2748e2649..98102958a72 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1910 +1874 diff --git a/CHANGELOG.md b/CHANGELOG.md index d8c3ddaceff..fbe7f4970b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,16 +5,25 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] + ### Fixed - Update vulnerable npm packages [CUMULUS-425] +- `@cumulus/api`: `kinesis-consumer.js` uses `sf-scheduler.js#schedule` instead of placing a message directly on the `startSF` SQS queue. This is a fix for [CUMULUS-359](https://bugs.earthdata.nasa.gov/browse/CUMULUS-359) because `sf-scheduler.js#schedule` looks up the provider and collection data in DynamoDB and adds it to the `meta` object of the enqueued message payload. +- `@cumulus/api`: `kinesis-consumer.js` catches and logs errors instead of doing an error callback. Before this change, `kinesis-consumer` was failing to process new records when an existing record caused an error because it would call back with an error and stop processing additional records. It keeps trying to process the record causing the error because it's "position" in the stream is unchanged. Catching and logging the errors is part 1 of the fix. Proposed part 2 is to enqueue the error and the message on a "dead-letter" queue so it can be processed later ([CUMULUS-413](https://bugs.earthdata.nasa.gov/browse/CUMULUS-413)). + +### Removed + +- `@cumulus/ingest/aws`: Remove queueWorkflowMessage which is no longer being used by `@cumulus/api`'s `kinesis-consumer.js`. ## [v1.1.4] - 2018-03-15 ### Added - added flag `useList` to parse-pdr [CUMULUS-404] ### Fixed + - Pass encrypted password to the ApiGranule Lambda function [CUMULUS-424] + ## [v1.1.3] - 2018-03-14 ### Fixed - Changed @cumulus/deployment package install behavior. The build process will happen after installation diff --git a/packages/api/config/lambdas.yml b/packages/api/config/lambdas.yml index 24b8afaddfa..c5b8699e34c 100644 --- a/packages/api/config/lambdas.yml +++ b/packages/api/config/lambdas.yml @@ -61,9 +61,12 @@ kinesisConsumer: RulesTable: function: Ref value: RulesTableDynamoDB - invoke: + CollectionsTable: function: Ref - value: ScheduleSFLambdaFunction + value: CollectionsTableDynamoDB + ProvidersTable: + function: Ref + value: ProvidersTableDynamoDB bucket: '{{buckets.internal}}' ScheduleSF: diff --git a/packages/api/lambdas/bootstrap.js b/packages/api/lambdas/bootstrap.js index d505e335b2a..5ca47596337 100644 --- a/packages/api/lambdas/bootstrap.js +++ b/packages/api/lambdas/bootstrap.js @@ -10,6 +10,7 @@ * - creating API users * - encrypting CMR user/pass and adding it to configuration files */ + 'use strict'; const https = require('https'); @@ -44,19 +45,17 @@ async function bootstrapElasticSearch(host, index = 'cumulus') { else { log.info(`index ${index} already exists`); } - - return; } async function bootstrapUsers(table, records) { if (!table) { - return new Promise(resolve => resolve()); + return new Promise((resolve) => resolve()); } const user = new Manager(table); // delete all user records const existingUsers = await user.scan(); - await Promise.all(existingUsers.Items.map(u => user.delete({ userName: u.userName }))); + await Promise.all(existingUsers.Items.map((u) => user.delete({ userName: u.userName }))); // add new ones const additions = records.map((record) => user.create({ userName: record.username, @@ -69,7 +68,7 @@ async function bootstrapUsers(table, records) { async function bootstrapCmrProvider(password) { if (!password) { - return new Promise(resolve => resolve('nopassword')); + return new Promise((resolve) => resolve('nopassword')); } return DefaultProvider.encrypt(password); } @@ -140,7 +139,7 @@ function handler(event, context, cb) { }; return sendResponse(event, 'SUCCESS', data, cb); - }).catch(e => { + }).catch((e) => { log.error(e); return sendResponse(event, 'FAILED', null, cb); }); @@ -155,8 +154,8 @@ justLocalRun(() => { //const a = {}; //handler(a, {}, (e, r) => console.log(e, r)); //bootstrapCmrProvider('testing').then(r => { - //console.log(r) - //return DefaultProvider.decrypt(r) + //console.log(r) + //return DefaultProvider.decrypt(r) //}).then(r => console.log(r)) - //.catch(e => console.log(e)); + //.catch(e => console.log(e)); }); diff --git a/packages/api/lambdas/db-indexer.js b/packages/api/lambdas/db-indexer.js index 1ea58dddff3..a2a8a936ab0 100644 --- a/packages/api/lambdas/db-indexer.js +++ b/packages/api/lambdas/db-indexer.js @@ -17,7 +17,7 @@ function indexRecord(esClient, record) { //determine whether the record should be indexed const acceptedTables = ['Collection', 'Provider', 'Rule']; - const tableConfig = {} + const tableConfig = {}; acceptedTables.forEach((a) => { tableConfig[`${stack}-${a}sTable`] = indexer[`index${a}`]; }); @@ -54,21 +54,20 @@ function indexRecord(esClient, record) { } async function indexRecords(records) { - const concurrencyLimit = process.env.CONCURRENCY || 3 + const concurrencyLimit = process.env.CONCURRENCY || 3; const limit = pLimit(concurrencyLimit); const esClient = await Search.es(); - const promises = records.map((record) => limit( - () => indexRecord(esClient, record) - )); + const promises = records.map((record) => limit(() => indexRecord(esClient, record))); return Promise.all(promises); } /** * Sync changes to dynamodb to an elasticsearch instance. * Sending updates to this lambda is handled by automatically AWS. - * @param {array} Records list of records with an eventName property signifying REMOVE or INSERT. - * @return {string} response text indicating the number of records altered in elasticsearch. + * + * @param {Array} Records - list of records with an eventName property signifying REMOVE or INSERT. + * @returns {string} response text indicating the number of records altered in elasticsearch. */ function handler(event, context, cb) { const records = event.Records; diff --git a/packages/api/lambdas/jobs.js b/packages/api/lambdas/jobs.js index 1cd80f4d82c..7c38385772a 100644 --- a/packages/api/lambdas/jobs.js +++ b/packages/api/lambdas/jobs.js @@ -1,4 +1,5 @@ /* runs a bunch of periodic jobs to keep the database updateToDate */ + 'use strict'; const get = require('lodash.get'); @@ -19,8 +20,8 @@ async function findStaleRecords(type, q, limit = 100, page = 1) { const response = await search.query(); //if (response.results.length >= limit) { - //const more = await findStaleRecords(type, q, limit, page + 1); - //return response.results.concat(more); + //const more = await findStaleRecords(type, q, limit, page + 1); + //return response.results.concat(more); //} return response.results; } @@ -29,16 +30,12 @@ async function updateGranulesAndPdrs(esClient, url, error) { // find related granule and update their status let searchTerm = `execution:"${url}"`; const granules = await findStaleRecords('granule', searchTerm, 100); - await Promise.all(granules.map(g => partialRecordUpdate( - esClient, g.granuleId, 'granule', { status: 'failed', error }, g.collectionId - ))); + await Promise.all(granules.map((g) => partialRecordUpdate(esClient, g.granuleId, 'granule', { status: 'failed', error }, g.collectionId))); // find related pdrs and update their status searchTerm = `execution:"${url}"`; const pdrs = await findStaleRecords('pdr', searchTerm, 100); - await Promise.all(pdrs.map(p => partialRecordUpdate( - esClient, p.pdrName, 'pdr', { status: 'failed', error } - ))); + await Promise.all(pdrs.map((p) => partialRecordUpdate(esClient, p.pdrName, 'pdr', { status: 'failed', error }))); } async function checkExecution(arn, url, timestamp, esClient) { @@ -133,17 +130,11 @@ async function cleanup() { const limit = pLimit(2); - await Promise.all( - executions.slice(0, 400).map( - ex => limit( - () => checkExecution(ex.arn, ex.execution, ex.timestamp, esClient) - ) - ) - ); + await Promise.all(executions.slice(0, 400).map((ex) => limit(() => checkExecution(ex.arn, ex.execution, ex.timestamp, esClient)))); } function handler(event, context, cb) { - cleanup().then(() => cb()).catch(e => { + cleanup().then(() => cb()).catch((e) => { log.error(e); cb(e); }); diff --git a/packages/api/lambdas/kinesis-consumer.js b/packages/api/lambdas/kinesis-consumer.js index c00da611b4f..acb7a4ba238 100644 --- a/packages/api/lambdas/kinesis-consumer.js +++ b/packages/api/lambdas/kinesis-consumer.js @@ -1,10 +1,13 @@ /* eslint-disable require-yield */ + 'use strict'; + const Ajv = require('ajv'); +const log = require('@cumulus/common/log'); const Rule = require('../models/rules'); const messageSchema = require('./kinesis-consumer-event-schema.json'); -const { queueWorkflowMessage } = require('@cumulus/ingest/queue'); +const sfSchedule = require('./sf-scheduler'); /** * `getKinesisRules` scans and returns DynamoDB rules table for enabled, @@ -14,7 +17,7 @@ const { queueWorkflowMessage } = require('@cumulus/ingest/queue'); * @returns {Array} List of zero or more rules found from table scan */ async function getKinesisRules(event) { - const collection = event.collection; + const { collection } = event; const model = new Rule(); const kinesisRules = await model.scan({ names: { @@ -51,8 +54,11 @@ async function queueMessageForRule(kinesisRule, eventObject) { payload: eventObject }; - return Rule.buildPayload(item) - .then(queueWorkflowMessage); + const payload = await Rule.buildPayload(item); + return new Promise((resolve, reject) => sfSchedule(payload, {}, (err, result) => { + if (err) reject(err); + resolve(result); + })); } /** @@ -63,10 +69,10 @@ async function queueMessageForRule(kinesisRule, eventObject) { * @returns {(error|Object)} Throws an Ajv.ValidationError if event object is invalid. * Returns the event object if event is valid. */ -async function validateMessage(event) { +function validateMessage(event) { const ajv = new Ajv({ allErrors: true }); const validate = ajv.compile(messageSchema); - return await validate(event); + return validate(event); } /** @@ -86,7 +92,12 @@ function processRecord(record) { .then(getKinesisRules) .then((kinesisRules) => ( Promise.all(kinesisRules.map((kinesisRule) => queueMessageForRule(kinesisRule, eventObject))) - )); + )) + .catch((err) => { + log.error('Caught error in process record:'); + log.error(err); + return err; + }); } /** diff --git a/packages/api/lambdas/sf-scheduler.js b/packages/api/lambdas/sf-scheduler.js index 9b6b9257e41..a42615cf242 100644 --- a/packages/api/lambdas/sf-scheduler.js +++ b/packages/api/lambdas/sf-scheduler.js @@ -10,9 +10,10 @@ const { Provider, Collection } = require('../models'); * Builds a cumulus-compatible message and adds it to the startSF queue * startSF queue will then start a stepfunction for the given message * - * @param {object} event lambda input message - * @param {object} context lambda context - * @param {function} cb lambda callback + * @param {Object} event - lambda input message + * @param {Object} context - lambda context + * @param {function} cb - lambda callback + * @returns {function} Calls callback with result of SQS.sendMessage or error */ function schedule(event, context, cb) { const template = get(event, 'template'); @@ -53,9 +54,11 @@ function schedule(event, context, cb) { .then((c) => { if (c) message.meta.collection = c; }) - .then(() => SQS.sendMessage(message.meta.queues.startSF, message)) + .then(() => { + SQS.sendMessage(message.meta.queues.startSF, message); + }) .then((r) => cb(null, r)) - .catch(e => cb(e)); + .catch((e) => cb(e)); } module.exports = schedule; diff --git a/packages/api/tests/test-kinesis-consumer.js b/packages/api/tests/test-kinesis-consumer.js index 4b8579b78b6..feac904b977 100644 --- a/packages/api/tests/test-kinesis-consumer.js +++ b/packages/api/tests/test-kinesis-consumer.js @@ -1,14 +1,18 @@ 'use strict'; -const test = require('ava'); -const sinon = require('sinon'); const get = require('lodash.get'); -const { createQueue, sqs, s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); -const { randomString } = require('@cumulus/common/test-utils'); +const sinon = require('sinon'); +const test = require('ava'); +const { randomString } = require('@cumulus/common/test-utils'); +const { SQS } = require('@cumulus/ingest/aws'); +const { s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); const { getKinesisRules, handler } = require('../lambdas/kinesis-consumer'); + const manager = require('../models/base'); +const Collection = require('../models/collections'); const Rule = require('../models/rules'); +const Provider = require('../models/providers'); const testCollectionName = 'test-collection'; const ruleTableParams = { @@ -23,17 +27,20 @@ const eventData = JSON.stringify({ const event = { Records: [ - { kinesis: { data: new Buffer(eventData).toString('base64') } }, - { kinesis: { data: new Buffer(eventData).toString('base64') } } + { kinesis: { data: Buffer.from(eventData).toString('base64') } }, + { kinesis: { data: Buffer.from(eventData).toString('base64') } } ] }; +const collection = { + name: testCollectionName, + version: '0.0.0' +}; +const provider = { id: 'PROV1' }; + const commonRuleParams = { - collection: { - name: testCollectionName, - version: '0.0.0' - }, - provider: 'PROV1', + collection, + provider: provider.id, rule: { type: 'kinesis', value: 'test-kinesisarn' @@ -69,36 +76,39 @@ function testCallback(err, object) { return object; } +let sfSchedulerSpy; +const stubQueueUrl = 'stubQueueUrl'; + test.beforeEach(async (t) => { + sfSchedulerSpy = sinon.stub(SQS, 'sendMessage').returns(true); t.context.templateBucket = randomString(); - await s3().createBucket({ Bucket: t.context.templateBucket }).promise(); - t.context.stateMachineArn = randomString(); + const messageTemplateKey = `${randomString()}/template.json`; - t.context.queueUrl = await createQueue(); - + t.context.messageTemplateKey = messageTemplateKey; t.context.messageTemplate = { cumulus_meta: { state_machine: t.context.stateMachineArn }, - meta: { queues: { startSF: t.context.queueUrl } } + meta: { queues: { startSF: stubQueueUrl } } }; - const messageTemplateKey = `${randomString()}/template.json`; + + await s3().createBucket({ Bucket: t.context.templateBucket }).promise(); await s3().putObject({ Bucket: t.context.templateBucket, Key: messageTemplateKey, Body: JSON.stringify(t.context.messageTemplate) }).promise(); - sinon.stub(Rule, 'buildPayload').callsFake((item) => - Promise.resolve({ - template: `s3://${t.context.templateBucket}/${messageTemplateKey}`, - provider: item.provider, - collection: item.collection, - meta: get(item, 'meta', {}), - payload: get(item, 'payload', {}) - }) - ); + sinon.stub(Rule, 'buildPayload').callsFake((item) => Promise.resolve({ + template: `s3://${t.context.templateBucket}/${messageTemplateKey}`, + provider: item.provider, + collection: item.collection, + meta: get(item, 'meta', {}), + payload: get(item, 'payload', {}) + })); + sinon.stub(Provider.prototype, 'get').returns(provider); + sinon.stub(Collection.prototype, 'get').returns(collection); t.context.tableName = randomString(); process.env.RulesTable = t.context.tableName; @@ -115,16 +125,18 @@ test.beforeEach(async (t) => { test.afterEach(async (t) => { await Promise.all([ recursivelyDeleteS3Bucket(t.context.templateBucket), - sqs().deleteQueue({ QueueUrl: t.context.queueUrl }).promise(), manager.deleteTable(t.context.tableName) ]); + sfSchedulerSpy.restore(); Rule.buildPayload.restore(); + Provider.prototype.get.restore(); + Collection.prototype.get.restore(); }); // getKinesisRule tests // eslint-disable-next-line max-len -test('it should look up kinesis-type rules which are associated with the collection, but not those that are disabled', (t) => { - return getKinesisRules(JSON.parse(eventData)) +test('it should look up kinesis-type rules which are associated with the collection, but not those that are disabled', async (t) => { + await getKinesisRules(JSON.parse(eventData)) .then((result) => { t.is(result.length, 2); }); @@ -133,49 +145,53 @@ test('it should look up kinesis-type rules which are associated with the collect // handler tests test('it should enqueue a message for each associated workflow', async (t) => { await handler(event, {}, testCallback); - await sqs().receiveMessage({ - QueueUrl: t.context.queueUrl, - MaxNumberOfMessages: 10, - WaitTimeSeconds: 1 - }).promise() - .then((receiveMessageResponse) => { - t.is(receiveMessageResponse.Messages.length, 4); - receiveMessageResponse.Messages.map((message) => ( - t.is(JSON.stringify(JSON.parse(message.Body).payload), JSON.stringify({ collection: 'test-collection' })) - )); - }); + const actualQueueUrl = sfSchedulerSpy.getCall(0).args[0]; + t.is(actualQueueUrl, stubQueueUrl); + const actualMessage = sfSchedulerSpy.getCall(0).args[1]; + const expectedMessage = { + cumulus_meta: { + state_machine: t.context.stateMachineArn + }, + meta: { + queues: { startSF: stubQueueUrl }, + provider, + collection + }, + payload: { + collection: 'test-collection' + } + }; + t.is(actualMessage.cumulus_meta.state_machine, expectedMessage.cumulus_meta.state_machine); + t.deepEqual(actualMessage.meta, expectedMessage.meta); + t.deepEqual(actualMessage.payload, expectedMessage.payload); }); -test('it should throw an error if message does not include a collection', (t) => { +test('it should throw an error if message does not include a collection', async (t) => { const invalidMessage = JSON.stringify({}); const kinesisEvent = { - Records: [{ kinesis: { data: new Buffer(invalidMessage).toString('base64') } }] + Records: [{ kinesis: { data: Buffer.from(invalidMessage).toString('base64') } }] }; - return handler(kinesisEvent, {}, testCallback) - .catch((err) => { - const errObject = JSON.parse(err); - t.is(errObject.errors[0].dataPath, ''); - t.is(errObject.errors[0].message, 'should have required property \'collection\''); - }); + const errors = await handler(kinesisEvent, {}, testCallback); + t.is(errors[0].message, 'validation failed'); + t.is(errors[0].errors[0].dataPath, ''); + t.is(errors[0].errors[0].message, 'should have required property \'collection\''); }); -test('it should throw an error if message collection has wrong data type', (t) => { +test('it should throw an error if message collection has wrong data type', async (t) => { const invalidMessage = JSON.stringify({ collection: {} }); const kinesisEvent = { - Records: [{ kinesis: { data: new Buffer(invalidMessage).toString('base64') } }] + Records: [{ kinesis: { data: Buffer.from(invalidMessage).toString('base64') } }] }; - return handler(kinesisEvent, {}, testCallback) - .catch((err) => { - const errObject = JSON.parse(err); - t.is(errObject.errors[0].dataPath, '.collection'); - t.is(errObject.errors[0].message, 'should be string'); - }); + const errors = await handler(kinesisEvent, {}, testCallback); + t.is(errors[0].message, 'validation failed'); + t.is(errors[0].errors[0].dataPath, '.collection'); + t.is(errors[0].errors[0].message, 'should be string'); }); test('it should not throw if message is valid', (t) => { const validMessage = JSON.stringify({ collection: 'confection-collection' }); const kinesisEvent = { - Records: [{ kinesis: { data: new Buffer(validMessage).toString('base64') } }] + Records: [{ kinesis: { data: Buffer.from(validMessage).toString('base64') } }] }; return handler(kinesisEvent, {}, testCallback).then((r) => t.deepEqual(r, [[]])); }); diff --git a/packages/ingest/README.md b/packages/ingest/README.md index 85e685b0f8a..a1ba7a25751 100644 --- a/packages/ingest/README.md +++ b/packages/ingest/README.md @@ -16,6 +16,16 @@ Cumulus is a cloud-based data ingest, archive, distribution and management proto npm install @cumulus/ingest ``` +## Testing + +Running tests locally requires [localstack](https://github.com/localstack/localstack). + +With localstack running, you can run tests using: + +``` +LOCALSTACK_HOST=localhost npm test +``` + ## Modules All modules are accessible using require: `require('@cumulus/ingest/')` or import: `import from '@cumulus/ingest/'`. diff --git a/packages/ingest/aws.js b/packages/ingest/aws.js index e24c95297a9..a39f6c67e3e 100644 --- a/packages/ingest/aws.js +++ b/packages/ingest/aws.js @@ -214,14 +214,12 @@ class S3 { } static async get(bucket, key) { - const s3 = new AWS.S3(); - const params = { Bucket: bucket, Key: key }; - return s3.getObject(params).promise(); + return aws.s3().getObject(params).promise(); } static async upload(bucket, key, body, acl = 'private') { diff --git a/packages/ingest/queue.js b/packages/ingest/queue.js index 702f2789d48..7e5790a1823 100644 --- a/packages/ingest/queue.js +++ b/packages/ingest/queue.js @@ -5,8 +5,6 @@ const { sendSQSMessage, parseS3Uri } = require('@cumulus/common/aws'); -const get = require('lodash.get'); -const uuidv4 = require('uuid/v4'); /** * Create a message from a template stored on S3 @@ -37,7 +35,8 @@ async function enqueueParsePdrMessage( queueUrl, parsePdrMessageTemplateUri, provider, - collection) { + collection +) { const message = await getMessageFromTemplate(parsePdrMessageTemplateUri); message.meta.provider = provider; @@ -87,27 +86,3 @@ async function enqueueGranuleIngestMessage( return sendSQSMessage(queueUrl, message); } exports.enqueueGranuleIngestMessage = enqueueGranuleIngestMessage; - -/** - * Queue a workflow to be picked up by SF starter - * - * @param {Object} event - event to queue with workflow and payload info - * @returns {Promise} - resolves when the message has been enqueued - */ -async function queueWorkflowMessage(event) { - const template = get(event, 'template'); - const provider = get(event, 'provider', {}); - const collection = get(event, 'collection', {}); - const payload = get(event, 'payload', {}); - - const message = await getMessageFromTemplate(template); - - message.meta.provider = provider; - message.meta.collection = collection; - - message.payload = payload; - message.cumulus_meta.execution_name = uuidv4(); - - return sendSQSMessage(message.meta.queues.startSF, message); -} -exports.queueWorkflowMessage = queueWorkflowMessage; diff --git a/packages/ingest/test/queue.js b/packages/ingest/test/queue.js index 4ad64c9ea89..0d1db238e6c 100644 --- a/packages/ingest/test/queue.js +++ b/packages/ingest/test/queue.js @@ -5,7 +5,7 @@ const queue = require('../queue'); const { createQueue, sqs, s3, recursivelyDeleteS3Bucket } = require('@cumulus/common/aws'); const { randomString } = require('@cumulus/common/test-utils'); -test.beforeEach(async (t) => { +test.beforeEach(async(t) => { t.context.templateBucket = randomString(); await s3().createBucket({ Bucket: t.context.templateBucket }).promise(); @@ -21,6 +21,7 @@ test.beforeEach(async (t) => { }; const messageTemplateKey = `${randomString()}/template.json`; + t.context.messageTemplateKey = messageTemplateKey; await s3().putObject({ Bucket: t.context.templateBucket, Key: messageTemplateKey, @@ -30,34 +31,42 @@ test.beforeEach(async (t) => { t.context.template = `s3://${t.context.templateBucket}/${messageTemplateKey}`; }); -test.afterEach(async (t) => { +test.afterEach(async(t) => { await Promise.all([ recursivelyDeleteS3Bucket(t.context.templateBucket), sqs().deleteQueue({ QueueUrl: t.context.queueUrl }).promise() ]); }); -test('the queue receives a correctly formatted workflow message', async (t) => { - const event = { - template: t.context.template, - provider: 'PROV1', - collection: { name: 'test-collection' }, - payload: { test: 'test payload' } - }; +test('the queue receives a correctly formatted workflow message', async(t) => { + const granule = { granuleId: '1', files: [] }; + const { queueUrl } = t.context; + const templateUri = `s3://${t.context.templateBucket}/${t.context.messageTemplateKey}`; + const collection = { name: 'test-collection', version: '0.0.0' }; + const provider = { id: 'test-provider' }; - await queue.queueWorkflowMessage(event); + await queue.enqueueGranuleIngestMessage(granule, queueUrl, templateUri, provider, collection); await sqs().receiveMessage({ QueueUrl: t.context.queueUrl, MaxNumberOfMessages: 10, WaitTimeSeconds: 1 }).promise() - .then((receiveMessageResponse) => { - t.is(receiveMessageResponse.Messages.length, 1); - - const message = JSON.parse(receiveMessageResponse.Messages[0].Body); - t.is(message.meta.provider, 'PROV1'); - t.is(JSON.stringify(message.meta.collection), JSON.stringify({ name: 'test-collection' })); - t.is(JSON.stringify(message.payload), JSON.stringify({ test: 'test payload' })); - t.is(message.cumulus_meta.state_machine, t.context.stateMachineArn); - }); + .then((receiveMessageResponse) => { + t.is(receiveMessageResponse.Messages.length, 1); + + const actualMessage = JSON.parse(receiveMessageResponse.Messages[0].Body); + const expectedMessage = { + cumulus_meta: { + state_machine: t.context.stateMachineArn + }, + meta: { + queues: { startSF: t.context.queueUrl }, + provider: provider, + collection: collection + }, + payload: { granules: [granule] } + }; + + t.deepEqual(expectedMessage, actualMessage); + }); }); From acb7ede84aef3fe5a6fddd77a972a06029c165eb Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Mon, 19 Mar 2018 16:59:01 -0400 Subject: [PATCH 42/94] Ratcheting down eslint score --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index af86ff11eb9..15475a3d5fc 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -3834 +1667 From 5d9ad5d617cfa4aabc97312eae3fb26b9095522f Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Mon, 19 Mar 2018 17:03:25 -0400 Subject: [PATCH 43/94] Fix missed merge resolution --- packages/api/lambdas/jobs.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/api/lambdas/jobs.js b/packages/api/lambdas/jobs.js index f9b0b05d70a..7c38385772a 100644 --- a/packages/api/lambdas/jobs.js +++ b/packages/api/lambdas/jobs.js @@ -130,17 +130,7 @@ async function cleanup() { const limit = pLimit(2); -<<<<<<< HEAD - await Promise.all( - executions.slice(0, 400).map( - (ex) => limit( - () => checkExecution(ex.arn, ex.execution, ex.timestamp, esClient) - ) - ) - ); -======= await Promise.all(executions.slice(0, 400).map((ex) => limit(() => checkExecution(ex.arn, ex.execution, ex.timestamp, esClient)))); ->>>>>>> master } function handler(event, context, cb) { From f34e2fde7f4e69ec695ed9cb233d7f5b27479c6f Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Mon, 19 Mar 2018 17:04:04 -0400 Subject: [PATCH 44/94] Fix missed merge resolution --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 15475a3d5fc..c7410a5b0a0 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1667 +1675 From db6214cb383929716e956c48b5e1b94002b8d5d1 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Tue, 20 Mar 2018 16:05:03 -0400 Subject: [PATCH 45/94] Merge release 1.2.0 to master (#270) Closes #270 --- .eslint-ratchet-high-water-mark | 2 +- CHANGELOG.md | 17 +++++++++++------ cumulus/services/sfn-scheduler/package.json | 4 ++-- cumulus/services/sfn-throttler/package.json | 2 +- .../tasks/copy-idx-from-s3-to-efs/package.json | 6 +++--- .../delete-ingest-tracking-data/package.json | 4 ++-- cumulus/tasks/delete-pdr-ftp/package.json | 4 ++-- cumulus/tasks/delete-pdr-s3/package.json | 4 ++-- .../tasks/discover-cmr-granules/package.json | 4 ++-- cumulus/tasks/discover-granules/package.json | 8 ++++---- cumulus/tasks/discover-http-tiles/package.json | 4 ++-- cumulus/tasks/discover-pdr/package.json | 6 +++--- cumulus/tasks/discover-pdrs/package.json | 8 ++++---- cumulus/tasks/discover-s3-granules/package.json | 8 ++++---- .../tasks/download-activity-mock/package.json | 4 ++-- cumulus/tasks/filter-payload/package.json | 4 ++-- cumulus/tasks/generate-mrf/package.json | 4 ++-- cumulus/tasks/generate-pan/package.json | 4 ++-- .../tasks/generate-pdr-file-list/package.json | 8 ++++---- cumulus/tasks/generate-pdrd/package.json | 4 ++-- cumulus/tasks/hello-world/package.json | 2 +- cumulus/tasks/parse-pdr/package.json | 8 ++++---- cumulus/tasks/pdr-status-check/package.json | 8 ++++---- cumulus/tasks/post-to-cmr/package.json | 10 +++++----- cumulus/tasks/queue-granules/package.json | 6 +++--- cumulus/tasks/queue-pdrs/package.json | 6 +++--- cumulus/tasks/run-gdal/package.json | 4 ++-- cumulus/tasks/sf-sns-report/package.json | 6 +++--- cumulus/tasks/sync-granule/package.json | 8 ++++---- cumulus/tasks/sync-http-urls/package.json | 4 ++-- cumulus/tasks/sync-wms/package.json | 4 ++-- cumulus/tasks/tee/package.json | 4 ++-- cumulus/tasks/trigger-ingest/package.json | 4 ++-- cumulus/tasks/trigger-mrf-gen/package.json | 4 ++-- cumulus/tasks/trigger-process-pdrs/package.json | 4 ++-- cumulus/tasks/validate-archives/package.json | 4 ++-- cumulus/tasks/validate-pdr/package.json | 8 ++++---- lerna.json | 2 +- packages/api/package.json | 10 +++++----- packages/cmrjs/package.json | 4 ++-- packages/common/package.json | 4 ++-- packages/ingest/aws.js | 2 +- packages/ingest/package.json | 8 ++++---- packages/integration-tests/package.json | 4 ++-- packages/pvl/package.json | 2 +- packages/task-debug/package.json | 4 ++-- packages/test-data/package.json | 2 +- 47 files changed, 125 insertions(+), 120 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 239cbd5e348..340b3519a5d 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1577 +1576 diff --git a/CHANGELOG.md b/CHANGELOG.md index fbe7f4970b9..070a1566bdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,16 +6,25 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [v1.2.0] - 2018-03-20 + ### Fixed - Update vulnerable npm packages [CUMULUS-425] - `@cumulus/api`: `kinesis-consumer.js` uses `sf-scheduler.js#schedule` instead of placing a message directly on the `startSF` SQS queue. This is a fix for [CUMULUS-359](https://bugs.earthdata.nasa.gov/browse/CUMULUS-359) because `sf-scheduler.js#schedule` looks up the provider and collection data in DynamoDB and adds it to the `meta` object of the enqueued message payload. - `@cumulus/api`: `kinesis-consumer.js` catches and logs errors instead of doing an error callback. Before this change, `kinesis-consumer` was failing to process new records when an existing record caused an error because it would call back with an error and stop processing additional records. It keeps trying to process the record causing the error because it's "position" in the stream is unchanged. Catching and logging the errors is part 1 of the fix. Proposed part 2 is to enqueue the error and the message on a "dead-letter" queue so it can be processed later ([CUMULUS-413](https://bugs.earthdata.nasa.gov/browse/CUMULUS-413)). +- **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. + - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. + - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. + - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. +- Fixed `aws.cloudwatchevents()` typo in `packages/ingest/aws.js`. This typo was the root cause of the error: `Error: Could not process scheduled_ingest, Error: : aws.cloudwatchevents is not a constructor` seen when trying to update a rule. + ### Removed - `@cumulus/ingest/aws`: Remove queueWorkflowMessage which is no longer being used by `@cumulus/api`'s `kinesis-consumer.js`. ## [v1.1.4] - 2018-03-15 + ### Added - added flag `useList` to parse-pdr [CUMULUS-404] @@ -41,11 +50,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `@cumulus/deployment` deploys DynamoDB streams for the Collections, Providers and Rules tables as well as a new lambda function called `dbIndexer`. The `dbIndexer` lambda has an event source mapping which listens to each of the DynamoDB streams. The dbIndexer lambda receives events referencing operations on the DynamoDB table and updates the elasticsearch cluster accordingly. - The `@cumulus/api` endpoints for collections, providers and rules _only_ query DynamoDB, with the exception of LIST endpoints and the collections' GET endpoint. -- **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. - - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. - - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. - ### Updated - Broke up `kes.override.js` of @cumulus/deployment to multiple modules and moved to a new location - Expanded @cumulus/deployment test coverage @@ -95,7 +99,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.1.4...HEAD +[Unreleased]: https://github.com/cumulus-nasa/cumulus/compare/v1.2.0...HEAD +[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 [v1.1.2]: https://github.com/cumulus-nasa/cumulus/compare/v1.1.1...v1.1.2 diff --git a/cumulus/services/sfn-scheduler/package.json b/cumulus/services/sfn-scheduler/package.json index 1d0e5376aea..82007cc4fff 100644 --- a/cumulus/services/sfn-scheduler/package.json +++ b/cumulus/services/sfn-scheduler/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/sfn-scheduler", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Runs ingest timers as configured in /config/products.json", "main": "index.js", "keywords": [ @@ -17,7 +17,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "lodash": "^4.17.4", "uuid": "^3.0.1" } diff --git a/cumulus/services/sfn-throttler/package.json b/cumulus/services/sfn-throttler/package.json index d812879937d..39e591fbeb2 100644 --- a/cumulus/services/sfn-throttler/package.json +++ b/cumulus/services/sfn-throttler/package.json @@ -1,6 +1,6 @@ { "name": "aws-step-function-throttling-service", - "version": "1.0.0", + "version": "1.2.0", "private": true, "description": "A service to throttle concurrent executions of AWS Step Functions.", "main": "index.js", diff --git a/cumulus/tasks/copy-idx-from-s3-to-efs/package.json b/cumulus/tasks/copy-idx-from-s3-to-efs/package.json index 54d012e358f..b092c5064bc 100644 --- a/cumulus/tasks/copy-idx-from-s3-to-efs/package.json +++ b/cumulus/tasks/copy-idx-from-s3-to-efs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/copy-idx-from-s3-to-efs", - "version": "1.1.3", + "version": "1.2.0", "description": "Task to copy idx file from S3 to EFS for OnEarth 2.0.", "main": "index.js", "private": true, @@ -35,8 +35,8 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", - "@cumulus/test-data": "^1.1.3" + "@cumulus/common": "^1.2.0", + "@cumulus/test-data": "^1.2.0" }, "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", diff --git a/cumulus/tasks/delete-ingest-tracking-data/package.json b/cumulus/tasks/delete-ingest-tracking-data/package.json index 36747bcd6dc..dd40e83a066 100644 --- a/cumulus/tasks/delete-ingest-tracking-data/package.json +++ b/cumulus/tasks/delete-ingest-tracking-data/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/delete-ingest-tracking-data", - "version": "1.1.3", + "version": "1.2.0", "description": "Task to delete ingest tracking data when ingest has completed.", "main": "index.js", "private": true, @@ -36,7 +36,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3" + "@cumulus/common": "^1.2.0" }, "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", diff --git a/cumulus/tasks/delete-pdr-ftp/package.json b/cumulus/tasks/delete-pdr-ftp/package.json index 16c6cb6e1cb..17f6e016b78 100644 --- a/cumulus/tasks/delete-pdr-ftp/package.json +++ b/cumulus/tasks/delete-pdr-ftp/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/delete-pdr-ftp", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "SIPS handler PDR discovery task", "main": "index.js", "keywords": [ @@ -35,7 +35,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/delete-pdr-s3/package.json b/cumulus/tasks/delete-pdr-s3/package.json index 61bb8ea8a1f..efb80178d89 100644 --- a/cumulus/tasks/delete-pdr-s3/package.json +++ b/cumulus/tasks/delete-pdr-s3/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/delete-pdr-s3", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "SIPS handler PDR discovery task", "main": "index.js", "keywords": [ @@ -39,7 +39,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/discover-cmr-granules/package.json b/cumulus/tasks/discover-cmr-granules/package.json index 27610984037..0f12ac9fa41 100644 --- a/cumulus/tasks/discover-cmr-granules/package.json +++ b/cumulus/tasks/discover-cmr-granules/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/discover-cmr-granules", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Discovers granules from the CMR", "main": "index.js", "keywords": [ @@ -19,7 +19,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "moment": "^2.21.0", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1" diff --git a/cumulus/tasks/discover-granules/package.json b/cumulus/tasks/discover-granules/package.json index 7eb2b993e3a..b9583a1a641 100644 --- a/cumulus/tasks/discover-granules/package.json +++ b/cumulus/tasks/discover-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-granules", - "version": "1.1.4", + "version": "1.2.0", "description": "Discover Granules in FTP/HTTP/SFTP endpoints", "main": "index.js", "directories": { @@ -37,10 +37,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-http-tiles/package.json b/cumulus/tasks/discover-http-tiles/package.json index 4b61b9b1f67..6131538c0e7 100644 --- a/cumulus/tasks/discover-http-tiles/package.json +++ b/cumulus/tasks/discover-http-tiles/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/discover-http-tiles", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Crawls an HTTP endpoint to discover tiled imagery", "main": "index.js", "keywords": [ @@ -14,7 +14,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "async": "^2.0.0", "lodash": "^4.15.0", "simplecrawler": "git+https://github.com/cgiffard/node-simplecrawler.git#193e506c39164ddf045c7c6c502e1a015d85a290" diff --git a/cumulus/tasks/discover-pdr/package.json b/cumulus/tasks/discover-pdr/package.json index 33a955975d2..9c0df38fd5f 100644 --- a/cumulus/tasks/discover-pdr/package.json +++ b/cumulus/tasks/discover-pdr/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/discover-pdr", "private": true, - "version": "1.1.4", + "version": "1.2.0", "description": "SIPS handler PDR discovery task", "main": "index.js", "keywords": [ @@ -36,8 +36,8 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", - "@cumulus/ingest": "^1.1.4", + "@cumulus/common": "^1.2.0", + "@cumulus/ingest": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/discover-pdrs/package.json b/cumulus/tasks/discover-pdrs/package.json index fc1f4ec249b..2a5f41da51a 100644 --- a/cumulus/tasks/discover-pdrs/package.json +++ b/cumulus/tasks/discover-pdrs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-pdrs", - "version": "1.1.4", + "version": "1.2.0", "description": "Discover PDRs in FTP and HTTP endpoints", "main": "index.js", "directories": { @@ -36,10 +36,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/discover-s3-granules/package.json b/cumulus/tasks/discover-s3-granules/package.json index bdfebf69969..1061fe29fc5 100644 --- a/cumulus/tasks/discover-s3-granules/package.json +++ b/cumulus/tasks/discover-s3-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-s3-granules", - "version": "1.1.4", + "version": "1.2.0", "description": "Discover granules from an S3 bucket", "main": "index.js", "directories": { @@ -37,10 +37,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/download-activity-mock/package.json b/cumulus/tasks/download-activity-mock/package.json index 1daa0d9cd38..d4bca34200a 100644 --- a/cumulus/tasks/download-activity-mock/package.json +++ b/cumulus/tasks/download-activity-mock/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/dowload-activity-mock", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Mock for provider gateway", "main": "index.js", "keywords": [ @@ -35,7 +35,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/filter-payload/package.json b/cumulus/tasks/filter-payload/package.json index f83aa6b342a..36ebf075d8b 100644 --- a/cumulus/tasks/filter-payload/package.json +++ b/cumulus/tasks/filter-payload/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/filter-payload", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Task to filter the payload from one task to the next", "main": "index.js", "keywords": [ @@ -35,7 +35,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3" + "@cumulus/common": "^1.2.0" }, "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", diff --git a/cumulus/tasks/generate-mrf/package.json b/cumulus/tasks/generate-mrf/package.json index 3e0e1d53b86..c22d1756145 100644 --- a/cumulus/tasks/generate-mrf/package.json +++ b/cumulus/tasks/generate-mrf/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/generate-mrf", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Generates MRFs for ingested tiles", "main": "index.js", "keywords": [ @@ -14,7 +14,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "async": "^2.0.0", "lodash": "^4.13.1", "mustache": "^2.2.1", diff --git a/cumulus/tasks/generate-pan/package.json b/cumulus/tasks/generate-pan/package.json index 51403be61a9..4a6946725ff 100644 --- a/cumulus/tasks/generate-pan/package.json +++ b/cumulus/tasks/generate-pan/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/generate-pan", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "SIPS handler PAN generation/upload task", "main": "index.js", "keywords": [ @@ -35,7 +35,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/generate-pdr-file-list/package.json b/cumulus/tasks/generate-pdr-file-list/package.json index 6ed111d9894..d4b93a0dd2f 100644 --- a/cumulus/tasks/generate-pdr-file-list/package.json +++ b/cumulus/tasks/generate-pdr-file-list/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/generate-pdr-file-list", "private": true, - "version": "1.1.4", + "version": "1.2.0", "description": "SIPS handler PDR processing task", "main": "index.js", "keywords": [ @@ -35,9 +35,9 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", - "@cumulus/ingest": "^1.1.4", - "@cumulus/pvl": "^1.0.0", + "@cumulus/common": "^1.2.0", + "@cumulus/ingest": "^1.2.0", + "@cumulus/pvl": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/generate-pdrd/package.json b/cumulus/tasks/generate-pdrd/package.json index 2912293fe23..5d18bfbc904 100644 --- a/cumulus/tasks/generate-pdrd/package.json +++ b/cumulus/tasks/generate-pdrd/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/generate-pdrd", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "SIPS handler generating a PDRD when PDR validation fails", "main": "index.js", "keywords": [ @@ -35,7 +35,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/hello-world/package.json b/cumulus/tasks/hello-world/package.json index 37ffef69393..5c5efc30f58 100644 --- a/cumulus/tasks/hello-world/package.json +++ b/cumulus/tasks/hello-world/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/hello-world", - "version": "1.1.3", + "version": "1.2.0", "description": "Example task", "main": "index.js", "directories": { diff --git a/cumulus/tasks/parse-pdr/package.json b/cumulus/tasks/parse-pdr/package.json index 8e08ae77658..b9a282125b2 100644 --- a/cumulus/tasks/parse-pdr/package.json +++ b/cumulus/tasks/parse-pdr/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/parse-pdr", - "version": "1.1.4", + "version": "1.2.0", "description": "Download and Parse a given PDR", "main": "index.js", "directories": { @@ -39,10 +39,10 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.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/pdr-status-check/package.json b/cumulus/tasks/pdr-status-check/package.json index 1fa1f1b1560..bace424943f 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/cumulus/tasks/pdr-status-check/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/pdr-status-check", - "version": "1.1.4", + "version": "1.2.0", "description": "Checks execution status of granules in a PDR", "main": "index.js", "directories": { @@ -40,10 +40,10 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.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/package.json b/cumulus/tasks/post-to-cmr/package.json index d8a9ce95f3f..311975ed78c 100644 --- a/cumulus/tasks/post-to-cmr/package.json +++ b/cumulus/tasks/post-to-cmr/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/post-to-cmr", - "version": "1.1.4", + "version": "1.2.0", "description": "Post a given granule to CMR", "main": "index.js", "directories": { @@ -41,11 +41,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/cmrjs": "^1.1.3", - "@cumulus/common": "^1.1.3", + "@cumulus/cmrjs": "^1.2.0", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.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/package.json b/cumulus/tasks/queue-granules/package.json index b2bc84b35f9..a25280af232 100644 --- a/cumulus/tasks/queue-granules/package.json +++ b/cumulus/tasks/queue-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-granules", - "version": "1.1.4", + "version": "1.2.0", "description": "Add discovered granules to the queue", "main": "index.js", "directories": { @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", + "@cumulus/ingest": "^1.2.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/package.json b/cumulus/tasks/queue-pdrs/package.json index 6fba492d8bb..8a942046557 100644 --- a/cumulus/tasks/queue-pdrs/package.json +++ b/cumulus/tasks/queue-pdrs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-pdrs", - "version": "1.1.4", + "version": "1.2.0", "description": "Add discovered PDRs to a queue", "main": "index.js", "directories": { @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", + "@cumulus/ingest": "^1.2.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/run-gdal/package.json b/cumulus/tasks/run-gdal/package.json index f6571ec12d3..f3d2f82f74d 100644 --- a/cumulus/tasks/run-gdal/package.json +++ b/cumulus/tasks/run-gdal/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@cumulus/run-gdal", - "version": "1.1.3", + "version": "1.2.0", "description": "Runs gdal commands as a task", "main": "index.js", "keywords": [ @@ -28,6 +28,6 @@ "webpack": "^1.12.13" }, "dependencies": { - "@cumulus/common": "^1.1.3" + "@cumulus/common": "^1.2.0" } } diff --git a/cumulus/tasks/sf-sns-report/package.json b/cumulus/tasks/sf-sns-report/package.json index a756fb4aada..a7c6bdb2e09 100644 --- a/cumulus/tasks/sf-sns-report/package.json +++ b/cumulus/tasks/sf-sns-report/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sf-sns-report", - "version": "1.1.1", + "version": "1.2.0", "description": "Broadcasts an incoming Cumulus message to SNS", "main": "index.js", "directories": { @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.0", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.1", + "@cumulus/ingest": "^1.2.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/sync-granule/package.json b/cumulus/tasks/sync-granule/package.json index a4098f57736..aed87eb41c6 100644 --- a/cumulus/tasks/sync-granule/package.json +++ b/cumulus/tasks/sync-granule/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sync-granule", - "version": "1.1.4", + "version": "1.2.0", "description": "Download a given granule", "main": "index.js", "directories": { @@ -41,10 +41,10 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/cumulus-message-adapter-js": "^1.0.1", - "@cumulus/ingest": "^1.1.4", - "@cumulus/test-data": "^1.1.3", + "@cumulus/ingest": "^1.2.0", + "@cumulus/test-data": "^1.2.0", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", "babel-polyfill": "^6.23.0", diff --git a/cumulus/tasks/sync-http-urls/package.json b/cumulus/tasks/sync-http-urls/package.json index 3dcd81bba3d..950f3ed42b1 100644 --- a/cumulus/tasks/sync-http-urls/package.json +++ b/cumulus/tasks/sync-http-urls/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/sync-http-urls", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Synchronizes http links to s3", "main": "index.js", "keywords": [ @@ -14,7 +14,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "async": "^2.0.0", "lodash": "^4.13.1", "request": "^2.83.0" diff --git a/cumulus/tasks/sync-wms/package.json b/cumulus/tasks/sync-wms/package.json index c1bdb47f02c..01290500409 100644 --- a/cumulus/tasks/sync-wms/package.json +++ b/cumulus/tasks/sync-wms/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/sync-wms", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Transforms input granule info to WMS URLs for URL sync", "main": "index.js", "keywords": [ @@ -14,6 +14,6 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3" + "@cumulus/common": "^1.2.0" } } diff --git a/cumulus/tasks/tee/package.json b/cumulus/tasks/tee/package.json index f81306182ed..a394753ad74 100644 --- a/cumulus/tasks/tee/package.json +++ b/cumulus/tasks/tee/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/tee", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Task for testing that splits output", "main": "index.js", "keywords": [ @@ -15,7 +15,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/cumulus/tasks/trigger-ingest/package.json b/cumulus/tasks/trigger-ingest/package.json index 9f1890d599c..2863629e6ea 100644 --- a/cumulus/tasks/trigger-ingest/package.json +++ b/cumulus/tasks/trigger-ingest/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/trigger-ingest", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Transforms input granule info to WMS URLs for URL sync", "main": "index.js", "keywords": [ @@ -14,7 +14,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "lodash": "^4.17.4" } } diff --git a/cumulus/tasks/trigger-mrf-gen/package.json b/cumulus/tasks/trigger-mrf-gen/package.json index a10b1aae751..801e0ac3e3b 100644 --- a/cumulus/tasks/trigger-mrf-gen/package.json +++ b/cumulus/tasks/trigger-mrf-gen/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/trigger-mrf-gen", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Invokes MRFGen for every group of images passed to it", "main": "index.js", "keywords": [ @@ -32,7 +32,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3" + "@cumulus/common": "^1.2.0" }, "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", diff --git a/cumulus/tasks/trigger-process-pdrs/package.json b/cumulus/tasks/trigger-process-pdrs/package.json index 457dcd2d956..745ad55801e 100644 --- a/cumulus/tasks/trigger-process-pdrs/package.json +++ b/cumulus/tasks/trigger-process-pdrs/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/trigger-process-pdrs", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "Transforms input granule info to WMS URLs for URL sync", "main": "index.js", "keywords": [ @@ -34,7 +34,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3" + "@cumulus/common": "^1.2.0" }, "devDependencies": { "@ava/babel-preset-stage-4": "^1.1.0", diff --git a/cumulus/tasks/validate-archives/package.json b/cumulus/tasks/validate-archives/package.json index f538be76f08..8ba6add2368 100644 --- a/cumulus/tasks/validate-archives/package.json +++ b/cumulus/tasks/validate-archives/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/validate-archives", "private": true, - "version": "1.1.3", + "version": "1.2.0", "description": "SIPS handler archive validation task", "main": "index.js", "keywords": [ @@ -35,7 +35,7 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "checksum": "^0.1.1", "ftp": "^0.3.10", "gunzip-maybe": "^1.4.1", diff --git a/cumulus/tasks/validate-pdr/package.json b/cumulus/tasks/validate-pdr/package.json index c50baa2b20b..8429e8e0b72 100644 --- a/cumulus/tasks/validate-pdr/package.json +++ b/cumulus/tasks/validate-pdr/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/validate-pdr", "private": true, - "version": "1.1.4", + "version": "1.2.0", "description": "SIPS handler PDR processing task", "main": "index.js", "keywords": [ @@ -37,9 +37,9 @@ ] }, "dependencies": { - "@cumulus/common": "^1.1.3", - "@cumulus/ingest": "^1.1.4", - "@cumulus/pvl": "^1.0.0", + "@cumulus/common": "^1.2.0", + "@cumulus/ingest": "^1.2.0", + "@cumulus/pvl": "^1.2.0", "ftp": "^0.3.10", "node-fetch": "^1.6.1", "parse-duration": "^0.1.1", diff --git a/lerna.json b/lerna.json index 4022c39ff8c..ea04ef403b4 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "2.9.0", - "version": "1.1.4", + "version": "1.2.0", "packages": [ "packages/*", "cumulus/tasks/*", diff --git a/packages/api/package.json b/packages/api/package.json index 52861029d3e..409cb888c5f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/api", - "version": "1.1.4", + "version": "1.2.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.1.3", - "@cumulus/common": "^1.1.3", - "@cumulus/ingest": "^1.1.4", - "@cumulus/pvl": "^1.0.0", + "@cumulus/cmrjs": "^1.2.0", + "@cumulus/common": "^1.2.0", + "@cumulus/ingest": "^1.2.0", + "@cumulus/pvl": "^1.2.0", "ajv": "^5.2.2", "archiver": "^2.1.1", "aws-sdk": "^2.95.0", diff --git a/packages/cmrjs/package.json b/packages/cmrjs/package.json index 56c0b6ae91c..435cd524b10 100644 --- a/packages/cmrjs/package.json +++ b/packages/cmrjs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cmrjs", - "version": "1.1.3", + "version": "1.2.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.1.3", + "@cumulus/common": "^1.2.0", "got": "^7.1.0", "json-loader": "^0.5.4", "lodash.property": "^4.4.2", diff --git a/packages/common/package.json b/packages/common/package.json index fe6cfbca1d6..2484345ab73 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/common", - "version": "1.1.3", + "version": "1.2.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.1.3", + "@cumulus/test-data": "^1.2.0", "ajv": "^5.0.4-beta.3", "ajv-cli": "^1.1.1", "async": "^2.0.0", diff --git a/packages/ingest/aws.js b/packages/ingest/aws.js index a39f6c67e3e..58cc77beda9 100644 --- a/packages/ingest/aws.js +++ b/packages/ingest/aws.js @@ -99,7 +99,7 @@ function sqs(local) { class Events { static async putEvent(name, schedule, state, description = null, role = null) { - const cwevents = new aws.cloudwatchevents(); + const cwevents = new AWS.CloudWatchEvents(); const params = { Name: name, diff --git a/packages/ingest/package.json b/packages/ingest/package.json index 0b8a37115dd..3f96ad56acd 100644 --- a/packages/ingest/package.json +++ b/packages/ingest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/ingest", - "version": "1.1.4", + "version": "1.2.0", "description": "Ingest utilities", "scripts": { "test": "ava" @@ -38,9 +38,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", - "@cumulus/pvl": "^1.0.0", - "@cumulus/test-data": "^1.1.3", + "@cumulus/common": "^1.2.0", + "@cumulus/pvl": "^1.2.0", + "@cumulus/test-data": "^1.2.0", "aws-sdk": "^2.4.11", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index 354d907a003..96ed89d8f91 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/integration-tests", - "version": "1.1.4", + "version": "1.2.0", "description": "Integration tests", "bin": { "cumulus-test": "./bin/cli.js" @@ -29,7 +29,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "@cumulus/deployment": "^1.1.4", "babel-core": "^6.25.0", "babel-loader": "^6.2.4", diff --git a/packages/pvl/package.json b/packages/pvl/package.json index fe506704e94..73a2bd0c722 100644 --- a/packages/pvl/package.json +++ b/packages/pvl/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/pvl", - "version": "1.0.0", + "version": "1.2.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 c34248bbfaa..981914d126d 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.1.3", + "version": "1.2.0", "description": "A harness for debugging workflows.", "main": "index.js", "repository": { @@ -18,7 +18,7 @@ "test": "test" }, "dependencies": { - "@cumulus/common": "^1.1.3", + "@cumulus/common": "^1.2.0", "commander": "^2.11.0" }, "devDependencies": { diff --git a/packages/test-data/package.json b/packages/test-data/package.json index 026fa3dc80f..40f30b80593 100644 --- a/packages/test-data/package.json +++ b/packages/test-data/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-data", - "version": "1.1.3", + "version": "1.2.0", "description": "Includes the test data for various packages", "keywords": [ "GIBS", From 619a8880cfd8d0f2f8add5d3c6b15b1d3690da63 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Wed, 21 Mar 2018 14:21:19 -0400 Subject: [PATCH 46/94] put rule response body --- packages/api/endpoints/rules.js | 85 +++++++++++++--------- packages/api/tests/test-endpoints-rules.js | 14 ++-- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/packages/api/endpoints/rules.js b/packages/api/endpoints/rules.js index 394f93d4d23..356aa5abc17 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,21 +9,23 @@ 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'); - search.query().then(response => cb(null, response)).catch(cb); + search.query().then((response) => cb(null, response)).catch(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', '{}'); @@ -55,7 +58,7 @@ function post(event, cb) { .catch((e) => { if (e instanceof RecordDoesNotExist) { return model.create(data) - .then(r => cb(null, { message: 'Record saved', record: r })) + .then((r) => cb(null, { message: 'Record saved', record: r })) .catch(cb); } return cb(e); @@ -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', '{}'); @@ -79,13 +84,10 @@ async function put(event) { // if the data includes any fields other than state and rule.value // throw error 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'); - } + 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) return cb({ message: 'Only state and rule.value values can be changed' }); } // get the record first @@ -94,32 +96,49 @@ 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(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 => { + return handle(event, context, !inTestMode() /* authCheck */, (cb) => { if (event.httpMethod === 'GET' && event.pathParameters) { get(event, cb); } @@ -127,10 +146,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/tests/test-endpoints-rules.js b/packages/api/tests/test-endpoints-rules.js index 21d7a849cf5..f3eb0d9d4da 100644 --- a/packages/api/tests/test-endpoints-rules.js +++ b/packages/api/tests/test-endpoints-rules.js @@ -52,7 +52,7 @@ test.before(async () => setup()); test.after.always(async () => teardown()); // TODO(aimee): Add a rule to ES. List uses ES and we don't have any rules in ES. -test('default returns list of rules', t => { +test('default returns list of rules', (t) => { const listEvent = { httpMethod: 'list ' }; return testEndpoint(rulesEndpoint, listEvent, (response) => { const { results } = JSON.parse(response.body); @@ -60,7 +60,7 @@ test('default returns list of rules', t => { }); }); -test('GET gets a rule', t => { +test('GET gets a rule', (t) => { const getEvent = { pathParameters: { name: testRule.name @@ -73,8 +73,8 @@ test('GET gets a rule', t => { }); }); -test('POST creates a rule', t => { - const newRule = Object.assign({}, testRule, {name: 'make_waffles'}); +test('POST creates a rule', (t) => { + const newRule = Object.assign({}, testRule, { name: 'make_waffles' }); const postEvent = { httpMethod: 'POST', body: JSON.stringify(newRule) @@ -86,9 +86,9 @@ test('POST creates a rule', t => { }); }); -test('PUT updates a rule', t => { +test('PUT updates a rule', (t) => { const updateEvent = { - body: JSON.stringify({state: 'ENABLED'}), + body: JSON.stringify({ state: 'ENABLED' }), pathParameters: { name: testRule.name }, @@ -100,7 +100,7 @@ test('PUT updates a rule', t => { }); }); -test('DELETE deletes a rule', t => { +test('DELETE deletes a rule', (t) => { const deleteEvent = { pathParameters: { name: testRule.name From d27f4184557d1db10e3999aec7b86d54cb488c9c Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Wed, 21 Mar 2018 14:24:10 -0400 Subject: [PATCH 47/94] remove duplicate entry --- CHANGELOG.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c066f15ab0..92bef90e08a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] -- **CUMULUS-260: "PDR page on dashboard only shows zeros."** The PDR stats in LPDAAC are all 0s, even if the dashboard has been fixed to retrieve the correct fields. The current version of pdr-status-check has a few issues. - - pdr is not included in the input/output schema. It's available from the input event. So the pdr status and stats are not updated when the ParsePdr workflow is complete. Adding the pdr to the input/output of the task will fix this. - - pdr-status-check doesn't update pdr stats which prevent the real time pdr progress from showing up in the dashboard. To solve this, added lambda function sf-sns-report which is copied from @cumulus/api/lambdas/sf-sns-broadcast with modification, sf-sns-report can be used to report step function status anywhere inside a step function. So add step sf-sns-report after each pdr-status-check, we will get the PDR status progress at real time. - - It's possible an execution is still in the queue and doesn't exist in sfn yet. Added code to handle 'ExecutionDoesNotExist' error when checking the execution status. - - **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. ## [v1.2.0] - 2018-03-20 From 46389edbdd789e90ea3bcf26bfdc4139a1e49b60 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Wed, 21 Mar 2018 15:07:37 -0400 Subject: [PATCH 48/94] changelog --- .eslint-ratchet-high-water-mark | 2 +- CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 340b3519a5d..c31670ba56a 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1576 +1525 diff --git a/CHANGELOG.md b/CHANGELOG.md index 92bef90e08a..d3eeec29885 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] - **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-271: "Empty response body from rules PUT endpoint"** Added the updated rule to response body. ## [v1.2.0] - 2018-03-20 From d116dc2838182fa9039ffc73141f13fe106f0947 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Wed, 21 Mar 2018 15:17:40 -0400 Subject: [PATCH 49/94] the number is different from local --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index c31670ba56a..1fd9918d8f2 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1525 +1539 From 519d19d4256a6bf1902a6b3efd7884e40ea38c0e Mon Sep 17 00:00:00 2001 From: sethvincent Date: Wed, 21 Mar 2018 20:19:24 -0400 Subject: [PATCH 50/94] add schema dirs to dist dirs --- cumulus/tasks/discover-granules/package.json | 4 ++-- cumulus/tasks/discover-pdrs/package.json | 4 ++-- cumulus/tasks/discover-s3-granules/package.json | 4 ++-- cumulus/tasks/hello-world/package.json | 4 ++-- cumulus/tasks/parse-pdr/package.json | 4 ++-- cumulus/tasks/pdr-status-check/package.json | 4 ++-- cumulus/tasks/post-to-cmr/package.json | 4 ++-- cumulus/tasks/queue-granules/package.json | 4 ++-- cumulus/tasks/queue-pdrs/package.json | 4 ++-- cumulus/tasks/sf-sns-report/package.json | 4 ++-- cumulus/tasks/sync-granule/package.json | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cumulus/tasks/discover-granules/package.json b/cumulus/tasks/discover-granules/package.json index b9583a1a641..445629397f6 100644 --- a/cumulus/tasks/discover-granules/package.json +++ b/cumulus/tasks/discover-granules/package.json @@ -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": { diff --git a/cumulus/tasks/discover-pdrs/package.json b/cumulus/tasks/discover-pdrs/package.json index 2a5f41da51a..0bf7faef33a 100644 --- a/cumulus/tasks/discover-pdrs/package.json +++ b/cumulus/tasks/discover-pdrs/package.json @@ -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": { diff --git a/cumulus/tasks/discover-s3-granules/package.json b/cumulus/tasks/discover-s3-granules/package.json index 1061fe29fc5..b38b4cec9f5 100644 --- a/cumulus/tasks/discover-s3-granules/package.json +++ b/cumulus/tasks/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/hello-world/package.json b/cumulus/tasks/hello-world/package.json index 5c5efc30f58..6273b71f850 100644 --- a/cumulus/tasks/hello-world/package.json +++ b/cumulus/tasks/hello-world/package.json @@ -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/cumulus/tasks/parse-pdr/package.json b/cumulus/tasks/parse-pdr/package.json index b9a282125b2..fd2d5d43b34 100644 --- a/cumulus/tasks/parse-pdr/package.json +++ b/cumulus/tasks/parse-pdr/package.json @@ -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", diff --git a/cumulus/tasks/pdr-status-check/package.json b/cumulus/tasks/pdr-status-check/package.json index 74aa7aa4e83..a9d53082110 100644 --- a/cumulus/tasks/pdr-status-check/package.json +++ b/cumulus/tasks/pdr-status-check/package.json @@ -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", diff --git a/cumulus/tasks/post-to-cmr/package.json b/cumulus/tasks/post-to-cmr/package.json index 311975ed78c..872a54c928b 100644 --- a/cumulus/tasks/post-to-cmr/package.json +++ b/cumulus/tasks/post-to-cmr/package.json @@ -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": { diff --git a/cumulus/tasks/queue-granules/package.json b/cumulus/tasks/queue-granules/package.json index a25280af232..c82495cae90 100644 --- a/cumulus/tasks/queue-granules/package.json +++ b/cumulus/tasks/queue-granules/package.json @@ -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": { diff --git a/cumulus/tasks/queue-pdrs/package.json b/cumulus/tasks/queue-pdrs/package.json index 8a942046557..cb668df09ca 100644 --- a/cumulus/tasks/queue-pdrs/package.json +++ b/cumulus/tasks/queue-pdrs/package.json @@ -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": { diff --git a/cumulus/tasks/sf-sns-report/package.json b/cumulus/tasks/sf-sns-report/package.json index a7c6bdb2e09..b7e98de5c39 100644 --- a/cumulus/tasks/sf-sns-report/package.json +++ b/cumulus/tasks/sf-sns-report/package.json @@ -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": { diff --git a/cumulus/tasks/sync-granule/package.json b/cumulus/tasks/sync-granule/package.json index aed87eb41c6..d534e03a6d2 100644 --- a/cumulus/tasks/sync-granule/package.json +++ b/cumulus/tasks/sync-granule/package.json @@ -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", From 9d9bb24d101f1fc7aaf22bd3fd73ddb8891bab5f Mon Sep 17 00:00:00 2001 From: sethvincent Date: Wed, 21 Mar 2018 20:35:13 -0400 Subject: [PATCH 51/94] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92bef90e08a..d71d1790a8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] - **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. ## [v1.2.0] - 2018-03-20 From c3c2e4f9cbf08e5bd086a921bf5ce988d2ced2b4 Mon Sep 17 00:00:00 2001 From: Katherine Kelly Date: Thu, 22 Mar 2018 12:36:33 -0400 Subject: [PATCH 52/94] Added fake provider --- cumulus/tasks/discover-granules/tests/index.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cumulus/tasks/discover-granules/tests/index.js b/cumulus/tasks/discover-granules/tests/index.js index 7689048a1c4..a25c8e83d87 100644 --- a/cumulus/tasks/discover-granules/tests/index.js +++ b/cumulus/tasks/discover-granules/tests/index.js @@ -14,12 +14,23 @@ const { } = require('@cumulus/common/test-utils'); const { discoverGranules } = require('../index'); -// This test is broken and will be fixed by CUMULUS-427 -test.skip('discover granules using FTP', async (t) => { +test('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); From 806c916b01ddff49bfb8e2cbbab8d62ea454b0ac Mon Sep 17 00:00:00 2001 From: Katherine Kelly Date: Thu, 22 Mar 2018 12:40:53 -0400 Subject: [PATCH 53/94] Updated changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92bef90e08a..315b4b9beba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] + +### Fixed +- 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. ## [v1.2.0] - 2018-03-20 From d0ee350dad2f1fb6cd2e0230f09155ee1dc6dd3c Mon Sep 17 00:00:00 2001 From: Katherine Kelly Date: Thu, 22 Mar 2018 12:45:41 -0400 Subject: [PATCH 54/94] Added bucket cleanup --- cumulus/tasks/discover-granules/tests/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cumulus/tasks/discover-granules/tests/index.js b/cumulus/tasks/discover-granules/tests/index.js index a25c8e83d87..00cfa8a93ee 100644 --- a/cumulus/tasks/discover-granules/tests/index.js +++ b/cumulus/tasks/discover-granules/tests/index.js @@ -44,6 +44,10 @@ test('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) => { From bd23ab76d36567da187b0c580c1a7a122ff41f12 Mon Sep 17 00:00:00 2001 From: Jenny Liu Date: Thu, 22 Mar 2018 13:09:18 -0400 Subject: [PATCH 55/94] updated tests --- packages/api/endpoints/rules.js | 4 +- packages/api/tests/test-endpoints-rules.js | 54 ++++++++++++++++++++-- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/packages/api/endpoints/rules.js b/packages/api/endpoints/rules.js index 6ba2af1e1ae..047a3a7a9cb 100644 --- a/packages/api/endpoints/rules.js +++ b/packages/api/endpoints/rules.js @@ -83,7 +83,7 @@ async function put(event, cb) { // 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) return cb({ message: 'Only state and rule.value values can be changed' }); @@ -102,7 +102,7 @@ async function put(event, cb) { // if rule type is onetime no change is allowed unless it is a rerun if (action === 'rerun') { await models.Rule.invoke(originalData); - return cb(originalData); + return cb(null, originalData); } return model.update(originalData, data) diff --git a/packages/api/tests/test-endpoints-rules.js b/packages/api/tests/test-endpoints-rules.js index f3eb0d9d4da..dd65ae896c2 100644 --- a/packages/api/tests/test-endpoints-rules.js +++ b/packages/api/tests/test-endpoints-rules.js @@ -82,11 +82,26 @@ 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' }), pathParameters: { @@ -95,8 +110,39 @@ test('PUT updates a rule', (t) => { 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'); - From 658f954a7440649e6ad0f27c889b677635b882a3 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 22 Mar 2018 13:42:24 -0400 Subject: [PATCH 56/94] Fix module dependency problems with eslint --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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", From f3c6d2df404cde527aa0ebc74dd0b7d97a9765b0 Mon Sep 17 00:00:00 2001 From: Marc Huffnagle Date: Thu, 22 Mar 2018 13:43:43 -0400 Subject: [PATCH 57/94] Updating eslint ratchet to reflect more restrictive checks in updated eslint --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 340b3519a5d..ce21c02e0e8 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1576 +2096 From 17671d34725e00bce233f1b35e18d26b6edda367 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 22 Mar 2018 16:34:16 -0400 Subject: [PATCH 58/94] Increase memory for CustomBootstrapLambdaFunction (#275) --- CHANGELOG.md | 1 + packages/api/config/lambdas.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92bef90e08a..b357ca2a3e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] - **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. +- 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. ## [v1.2.0] - 2018-03-20 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}}' From b184ccd8cbcd4d782a12f000fad13a63e9a81746 Mon Sep 17 00:00:00 2001 From: jennyhliu <34660846+jennyhliu@users.noreply.github.com> Date: Thu, 22 Mar 2018 18:02:09 -0400 Subject: [PATCH 59/94] Update .eslint-ratchet-high-water-mark --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index e4a36c3722d..a4ea6e7a770 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1539 \ No newline at end of file +2059 From aedf76889bbddf31f80d5223b14f2d2be652cc4a Mon Sep 17 00:00:00 2001 From: sethvincent Date: Mon, 26 Mar 2018 14:53:41 -0400 Subject: [PATCH 60/94] aws.downloadS3File: use pump to catch errors in both streams, add tests --- packages/common/aws.js | 23 ++++++++++++++--------- packages/common/tests/aws.js | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 9 deletions(-) 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/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); +}); From d42ec577285f50ee51862c68d90ae826e6d200f1 Mon Sep 17 00:00:00 2001 From: sethvincent Date: Mon, 26 Mar 2018 14:58:50 -0400 Subject: [PATCH 61/94] eslint-ratchet update --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index a4ea6e7a770..e8c19528942 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -2059 +1530 From 23888b592efb1d932616a17211d009cdd241cbed Mon Sep 17 00:00:00 2001 From: sethvincent Date: Mon, 26 Mar 2018 15:02:45 -0400 Subject: [PATCH 62/94] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 393a813295c..2351eb624db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### 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-271: "Empty response body from rules PUT endpoint"** Added the updated rule to response body. From 345488dff8b831c838e66ae71e5198040ca0341e Mon Sep 17 00:00:00 2001 From: sethvincent Date: Mon, 26 Mar 2018 15:57:56 -0400 Subject: [PATCH 63/94] fix eslint-ratchet --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index e8c19528942..9adbd23923b 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1530 +2042 From 96fda69eb71155c09f79cced38e6078704991ed8 Mon Sep 17 00:00:00 2001 From: sethvincent Date: Mon, 26 Mar 2018 16:14:12 -0400 Subject: [PATCH 64/94] fix eslint-ratchet --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 9adbd23923b..65bb5e1ec8c 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -2042 +2051 From 8d55343f3292ade6a3e5f4a15087c4d8ad0d90f7 Mon Sep 17 00:00:00 2001 From: Scisco Date: Tue, 27 Mar 2018 17:12:26 -0400 Subject: [PATCH 65/94] reorganize folders --- cumulus/lib/cf-template.js | 85 - cumulus/lib/templates/defaults.yml | 15 - cumulus/lib/templates/ecs-task-defaults.yml | 13 - cumulus/lib/templates/service-defaults.yml | 35 - cumulus/lib/templates/task-defaults.yml | 10 - cumulus/services/provider-gateway/.gitignore | 15 - cumulus/services/provider-gateway/Dockerfile | 7 - cumulus/services/provider-gateway/README.md | 233 - .../services/provider-gateway/bin/build.sh | 4 - .../provider-gateway/bin/docker_deploy.sh | 47 - .../provider-gateway/bin/docker_run.sh | 12 - .../provider-gateway/bin/docker_stop.sh | 7 - .../provider-gateway/bin/docker_tail_logs.sh | 3 - .../config/cloudformation.yml | 20 - .../services/provider-gateway/dev/user.clj | 56 - cumulus/services/provider-gateway/project.clj | 60 - .../sync_task_to_request_handler.clj | 72 - .../provider_gateway/aws/activity_api.clj | 232 - .../src/cumulus/provider_gateway/aws/s3.clj | 148 - .../download_activity_handler.clj | 225 - .../provider_gateway/protocols/ftp.clj | 153 - .../provider_gateway/protocols/http.clj | 58 - .../provider_gateway/protocols/sftp.clj | 87 - .../protocols/url_connection.clj | 17 - .../src/cumulus/provider_gateway/runner.clj | 24 - .../cumulus/provider_gateway/specs/common.clj | 12 - .../cumulus/provider_gateway/specs/config.clj | 16 - .../provider_gateway/specs/provider.clj | 76 - .../provider_gateway/specs/sync_task.clj | 11 - .../cumulus/provider_gateway/specs/task.clj | 35 - .../src/cumulus/provider_gateway/system.clj | 110 - .../provider_gateway/task_executor.clj | 211 - .../src/cumulus/provider_gateway/util.clj | 103 - .../sync_task_to_request_handler_test.clj | 97 - .../cumulus/provider_gateway/ftp_server.clj | 89 - .../cumulus/provider_gateway/http_server.clj | 67 - .../provider_gateway/integration_test.clj | 472 - .../cumulus/provider_gateway/sftp_server.clj | 89 - .../cumulus/provider_gateway/system_test.clj | 27 - .../cumulus/provider_gateway/util_test.clj | 49 - cumulus/services/sfn-scheduler/README.md | 13 - .../sfn-scheduler/config/cloudformation.yml | 47 - cumulus/services/sfn-scheduler/index.js | 117 - cumulus/services/sfn-scheduler/package.json | 24 - .../sfn-throttler/config/cloudformation.yml | 15 - cumulus/services/sfn-throttler/index.js | 157 - cumulus/services/sfn-throttler/package.json | 25 - cumulus/tasks/discover-pdrs/package-lock.json | 8426 ----------------- cumulus/tasks/parse-pdr/package-lock.json | 4487 --------- .../config/cloudformation.yml | 0 .../copy-idx-from-s3-to-efs/index.js | 0 .../copy-idx-from-s3-to-efs/package.json | 0 .../copy-idx-from-s3-to-efs/test/ast_l1t.yml | 0 .../test/copy-idx-spec.js | 0 .../test/input_payload.json | 0 .../delete-ingest-tracking-data/README.md | 0 .../config/cloudformation.yml | 0 .../delete-ingest-tracking-data/index.js | 0 .../delete-ingest-tracking-data/package.json | 0 .../test/filter-payload-spec.js | 0 .../delete-pdr-ftp/.babelrc | 0 .../delete-pdr-ftp/.gitignore | 0 .../delete-pdr-ftp/README.md | 0 .../delete-pdr-ftp/config/cloudformation.yml | 0 .../delete-pdr-ftp/ftp_util.js | 0 .../delete-pdr-ftp/index.js | 0 .../delete-pdr-ftp/package.json | 0 .../test/delete-pdr-ftp-spec.js | 0 .../delete-pdr-s3/.babelrc | 0 .../delete-pdr-s3/.gitignore | 0 .../delete-pdr-s3/README.md | 0 .../delete-pdr-s3/config/cloudformation.yml | 0 .../delete-pdr-s3/index.js | 0 .../delete-pdr-s3/package.json | 0 .../delete-pdr-s3/test/delete-pdr-s3.test.js | 0 .../discover-cmr-granules/README.md | 0 .../config/cloudformation.yml | 0 .../discover-cmr-granules/index.js | 0 .../discover-cmr-granules/package.json | 0 .../test/discover-cmr-granules-spec.js | 0 .../discover-http-tiles/README.md | 0 .../apache-index-tile-crawler.js | 0 .../config/cloudformation.yml | 0 .../discover-http-tiles/http-tile-crawler.js | 0 .../discover-http-tiles/index.js | 0 .../discover-http-tiles/package.json | 0 .../test/discover-http-tiles-spec.js | 0 .../.not_CMA_compliant}/discover-pdr/.babelrc | 0 .../discover-pdr/.gitignore | 0 .../discover-pdr/README.md | 0 .../discover-pdr/config/cloudformation.yml | 0 .../.not_CMA_compliant}/discover-pdr/index.js | 0 .../discover-pdr/package.json | 0 .../.not_CMA_compliant}/discover-pdr/pdr.js | 0 .../discover-pdr/test/discover-pdr-spec.js | 0 .../download-activity-mock/.babelrc | 0 .../download-activity-mock/.gitignore | 0 .../download-activity-mock/README.md | 0 .../download-activity-mock/index.js | 0 .../download-activity-mock/package.json | 0 .../download-activity-mock/sips.js | 0 .../test/download-activity-mock-spec.js | 0 .../filter-payload/README.md | 0 .../filter-payload/config/cloudformation.yml | 0 .../filter-payload/index.js | 0 .../filter-payload/package.json | 0 .../test/filter-payload-spec.js | 0 .../generate-mrf/README.md | 0 .../generate-mrf/config-gen.js | 0 .../generate-mrf/config/cloudformation.yml | 0 .../.not_CMA_compliant}/generate-mrf/index.js | 0 .../generate-mrf/package.json | 0 .../templates/empty-tiles/empty256.jpg | Bin .../templates/empty-tiles/empty256.png | Bin .../templates/empty-tiles/empty512.jpg | Bin .../templates/empty-tiles/empty512.png | Bin .../generate-mrf/templates/mrfgen_config.xml | 0 .../templates/products/_viirs.xml | 0 .../source-projections/_epsg3031.xml | 0 .../source-projections/_epsg3413.xml | 0 .../source-projections/_epsg4326.xml | 0 .../target-projections/_epsg3031.xml | 0 .../target-projections/_epsg3413.xml | 0 .../target-projections/_epsg4326.xml | 0 .../generate-mrf/test/generate-mrf-spec.js | 0 .../.not_CMA_compliant}/generate-pan/.babelrc | 0 .../generate-pan/.gitignore | 0 .../generate-pan/README.md | 0 .../generate-pan/config/cloudformation.yml | 0 .../generate-pan/ftp_util.js | 0 .../.not_CMA_compliant}/generate-pan/index.js | 0 .../generate-pan/package.json | 0 .../.not_CMA_compliant}/generate-pan/pan.js | 0 .../test/fixtures/all-success-fixture.js | 0 .../test/fixtures/missing-file-fixture.js | 0 .../generate-pan/test/generate-pan-spec.js | 0 .../generate-pdr-file-list/README.md | 0 .../config/cloudformation.yml | 0 .../generate-pdr-file-list/index.js | 0 .../generate-pdr-file-list/package.json | 0 .../generate-pdr-file-list/pdr.js | 0 .../test/fixtures/bad-pdr-fixture.js | 0 .../test/fixtures/good-pdr-fixture.js | 0 .../test/generate-pdr-file-list-spec.js | 0 .../generate-pdrd/.babelrc | 0 .../generate-pdrd/.gitignore | 0 .../generate-pdrd/README.md | 0 .../generate-pdrd/config/cloudformation.yml | 0 .../generate-pdrd/ftp_util.js | 0 .../generate-pdrd/index.js | 0 .../generate-pdrd/package.json | 0 .../.not_CMA_compliant}/generate-pdrd/pdrd.js | 0 .../test/fixtures/bad-file-entry-fixture.js | 0 .../test/fixtures/invalid-pvl-fixture.js | 0 .../test/fixtures/missing-fields-fixture.js | 0 .../generate-pdrd/test/generate-pdrd-spec.js | 0 .../.not_CMA_compliant}/run-gdal/README.md | 0 .../run-gdal/build-gdal/.gitignore | 0 .../run-gdal/build-gdal/Dockerfile | 0 .../run-gdal/build-gdal/Makefile | 0 .../run-gdal/config/cloudformation.yml | 0 .../run-gdal/deps/lambda-gdal.zip | Bin .../run-gdal/example/ast_l1t-to-mrf.json | 0 .../run-gdal/example/ast_l1t-to-png.json | 0 .../run-gdal/example/event.json | 0 .../.not_CMA_compliant}/run-gdal/index.js | 0 .../.not_CMA_compliant}/run-gdal/package.json | 0 .../run-gdal/webpack.config.js | 0 .../sync-http-urls/README.md | 0 .../sync-http-urls/config/cloudformation.yml | 0 .../sync-http-urls/index.js | 0 .../sync-http-urls/package.json | 0 .../test/sync-http-urls-spec.js | 0 .../.not_CMA_compliant}/sync-wms/README.md | 0 .../sync-wms/config/cloudformation.yml | 0 .../.not_CMA_compliant}/sync-wms/index.js | 0 .../.not_CMA_compliant}/sync-wms/package.json | 0 .../sync-wms/test/sync-wms-spec.js | 0 .../.not_CMA_compliant}/tee/README.md | 0 .../tee/config/cloudformation.yml | 0 .../.not_CMA_compliant}/tee/index.js | 0 .../.not_CMA_compliant}/tee/package.json | 0 .../trigger-ingest/README.md | 0 .../trigger-ingest/config/cloudformation.yml | 0 .../trigger-ingest/index.js | 0 .../trigger-ingest/package.json | 0 .../test/trigger-ingest-spec.js | 0 .../trigger-mrf-gen/README.md | 0 .../trigger-mrf-gen/config/cloudformation.yml | 0 .../trigger-mrf-gen/index.js | 0 .../trigger-mrf-gen/package.json | 0 .../trigger-process-pdrs/README.md | 0 .../config/cloudformation.yml | 0 .../trigger-process-pdrs/index.js | 0 .../trigger-process-pdrs/package.json | 0 .../test/trigger-process-pdrs-spec.js | 0 .../validate-archives/README.md | 0 .../validate-archives/archive-validations.js | 0 .../config/cloudformation.yml | 0 .../validate-archives/index.js | 0 .../validate-archives/package.json | 0 .../test/fixtures/all-success-fixture.js | 0 .../test/fixtures/missing-file-fixture.js | 0 .../test/vaidate-archives-spec.js | 0 .../.not_CMA_compliant}/validate-pdr/.babelrc | 0 .../validate-pdr/.gitignore | 0 .../validate-pdr/README.md | 0 .../validate-pdr/config/cloudformation.yml | 0 .../.not_CMA_compliant}/validate-pdr/index.js | 0 .../validate-pdr/package.json | 0 .../validate-pdr/pdr-validations.js | 0 .../.not_CMA_compliant}/validate-pdr/pdr.js | 0 .../test/fixtures/file-errors-fixture.js | 0 .../test/fixtures/invalid-pvl-fixture.js | 0 .../test/fixtures/missing-fields-fixture.js | 0 .../test/fixtures/success-fixture.js | 0 .../validate-pdr/test/pdr-validations.test.js | 0 .../validate-pdr/test/validate-pdr.test.js | 0 .../discover-granules/README.md | 0 .../discover-granules/cumulus.json | 0 .../discover-granules/index.js | 0 .../discover-granules/package.json | 0 .../discover-granules/schemas/config.json | 0 .../discover-granules/schemas/output.json | 0 .../discover-granules/tests/.eslintrc.json | 0 .../discover-granules/tests/fixtures/mur.json | 0 .../discover-granules/tests/index.js | 0 .../discover-granules/webpack.config.js | 0 .../tasks => tasks}/discover-pdrs/README.md | 0 .../discover-pdrs/cumulus.json | 0 .../tasks => tasks}/discover-pdrs/index.js | 0 .../discover-pdrs/package.json | 0 .../discover-pdrs/schemas/config.json | 0 .../discover-pdrs/schemas/output.json | 0 .../discover-pdrs/tests/.eslintrc.json | 0 .../discover-pdrs/tests/fixtures/input.json | 0 .../discover-pdrs/tests/index.js | 0 .../tasks => tasks}/discover-pdrs/tests/s3.js | 0 .../discover-pdrs/webpack.config.js | 0 .../discover-s3-granules/README.md | 0 .../discover-s3-granules/index.js | 0 .../discover-s3-granules/package.json | 0 .../discover-s3-granules/schemas/config.json | 0 .../discover-s3-granules/schemas/output.json | 0 .../tests/fixtures/input.json | 0 .../discover-s3-granules/tests/index.js | 0 .../discover-s3-granules/webpack.config.js | 0 .../tasks => tasks}/hello-world/README.md | 0 {cumulus/tasks => tasks}/hello-world/index.js | 0 .../tasks => tasks}/hello-world/package.json | 0 .../hello-world/tests/hello_world_test.js | 0 .../hello-world/webpack.config.js | 0 {cumulus/tasks => tasks}/parse-pdr/README.md | 0 {cumulus/tasks => tasks}/parse-pdr/index.js | 0 .../tasks => tasks}/parse-pdr/package.json | 0 .../parse-pdr/schemas/config.json | 0 .../parse-pdr/schemas/input.json | 0 .../parse-pdr/schemas/output.json | 0 .../parse-pdr/tests/parse_pdrs_test.js | 0 .../parse-pdr/webpack.config.js | 0 .../pdr-status-check/README.md | 0 .../tasks => tasks}/pdr-status-check/index.js | 0 .../pdr-status-check/package.json | 0 .../pdr-status-check/schemas/input.json | 0 .../pdr-status-check/schemas/output.json | 0 .../pdr-status-check/tests/index.js | 0 .../pdr-status-check/webpack.config.js | 0 .../tasks => tasks}/post-to-cmr/README.md | 0 {cumulus/tasks => tasks}/post-to-cmr/index.js | 0 .../tasks => tasks}/post-to-cmr/package.json | 0 .../post-to-cmr/schemas/config.json | 0 .../post-to-cmr/schemas/input.json | 0 .../post-to-cmr/schemas/output.json | 0 .../post-to-cmr/tests/cmr_test.js | 0 .../post-to-cmr/tests/data/meta.xml | 0 .../post-to-cmr/tests/data/payload.json | 0 .../post-to-cmr/webpack.config.js | 0 .../tasks => tasks}/queue-granules/README.md | 0 .../tasks => tasks}/queue-granules/index.js | 0 .../queue-granules/package.json | 0 .../queue-granules/schemas/config.json | 0 .../queue-granules/schemas/input.json | 0 .../queue-granules/schemas/output.json | 0 .../queue-granules/tests/.eslintrc.json | 0 .../queue-granules/tests/fixtures/input.json | 0 .../tests/fixtures/workflow-template.json | 0 .../queue-granules/tests/index.js | 0 .../queue-granules/webpack.config.js | 0 {cumulus/tasks => tasks}/queue-pdrs/README.md | 0 {cumulus/tasks => tasks}/queue-pdrs/index.js | 0 .../tasks => tasks}/queue-pdrs/package.json | 0 .../queue-pdrs/schemas/config.json | 0 .../queue-pdrs/schemas/input.json | 0 .../queue-pdrs/schemas/output.json | 0 .../queue-pdrs/tests/.eslintrc.json | 0 .../queue-pdrs/tests/fixtures/input.json | 0 .../tests/fixtures/workflow-template.json | 0 .../tasks => tasks}/queue-pdrs/tests/index.js | 0 .../queue-pdrs/webpack.config.js | 0 .../tasks => tasks}/sf-sns-report/README.md | 0 .../tasks => tasks}/sf-sns-report/index.js | 0 .../sf-sns-report/package.json | 0 .../sf-sns-report/schemas/config.json | 0 .../sf-sns-report/tests/.eslintrc.json | 0 .../sf-sns-report/tests/index.js | 0 .../sf-sns-report/webpack.config.js | 0 .../tasks => tasks}/sync-granule/README.md | 0 .../tasks => tasks}/sync-granule/index.js | 0 .../tasks => tasks}/sync-granule/package.json | 0 .../sync-granule/schemas/config.json | 0 .../sync-granule/schemas/input.json | 0 .../sync-granule/schemas/output.json | 0 .../sync-granule/tests/.eslintrc.json | 0 .../sync-granule/tests/sync_granule_test.js | 0 .../sync-granule/webpack.config.js | 0 .../fixtures/workflows/pdr_parse_ingest.json | 6 +- 316 files changed, 3 insertions(+), 16416 deletions(-) delete mode 100644 cumulus/lib/cf-template.js delete mode 100644 cumulus/lib/templates/defaults.yml delete mode 100644 cumulus/lib/templates/ecs-task-defaults.yml delete mode 100644 cumulus/lib/templates/service-defaults.yml delete mode 100644 cumulus/lib/templates/task-defaults.yml delete mode 100644 cumulus/services/provider-gateway/.gitignore delete mode 100644 cumulus/services/provider-gateway/Dockerfile delete mode 100644 cumulus/services/provider-gateway/README.md delete mode 100755 cumulus/services/provider-gateway/bin/build.sh delete mode 100755 cumulus/services/provider-gateway/bin/docker_deploy.sh delete mode 100755 cumulus/services/provider-gateway/bin/docker_run.sh delete mode 100755 cumulus/services/provider-gateway/bin/docker_stop.sh delete mode 100755 cumulus/services/provider-gateway/bin/docker_tail_logs.sh delete mode 100644 cumulus/services/provider-gateway/config/cloudformation.yml delete mode 100644 cumulus/services/provider-gateway/dev/user.clj delete mode 100644 cumulus/services/provider-gateway/project.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/activities/sync_task_to_request_handler.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/activity_api.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/aws/s3.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/download_activity_handler.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/ftp.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/http.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/sftp.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/protocols/url_connection.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/runner.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/common.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/config.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/provider.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/sync_task.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/specs/task.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/system.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/task_executor.clj delete mode 100644 cumulus/services/provider-gateway/src/cumulus/provider_gateway/util.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/activities/sync_task_to_request_handler_test.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/ftp_server.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/http_server.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/integration_test.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/sftp_server.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/system_test.clj delete mode 100644 cumulus/services/provider-gateway/test/cumulus/provider_gateway/util_test.clj delete mode 100644 cumulus/services/sfn-scheduler/README.md delete mode 100644 cumulus/services/sfn-scheduler/config/cloudformation.yml delete mode 100644 cumulus/services/sfn-scheduler/index.js delete mode 100644 cumulus/services/sfn-scheduler/package.json delete mode 100644 cumulus/services/sfn-throttler/config/cloudformation.yml delete mode 100644 cumulus/services/sfn-throttler/index.js delete mode 100644 cumulus/services/sfn-throttler/package.json delete mode 100644 cumulus/tasks/discover-pdrs/package-lock.json delete mode 100644 cumulus/tasks/parse-pdr/package-lock.json rename {cumulus/tasks => tasks/.not_CMA_compliant}/copy-idx-from-s3-to-efs/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/copy-idx-from-s3-to-efs/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/copy-idx-from-s3-to-efs/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/copy-idx-from-s3-to-efs/test/ast_l1t.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/copy-idx-from-s3-to-efs/test/copy-idx-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/copy-idx-from-s3-to-efs/test/input_payload.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-ingest-tracking-data/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-ingest-tracking-data/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-ingest-tracking-data/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-ingest-tracking-data/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-ingest-tracking-data/test/filter-payload-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/ftp_util.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-ftp/test/delete-pdr-ftp-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/delete-pdr-s3/test/delete-pdr-s3.test.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-cmr-granules/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-cmr-granules/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-cmr-granules/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-cmr-granules/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-cmr-granules/test/discover-cmr-granules-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/apache-index-tile-crawler.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/http-tile-crawler.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-http-tiles/test/discover-http-tiles-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/pdr.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/discover-pdr/test/discover-pdr-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/sips.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/download-activity-mock/test/download-activity-mock-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/filter-payload/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/filter-payload/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/filter-payload/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/filter-payload/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/filter-payload/test/filter-payload-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/config-gen.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/empty-tiles/empty256.jpg (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/empty-tiles/empty256.png (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/empty-tiles/empty512.jpg (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/empty-tiles/empty512.png (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/mrfgen_config.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/products/_viirs.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/source-projections/_epsg3031.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/source-projections/_epsg3413.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/source-projections/_epsg4326.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/target-projections/_epsg3031.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/target-projections/_epsg3413.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/templates/target-projections/_epsg4326.xml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-mrf/test/generate-mrf-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/ftp_util.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/pan.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/test/fixtures/all-success-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/test/fixtures/missing-file-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pan/test/generate-pan-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/pdr.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/test/fixtures/bad-pdr-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/test/fixtures/good-pdr-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdr-file-list/test/generate-pdr-file-list-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/ftp_util.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/pdrd.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/test/fixtures/bad-file-entry-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/test/fixtures/invalid-pvl-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/test/fixtures/missing-fields-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/generate-pdrd/test/generate-pdrd-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/build-gdal/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/build-gdal/Dockerfile (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/build-gdal/Makefile (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/deps/lambda-gdal.zip (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/example/ast_l1t-to-mrf.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/example/ast_l1t-to-png.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/example/event.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/run-gdal/webpack.config.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-http-urls/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-http-urls/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-http-urls/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-http-urls/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-http-urls/test/sync-http-urls-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-wms/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-wms/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-wms/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-wms/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/sync-wms/test/sync-wms-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/tee/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/tee/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/tee/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/tee/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-ingest/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-ingest/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-ingest/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-ingest/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-ingest/test/trigger-ingest-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-mrf-gen/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-mrf-gen/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-mrf-gen/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-mrf-gen/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-process-pdrs/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-process-pdrs/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-process-pdrs/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-process-pdrs/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/trigger-process-pdrs/test/trigger-process-pdrs-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/archive-validations.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/test/fixtures/all-success-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/test/fixtures/missing-file-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-archives/test/vaidate-archives-spec.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/.babelrc (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/.gitignore (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/README.md (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/config/cloudformation.yml (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/index.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/package.json (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/pdr-validations.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/pdr.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/test/fixtures/file-errors-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/test/fixtures/invalid-pvl-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/test/fixtures/missing-fields-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/test/fixtures/success-fixture.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/test/pdr-validations.test.js (100%) rename {cumulus/tasks => tasks/.not_CMA_compliant}/validate-pdr/test/validate-pdr.test.js (100%) rename {cumulus/tasks => tasks}/discover-granules/README.md (100%) rename {cumulus/tasks => tasks}/discover-granules/cumulus.json (100%) rename {cumulus/tasks => tasks}/discover-granules/index.js (100%) rename {cumulus/tasks => tasks}/discover-granules/package.json (100%) rename {cumulus/tasks => tasks}/discover-granules/schemas/config.json (100%) rename {cumulus/tasks => tasks}/discover-granules/schemas/output.json (100%) rename {cumulus/tasks => tasks}/discover-granules/tests/.eslintrc.json (100%) rename {cumulus/tasks => tasks}/discover-granules/tests/fixtures/mur.json (100%) rename {cumulus/tasks => tasks}/discover-granules/tests/index.js (100%) rename {cumulus/tasks => tasks}/discover-granules/webpack.config.js (100%) rename {cumulus/tasks => tasks}/discover-pdrs/README.md (100%) rename {cumulus/tasks => tasks}/discover-pdrs/cumulus.json (100%) rename {cumulus/tasks => tasks}/discover-pdrs/index.js (100%) rename {cumulus/tasks => tasks}/discover-pdrs/package.json (100%) rename {cumulus/tasks => tasks}/discover-pdrs/schemas/config.json (100%) rename {cumulus/tasks => tasks}/discover-pdrs/schemas/output.json (100%) rename {cumulus/tasks => tasks}/discover-pdrs/tests/.eslintrc.json (100%) rename {cumulus/tasks => tasks}/discover-pdrs/tests/fixtures/input.json (100%) rename {cumulus/tasks => tasks}/discover-pdrs/tests/index.js (100%) rename {cumulus/tasks => tasks}/discover-pdrs/tests/s3.js (100%) rename {cumulus/tasks => tasks}/discover-pdrs/webpack.config.js (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/README.md (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/index.js (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/package.json (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/schemas/config.json (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/schemas/output.json (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/tests/fixtures/input.json (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/tests/index.js (100%) rename {cumulus/tasks => tasks}/discover-s3-granules/webpack.config.js (100%) rename {cumulus/tasks => tasks}/hello-world/README.md (100%) rename {cumulus/tasks => tasks}/hello-world/index.js (100%) rename {cumulus/tasks => tasks}/hello-world/package.json (100%) rename {cumulus/tasks => tasks}/hello-world/tests/hello_world_test.js (100%) rename {cumulus/tasks => tasks}/hello-world/webpack.config.js (100%) rename {cumulus/tasks => tasks}/parse-pdr/README.md (100%) rename {cumulus/tasks => tasks}/parse-pdr/index.js (100%) rename {cumulus/tasks => tasks}/parse-pdr/package.json (100%) rename {cumulus/tasks => tasks}/parse-pdr/schemas/config.json (100%) rename {cumulus/tasks => tasks}/parse-pdr/schemas/input.json (100%) rename {cumulus/tasks => tasks}/parse-pdr/schemas/output.json (100%) rename {cumulus/tasks => tasks}/parse-pdr/tests/parse_pdrs_test.js (100%) rename {cumulus/tasks => tasks}/parse-pdr/webpack.config.js (100%) rename {cumulus/tasks => tasks}/pdr-status-check/README.md (100%) rename {cumulus/tasks => tasks}/pdr-status-check/index.js (100%) rename {cumulus/tasks => tasks}/pdr-status-check/package.json (100%) rename {cumulus/tasks => tasks}/pdr-status-check/schemas/input.json (100%) rename {cumulus/tasks => tasks}/pdr-status-check/schemas/output.json (100%) rename {cumulus/tasks => tasks}/pdr-status-check/tests/index.js (100%) rename {cumulus/tasks => tasks}/pdr-status-check/webpack.config.js (100%) rename {cumulus/tasks => tasks}/post-to-cmr/README.md (100%) rename {cumulus/tasks => tasks}/post-to-cmr/index.js (100%) rename {cumulus/tasks => tasks}/post-to-cmr/package.json (100%) rename {cumulus/tasks => tasks}/post-to-cmr/schemas/config.json (100%) rename {cumulus/tasks => tasks}/post-to-cmr/schemas/input.json (100%) rename {cumulus/tasks => tasks}/post-to-cmr/schemas/output.json (100%) rename {cumulus/tasks => tasks}/post-to-cmr/tests/cmr_test.js (100%) rename {cumulus/tasks => tasks}/post-to-cmr/tests/data/meta.xml (100%) rename {cumulus/tasks => tasks}/post-to-cmr/tests/data/payload.json (100%) rename {cumulus/tasks => tasks}/post-to-cmr/webpack.config.js (100%) rename {cumulus/tasks => tasks}/queue-granules/README.md (100%) rename {cumulus/tasks => tasks}/queue-granules/index.js (100%) rename {cumulus/tasks => tasks}/queue-granules/package.json (100%) rename {cumulus/tasks => tasks}/queue-granules/schemas/config.json (100%) rename {cumulus/tasks => tasks}/queue-granules/schemas/input.json (100%) rename {cumulus/tasks => tasks}/queue-granules/schemas/output.json (100%) rename {cumulus/tasks => tasks}/queue-granules/tests/.eslintrc.json (100%) rename {cumulus/tasks => tasks}/queue-granules/tests/fixtures/input.json (100%) rename {cumulus/tasks => tasks}/queue-granules/tests/fixtures/workflow-template.json (100%) rename {cumulus/tasks => tasks}/queue-granules/tests/index.js (100%) rename {cumulus/tasks => tasks}/queue-granules/webpack.config.js (100%) rename {cumulus/tasks => tasks}/queue-pdrs/README.md (100%) rename {cumulus/tasks => tasks}/queue-pdrs/index.js (100%) rename {cumulus/tasks => tasks}/queue-pdrs/package.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/schemas/config.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/schemas/input.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/schemas/output.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/tests/.eslintrc.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/tests/fixtures/input.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/tests/fixtures/workflow-template.json (100%) rename {cumulus/tasks => tasks}/queue-pdrs/tests/index.js (100%) rename {cumulus/tasks => tasks}/queue-pdrs/webpack.config.js (100%) rename {cumulus/tasks => tasks}/sf-sns-report/README.md (100%) rename {cumulus/tasks => tasks}/sf-sns-report/index.js (100%) rename {cumulus/tasks => tasks}/sf-sns-report/package.json (100%) rename {cumulus/tasks => tasks}/sf-sns-report/schemas/config.json (100%) rename {cumulus/tasks => tasks}/sf-sns-report/tests/.eslintrc.json (100%) rename {cumulus/tasks => tasks}/sf-sns-report/tests/index.js (100%) rename {cumulus/tasks => tasks}/sf-sns-report/webpack.config.js (100%) rename {cumulus/tasks => tasks}/sync-granule/README.md (100%) rename {cumulus/tasks => tasks}/sync-granule/index.js (100%) rename {cumulus/tasks => tasks}/sync-granule/package.json (100%) rename {cumulus/tasks => tasks}/sync-granule/schemas/config.json (100%) rename {cumulus/tasks => tasks}/sync-granule/schemas/input.json (100%) rename {cumulus/tasks => tasks}/sync-granule/schemas/output.json (100%) rename {cumulus/tasks => tasks}/sync-granule/tests/.eslintrc.json (100%) rename {cumulus/tasks => tasks}/sync-granule/tests/sync_granule_test.js (100%) rename {cumulus/tasks => tasks}/sync-granule/webpack.config.js (100%) 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/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 100% rename from cumulus/tasks/discover-granules/package.json rename to tasks/discover-granules/package.json 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 100% rename from cumulus/tasks/discover-granules/tests/index.js rename to tasks/discover-granules/tests/index.js diff --git a/cumulus/tasks/discover-granules/webpack.config.js b/tasks/discover-granules/webpack.config.js similarity index 100% rename from cumulus/tasks/discover-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 100% rename from cumulus/tasks/discover-pdrs/package.json rename to tasks/discover-pdrs/package.json 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 100% rename from cumulus/tasks/discover-pdrs/tests/index.js rename to tasks/discover-pdrs/tests/index.js 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/discover-s3-granules/README.md b/tasks/discover-s3-granules/README.md similarity index 100% rename from cumulus/tasks/discover-s3-granules/README.md rename to tasks/discover-s3-granules/README.md diff --git a/cumulus/tasks/discover-s3-granules/index.js b/tasks/discover-s3-granules/index.js similarity index 100% rename from cumulus/tasks/discover-s3-granules/index.js rename to tasks/discover-s3-granules/index.js diff --git a/cumulus/tasks/discover-s3-granules/package.json b/tasks/discover-s3-granules/package.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/package.json rename to tasks/discover-s3-granules/package.json diff --git a/cumulus/tasks/discover-s3-granules/schemas/config.json b/tasks/discover-s3-granules/schemas/config.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/schemas/config.json rename to tasks/discover-s3-granules/schemas/config.json diff --git a/cumulus/tasks/discover-s3-granules/schemas/output.json b/tasks/discover-s3-granules/schemas/output.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/schemas/output.json rename to tasks/discover-s3-granules/schemas/output.json diff --git a/cumulus/tasks/discover-s3-granules/tests/fixtures/input.json b/tasks/discover-s3-granules/tests/fixtures/input.json similarity index 100% rename from cumulus/tasks/discover-s3-granules/tests/fixtures/input.json rename to tasks/discover-s3-granules/tests/fixtures/input.json diff --git a/cumulus/tasks/discover-s3-granules/tests/index.js b/tasks/discover-s3-granules/tests/index.js similarity index 100% rename from cumulus/tasks/discover-s3-granules/tests/index.js rename to tasks/discover-s3-granules/tests/index.js diff --git a/cumulus/tasks/discover-s3-granules/webpack.config.js b/tasks/discover-s3-granules/webpack.config.js similarity index 100% rename from cumulus/tasks/discover-s3-granules/webpack.config.js rename to tasks/discover-s3-granules/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 100% rename from cumulus/tasks/hello-world/package.json rename to tasks/hello-world/package.json 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 100% rename from cumulus/tasks/parse-pdr/package.json rename to tasks/parse-pdr/package.json 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 100% rename from cumulus/tasks/parse-pdr/tests/parse_pdrs_test.js rename to tasks/parse-pdr/tests/parse_pdrs_test.js 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 100% rename from cumulus/tasks/pdr-status-check/README.md rename to tasks/pdr-status-check/README.md diff --git a/cumulus/tasks/pdr-status-check/index.js b/tasks/pdr-status-check/index.js similarity index 100% rename from cumulus/tasks/pdr-status-check/index.js rename to tasks/pdr-status-check/index.js diff --git a/cumulus/tasks/pdr-status-check/package.json b/tasks/pdr-status-check/package.json similarity index 100% rename from cumulus/tasks/pdr-status-check/package.json rename to tasks/pdr-status-check/package.json 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 100% rename from cumulus/tasks/pdr-status-check/tests/index.js rename to tasks/pdr-status-check/tests/index.js 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 100% rename from cumulus/tasks/post-to-cmr/package.json rename to tasks/post-to-cmr/package.json 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 100% rename from cumulus/tasks/queue-granules/package.json rename to tasks/queue-granules/package.json 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 100% rename from cumulus/tasks/queue-pdrs/package.json rename to tasks/queue-pdrs/package.json 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/cumulus/tasks/sf-sns-report/README.md b/tasks/sf-sns-report/README.md similarity index 100% rename from cumulus/tasks/sf-sns-report/README.md rename to tasks/sf-sns-report/README.md diff --git a/cumulus/tasks/sf-sns-report/index.js b/tasks/sf-sns-report/index.js similarity index 100% rename from cumulus/tasks/sf-sns-report/index.js rename to tasks/sf-sns-report/index.js diff --git a/cumulus/tasks/sf-sns-report/package.json b/tasks/sf-sns-report/package.json similarity index 100% rename from cumulus/tasks/sf-sns-report/package.json rename to tasks/sf-sns-report/package.json diff --git a/cumulus/tasks/sf-sns-report/schemas/config.json b/tasks/sf-sns-report/schemas/config.json similarity index 100% rename from cumulus/tasks/sf-sns-report/schemas/config.json rename to tasks/sf-sns-report/schemas/config.json diff --git a/cumulus/tasks/sf-sns-report/tests/.eslintrc.json b/tasks/sf-sns-report/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/sf-sns-report/tests/.eslintrc.json rename to tasks/sf-sns-report/tests/.eslintrc.json diff --git a/cumulus/tasks/sf-sns-report/tests/index.js b/tasks/sf-sns-report/tests/index.js similarity index 100% rename from cumulus/tasks/sf-sns-report/tests/index.js rename to tasks/sf-sns-report/tests/index.js diff --git a/cumulus/tasks/sf-sns-report/webpack.config.js b/tasks/sf-sns-report/webpack.config.js similarity index 100% rename from cumulus/tasks/sf-sns-report/webpack.config.js rename to tasks/sf-sns-report/webpack.config.js 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 100% rename from cumulus/tasks/sync-granule/package.json rename to tasks/sync-granule/package.json 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/cumulus/tasks/sync-granule/tests/.eslintrc.json b/tasks/sync-granule/tests/.eslintrc.json similarity index 100% rename from cumulus/tasks/sync-granule/tests/.eslintrc.json rename to tasks/sync-granule/tests/.eslintrc.json diff --git a/cumulus/tasks/sync-granule/tests/sync_granule_test.js b/tasks/sync-granule/tests/sync_granule_test.js similarity index 100% rename from cumulus/tasks/sync-granule/tests/sync_granule_test.js rename to tasks/sync-granule/tests/sync_granule_test.js 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, From 4edcd190eb3f4041918bc6ddc9db8c7a877f6a50 Mon Sep 17 00:00:00 2001 From: Scisco Date: Tue, 27 Mar 2018 17:12:41 -0400 Subject: [PATCH 66/94] update lerna paths --- .circleci/config.yml | 63 ++++++++------------------------------------ lerna.json | 3 +-- 2 files changed, 12 insertions(+), 54 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 130eddf0dac..02db97e4b2d 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: | @@ -79,50 +71,17 @@ 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/discover-s3-granules/node_modules + - ./tasks/sf-sns-report/node_modules - run: name: Running Tests diff --git a/lerna.json b/lerna.json index ea04ef403b4..79938b19107 100644 --- a/lerna.json +++ b/lerna.json @@ -3,7 +3,6 @@ "version": "1.2.0", "packages": [ "packages/*", - "cumulus/tasks/*", - "cumulus/services/*" + "tasks/*" ] } From 8061a405c1562ef3fbc0b8904dc5fec0eb6d01a1 Mon Sep 17 00:00:00 2001 From: Scisco Date: Tue, 27 Mar 2018 17:18:07 -0400 Subject: [PATCH 67/94] update paths in tests --- tasks/parse-pdr/tests/parse_pdrs_test.js | 2 +- tasks/sync-granule/tests/sync_granule_test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/parse-pdr/tests/parse_pdrs_test.js b/tasks/parse-pdr/tests/parse_pdrs_test.js index 0cb3ff3d98d..42f6f3e75a8 100644 --- a/tasks/parse-pdr/tests/parse_pdrs_test.js +++ b/tasks/parse-pdr/tests/parse_pdrs_test.js @@ -175,7 +175,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/tasks/sync-granule/tests/sync_granule_test.js b/tasks/sync-granule/tests/sync_granule_test.js index 2abfd3daa0f..210f43fb779 100644 --- a/tasks/sync-granule/tests/sync_granule_test.js +++ b/tasks/sync-granule/tests/sync_granule_test.js @@ -194,7 +194,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); From e0a2efba824742e09df60ca0fd6f10db7e26fcd3 Mon Sep 17 00:00:00 2001 From: Scisco Date: Tue, 27 Mar 2018 17:19:24 -0400 Subject: [PATCH 68/94] update readme to include localstack requirement for tests --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1aee8f3ee97..f6747539022 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 From f25d974ab6659627fa6fc8cc182a16d97caf4ee2 Mon Sep 17 00:00:00 2001 From: Scisco Date: Tue, 27 Mar 2018 17:25:58 -0400 Subject: [PATCH 69/94] update eslint number --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index a4ea6e7a770..9e5e9704e3d 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -2059 +1370 From 08e501af2c6f9a96cc145eb42ad580ed640688ce Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 09:23:26 -0400 Subject: [PATCH 70/94] update language --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 408eb6690d3..54c0668de70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Updated -- Cumulus Repositories folder structure updated: +- 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` From 74323e4aed45f43cf71fdcd8c221906c3732bdb1 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 11:03:03 -0400 Subject: [PATCH 71/94] change updated to changed --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54c0668de70..4447cb8a4f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] -### Updated +### Changed - Cumulus repository folders structure updated: - removed the `cumulus` folder altogether From 94ddc4292713f490a8b087cd474290a4a675e5c5 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 11:49:14 -0400 Subject: [PATCH 72/94] deprecate discover-s3-granules --- CHANGELOG.md | 3 +++ tasks/{ => .deprecated}/discover-s3-granules/README.md | 0 tasks/{ => .deprecated}/discover-s3-granules/index.js | 0 tasks/{ => .deprecated}/discover-s3-granules/package.json | 0 .../{ => .deprecated}/discover-s3-granules/schemas/config.json | 0 .../{ => .deprecated}/discover-s3-granules/schemas/output.json | 0 .../discover-s3-granules/tests/fixtures/input.json | 0 tasks/{ => .deprecated}/discover-s3-granules/tests/index.js | 0 tasks/{ => .deprecated}/discover-s3-granules/webpack.config.js | 0 9 files changed, 3 insertions(+) rename tasks/{ => .deprecated}/discover-s3-granules/README.md (100%) rename tasks/{ => .deprecated}/discover-s3-granules/index.js (100%) rename tasks/{ => .deprecated}/discover-s3-granules/package.json (100%) rename tasks/{ => .deprecated}/discover-s3-granules/schemas/config.json (100%) rename tasks/{ => .deprecated}/discover-s3-granules/schemas/output.json (100%) rename tasks/{ => .deprecated}/discover-s3-granules/tests/fixtures/input.json (100%) rename tasks/{ => .deprecated}/discover-s3-granules/tests/index.js (100%) rename tasks/{ => .deprecated}/discover-s3-granules/webpack.config.js (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4447cb8a4f0..355e3ca28af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - 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 + +### 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] diff --git a/tasks/discover-s3-granules/README.md b/tasks/.deprecated/discover-s3-granules/README.md similarity index 100% rename from tasks/discover-s3-granules/README.md rename to tasks/.deprecated/discover-s3-granules/README.md diff --git a/tasks/discover-s3-granules/index.js b/tasks/.deprecated/discover-s3-granules/index.js similarity index 100% rename from tasks/discover-s3-granules/index.js rename to tasks/.deprecated/discover-s3-granules/index.js diff --git a/tasks/discover-s3-granules/package.json b/tasks/.deprecated/discover-s3-granules/package.json similarity index 100% rename from tasks/discover-s3-granules/package.json rename to tasks/.deprecated/discover-s3-granules/package.json diff --git a/tasks/discover-s3-granules/schemas/config.json b/tasks/.deprecated/discover-s3-granules/schemas/config.json similarity index 100% rename from tasks/discover-s3-granules/schemas/config.json rename to tasks/.deprecated/discover-s3-granules/schemas/config.json diff --git a/tasks/discover-s3-granules/schemas/output.json b/tasks/.deprecated/discover-s3-granules/schemas/output.json similarity index 100% rename from tasks/discover-s3-granules/schemas/output.json rename to tasks/.deprecated/discover-s3-granules/schemas/output.json diff --git a/tasks/discover-s3-granules/tests/fixtures/input.json b/tasks/.deprecated/discover-s3-granules/tests/fixtures/input.json similarity index 100% rename from tasks/discover-s3-granules/tests/fixtures/input.json rename to tasks/.deprecated/discover-s3-granules/tests/fixtures/input.json diff --git a/tasks/discover-s3-granules/tests/index.js b/tasks/.deprecated/discover-s3-granules/tests/index.js similarity index 100% rename from tasks/discover-s3-granules/tests/index.js rename to tasks/.deprecated/discover-s3-granules/tests/index.js diff --git a/tasks/discover-s3-granules/webpack.config.js b/tasks/.deprecated/discover-s3-granules/webpack.config.js similarity index 100% rename from tasks/discover-s3-granules/webpack.config.js rename to tasks/.deprecated/discover-s3-granules/webpack.config.js From 5e57490eee09c30e067dd2f7ac517d39d8304142 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 11:50:35 -0400 Subject: [PATCH 73/94] remove discover-s3-granules --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 02db97e4b2d..cee948edb81 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -80,7 +80,6 @@ jobs: - ./tasks/queue-granules/node_modules - ./tasks/queue-pdrs/node_modules - ./tasks/sync-granule/node_modules - - ./tasks/discover-s3-granules/node_modules - ./tasks/sf-sns-report/node_modules - run: From 8d1a9386a6b0a1e6c8a66e36959a918c797a98d9 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 11:58:58 -0400 Subject: [PATCH 74/94] update ratchet number --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index ea29ccd0715..fba12d19c74 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1362 +1349 From 9adc96e29291abb763004b8de4bf0f21fb4fbc8a Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 14:31:30 -0400 Subject: [PATCH 75/94] remove tmp-test-data --- .tmp-test-data/.gitignore | 3 --- .tmp-test-data/README | 6 ------ 2 files changed, 9 deletions(-) delete mode 100644 .tmp-test-data/.gitignore delete mode 100644 .tmp-test-data/README 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. From 4590fa24074beea183e78acaaebef7fffd9729eb Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 14:31:40 -0400 Subject: [PATCH 76/94] load html test data from test-data package --- .circleci/config.yml | 2 +- docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cee948edb81..3c303d3aa28 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,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 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" From 190d8545a0d9d6381f2f2ad2a0837192689cfb77 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 14:31:57 -0400 Subject: [PATCH 77/94] use data from test-data package --- tasks/discover-granules/tests/index.js | 40 ++++---------------------- tasks/discover-pdrs/tests/index.js | 27 +++-------------- 2 files changed, 9 insertions(+), 58 deletions(-) diff --git a/tasks/discover-granules/tests/index.js b/tasks/discover-granules/tests/index.js index 00cfa8a93ee..bbfbee8104b 100644 --- a/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 @@ -88,29 +85,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', @@ -118,6 +95,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); @@ -133,10 +111,7 @@ test('discover granules using HTTP', async (t) => { } finally { // Clean up - await Promise.all([ - recursivelyDeleteS3Bucket(internalBucketName), - fs.remove(providerPathDirectory) - ]); + await recursivelyDeleteS3Bucket(event.config.bucket); } }); @@ -145,12 +120,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() ]); @@ -188,8 +159,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/tasks/discover-pdrs/tests/index.js b/tasks/discover-pdrs/tests/index.js index 6c5bd31bd50..26c44669ade 100644 --- a/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); } }); From 6ba38694c0cfd08080ae8ff318ae00fba5aa6e98 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 14:32:28 -0400 Subject: [PATCH 78/94] move changed to fixed --- CHANGELOG.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 355e3ca28af..20192040451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] -### Changed - -- 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 - ### Deprecated - discover-s3-granules is deprecated. The functionality is provided by the discover-granules task ### Fixed @@ -23,6 +15,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - **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-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 ## [v1.2.0] - 2018-03-20 From 91d3613d381dfed2a5e712105d08741ce44b39ad Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 15:55:14 -0400 Subject: [PATCH 79/94] use test files in test-data packages --- tasks/parse-pdr/tests/parse_pdrs_test.js | 19 ++--------- tasks/sync-granule/tests/sync_granule_test.js | 33 +++---------------- 2 files changed, 7 insertions(+), 45 deletions(-) diff --git a/tasks/parse-pdr/tests/parse_pdrs_test.js b/tasks/parse-pdr/tests/parse_pdrs_test.js index 42f6f3e75a8..900627ffc6a 100644 --- a/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); } }); diff --git a/tasks/sync-granule/tests/sync_granule_test.js b/tasks/sync-granule/tests/sync_granule_test.js index 210f43fb779..ab7fb179898 100644 --- a/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) => { @@ -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 From f6cba324e573a541689b27e12437590d46890854 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 15:59:02 -0400 Subject: [PATCH 80/94] less eslint errors Yay! --- .eslint-ratchet-high-water-mark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index fba12d19c74..79abba8435f 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1349 +1348 From 0a1b0a9837840c799a321424f93f5eaa0a66e788 Mon Sep 17 00:00:00 2001 From: Scisco Date: Wed, 28 Mar 2018 16:08:13 -0400 Subject: [PATCH 81/94] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20192040451..0d6cd017803 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - 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: From 6d884a5e1be8158b5fd6c5352780db697ca0cb10 Mon Sep 17 00:00:00 2001 From: sethvincent Date: Thu, 29 Mar 2018 13:15:25 -0400 Subject: [PATCH 82/94] add hello-world/schemas/output.json --- tasks/hello-world/schemas/output.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tasks/hello-world/schemas/output.json 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" + } + } +} From 31a96f162044d0fa533f7f391004e489d0eff7d6 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 13:46:10 -0400 Subject: [PATCH 83/94] CUMULUS-436: Add activities support to @cumulus/integration-tests (#277) **Summary:** Adds support for testing output of activities in workflow tests Addresses https://bugs.earthdata.nasa.gov/browse/CUMULUS-436 ## Changes * Replaces `integration-tests/lambda.js` with `integration-tests/sfnStep.js` and removes many reference to `lambda` * `sfnStep.js` includes `LambdaStep` and `ActivityStep` classes which inherit from `SfnStep` * Update CHANGELOG * Update exports from `integration-tests/index.js` ## Test Plan - [x] N/A Unit tests - [x] Integration tests passing (see https://github.com/cumulus-nasa/cumulus-integration-tests/pull/10) - [x] Updated CHANGELOG Reviewers: @sethvincent @yjpa7145 @laurenfrederick --- .eslint-ratchet-high-water-mark | 2 +- CHANGELOG.md | 3 + packages/integration-tests/index.js | 16 ++- packages/integration-tests/lambda.js | 89 -------------- packages/integration-tests/sfnStep.js | 166 ++++++++++++++++++++++++++ 5 files changed, 181 insertions(+), 95 deletions(-) delete mode 100644 packages/integration-tests/lambda.js create mode 100644 packages/integration-tests/sfnStep.js diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 79abba8435f..4e98696eb77 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1348 +1344 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d6cd017803..e2d16df7bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - moved the tasks that are not converted to use CMA to `tasks/.not_CMA_compliant` - updated paths where necessary +### Added +- `@cumulus/integration-tests` supports testing the output of an activity-type step in addition to a lambda-type step. + ## [v1.2.0] - 2018-03-20 ### Fixed 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/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 +}; From c276e9639f5c0fa248ef3ce3e08ca47f072914a8 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 13:52:45 -0400 Subject: [PATCH 84/94] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d16df7bb8..0dbc2e66a6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ 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 @@ -118,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 From 77c707fa009382912beaa0c3e45cd196555ed682 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 13:53:13 -0400 Subject: [PATCH 85/94] Update packages to 1.3.0 --- lerna.json | 2 +- packages/api/package.json | 10 +++++----- packages/cmrjs/package.json | 4 ++-- packages/common/package.json | 4 ++-- packages/deployment/package.json | 2 +- packages/ingest/package.json | 8 ++++---- packages/integration-tests/package.json | 6 +++--- packages/pvl/package.json | 2 +- packages/task-debug/package.json | 4 ++-- packages/test-data/package.json | 2 +- tasks/discover-granules/package.json | 8 ++++---- tasks/discover-pdrs/package.json | 8 ++++---- tasks/hello-world/package.json | 2 +- tasks/parse-pdr/package.json | 8 ++++---- tasks/pdr-status-check/package.json | 8 ++++---- tasks/post-to-cmr/package.json | 10 +++++----- tasks/queue-granules/package.json | 6 +++--- tasks/queue-pdrs/package.json | 6 +++--- tasks/sf-sns-report/package.json | 6 +++--- tasks/sync-granule/package.json | 8 ++++---- 20 files changed, 57 insertions(+), 57 deletions(-) diff --git a/lerna.json b/lerna.json index 79938b19107..2d92da360fc 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "2.9.0", - "version": "1.2.0", + "version": "1.3.0", "packages": [ "packages/*", "tasks/*" 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/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/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/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/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/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/tasks/discover-granules/package.json b/tasks/discover-granules/package.json index 445629397f6..7fc853b84c2 100644 --- a/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": { @@ -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/tasks/discover-pdrs/package.json b/tasks/discover-pdrs/package.json index 0bf7faef33a..8020e9a6033 100644 --- a/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": { @@ -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/tasks/hello-world/package.json b/tasks/hello-world/package.json index 6273b71f850..5ca554df175 100644 --- a/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": { diff --git a/tasks/parse-pdr/package.json b/tasks/parse-pdr/package.json index fd2d5d43b34..f8ab352b5a2 100644 --- a/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": { @@ -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/tasks/pdr-status-check/package.json b/tasks/pdr-status-check/package.json index a9d53082110..faee5feb30e 100644 --- a/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": { @@ -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", diff --git a/tasks/post-to-cmr/package.json b/tasks/post-to-cmr/package.json index 872a54c928b..284906d962e 100644 --- a/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": { @@ -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/tasks/queue-granules/package.json b/tasks/queue-granules/package.json index c82495cae90..868639cf604 100644 --- a/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": { @@ -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/tasks/queue-pdrs/package.json b/tasks/queue-pdrs/package.json index cb668df09ca..1c95bcc736f 100644 --- a/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": { @@ -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/tasks/sf-sns-report/package.json b/tasks/sf-sns-report/package.json index b7e98de5c39..4c5ca7e3761 100644 --- a/tasks/sf-sns-report/package.json +++ b/tasks/sf-sns-report/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sf-sns-report", - "version": "1.2.0", + "version": "1.3.0", "description": "Broadcasts an incoming Cumulus message to SNS", "main": "index.js", "directories": { @@ -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/tasks/sync-granule/package.json b/tasks/sync-granule/package.json index d534e03a6d2..eb698b7a301 100644 --- a/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": { @@ -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", From b92de0694b033b879fd58466352f2992f2f256f9 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 15:08:16 -0400 Subject: [PATCH 86/94] Minor changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dbc2e66a6a..fa29373c141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - updated paths where necessary ### Added -- `@cumulus/integration-tests` supports testing the output of an activity-type step in addition to a lambda-type step. +- `@cumulus/integration-tests` supports testing the output of an ECS activity step in addition to a Lambda step. ## [v1.2.0] - 2018-03-20 From 44661e232746ed529bffa3a1bb19d072ea356a86 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 15:29:20 -0400 Subject: [PATCH 87/94] Minor changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa29373c141..d875449d267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - updated paths where necessary ### Added -- `@cumulus/integration-tests` supports testing the output of an ECS activity step in addition to a Lambda step. +- `@cumulus/integration-tests` supports testing the output of an ECS activity as well as a Lambda step. ## [v1.2.0] - 2018-03-20 From 955e9e89e71d741f05e9f2c429f9c20a14e10416 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 16:47:25 -0400 Subject: [PATCH 88/94] Chage lambda step to lambda function --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d875449d267..28ffc7f3d73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - updated paths where necessary ### Added -- `@cumulus/integration-tests` supports testing the output of an ECS activity as well as a Lambda step. +- `@cumulus/integration-tests` supports testing the output of an ECS activity as well as a Lambda function. ## [v1.2.0] - 2018-03-20 From 720573e88513c2a35d4913978e305e45e8570965 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 17:06:34 -0400 Subject: [PATCH 89/94] Minor changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28ffc7f3d73..85faa4ef0b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - updated paths where necessary ### Added -- `@cumulus/integration-tests` supports testing the output of an ECS activity as well as a Lambda function. +- `@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 From 1e67973aad27bf2873b22241bae768a5ca2b34ff Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 18:25:15 -0400 Subject: [PATCH 90/94] Minor changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85faa4ef0b7..d2562147e98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - updated paths where necessary ### Added -- `@cumulus/integration-tests` - added support for testing the output of an ECS activity as well as a Lambda function. +- `@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 From 593157b8895701a12daf2ec941aa23abe74da88d Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 18:51:13 -0400 Subject: [PATCH 91/94] Minor changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2562147e98..77c637c035b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - updated paths where necessary ### Added -- `@cumulus/integration-tests`: Added support for testing the output of an ECS activity as well as a Lambda function. +- `@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 From dee92462c7150e43c0a0759699dcbcdf0c9f27b2 Mon Sep 17 00:00:00 2001 From: Aimee Barciauskas Date: Thu, 29 Mar 2018 23:01:04 -0400 Subject: [PATCH 92/94] Fix some lint errors and update .eslint-ratchet-high-water-mark --- .eslint-ratchet-high-water-mark | 2 +- packages/integration-tests/bin/cli.js | 6 ++++-- packages/integration-tests/local.js | 13 +++---------- packages/integration-tests/webpack.config.js | 2 +- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/.eslint-ratchet-high-water-mark b/.eslint-ratchet-high-water-mark index 4e98696eb77..3bf5890ffb0 100644 --- a/.eslint-ratchet-high-water-mark +++ b/.eslint-ratchet-high-water-mark @@ -1 +1 @@ -1344 \ No newline at end of file +1338 \ No newline at end of file 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/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/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 +}; From 3233094eb8c5a76ef6801fbc3e80dea80736c5bb Mon Sep 17 00:00:00 2001 From: Scisco Date: Fri, 30 Mar 2018 12:07:41 -0400 Subject: [PATCH 93/94] test publishing from tag --- .circleci/config.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3c303d3aa28..f274e3a567d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -139,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 @@ -159,4 +163,4 @@ workflows: - build_and_test filters: branches: - only: release + only: release-version-1.3.0 From c9dc2fb8589fc48da8c0d66a8bbfe65c27985348 Mon Sep 17 00:00:00 2001 From: Scisco Date: Fri, 30 Mar 2018 12:36:15 -0400 Subject: [PATCH 94/94] update readme --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index f6747539022..4e9ac6701f8 100644 --- a/README.md +++ b/README.md @@ -169,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