From c7c46db5a1725d3387bea682c39f42212ecd4358 Mon Sep 17 00:00:00 2001 From: yoution Date: Tue, 4 Feb 2020 13:38:43 +0800 Subject: [PATCH 1/5] change aws s3 cli to aws-sdk --- package.json | 2 +- src/routes/attachments/create.js | 17 ++++++--- src/util.js | 62 +++++++++++++++++++++----------- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index a7e72a9c..6490f091 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "amqplib": "^0.5.1", "analytics-node": "^2.1.1", "app-module-path": "^1.0.7", - "aws-sdk": "^2.468.0", + "aws-sdk": "^2.610.0", "axios": "^0.19.0", "bluebird": "^3.4.1", "body-parser": "^1.15.0", diff --git a/src/routes/attachments/create.js b/src/routes/attachments/create.js index be69ab48..ac9a2061 100644 --- a/src/routes/attachments/create.js +++ b/src/routes/attachments/create.js @@ -76,17 +76,26 @@ module.exports = [ contentType: data.contentType, isPublic: false, }, + // Promise.resolve({ + // status: 200, + // data: { + // result: { + // status: 200, + // }, + // }, }).then((resp) => { req.log.debug('Presigned Url resp: ', JSON.stringify(resp.data, null, 2)); if (resp.status !== 200 || resp.data.result.status !== 200) { return reject(new Error(resp.data.result.message)); } - // store deistination path & url - const destinationUri = `s3://${config.get('attachmentsS3Bucket')}/${filePath}`; - const sourceUri = `s3://${data.s3Bucket}/${data.filePath}`; + const sourceBucket = data.s3Bucket; + const sourceKey = data.filePath; + const destBucket = config.get('attachmentsS3Bucket'); + const destKey = filePath; + req.log.debug('Moving s3 file'); // transfer file - return util.s3FileTransfer(req, sourceUri, destinationUri); + return util.s3FileTransfer(req, sourceBucket, sourceKey, destBucket, destKey); }).then(() => accept()).catch(reject); } else { accept(); diff --git a/src/util.js b/src/util.js index a593751e..1f096f5f 100644 --- a/src/util.js +++ b/src/util.js @@ -15,10 +15,10 @@ import querystring from 'querystring'; import config from 'config'; import urlencode from 'urlencode'; import elasticsearch from 'elasticsearch'; +import AWS from 'aws-sdk'; // import jp from 'jsonpath'; import Promise from 'bluebird'; import models from './models'; -// import AWS from 'aws-sdk'; import { ADMIN_ROLES, @@ -30,7 +30,6 @@ import { RESOURCES, } from './constants'; -const exec = require('child_process').exec; const tcCoreLibAuth = require('tc-core-library-js').auth; const m2m = tcCoreLibAuth.m2m(config); @@ -269,28 +268,49 @@ _.assignIn(util, { /** * Moves file from source to destination - * @param {object} req request object - * @param {object} source source object - * @param {string} dest destination url + * @param {object} req request object + * @param {string} sourceBucket source bucket + * @param {string} sourceKey source key + * @param {string} destBucket destination bucket + * @param {string} destKey destination key * @return {promise} promise */ - s3FileTransfer: (req, source, dest) => new Promise((resolve, reject) => { - const cmdStr = _.join([ - 'aws s3 mv', - `"${source}"`, - `"${dest}"`, - '--region us-east-1', - ], ' '); - exec(cmdStr, (error, stdout, stderr) => { - req.log.debug(`s3FileTransfer: stdout: ${stdout}`); - req.log.debug(`s3FileTransfer: stderr: ${stderr}`); - if (error !== null) { - req.log.error(`exec error: ${error}`); - return reject(error); - } - return resolve({ success: true }); + s3FileTransfer: async (req, sourceBucket, sourceKey, destBucket, destKey) => { + const s3 = new AWS.S3({ + Region: 'us-east-1', + apiVersion: '2006-03-01', }); - }), + + + try { + const sourceParam = { + Bucket: sourceBucket, + Key: sourceKey, + }; + + const copyParam = { + Bucket: destBucket, + Key: destKey, + CopySource: `${sourceBucket}/${sourceKey}`, + }; + + await s3.copyObject(copyParam).promise(); + req.log.debug(`s3FileTransfer: copyObject successfully: ${sourceBucket}/${sourceKey}`); + // expect delteObject not block the request + setTimeout(async () => { + try { + await s3.deleteObject(sourceParam).promise(); + req.log.debug(`s3FileTransfer: deleteObject successfully: ${sourceBucket}/${sourceKey}`); + } catch (e) { + req.log.debug(`s3FileTransfer: deleteObject failed: ${sourceBucket}/${sourceKey} : ${e.message}`); + } + }); + return { success: true }; + } catch (e) { + req.log.debug(`s3FileTransfer: error: ${e.message}`); + throw e; + } + }, /** From 02d40b2375c9c2f47ad1edb538f291df850217a5 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Tue, 4 Feb 2020 14:06:35 +0800 Subject: [PATCH 2/5] refactor: don't use setTimeout for deleting S3 object --- src/util.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/util.js b/src/util.js index 1f096f5f..5c8b7687 100644 --- a/src/util.js +++ b/src/util.js @@ -281,7 +281,6 @@ _.assignIn(util, { apiVersion: '2006-03-01', }); - try { const sourceParam = { Bucket: sourceBucket, @@ -296,18 +295,18 @@ _.assignIn(util, { await s3.copyObject(copyParam).promise(); req.log.debug(`s3FileTransfer: copyObject successfully: ${sourceBucket}/${sourceKey}`); - // expect delteObject not block the request - setTimeout(async () => { + // we don't want deleteObject to block the request as it's not critical operation + (async () => { try { await s3.deleteObject(sourceParam).promise(); req.log.debug(`s3FileTransfer: deleteObject successfully: ${sourceBucket}/${sourceKey}`); } catch (e) { - req.log.debug(`s3FileTransfer: deleteObject failed: ${sourceBucket}/${sourceKey} : ${e.message}`); + req.log.error(`s3FileTransfer: deleteObject failed: ${sourceBucket}/${sourceKey} : ${e.message}`); } - }); + })(); return { success: true }; } catch (e) { - req.log.debug(`s3FileTransfer: error: ${e.message}`); + req.log.error(`s3FileTransfer: error: ${e.message}`); throw e; } }, From b4c3a50b07ce7301e3da51198fb38fb520e1842e Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Tue, 4 Feb 2020 15:09:41 +0800 Subject: [PATCH 3/5] fix: enabling file uploading on dev --- src/routes/attachments/download.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/attachments/download.js b/src/routes/attachments/download.js index d925774a..3cc289f4 100644 --- a/src/routes/attachments/download.js +++ b/src/routes/attachments/download.js @@ -12,7 +12,7 @@ import util from '../../util'; const permissions = tcMiddleware.permissions; const getFileDownloadUrl = (req, filePath) => { - if (process.env.NODE_ENV === 'development' || config.get('enableFileUpload') === false) { + if (process.env.NODE_ENV === 'development' && config.get('enableFileUpload') === 'false') { return ['', 'dummy://url']; } return util.getFileDownloadUrl(req, filePath); From ac566176796ac10a08e0382c3aff7fa31c2b9cdc Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Tue, 4 Feb 2020 15:46:21 +0800 Subject: [PATCH 4/5] fix: remove redundant call for ${fileServiceUrl}uploadurl --- src/routes/attachments/create.js | 42 ++++++-------------------------- 1 file changed, 8 insertions(+), 34 deletions(-) diff --git a/src/routes/attachments/create.js b/src/routes/attachments/create.js index ac9a2061..54fd0d7d 100644 --- a/src/routes/attachments/create.js +++ b/src/routes/attachments/create.js @@ -66,41 +66,15 @@ module.exports = [ fileServiceUrl += '/'; } - const fileTransferPromise = new Promise((accept, reject) => { - if (process.env.NODE_ENV !== 'development' || config.get('enableFileUpload') === 'true') { - // get pre-signed Url - req.log.debug('requesting presigned Url'); - httpClient.post(`${fileServiceUrl}uploadurl/`, { - param: { - filePath, - contentType: data.contentType, - isPublic: false, - }, - // Promise.resolve({ - // status: 200, - // data: { - // result: { - // status: 200, - // }, - // }, - }).then((resp) => { - req.log.debug('Presigned Url resp: ', JSON.stringify(resp.data, null, 2)); - if (resp.status !== 200 || resp.data.result.status !== 200) { - return reject(new Error(resp.data.result.message)); - } - const sourceBucket = data.s3Bucket; - const sourceKey = data.filePath; - const destBucket = config.get('attachmentsS3Bucket'); - const destKey = filePath; + const sourceBucket = data.s3Bucket; + const sourceKey = data.filePath; + const destBucket = config.get('attachmentsS3Bucket'); + const destKey = filePath; - req.log.debug('Moving s3 file'); - // transfer file - return util.s3FileTransfer(req, sourceBucket, sourceKey, destBucket, destKey); - }).then(() => accept()).catch(reject); - } else { - accept(); - } - }); + // don't actually transfer file in development mode if file uploading is disabled, so we can test this endpoint + const fileTransferPromise = (process.env.NODE_ENV !== 'development' || config.get('enableFileUpload') === 'true') + ? util.s3FileTransfer(req, sourceBucket, sourceKey, destBucket, destKey) + : Promise.resolve(); fileTransferPromise.then(() => { // file copied to final destination, create DB record From 8dd6e2de6c1a08b21ade2dba4e134a761f7061a8 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Wed, 5 Feb 2020 15:44:41 +0800 Subject: [PATCH 5/5] chore: update package-lock for master after changing aws version --- package-lock.json | 170 ++++++++++++++++++++++++++++++---------------- 1 file changed, 111 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 586f817e..5ac8f9d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -410,19 +410,26 @@ } }, "aws-sdk": { - "version": "2.568.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.568.0.tgz", - "integrity": "sha512-jPvhiJV2iLyWbJJDM01gvUCzeChWUeRMkIr6dsHu+leH2QnzvGNunTwMGculKE1jouXatajZEoA9bdqfosranw==", - "requires": { - "buffer": "^4.9.1", - "events": "^1.1.1", - "ieee754": "^1.1.13", - "jmespath": "^0.15.0", - "querystring": "^0.2.0", - "sax": "^1.2.1", - "url": "^0.10.3", - "uuid": "^3.3.2", - "xml2js": "^0.4.19" + "version": "2.611.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.611.0.tgz", + "integrity": "sha512-2Y0vqEUQFRJE/5Ne6IYgP2y+8XEp0jQefHxlwdqwj9n9a8OmdsmBnNaw2IVsyxySgk2ynp38+imBJaceDNKiiQ==", + "requires": { + "buffer": "4.9.1", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } } }, "aws-sign2": { @@ -1858,9 +1865,9 @@ "dev": true }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -2541,8 +2548,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-require-extensions": { "version": "1.0.0", @@ -2568,6 +2574,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -2781,6 +2788,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", @@ -2798,6 +2806,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2897,6 +2906,26 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", + "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "escope": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", @@ -3062,8 +3091,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.0.1", @@ -3086,14 +3114,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -3312,8 +3338,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "figures": { "version": "1.7.0", @@ -4111,7 +4136,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "generate-function": { "version": "2.3.1", @@ -4275,6 +4301,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -4296,7 +4323,8 @@ "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "has-value": { "version": "1.0.0", @@ -4608,7 +4636,8 @@ "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true }, "is-ci": { "version": "1.2.1", @@ -4631,7 +4660,8 @@ "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=" + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true }, "is-descriptor": { "version": "0.1.6", @@ -4829,6 +4859,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, "requires": { "has": "^1.0.1" } @@ -4855,6 +4886,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, "requires": { "has-symbols": "^1.0.0" } @@ -5216,6 +5248,28 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsonpath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.0.2.tgz", + "integrity": "sha512-rmzlgFZiQPc6q4HDyK8s9Qb4oxBnI5sF61y/Co5PV0lc3q2bIuRsNdueVbhoSHdKM4fxeimphOAtfz47yjCfeA==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.7.0" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=" + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + } + } + }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", @@ -5358,7 +5412,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -6510,12 +6563,14 @@ "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object-visit": { "version": "1.0.1", @@ -6562,6 +6617,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" @@ -6662,7 +6718,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -6993,8 +7048,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", @@ -7853,9 +7907,9 @@ "integrity": "sha1-1PCvdHXZp7ryqeWmEXGLqheKOeE=" }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "semver": { "version": "5.7.1", @@ -8321,6 +8375,14 @@ "tweetnacl": "~0.14.0" } }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -8362,6 +8424,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -8371,6 +8434,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -8743,7 +8807,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -9072,15 +9135,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -9217,8 +9271,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { "version": "1.0.0", @@ -9320,19 +9373,18 @@ "dev": true }, "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { "sax": ">=0.6.0", - "util.promisify": "~1.0.0", - "xmlbuilder": "~11.0.0" + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xtend": { "version": "4.0.2",