diff --git a/.vscode/launch.json b/.vscode/launch.json index de065d110..c919f6d71 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,7 +4,9 @@ { "type": "node", "request": "attach", - "name": "Attach" + "name": "Attach", + "restart": true, + "timeout": 50000 }, { "type": "node", "request": "attach", diff --git a/client/agency/src/zone/search-panel/index.html b/client/agency/src/zone/search-panel/index.html index c5193a385..d3f06d8b3 100644 --- a/client/agency/src/zone/search-panel/index.html +++ b/client/agency/src/zone/search-panel/index.html @@ -3,11 +3,18 @@ + + + + + + + + - - - - History - - - - Date - Changed by - Model - Action - Instance - Before - After - - - - - - {{::clientLog.creationDate | date:'dd/MM/yyyy HH:mm'}} -
-
- Changed by: - {{::clientLog.user.name}} -
-
- Model: - {{::clientLog.changedModel}} -
-
- Action: - {{::clientLog.action}} -
-
- Instance: - {{::clientLog.changedModelValue}} -
-
-
- - {{::clientLog.user.name}} - - - {{::clientLog.changedModel}} - - - {{::clientLog.action}} - - - {{::clientLog.changedModelValue}} - - - -
- {{::old.key}}: - {{::old.value}} -
-
-
- - -
- {{::new.key}}: - {{::new.value}} -
-
-
-
-
- - No results - -
-
- - -
-
+ \ No newline at end of file diff --git a/client/client/src/log/index.js b/client/client/src/log/index.js index c0ee42009..18cc42a07 100644 --- a/client/client/src/log/index.js +++ b/client/client/src/log/index.js @@ -1,5 +1,4 @@ import ngModule from '../module'; -import './style.scss'; class Controller { constructor($scope, $stateParams) { @@ -22,18 +21,17 @@ class Controller { set logs(value) { this._logs = value; - if (this.logs) { - this.logs.forEach((log) => { + if (this.logs) + this.logs.forEach(log => { log.oldProperties = this.getInstance(log.oldInstance); log.newProperties = this.getInstance(log.newInstance); }); - } } getInstance(instance) { const properties = []; - Object.keys(instance).forEach((property) => { + Object.keys(instance).forEach(property => { properties.push({key: property, value: instance[property]}); }); diff --git a/client/client/src/search-panel/index.html b/client/client/src/search-panel/index.html index de772afe3..14619ed94 100644 --- a/client/client/src/search-panel/index.html +++ b/client/client/src/search-panel/index.html @@ -1,22 +1,61 @@
- - + + - + + + + - + + - - + + - - + + + + + + + + + + diff --git a/client/core/src/components/crud-model/crud-model.js b/client/core/src/components/crud-model/crud-model.js index 9682416b5..a18ff4ad4 100644 --- a/client/core/src/components/crud-model/crud-model.js +++ b/client/core/src/components/crud-model/crud-model.js @@ -135,14 +135,14 @@ export default class CrudModel extends ModelProxy { if (!this.isChanged) return null; - let create = []; - let update = []; - let remove = []; + let deletes = []; + let updates = []; + let creates = []; let pk = this.primaryKey; for (let row of this.removed) - remove.push(row.$orgRow[pk]); + deletes.push(row.$orgRow[pk]); for (let row of this._data) if (row.$isNew) { @@ -150,22 +150,22 @@ export default class CrudModel extends ModelProxy { for (let prop in row) if (prop.charAt(0) !== '$') data[prop] = row[prop]; - create.push(data); + creates.push(data); } else if (row.$oldData) { let data = {}; for (let prop in row.$oldData) data[prop] = row[prop]; - update.push({ + updates.push({ data, where: {[pk]: row.$orgRow[pk]} }); } - let changes = { - create: create, - update: update, - delete: remove - }; + let changes = {deletes, updates, creates}; + + for (let prop in changes) + if (changes[prop].length === 0) + changes[prop] = undefined; return changes; } diff --git a/client/core/src/components/index.js b/client/core/src/components/index.js index 3914fc656..ab2cea5e9 100644 --- a/client/core/src/components/index.js +++ b/client/core/src/components/index.js @@ -42,3 +42,4 @@ import './chip'; import './input-number'; import './input-time'; import './fetched-tags'; +import './log'; diff --git a/client/core/src/components/log/index.html b/client/core/src/components/log/index.html new file mode 100644 index 000000000..1f19a49cf --- /dev/null +++ b/client/core/src/components/log/index.html @@ -0,0 +1,80 @@ + + + + History + + + + Date + Changed by + Model + Action + Instance + Before + After + + + + + + {{::log.creationDate | date:'dd/MM/yyyy HH:mm'}} +
+
+ Changed by: + {{::log.user.name}} +
+
+ Model: + {{::log.changedModel}} +
+
+ Action: + {{::log.action}} +
+
+ Instance: + {{::log.changedModelValue}} +
+
+
+ + {{::log.user.name}} + + + {{::log.changedModel}} + + + {{::log.action}} + + + {{::log.changedModelValue}} + + + +
+ {{::old.key}}: + {{::old.value}} +
+
+
+ + +
+ {{::new.key}}: + {{::new.value}} +
+
+
+
+
+ + No results + +
+
+ + +
+
diff --git a/client/core/src/components/log/index.js b/client/core/src/components/log/index.js new file mode 100644 index 000000000..7e5a8bd89 --- /dev/null +++ b/client/core/src/components/log/index.js @@ -0,0 +1,9 @@ +import ngModule from '../../module'; +import './style.scss'; + +ngModule.component('vnLog', { + template: require('./index.html'), + bindings: { + model: '<' + } +}); diff --git a/client/client/src/log/locale/es.yml b/client/core/src/components/log/locale/es.yml similarity index 100% rename from client/client/src/log/locale/es.yml rename to client/core/src/components/log/locale/es.yml diff --git a/client/client/src/log/style.scss b/client/core/src/components/log/style.scss similarity index 96% rename from client/client/src/log/style.scss rename to client/core/src/components/log/style.scss index a11cf5933..1a6dacf8a 100644 --- a/client/client/src/log/style.scss +++ b/client/core/src/components/log/style.scss @@ -1,6 +1,6 @@ @import 'colors'; -vn-client-log { +vn-log { vn-td { vertical-align: initial !important; } diff --git a/client/core/src/components/searchbar/searchbar.js b/client/core/src/components/searchbar/searchbar.js index 40a023d5a..13c86e8c8 100644 --- a/client/core/src/components/searchbar/searchbar.js +++ b/client/core/src/components/searchbar/searchbar.js @@ -159,14 +159,13 @@ export default class Controller extends Component { let regex = /((([\w_]+):([\w_]+))|([\w_]+):\(([\w_ ]+)\))/gi; let findPattern = searchString.match(regex); let remnantString = searchString.replace(regex, '').trim(); - if (findPattern) { + if (findPattern) for (let i = 0; i < findPattern.length; i++) { let aux = findPattern[i].split(':'); let property = aux[0]; let value = aux[1].replace(/\(|\)/g, ''); result[property] = value.trim(); } - } if (remnantString) result.search = remnantString; } diff --git a/client/core/src/locale/en.yml b/client/core/src/locale/en.yml index 613eda985..99a9b8049 100644 --- a/client/core/src/locale/en.yml +++ b/client/core/src/locale/en.yml @@ -12,4 +12,5 @@ Next: Next Finalize: Finalize Previous: Back Load more: Load more -Auto-scroll interrupted, please adjust the search: Auto-scroll interrupted, please adjust the search \ No newline at end of file +Auto-scroll interrupted, please adjust the search: Auto-scroll interrupted, please adjust the search +General search: General search \ No newline at end of file diff --git a/client/core/src/locale/es.yml b/client/core/src/locale/es.yml index 6c84cd925..0771b1181 100644 --- a/client/core/src/locale/es.yml +++ b/client/core/src/locale/es.yml @@ -23,4 +23,5 @@ Value can't be null: El valor no puede ser nulo Value should be %s characters long: El valor debe ser de %s carácteres de longitud Value should have a length between %s and %s: El valor debe tener una longitud de entre %s y %s Value should have at least %s characters: El valor debe tener al menos %s carácteres -Value should have at most %s characters: El valor debe tener un máximo de %s carácteres \ No newline at end of file +Value should have at most %s characters: El valor debe tener un máximo de %s carácteres +General search: Busqueda general \ No newline at end of file diff --git a/client/item/src/search-panel/index.html b/client/item/src/search-panel/index.html index e14444805..66bdefa44 100644 --- a/client/item/src/search-panel/index.html +++ b/client/item/src/search-panel/index.html @@ -4,10 +4,17 @@ + + + + + + + + + + + + - -
diff --git a/client/ticket/src/weekly/index.js b/client/ticket/src/weekly/index.js index 07f5dd66b..a81d100e3 100644 --- a/client/ticket/src/weekly/index.js +++ b/client/ticket/src/weekly/index.js @@ -2,30 +2,36 @@ import ngModule from '../module'; import './style.scss'; export default class Controller { - constructor($scope) { + constructor($scope, vnApp, $translate) { this.$scope = $scope; + this.vnApp = vnApp; + this._ = $translate; + this.ticketSelected = null; this.filter = { - include: [ - {relation: 'ticket', - scope: { - fields: ['id', 'clientFk', 'companyFk', 'warehouseFk'], - include: [ - {relation: 'client', - scope: { - fields: ['salesPersonFk', 'name'], - include: { - relation: 'salesPerson', - fields: ['firstName', 'name'] + include: { + relation: 'ticket', + scope: { + fields: ['id', 'clientFk', 'companyFk', 'warehouseFk'], + include: [ + { + relation: 'client', + scope: { + fields: ['salesPersonFk', 'name'], + include: { + relation: 'salesPerson', + scope: { + fields: ['id', 'firstName', 'name'] } } - }, - {relation: 'warehouse'} - ] - } + } + }, + {relation: 'warehouse'} + ] } - ] + } }; + this.weekdays = [ {id: 0, name: 'Monday'}, {id: 1, name: 'Tuesday'}, @@ -38,7 +44,7 @@ export default class Controller { } onSave() { - this.$scope.watcher.notifySaved(); + this.vnApp.showSuccess(this._.instant('Data saved!')); } showClientDescriptor(event, clientFk) { @@ -65,17 +71,9 @@ export default class Controller { this.expeditionId = expedition.id; this.$scope.deleteWeekly.show(); } - - onSubmit() { - this.$scope.watcher.check(); - this.$scope.model.save().then(() => { - this.$scope.watcher.notifySaved(); - this.$scope.model.refresh(); - }); - } } -Controller.$inject = ['$scope']; +Controller.$inject = ['$scope', 'vnApp', '$translate']; ngModule.component('vnTicketWeekly', { template: require('./index.html'), diff --git a/e2e/paths/client-module/03_edit_fiscal_data.spec.js b/e2e/paths/client-module/03_edit_fiscal_data.spec.js index 5992589d2..51116186d 100644 --- a/e2e/paths/client-module/03_edit_fiscal_data.spec.js +++ b/e2e/paths/client-module/03_edit_fiscal_data.spec.js @@ -6,409 +6,356 @@ describe('Client Edit fiscalData path', () => { describe('as employee', () => { beforeAll(() => { return nightmare - .waitForLogin('employee'); + .waitForLogin('employee'); }); - it('should click on the Clients button of the top bar menu', done => { - return nightmare - .waitToClick(selectors.globalItems.applicationsMenuButton) - .wait(selectors.globalItems.applicationsMenuVisible) - .waitToClick(selectors.globalItems.clientsButton) - .wait(selectors.clientsIndex.createClientButton) - .parsedUrl() - .then(url => { - expect(url.hash).toEqual('#!/client/index'); - done(); - }).catch(done.fail); + it('should click on the Clients button of the top bar menu', async () => { + const url = await nightmare + .waitToClick(selectors.globalItems.applicationsMenuButton) + .wait(selectors.globalItems.applicationsMenuVisible) + .waitToClick(selectors.globalItems.clientsButton) + .wait(selectors.clientsIndex.createClientButton) + .parsedUrl(); + + expect(url.hash).toEqual('#!/client/index'); }); - it('should search for the user Bruce Banner', done => { - return nightmare - .wait(selectors.clientsIndex.searchResult) - .type(selectors.clientsIndex.searchClientInput, 'Bruce Banner') - .click(selectors.clientsIndex.searchButton) - .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) - .countElement(selectors.clientsIndex.searchResult) - .then(result => { - expect(result).toEqual(1); - done(); - }).catch(done.fail); + it('should search for the user Bruce Banner', async () => { + const resultCount = await nightmare + .wait(selectors.clientsIndex.searchResult) + .type(selectors.clientsIndex.searchClientInput, 'Bruce Banner') + .click(selectors.clientsIndex.searchButton) + .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) + .countElement(selectors.clientsIndex.searchResult); + + expect(resultCount).toEqual(1); }); // Confirms all addresses have EQtax false for future propagation test step 1 - it(`should click on the search result to access to the client's addresses`, () => { - return nightmare - .waitForTextInElement(selectors.clientsIndex.searchResult, 'Bruce Banner') - .waitToClick(selectors.clientsIndex.searchResult) - .waitToClick(selectors.clientAddresses.addressesButton) - .waitForURL('/address/index') - .url() - .then(url => { - expect(url).toContain('/address/index'); - }); + it(`should click on the search result to access to the client's addresses`, async () => { + const url = await nightmare + .waitForTextInElement(selectors.clientsIndex.searchResult, 'Bruce Banner') + .waitToClick(selectors.clientsIndex.searchResult) + .waitToClick(selectors.clientAddresses.addressesButton) + .waitForURL('/address/index') + .url(); + + expect(url).toContain('/address/index'); }); // Confirms all addresses have EQtax false for future propagation test step 2 - it(`should click on the 1st edit icon to check EQtax isnt checked`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.firstEditButton) - .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientAddresses.equalizationTaxCheckboxLabel) - .then(value => { - expect(value).toBeFalsy(); - }); + it(`should click on the 1st edit icon to check EQtax isnt checked`, async () => { + const result = await nightmare + .waitToClick(selectors.clientAddresses.firstEditButton) + .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientAddresses.equalizationTaxCheckboxLabel); + + expect(result).toBeFalsy(); }); // Confirms all addresses have EQtax false for future propagation test step 3 - it(`should go back to addresses then select the second one and confirm the EQtax isnt checked`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.addressesButton) - .waitToClick(selectors.clientAddresses.secondEditButton) - .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientAddresses.equalizationTaxCheckboxLabel) - .then(value => { - expect(value).toBeFalsy(); - }); + it(`should go back to addresses then select the second one and confirm the EQtax isnt checked`, async () => { + const result = await nightmare + .waitToClick(selectors.clientAddresses.addressesButton) + .waitToClick(selectors.clientAddresses.secondEditButton) + .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientAddresses.equalizationTaxCheckboxLabel); + + expect(result).toBeFalsy(); }); - it(`should click on the fiscal data button`, () => { - return nightmare - .waitToClick(selectors.clientFiscalData.fiscalDataButton) - .waitForURL('fiscal-data') - .url() - .then(url => { - expect(url).toContain('fiscal-data'); - }); + it(`should click on the fiscal data button`, async () => { + const url = await nightmare + .waitToClick(selectors.clientFiscalData.fiscalDataButton) + .waitForURL('fiscal-data') + .url(); + + expect(url).toContain('fiscal-data'); }); - it('should not be able to edit the verified data checkbox', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).disabled; - }, selectors.clientFiscalData.verifiedDataCheckboxInput) - .then(value => { - expect(value).toBeTruthy(); - done(); - }).catch(done.fail); + it('should not be able to edit the verified data checkbox', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).disabled; + }, selectors.clientFiscalData.verifiedDataCheckboxInput); + + expect(result).toBeTruthy(); }); }); describe('as administrative', () => { beforeAll(() => { return nightmare - .waitForLogin('administrative'); + .waitForLogin('administrative'); }); - it('should now click on the Clients button of the top bar menu', done => { - return nightmare - .waitToClick(selectors.globalItems.applicationsMenuButton) - .wait(selectors.globalItems.applicationsMenuVisible) - .waitToClick(selectors.globalItems.clientsButton) - .wait(selectors.clientsIndex.createClientButton) - .parsedUrl() - .then(url => { - expect(url.hash).toEqual('#!/client/index'); - done(); - }).catch(done.fail); + it('should now click on the Clients button of the top bar menu', async () => { + const url = await nightmare + .waitToClick(selectors.globalItems.applicationsMenuButton) + .wait(selectors.globalItems.applicationsMenuVisible) + .waitToClick(selectors.globalItems.clientsButton) + .wait(selectors.clientsIndex.createClientButton) + .parsedUrl(); + + expect(url.hash).toEqual('#!/client/index'); }); - it('should now search for the user Bruce Banner', done => { - return nightmare - .wait(selectors.clientsIndex.searchResult) - .type(selectors.clientsIndex.searchClientInput, 'Bruce Banner') - .click(selectors.clientsIndex.searchButton) - .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) - .countElement(selectors.clientsIndex.searchResult) - .then(result => { - expect(result).toEqual(1); - done(); - }).catch(done.fail); + it('should now search for the user Bruce Banner', async () => { + const resultCount = await nightmare + .wait(selectors.clientsIndex.searchResult) + .type(selectors.clientsIndex.searchClientInput, 'Bruce Banner') + .click(selectors.clientsIndex.searchButton) + .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) + .countElement(selectors.clientsIndex.searchResult); + + expect(resultCount).toEqual(1); }); - it(`should access to the client fiscal data`, () => { - return nightmare - .waitForTextInElement(selectors.clientsIndex.searchResult, 'Bruce Banner') - .waitToClick(selectors.clientsIndex.searchResult) - .waitToClick(selectors.clientFiscalData.fiscalDataButton) - .waitForURL('fiscal-data') - .url() - .then(url => { - expect(url).toContain('fiscal-data'); - }); + it(`should access to the client fiscal data`, async () => { + const url = await nightmare + .waitForTextInElement(selectors.clientsIndex.searchResult, 'Bruce Banner') + .waitToClick(selectors.clientsIndex.searchResult) + .waitToClick(selectors.clientFiscalData.fiscalDataButton) + .waitForURL('fiscal-data') + .url(); + + expect(url).toContain('fiscal-data'); }); - it('should edit the clients fiscal data', done => { - return nightmare - .wait(selectors.clientFiscalData.socialNameInput) - .clearInput(selectors.clientFiscalData.socialNameInput) - .type(selectors.clientFiscalData.socialNameInput, 'SMASH!') - .waitForTextInInput(selectors.clientFiscalData.socialNameInput, 'SMASH!') - .clearInput(selectors.clientFiscalData.fiscalIdInput) - .type(selectors.clientFiscalData.fiscalIdInput, '94980061C') - .clearInput(selectors.clientFiscalData.addressInput) - .type(selectors.clientFiscalData.addressInput, 'Somewhere edited') - .clearInput(selectors.clientFiscalData.postcodeInput) - .type(selectors.clientFiscalData.postcodeInput, '12345') - .clearInput(selectors.clientFiscalData.cityInput) - .type(selectors.clientFiscalData.cityInput, 'N/A') - .waitToClick(selectors.clientFiscalData.countryInput) - .waitToClick(selectors.clientFiscalData.countryThirdOption) - .waitToClick(selectors.clientFiscalData.provinceInput) - .waitToClick(selectors.clientFiscalData.provinceFifthOption) - .waitToClick(selectors.clientFiscalData.activeCheckboxLabel) - .waitToClick(selectors.clientFiscalData.frozenCheckboxLabel) - .waitToClick(selectors.clientFiscalData.hasToInvoiceCheckboxLabel) - .waitToClick(selectors.clientFiscalData.viesCheckboxInput) - .waitToClick(selectors.clientFiscalData.invoiceByMailCheckboxLabel) - .waitToClick(selectors.clientFiscalData.invoiceByAddressCheckboxInput) - .waitToClick(selectors.clientFiscalData.equalizationTaxCheckboxLabel) - .waitToClick(selectors.clientFiscalData.verifiedDataCheckboxInput) - .click(selectors.clientFiscalData.saveButton) - .waitForLastSnackbar() - .then(result => { - expect(result).toEqual('Data saved!'); - done(); - }).catch(done.fail); + it('should edit the clients fiscal data', async () => { + const result = await nightmare + .wait(selectors.clientFiscalData.socialNameInput) + .clearInput(selectors.clientFiscalData.socialNameInput) + .type(selectors.clientFiscalData.socialNameInput, 'SMASH!') + .waitForTextInInput(selectors.clientFiscalData.socialNameInput, 'SMASH!') + .clearInput(selectors.clientFiscalData.fiscalIdInput) + .type(selectors.clientFiscalData.fiscalIdInput, '94980061C') + .clearInput(selectors.clientFiscalData.addressInput) + .type(selectors.clientFiscalData.addressInput, 'Somewhere edited') + .clearInput(selectors.clientFiscalData.postcodeInput) + .type(selectors.clientFiscalData.postcodeInput, '12345') + .clearInput(selectors.clientFiscalData.cityInput) + .type(selectors.clientFiscalData.cityInput, 'N/A') + .waitToClick(selectors.clientFiscalData.countryInput) + .waitToClick(selectors.clientFiscalData.countryThirdOption) + .waitToClick(selectors.clientFiscalData.provinceInput) + .waitToClick(selectors.clientFiscalData.provinceFifthOption) + .waitToClick(selectors.clientFiscalData.activeCheckboxLabel) + .waitToClick(selectors.clientFiscalData.frozenCheckboxLabel) + .waitToClick(selectors.clientFiscalData.hasToInvoiceCheckboxLabel) + .waitToClick(selectors.clientFiscalData.viesCheckboxInput) + .waitToClick(selectors.clientFiscalData.invoiceByMailCheckboxLabel) + .waitToClick(selectors.clientFiscalData.invoiceByAddressCheckboxInput) + .waitToClick(selectors.clientFiscalData.equalizationTaxCheckboxLabel) + .waitToClick(selectors.clientFiscalData.verifiedDataCheckboxInput) + .click(selectors.clientFiscalData.saveButton) + .waitForLastSnackbar(); + + expect(result).toEqual('Data saved!'); }); - it('should propagate the Equalization tax', done => { - return nightmare - .waitToClick(selectors.clientFiscalData.acceptPropagationButton) - .waitForLastSnackbar() - .then(result => { - expect(result).toEqual('Equivalent tax spreaded'); - done(); - }).catch(done.fail); + it('should propagate the Equalization tax', async () => { + const result = await nightmare + .waitToClick(selectors.clientFiscalData.acceptPropagationButton) + .waitForLastSnackbar(); + + expect(result).toEqual('Equivalent tax spreaded'); }); // confirm all addresses have now EQtax checked step 1 - it(`should click on the addresses button to access to the client's addresses`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.addressesButton) - .waitForURL('/address/index') - .url() - .then(url => { - expect(url).toContain('/address/index'); - }); + it(`should click on the addresses button to access to the client's addresses`, async () => { + const url = await nightmare + .waitToClick(selectors.clientAddresses.addressesButton) + .waitForURL('/address/index') + .url(); + + expect(url).toContain('/address/index'); }); // confirm all addresses have now EQtax checked step 2 - it(`should click on the 1st edit icon to confirm EQtax is checked`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.firstEditButton) - .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientAddresses.equalizationTaxCheckboxLabel) - .then(value => { - expect(value).toBeTruthy(); - }); + it(`should click on the 1st edit icon to confirm EQtax is checked`, async () => { + const result = await nightmare + .waitToClick(selectors.clientAddresses.firstEditButton) + .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientAddresses.equalizationTaxCheckboxLabel); + + expect(result).toBeTruthy(); }); // confirm all addresses have now EQtax checked step 3 - it(`should go back to addresses then select the second one and confirm the EQtax is checked`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.addressesButton) - .waitToClick(selectors.clientAddresses.secondEditButton) - .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientAddresses.equalizationTaxCheckboxLabel) - .then(value => { - expect(value).toBeTruthy(); - }); + it(`should go back to addresses then select the second one and confirm the EQtax is checked`, async () => { + const result = await nightmare + .waitToClick(selectors.clientAddresses.addressesButton) + .waitToClick(selectors.clientAddresses.secondEditButton) + .wait(selectors.clientAddresses.equalizationTaxCheckboxLabel) + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientAddresses.equalizationTaxCheckboxLabel); + + expect(result).toBeTruthy(); }); - it('should navigate back to fiscal data to confirm its name have been edited', done => { - return nightmare - .waitToClick(selectors.clientFiscalData.fiscalDataButton) - .wait(selectors.clientFiscalData.socialNameInput) - .getInputValue(selectors.clientFiscalData.socialNameInput) - .then(result => { - expect(result).toEqual('SMASH!'); - done(); - }).catch(done.fail); + it('should navigate back to fiscal data to confirm its name have been edited', async () => { + const result = await nightmare + .waitToClick(selectors.clientFiscalData.fiscalDataButton) + .wait(selectors.clientFiscalData.socialNameInput) + .getInputValue(selectors.clientFiscalData.socialNameInput); + + expect(result).toEqual('SMASH!'); }); - it('should confirm the fiscal id have been edited', done => { - return nightmare - .getInputValue(selectors.clientFiscalData.fiscalIdInput) - .then(result => { - expect(result).toEqual('94980061C'); - done(); - }).catch(done.fail); + it('should confirm the fiscal id have been edited', async () => { + const result = await nightmare + .getInputValue(selectors.clientFiscalData.fiscalIdInput); + + expect(result).toEqual('94980061C'); }); - it('should confirm the address have been edited', done => { - return nightmare - .getInputValue(selectors.clientFiscalData.addressInput) - .then(result => { - expect(result).toEqual('Somewhere edited'); - done(); - }).catch(done.fail); + it('should confirm the address have been edited', async () => { + const result = await nightmare + .getInputValue(selectors.clientFiscalData.addressInput); + + expect(result).toEqual('Somewhere edited'); }); - it('should confirm the postcode have been edited', done => { - return nightmare - .getInputValue(selectors.clientFiscalData.postcodeInput) - .then(result => { - expect(result).toEqual('12345'); - done(); - }).catch(done.fail); + it('should confirm the postcode have been edited', async () => { + const result = await nightmare + .getInputValue(selectors.clientFiscalData.postcodeInput); + + expect(result).toEqual('12345'); }); - it('should confirm the city have been edited', done => { - return nightmare - .getInputValue(selectors.clientFiscalData.cityInput) - .then(result => { - expect(result).toEqual('N/A'); - done(); - }).catch(done.fail); + it('should confirm the city have been edited', async () => { + const result = await nightmare + .getInputValue(selectors.clientFiscalData.cityInput); + + expect(result).toEqual('N/A'); }); - it(`should confirm the country have been selected`, () => { - return nightmare - .getInputValue(selectors.clientFiscalData.countryInput) - .then(result => { - expect(result).toEqual('Francia'); - }); + it(`should confirm the country have been selected`, async () => { + const result = await nightmare + .getInputValue(selectors.clientFiscalData.countryInput); + + expect(result).toEqual('Francia'); }); - it(`should confirm the province have been selected`, () => { - return nightmare - .getInputValue(selectors.clientFiscalData.provinceInput) - .then(result => { - expect(result).toEqual('Province two'); - }); + it(`should confirm the province have been selected`, async () => { + const result = await nightmare + .getInputValue(selectors.clientFiscalData.provinceInput); + + expect(result).toEqual('Province two'); }); - it('should confirm active checkbox is unchecked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.activeCheckboxLabel) - .then(value => { - expect(value).toBeFalsy(); - done(); - }).catch(done.fail); + it('should confirm active checkbox is unchecked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.activeCheckboxLabel); + + expect(result).toBeFalsy(); }); - it('should confirm frozen checkbox is unchecked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.frozenCheckboxLabel) - .then(value => { - expect(value).toBeFalsy(); - done(); - }).catch(done.fail); + it('should confirm frozen checkbox is unchecked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.frozenCheckboxLabel); + + expect(result).toBeFalsy(); }); - it('should confirm Has to invoice checkbox is unchecked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.hasToInvoiceCheckboxLabel) - .then(value => { - expect(value).toBeFalsy(); - done(); - }).catch(done.fail); + it('should confirm Has to invoice checkbox is unchecked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.hasToInvoiceCheckboxLabel); + + expect(result).toBeFalsy(); }); - it('should confirm Vies checkbox is checked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.viesCheckboxInput) - .then(value => { - expect(value).toBeTruthy(); - done(); - }).catch(done.fail); + it('should confirm Vies checkbox is checked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.viesCheckboxInput); + + expect(result).toBeTruthy(); }); - it('should confirm Invoice by mail checkbox is unchecked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.invoiceByMailCheckboxLabel) - .then(value => { - expect(value).toBeFalsy(); - done(); - }).catch(done.fail); + it('should confirm Invoice by mail checkbox is unchecked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.invoiceByMailCheckboxLabel); + + expect(result).toBeFalsy(); }); - it('should confirm invoice by address checkbox is unchecked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.invoiceByAddressCheckboxInput) - .then(value => { - expect(value).toBeFalsy(); - done(); - }).catch(done.fail); + it('should confirm invoice by address checkbox is unchecked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.invoiceByAddressCheckboxInput); + + expect(result).toBeFalsy(); }); - it('should confirm Equalization tax checkbox is checked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.equalizationTaxCheckboxLabel) - .then(value => { - expect(value).toBeTruthy(); - done(); - }).catch(done.fail); + it('should confirm Equalization tax checkbox is checked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.equalizationTaxCheckboxLabel); + + expect(result).toBeTruthy(); }); - it('should confirm Verified data checkbox is checked', done => { - return nightmare - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.verifiedDataCheckboxInput) - .then(value => { - expect(value).toBeTruthy(); - done(); - }).catch(done.fail); + it('should confirm Verified data checkbox is checked', async () => { + const result = await nightmare + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.verifiedDataCheckboxInput); + + expect(result).toBeTruthy(); }); // confirm invoice by address checkbox gets checked if the EQtax differs between addresses step 1 - it(`should click on the addresses button to access to the client's addresses`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.addressesButton) - .waitForURL('/address/index') - .url() - .then(url => { - expect(url).toContain('/address/index'); - }); + it(`should click on the addresses button to access to the client's addresses`, async () => { + const url = await nightmare + .waitToClick(selectors.clientAddresses.addressesButton) + .waitForURL('/address/index') + .url(); + + expect(url).toContain('/address/index'); }); // confirm invoice by address checkbox gets checked if the EQtax differs between addresses step 2 - it(`should click on the 1st edit icon to access the address details and uncheck EQtax checkbox`, () => { - return nightmare - .waitToClick(selectors.clientAddresses.firstEditButton) - .waitToClick(selectors.clientAddresses.equalizationTaxCheckboxLabel) - .click(selectors.clientAddresses.saveButton) - .waitForLastSnackbar() - .then(result => { - expect(result).toEqual('Data saved!'); - }); + it(`should click on the 1st edit icon to access the address details and uncheck EQtax checkbox`, async () => { + const result = await nightmare + .waitToClick(selectors.clientAddresses.firstEditButton) + .waitToClick(selectors.clientAddresses.equalizationTaxCheckboxLabel) + .click(selectors.clientAddresses.saveButton) + .waitForLastSnackbar() + .then(result => { + expect(result).toEqual('Data saved!'); + }); }); // confirm invoice by address checkbox gets checked if the EQtax differs between addresses step 3 - it('should navigate back to fiscal data to confirm invoice by address is now checked', done => { - return nightmare - .waitToClick(selectors.clientFiscalData.fiscalDataButton) - .wait(selectors.clientFiscalData.invoiceByAddressCheckboxInput) - .evaluate(selector => { - return document.querySelector(selector).checked; - }, selectors.clientFiscalData.invoiceByAddressCheckboxInput) - .then(value => { - expect(value).toBeTruthy(); - done(); - }).catch(done.fail); + it('should navigate back to fiscal data to confirm invoice by address is now checked', async () => { + const result = await nightmare + .waitToClick(selectors.clientFiscalData.fiscalDataButton) + .wait(selectors.clientFiscalData.invoiceByAddressCheckboxInput) + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.clientFiscalData.invoiceByAddressCheckboxInput); + + expect(result).toBeTruthy(); }); }); }); diff --git a/e2e/paths/item-module/01_item_summary.spec.js b/e2e/paths/item-module/01_item_summary.spec.js index 9032546cb..561c47712 100644 --- a/e2e/paths/item-module/01_item_summary.spec.js +++ b/e2e/paths/item-module/01_item_summary.spec.js @@ -1,214 +1,212 @@ import selectors from '../../helpers/selectors.js'; import createNightmare from '../../helpers/nightmare'; -describe('Item', () => { - describe('Summary path', () => { - const nightmare = createNightmare(); +describe('Item summary path', () => { + const nightmare = createNightmare(); - beforeAll(() => { - nightmare - .waitForLogin('employee'); - }); + beforeAll(() => { + nightmare + .waitForLogin('employee'); + }); - it('should access to the items index by clicking the items button', async () => { - const url = await nightmare - .click(selectors.moduleAccessView.itemsSectionButton) - .wait(selectors.itemsIndex.createItemButton) - .parsedUrl(); + it('should access to the items index by clicking the items button', async () => { + const url = await nightmare + .click(selectors.moduleAccessView.itemsSectionButton) + .wait(selectors.itemsIndex.createItemButton) + .parsedUrl(); - expect(url.hash).toEqual('#!/item/index'); - }); + expect(url.hash).toEqual('#!/item/index'); + }); - it('should search for the item Gem of Time', async () => { - const result = await nightmare - .wait(selectors.itemsIndex.searchResult) - .type(selectors.itemsIndex.searchItemInput, 'Gem of Time') - .click(selectors.itemsIndex.searchButton) - .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) - .countElement(selectors.itemsIndex.searchResult); + it('should search for the item Gem of Time', async () => { + const result = await nightmare + .wait(selectors.itemsIndex.searchResult) + .type(selectors.itemsIndex.searchItemInput, 'Gem of Time') + .click(selectors.itemsIndex.searchButton) + .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) + .countElement(selectors.itemsIndex.searchResult); - expect(result).toEqual(1); - }); + expect(result).toEqual(1); + }); - it(`should click on the search result summary button to open the item summary popup`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Time') - .isVisible(selectors.itemSummary.basicData) - .then((result) => { - expect(result).toBeFalsy(); - return nightmare - .waitToClick(selectors.itemsIndex.searchResultPreviewButton) - .isVisible(selectors.itemSummary.basicData); - }); + it(`should click on the search result summary button to open the item summary popup`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Time') + .isVisible(selectors.itemSummary.basicData) + .then(result => { + expect(result).toBeFalsy(); + return nightmare + .waitToClick(selectors.itemsIndex.searchResultPreviewButton) + .isVisible(selectors.itemSummary.basicData); + }); - expect(result).toBeTruthy(); - }); + expect(result).toBeTruthy(); + }); - it(`should check the item summary preview shows fields from basic data`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.basicData, 'Name: Gem of Time') - .getInnerText(selectors.itemSummary.basicData); + it(`should check the item summary preview shows fields from basic data`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.basicData, 'Name: Gem of Time') + .getInnerText(selectors.itemSummary.basicData); - expect(result).toContain('Name: Gem of Time'); - }); + expect(result).toContain('Name: Gem of Time'); + }); - it(`should check the item summary preview shows fields from tags`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.tags, 'Color: Yellow') - .getInnerText(selectors.itemSummary.tags); + it(`should check the item summary preview shows fields from tags`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.tags, 'Color: Yellow') + .getInnerText(selectors.itemSummary.tags); - expect(result).toContain('Color: Yellow'); - }); + expect(result).toContain('Color: Yellow'); + }); - it(`should check the item summary preview shows fields from niche`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.niche, 'Warehouse One: A1') - .getInnerText(selectors.itemSummary.niche); + it(`should check the item summary preview shows fields from niche`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.niche, 'Warehouse One: A1') + .getInnerText(selectors.itemSummary.niche); - expect(result).toContain('Warehouse One: A1'); - }); + expect(result).toContain('Warehouse One: A1'); + }); - it(`should check the item summary preview shows fields from botanical`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.botanical, 'Botanical: Hedera helix') - .getInnerText(selectors.itemSummary.botanical); + it(`should check the item summary preview shows fields from botanical`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.botanical, 'Botanical: Hedera helix') + .getInnerText(selectors.itemSummary.botanical); - expect(result).toContain('Botanical: Hedera helix'); - }); + expect(result).toContain('Botanical: Hedera helix'); + }); - it(`should check the item summary preview shows fields from barcode`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.barcode, '1') - .getInnerText(selectors.itemSummary.barcode); + it(`should check the item summary preview shows fields from barcode`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.barcode, '1') + .getInnerText(selectors.itemSummary.barcode); - expect(result).toContain('1'); - }); + expect(result).toContain('1'); + }); - it(`should close the summary popup`, async () => { - const result = await nightmare - .waitToClick(selectors.itemsIndex.closeItemSummaryPreview) - .isVisible(selectors.itemSummary.basicData); + it(`should close the summary popup`, async () => { + const result = await nightmare + .waitToClick(selectors.itemsIndex.closeItemSummaryPreview) + .isVisible(selectors.itemSummary.basicData); - expect(result).toBeFalsy(); - }); + expect(result).toBeFalsy(); + }); - it('should search for the item Gem of Mind', async () => { - const result = await nightmare - .clearInput('body > vn-app > vn-vertical > vn-vertical > ui-view > vn-item-index > div > div > vn-card:nth-child(1) > div > vn-searchbar > form > vn-horizontal > vn-textfield > div > div > div.infix > input') - .click(selectors.itemsIndex.searchButton) - .type(selectors.itemsIndex.searchItemInput, 'Gem of Mind') - .click(selectors.itemsIndex.searchButton) - .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) - .countElement(selectors.itemsIndex.searchResult); + it('should search for the item Gem of Mind', async () => { + const result = await nightmare + .clearInput('body > vn-app > vn-vertical > vn-vertical > ui-view > vn-item-index > div > div > vn-card:nth-child(1) > div > vn-searchbar > form > vn-horizontal > vn-textfield > div > div > div.infix > input') + .click(selectors.itemsIndex.searchButton) + .type(selectors.itemsIndex.searchItemInput, 'Gem of Mind') + .click(selectors.itemsIndex.searchButton) + .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) + .countElement(selectors.itemsIndex.searchResult); - expect(result).toEqual(1); - }); + expect(result).toEqual(1); + }); - it(`should now click on the search result summary button to open the item summary popup`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Mind') - .isVisible(selectors.itemSummary.basicData) - .then((result) => { - expect(result).toBeFalsy(); - return nightmare - .waitToClick(selectors.itemsIndex.searchResultPreviewButton) - .isVisible(selectors.itemSummary.basicData); - }); + it(`should now click on the search result summary button to open the item summary popup`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Mind') + .isVisible(selectors.itemSummary.basicData) + .then(result => { + expect(result).toBeFalsy(); + return nightmare + .waitToClick(selectors.itemsIndex.searchResultPreviewButton) + .isVisible(selectors.itemSummary.basicData); + }); - expect(result).toBeTruthy(); - }); + expect(result).toBeTruthy(); + }); - it(`should now check the item summary preview shows fields from basic data`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.basicData, 'Name: Gem of Mind') - .getInnerText(selectors.itemSummary.basicData); + it(`should now check the item summary preview shows fields from basic data`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.basicData, 'Name: Gem of Mind') + .getInnerText(selectors.itemSummary.basicData); - expect(result).toContain('Name: Gem of Mind'); - }); + expect(result).toContain('Name: Gem of Mind'); + }); - it(`should now check the item summary preview shows fields from tags`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.tags, 'Color: Red') - .getInnerText(selectors.itemSummary.tags); + it(`should now check the item summary preview shows fields from tags`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.tags, 'Color: Red') + .getInnerText(selectors.itemSummary.tags); - expect(result).toContain('Color: Red'); - }); + expect(result).toContain('Color: Red'); + }); - it(`should now check the item summary preview shows fields from niche`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.niche, 'Warehouse One: A4') - .getInnerText(selectors.itemSummary.niche); + it(`should now check the item summary preview shows fields from niche`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.niche, 'Warehouse One: A4') + .getInnerText(selectors.itemSummary.niche); - expect(result).toContain('Warehouse One: A4'); - }); + expect(result).toContain('Warehouse One: A4'); + }); - it(`should now check the item summary preview shows fields from botanical`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.botanical, 'Botanical: -') - .getInnerText(selectors.itemSummary.botanical); + it(`should now check the item summary preview shows fields from botanical`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.botanical, 'Botanical: -') + .getInnerText(selectors.itemSummary.botanical); - expect(result).toContain('Botanical: -'); - }); + expect(result).toContain('Botanical: -'); + }); - it(`should now check the item summary preview shows fields from barcode`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.barcode, '4') - .getInnerText(selectors.itemSummary.barcode); + it(`should now check the item summary preview shows fields from barcode`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.barcode, '4') + .getInnerText(selectors.itemSummary.barcode); - expect(result).toContain('4'); - }); + expect(result).toContain('4'); + }); - it(`should now close the summary popup`, async () => { - const result = await nightmare - .waitToClick(selectors.itemsIndex.closeItemSummaryPreview) - .isVisible(selectors.itemSummary.basicData); + it(`should now close the summary popup`, async () => { + const result = await nightmare + .waitToClick(selectors.itemsIndex.closeItemSummaryPreview) + .isVisible(selectors.itemSummary.basicData); - expect(result).toBeFalsy(); - }); + expect(result).toBeFalsy(); + }); - it(`should navigate to the one of the items detailed section`, async () => { - const url = await nightmare - .waitToClick(selectors.itemsIndex.searchResult) - .waitForURL('summary') - .parsedUrl(); + it(`should navigate to the one of the items detailed section`, async () => { + const url = await nightmare + .waitToClick(selectors.itemsIndex.searchResult) + .waitForURL('summary') + .parsedUrl(); - expect(url.hash).toContain('summary'); - }); + expect(url.hash).toContain('summary'); + }); - it(`should check the item summary shows fields from basic data section`, async () => { - const result = await nightmare - .waitForTextInElement(selectors.itemSummary.basicData, 'Name: Gem of Mind') - .getInnerText(selectors.itemSummary.basicData); + it(`should check the item summary shows fields from basic data section`, async () => { + const result = await nightmare + .waitForTextInElement(selectors.itemSummary.basicData, 'Name: Gem of Mind') + .getInnerText(selectors.itemSummary.basicData); - expect(result).toContain('Name: Gem of Mind'); - }); + expect(result).toContain('Name: Gem of Mind'); + }); - it(`should check the item summary shows fields from tags section`, async () => { - const result = await nightmare - .getInnerText(selectors.itemSummary.tags); + it(`should check the item summary shows fields from tags section`, async () => { + const result = await nightmare + .getInnerText(selectors.itemSummary.tags); - expect(result).toContain('Color: Red'); - }); + expect(result).toContain('Color: Red'); + }); - it(`should check the item summary shows fields from niches section`, async () => { - const result = await nightmare - .getInnerText(selectors.itemSummary.niche); + it(`should check the item summary shows fields from niches section`, async () => { + const result = await nightmare + .getInnerText(selectors.itemSummary.niche); - expect(result).toContain('Warehouse One: A4'); - }); + expect(result).toContain('Warehouse One: A4'); + }); - it(`should check the item summary shows fields from botanical section`, async () => { - const result = await nightmare - .getInnerText(selectors.itemSummary.botanical); + it(`should check the item summary shows fields from botanical section`, async () => { + const result = await nightmare + .getInnerText(selectors.itemSummary.botanical); - expect(result).toContain('Botanical: -'); - }); + expect(result).toContain('Botanical: -'); + }); - it(`should check the item summary shows fields from barcodes section`, async () => { - const result = await nightmare - .getInnerText(selectors.itemSummary.barcode); + it(`should check the item summary shows fields from barcodes section`, async () => { + const result = await nightmare + .getInnerText(selectors.itemSummary.barcode); - expect(result).toContain('4'); - }); + expect(result).toContain('4'); }); }); diff --git a/e2e/paths/item-module/03_edit_item_tax.spec.js b/e2e/paths/item-module/03_edit_item_tax.spec.js index 7f603de17..2e15ebbca 100644 --- a/e2e/paths/item-module/03_edit_item_tax.spec.js +++ b/e2e/paths/item-module/03_edit_item_tax.spec.js @@ -1,84 +1,82 @@ import selectors from '../../helpers/selectors.js'; import createNightmare from '../../helpers/nightmare'; -describe('Item', () => { - describe('Edit tax path', () => { - const nightmare = createNightmare(); +describe('Item edit tax path', () => { + const nightmare = createNightmare(); - beforeAll(() => { - return nightmare - .waitForLogin('buyer'); - }); + beforeAll(() => { + return nightmare + .waitForLogin('buyer'); + }); - it('should access to the items index by clicking the items button', async () => { - const url = await nightmare - .click(selectors.moduleAccessView.itemsSectionButton) - .wait(selectors.itemsIndex.createItemButton) - .parsedUrl(); + it('should access to the items index by clicking the items button', async () => { + const url = await nightmare + .click(selectors.moduleAccessView.itemsSectionButton) + .wait(selectors.itemsIndex.createItemButton) + .parsedUrl(); - expect(url.hash).toEqual('#!/item/index'); - }); + expect(url.hash).toEqual('#!/item/index'); + }); - it('should search for the item Gem of Time', async () => { - const resultCount = await nightmare - .wait(selectors.itemsIndex.searchResult) - .type(selectors.itemsIndex.searchItemInput, 'Gem of Time') - .click(selectors.itemsIndex.searchButton) - .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) - .countElement(selectors.itemsIndex.searchResult); + it('should search for the item Gem of Time', async () => { + const resultCount = await nightmare + .wait(selectors.itemsIndex.searchResult) + .type(selectors.itemsIndex.searchItemInput, 'Gem of Time') + .click(selectors.itemsIndex.searchButton) + .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) + .countElement(selectors.itemsIndex.searchResult); - expect(resultCount).toEqual(1); - }); + expect(resultCount).toEqual(1); + }); - it(`should click on the search result to access to the item tax`, async () => { - const url = await nightmare - .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Time') - .waitToClick(selectors.itemsIndex.searchResult) - .waitToClick(selectors.itemTax.taxButton) - .waitForURL('tax') - .url(); + it(`should click on the search result to access to the item tax`, async () => { + const url = await nightmare + .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Time') + .waitToClick(selectors.itemsIndex.searchResult) + .waitToClick(selectors.itemTax.taxButton) + .waitForURL('tax') + .url(); - expect(url).toContain('tax'); - }); + expect(url).toContain('tax'); + }); - it(`should add the item tax to all countries`, async () => { - const result = await nightmare - .waitToClick(selectors.itemTax.firstClassSelect) - .waitToClick(selectors.itemTax.firstClassSelectOptionTwo) - .waitToClick(selectors.itemTax.secondClassSelect) - .waitToClick(selectors.itemTax.secondClassSelectOptionOne) - .waitToClick(selectors.itemTax.thirdClassSelect) - .waitToClick(selectors.itemTax.thirdClassSelectOptionTwo) - .click(selectors.itemTax.submitTaxButton) - .waitForLastSnackbar(); + it(`should add the item tax to all countries`, async () => { + const result = await nightmare + .waitToClick(selectors.itemTax.firstClassSelect) + .waitToClick(selectors.itemTax.firstClassSelectOptionTwo) + .waitToClick(selectors.itemTax.secondClassSelect) + .waitToClick(selectors.itemTax.secondClassSelectOptionOne) + .waitToClick(selectors.itemTax.thirdClassSelect) + .waitToClick(selectors.itemTax.thirdClassSelectOptionTwo) + .click(selectors.itemTax.submitTaxButton) + .waitForLastSnackbar(); - expect(result).toEqual('Data saved!'); - }); + expect(result).toEqual('Data saved!'); + }); - it(`should confirm the first item tax class was edited`, async () => { - const firstVatType = await nightmare - .click(selectors.itemTags.tagsButton) - .wait(selectors.itemTags.firstTagDisabled) - .click(selectors.itemTax.taxButton) - .waitToClick(selectors.itemTax.taxButton) - .waitForTextInInput(selectors.itemTax.firstClassSelect, 'reduced') - .getInputValue(selectors.itemTax.firstClassSelect); + it(`should confirm the first item tax class was edited`, async () => { + const firstVatType = await nightmare + .click(selectors.itemTags.tagsButton) + .wait(selectors.itemTags.firstTagDisabled) + .click(selectors.itemTax.taxButton) + .waitToClick(selectors.itemTax.taxButton) + .waitForTextInInput(selectors.itemTax.firstClassSelect, 'reduced') + .getInputValue(selectors.itemTax.firstClassSelect); - expect(firstVatType).toEqual('Reduced VAT'); - }); + expect(firstVatType).toEqual('Reduced VAT'); + }); - it(`should confirm the second item tax class was edited`, async () => { - const secondVatType = await nightmare - .getInputValue(selectors.itemTax.secondClassSelect); + it(`should confirm the second item tax class was edited`, async () => { + const secondVatType = await nightmare + .getInputValue(selectors.itemTax.secondClassSelect); - expect(secondVatType).toEqual('General VAT'); - }); + expect(secondVatType).toEqual('General VAT'); + }); - it(`should confirm the third item tax class was edited`, async () => { - const thirdVatType = await nightmare - .getInputValue(selectors.itemTax.thirdClassSelect); + it(`should confirm the third item tax class was edited`, async () => { + const thirdVatType = await nightmare + .getInputValue(selectors.itemTax.thirdClassSelect); - expect(thirdVatType).toEqual('Reduced VAT'); - }); + expect(thirdVatType).toEqual('Reduced VAT'); }); }); diff --git a/e2e/paths/item-module/04_create_item_tags.spec.js b/e2e/paths/item-module/04_create_item_tags.spec.js index 1128a114a..89bf10c38 100644 --- a/e2e/paths/item-module/04_create_item_tags.spec.js +++ b/e2e/paths/item-module/04_create_item_tags.spec.js @@ -1,54 +1,47 @@ import selectors from '../../helpers/selectors.js'; import createNightmare from '../../helpers/nightmare'; -describe('Item', () => { - describe('Create tags path', () => { - const nightmare = createNightmare(); +describe('Item create tags path', () => { + const nightmare = createNightmare(); - beforeAll(() => { - return nightmare + beforeAll(() => { + return nightmare .waitForLogin('buyer'); - }); + }); - it('should access to the items index by clicking the items button', done => { - return nightmare + it('should access to the items index by clicking the items button', async () => { + const url = await nightmare .click(selectors.moduleAccessView.itemsSectionButton) .wait(selectors.itemsIndex.createItemButton) - .parsedUrl() - .then(url => { - expect(url.hash).toEqual('#!/item/index'); - done(); - }).catch(done.fail); - }); + .parsedUrl(); - it('should search for the item Gem of Time', done => { - return nightmare + expect(url.hash).toEqual('#!/item/index'); + }); + + it('should search for the item Gem of Time', async () => { + const resultCount = await nightmare .wait(selectors.itemsIndex.searchResult) .type(selectors.itemsIndex.searchItemInput, 'Gem of Time') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) - .countElement(selectors.itemsIndex.searchResult) - .then(result => { - expect(result).toEqual(1); - done(); - }).catch(done.fail); - }); + .countElement(selectors.itemsIndex.searchResult); - it(`should click on the search result to access to the item tags`, done => { - return nightmare + expect(resultCount).toEqual(1); + }); + + it(`should click on the search result to access to the item tags`, async () => { + const url = await nightmare .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Time') .waitToClick(selectors.itemsIndex.searchResult) .waitToClick(selectors.itemTags.tagsButton) .waitForURL('tags') - .url() - .then(url => { - expect(url).toContain('tags'); - done(); - }).catch(done.fail); - }); + .url(); - it(`should create a new tag and delete a former one`, done => { - return nightmare + expect(url).toContain('tags'); + }); + + it(`should create a new tag and delete a former one`, async () => { + const result = await nightmare .waitToClick(selectors.itemTags.firstRemoveTagButton) .waitToClick(selectors.itemTags.addItemTagButton) .waitToClick(selectors.itemTags.seventhTagSelect) @@ -57,69 +50,65 @@ describe('Item', () => { .clearInput(selectors.itemTags.seventhRelevancyInput) .type(selectors.itemTags.seventhRelevancyInput, '1') .click(selectors.itemTags.submitItemTagsButton) - .waitForLastSnackbar() - .then(result => { - expect(result).toEqual('Data saved!'); - done(); - }).catch(done.fail); - }); + .waitForLastSnackbar(); - it(`should reload tags form to check that the changes are saved`, () => { - return nightmare + expect(result).toEqual('Data saved!'); + }); + + it(`should confirm the first row data is the expected one`, async () => { + let result = await nightmare .click(selectors.itemBasicData.basicDataButton) .wait(selectors.itemBasicData.nameInput) .click(selectors.itemTags.tagsButton) - .wait('vn-item-tags'); - }); + .wait('vn-item-tags') + .getProperty(selectors.itemTags.firstTagSelect, 'value'); - it(`should confirm the first row data is the expected one`, async() => { - let tag = await nightmare.getProperty(selectors.itemTags.firstTagSelect, 'value'); - let value = await nightmare.getProperty(selectors.itemTags.firstValueInput, 'value'); - let relevancy = await nightmare.getProperty(selectors.itemTags.firstRelevancyInput, 'value'); + expect(result).toEqual('Ancho de la base'); + result = await nightmare.getProperty(selectors.itemTags.firstValueInput, 'value'); - expect(tag).toEqual('Ancho de la base'); - expect(value).toEqual('50'); - expect(relevancy).toEqual('1'); - }); + expect(result).toEqual('50'); + result = await nightmare.getProperty(selectors.itemTags.firstRelevancyInput, 'value'); - it(`should confirm the second row data is the expected one`, async() => { - let tag = await nightmare.getProperty(selectors.itemTags.secondTagSelect, 'value'); - let value = await nightmare.getProperty(selectors.itemTags.secondValueInput, 'value'); - let relevancy = await nightmare.getProperty(selectors.itemTags.secondRelevancyInput, 'value'); + expect(result).toEqual('1'); + }); - expect(tag).toEqual('Variedad'); - expect(value).toEqual('Gem1'); - expect(relevancy).toEqual('2'); - }); + it(`should confirm the second row data is the expected one`, async () => { + let tag = await nightmare.getProperty(selectors.itemTags.secondTagSelect, 'value'); + let value = await nightmare.getProperty(selectors.itemTags.secondValueInput, 'value'); + let relevancy = await nightmare.getProperty(selectors.itemTags.secondRelevancyInput, 'value'); - it(`should confirm the second row data is the expected one`, async() => { - let tag = await nightmare.getProperty(selectors.itemTags.thirdTagSelect, 'value'); - let value = await nightmare.getProperty(selectors.itemTags.thirdValueInput, 'value'); - let relevancy = await nightmare.getProperty(selectors.itemTags.thirdRelevancyInput, 'value'); + expect(tag).toEqual('Variedad'); + expect(value).toEqual('Gem1'); + expect(relevancy).toEqual('2'); + }); - expect(tag).toEqual('Longitud(cm)'); - expect(value).toEqual('5'); - expect(relevancy).toEqual('3'); - }); + it(`should confirm the third row data is the expected one`, async () => { + let tag = await nightmare.getProperty(selectors.itemTags.thirdTagSelect, 'value'); + let value = await nightmare.getProperty(selectors.itemTags.thirdValueInput, 'value'); + let relevancy = await nightmare.getProperty(selectors.itemTags.thirdRelevancyInput, 'value'); - it(`should confirm the fourth row data is the expected one`, async() => { - let tag = await nightmare.getProperty(selectors.itemTags.fourthTagSelect, 'value'); - let value = await nightmare.getProperty(selectors.itemTags.fourthValueInput, 'value'); - let relevancy = await nightmare.getProperty(selectors.itemTags.fourthRelevancyInput, 'value'); + expect(tag).toEqual('Longitud(cm)'); + expect(value).toEqual('5'); + expect(relevancy).toEqual('3'); + }); - expect(tag).toEqual('Proveedor'); - expect(value).toEqual('Marvel1'); - expect(relevancy).toEqual('4'); - }); + it(`should confirm the fourth row data is the expected one`, async () => { + let tag = await nightmare.getProperty(selectors.itemTags.fourthTagSelect, 'value'); + let value = await nightmare.getProperty(selectors.itemTags.fourthValueInput, 'value'); + let relevancy = await nightmare.getProperty(selectors.itemTags.fourthRelevancyInput, 'value'); - it(`should confirm the fifth row data is the expected one`, async() => { - let tag = await nightmare.getProperty(selectors.itemTags.fifthTagSelect, 'value'); - let value = await nightmare.getProperty(selectors.itemTags.fifthValueInput, 'value'); - let relevancy = await nightmare.getProperty(selectors.itemTags.fifthRelevancyInput, 'value'); + expect(tag).toEqual('Proveedor'); + expect(value).toEqual('Marvel1'); + expect(relevancy).toEqual('4'); + }); - expect(tag).toEqual('Color'); - expect(value).toEqual('Yellow'); - expect(relevancy).toEqual('5'); - }); + it(`should confirm the fifth row data is the expected one`, async () => { + let tag = await nightmare.getProperty(selectors.itemTags.fifthTagSelect, 'value'); + let value = await nightmare.getProperty(selectors.itemTags.fifthValueInput, 'value'); + let relevancy = await nightmare.getProperty(selectors.itemTags.fifthRelevancyInput, 'value'); + + expect(tag).toEqual('Color'); + expect(value).toEqual('Yellow'); + expect(relevancy).toEqual('5'); }); }); diff --git a/e2e/paths/item-module/05_create_item_niche.spec.js b/e2e/paths/item-module/05_create_item_niche.spec.js index 737550e05..04fa0f3db 100644 --- a/e2e/paths/item-module/05_create_item_niche.spec.js +++ b/e2e/paths/item-module/05_create_item_niche.spec.js @@ -1,111 +1,93 @@ import selectors from '../../helpers/selectors.js'; import createNightmare from '../../helpers/nightmare'; -describe('Item', () => { - describe('Create niche path', () => { - const nightmare = createNightmare(); +describe('Item create niche path', () => { + const nightmare = createNightmare(); - beforeAll(() => { - return nightmare + beforeAll(() => { + return nightmare .waitForLogin('buyer'); - }); + }); - it('should access to the items index by clicking the items button', done => { - return nightmare + it('should access to the items index by clicking the items button', async () => { + const url = await nightmare .click(selectors.moduleAccessView.itemsSectionButton) .wait(selectors.itemsIndex.createItemButton) - .parsedUrl() - .then(url => { - expect(url.hash).toEqual('#!/item/index'); - done(); - }).catch(done.fail); - }); + .parsedUrl(); - it('should search for the item Gem of Time', done => { - return nightmare + expect(url.hash).toEqual('#!/item/index'); + }); + + it('should search for the item Gem of Time', async () => { + const resultCount = await nightmare .wait(selectors.itemsIndex.searchResult) .type(selectors.itemsIndex.searchItemInput, 'Gem of Time') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) - .countElement(selectors.itemsIndex.searchResult) - .then(result => { - expect(result).toEqual(1); - done(); - }).catch(done.fail); - }); + .countElement(selectors.itemsIndex.searchResult); - it(`should click on the search result to access to the item niches`, done => { - return nightmare + expect(resultCount).toEqual(1); + }); + + it(`should click on the search result to access to the item niches`, async () => { + const url = await nightmare .waitForTextInElement(selectors.itemsIndex.searchResult, 'Gem of Time') .waitToClick(selectors.itemsIndex.searchResult) .waitToClick(selectors.itemNiches.nicheButton) .waitForURL('niche') - .url() - .then(url => { - expect(url).toContain('niche'); - done(); - }).catch(done.fail); - }); + .url(); - it(`should click create a new niche and delete a former one`, done => { - return nightmare + expect(url).toContain('niche'); + }); + + it(`should click create a new niche and delete a former one`, async () => { + const result = await nightmare .waitToClick(selectors.itemNiches.addNicheButton) .waitToClick(selectors.itemNiches.secondNicheRemoveButton) .waitToClick(selectors.itemNiches.thirdWarehouseSelect) .waitToClick(selectors.itemNiches.thirdWarehouseSelectFourthOption) .type(selectors.itemNiches.thirdCodeInput, 'A4') .click(selectors.itemNiches.submitNichesButton) - .waitForLastSnackbar() - .then(result => { - expect(result).toEqual('Data saved!'); - done(); - }).catch(done.fail); - }); + .waitForLastSnackbar(); - it(`should confirm the first niche is the expected one`, done => { - return nightmare + expect(result).toEqual('Data saved!'); + }); + + it(`should confirm the first niche is the expected one`, async () => { + let result = await nightmare .click(selectors.itemBasicData.basicDataButton) .wait(selectors.itemBasicData.nameInput) .click(selectors.itemNiches.nicheButton) .waitForTextInInput(selectors.itemNiches.firstWarehouseSelect, 'Warehouse One') - .getInputValue(selectors.itemNiches.firstWarehouseSelect) - .then(result => { - expect(result).toEqual('Warehouse One'); - return nightmare - .getInputValue(selectors.itemNiches.firstCodeInput); - }) - .then(result => { - expect(result).toEqual('A1'); - done(); - }).catch(done.fail); - }); + .getInputValue(selectors.itemNiches.firstWarehouseSelect); - it(`should confirm the second niche is the expected one`, done => { - return nightmare - .getInputValue(selectors.itemNiches.secondWarehouseSelect) - .then(result => { - expect(result).toEqual('Warehouse Three'); - return nightmare - .getInputValue(selectors.itemNiches.secondCodeInput); - }) - .then(result => { - expect(result).toEqual('A3'); - done(); - }).catch(done.fail); - }); + expect(result).toEqual('Warehouse One'); + result = await nightmare + .getInputValue(selectors.itemNiches.firstCodeInput); - it(`should confirm the third niche is the expected one`, done => { - return nightmare - .getInputValue(selectors.itemNiches.thirdWarehouseSelect) - .then(result => { - expect(result).toEqual('Warehouse Two'); - return nightmare - .getInputValue(selectors.itemNiches.thirdCodeInput); - }) - .then(result => { - expect(result).toEqual('A4'); - done(); - }).catch(done.fail); - }); + expect(result).toEqual('A1'); + }); + + it(`should confirm the second niche is the expected one`, async () => { + let result = await nightmare + .getInputValue(selectors.itemNiches.secondWarehouseSelect); + + expect(result).toEqual('Warehouse Three'); + result = await nightmare + .getInputValue(selectors.itemNiches.secondCodeInput); + + + expect(result).toEqual('A3'); + }); + + it(`should confirm the third niche is the expected one`, async () => { + let result = await nightmare + .getInputValue(selectors.itemNiches.thirdWarehouseSelect); + + expect(result).toEqual('Warehouse Two'); + result = await nightmare + .getInputValue(selectors.itemNiches.thirdCodeInput); + + expect(result).toEqual('A4'); }); }); diff --git a/gulpfile.js b/gulpfile.js index f381b1fbc..aeaab9bc0 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -38,7 +38,7 @@ let defaultPort = proxyConf.defaultPort; // Development gulp.task('default', () => { - return gulp.start('environment', 'services', 'client'); + return gulp.start('services', 'client'); }); gulp.task('environment', async () => { @@ -55,13 +55,13 @@ gulp.task('client', ['build-clean'], async () => { * Starts all backend services, including the nginx proxy and the database. */ gulp.task('services', async () => { - await runSequenceP('environment', 'docker-start', 'services-only', 'nginx'); + await runSequenceP('docker-start', 'services-only', 'nginx'); }); /** * Starts backend services. */ -gulp.task('services-only', async () => { +gulp.task('services-only', ['environment'], async () => { const services = await getServices(); for (let service of services) require(service.index).start(service.port); @@ -88,13 +88,13 @@ gulp.task('e2e-only', () => { process.env.E2E_SHOW = true; return gulp.src('./e2e_tests.js') - .pipe(jasmine({reporter: 'none'})); + .pipe(jasmine({reporter: 'none'})); }); gulp.task('smokes-only', () => { const jasmine = require('gulp-jasmine'); return gulp.src('./smokes_tests.js') - .pipe(jasmine({reporter: 'none'})); + .pipe(jasmine({reporter: 'none'})); }); /** @@ -354,10 +354,9 @@ gulp.task('webpack-dev-server', function() { const webpackConfig = require('./webpack.config.js'); let configCopy = Object.create(webpackConfig); - for (let entry in configCopy.entry) { + for (let entry in configCopy.entry) configCopy.entry[entry] .unshift(`webpack-dev-server/client?http://127.0.0.1:${devServerPort}/`); - } let compiler = webpack(configCopy); new WebpackDevServer(compiler, { diff --git a/package-lock.json b/package-lock.json index 7417eb098..990c26b26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,8 +89,7 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.3", @@ -230,7 +229,6 @@ "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" }, @@ -238,20 +236,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "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=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -261,7 +256,6 @@ "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" } @@ -398,8 +392,7 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-differ": { "version": "1.0.0", @@ -550,8 +543,7 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { "version": "0.9.6", @@ -579,8 +571,7 @@ "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "async-foreach": { "version": "0.1.3", @@ -597,8 +588,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "aws-sign2": { "version": "0.7.0", @@ -1371,14 +1361,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, "requires": { "cache-base": "1.0.1", "class-utils": "0.3.6", @@ -1392,14 +1380,12 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -1461,8 +1447,7 @@ "binary-extensions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=" }, "blob": { "version": "0.0.4", @@ -1619,7 +1604,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -1633,14 +1617,12 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "1.9.3" } @@ -1648,14 +1630,12 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -1665,14 +1645,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "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=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", @@ -1688,7 +1666,6 @@ "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" } @@ -1697,7 +1674,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "3.0.0" } @@ -1708,7 +1684,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1836,8 +1811,7 @@ "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "buffer-xor": { "version": "1.0.3", @@ -1876,7 +1850,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, "requires": { "collection-visit": "1.0.0", "component-emitter": "1.2.1", @@ -1892,14 +1865,12 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -1953,8 +1924,7 @@ "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" }, "cardinal": { "version": "2.1.1", @@ -2021,8 +1991,7 @@ "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" }, "cipher-base": { "version": "1.0.4", @@ -2044,7 +2013,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, "requires": { "arr-union": "3.1.0", "define-property": "0.2.5", @@ -2056,7 +2024,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -2065,7 +2032,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2074,7 +2040,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2084,14 +2049,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2100,7 +2063,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2111,7 +2073,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -2121,14 +2082,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -2152,8 +2111,7 @@ "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { "version": "2.1.0", @@ -2293,7 +2251,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { "map-visit": "1.0.0", "object-visit": "1.0.1" @@ -2303,7 +2260,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -2311,8 +2267,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-support": { "version": "1.1.3", @@ -2460,8 +2415,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-with-sourcemaps": { "version": "1.1.0", @@ -2484,7 +2438,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.10", @@ -2613,8 +2566,7 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { "version": "2.4.1", @@ -2625,8 +2577,7 @@ "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=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { "version": "2.8.4", @@ -2652,7 +2603,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, "requires": { "capture-stack-trace": "1.0.1" } @@ -2716,8 +2666,7 @@ "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 + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "css-loader": { "version": "0.25.0", @@ -4107,7 +4056,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -4121,8 +4069,7 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-defaults": { "version": "1.0.5", @@ -4142,8 +4089,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.3", @@ -4181,7 +4127,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -4340,8 +4285,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", - "dev": true, + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { "is-obj": "1.0.1" } @@ -4349,8 +4293,7 @@ "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, "duplexer2": { "version": "0.0.2", @@ -4384,8 +4327,7 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "ecc-jsbn": { "version": "0.1.2", @@ -4889,8 +4831,7 @@ "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=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escope": { "version": "3.6.0", @@ -5195,7 +5136,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, "requires": { "duplexer": "0.1.1", "from": "0.1.3", @@ -5241,7 +5181,6 @@ "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", @@ -5256,7 +5195,6 @@ "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.0.1", "shebang-command": "1.2.0", @@ -5456,7 +5394,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "1.0.0", "is-extendable": "1.0.1" @@ -5466,7 +5403,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -6104,7 +6040,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { "map-cache": "0.2.2" } @@ -6118,8 +6053,7 @@ "from": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/from/-/from-0.1.3.tgz", - "integrity": "sha1-72OsIGKsMqz3hi4NQLRLiW8i87w=", - "dev": true + "integrity": "sha1-72OsIGKsMqz3hi4NQLRLiW8i87w=" }, "fs-access": { "version": "1.0.1", @@ -7125,14 +7059,12 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", @@ -7330,7 +7262,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, "requires": { "ini": "1.3.4" } @@ -7418,9 +7349,8 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://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", @@ -9086,7 +9016,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { "get-value": "2.0.6", "has-values": "1.0.0", @@ -9096,8 +9025,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -9105,7 +9033,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -9114,14 +9041,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -9130,7 +9055,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -9141,7 +9065,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -9398,14 +9321,12 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true + "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 + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "import-local": { "version": "1.0.0", @@ -9420,8 +9341,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.0", @@ -9457,14 +9377,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, "inquirer": { "version": "6.2.0", @@ -9617,7 +9535,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, "requires": { "kind-of": "6.0.2" }, @@ -9625,8 +9542,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -9640,7 +9556,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, "requires": { "binary-extensions": "1.8.0" } @@ -9648,8 +9563,7 @@ "is-buffer": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true + "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=" }, "is-builtin-module": { "version": "1.0.0", @@ -9670,7 +9584,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, "requires": { "ci-info": "1.6.0" } @@ -9679,7 +9592,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, "requires": { "kind-of": "6.0.2" }, @@ -9687,8 +9599,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -9702,7 +9613,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", "is-data-descriptor": "1.0.0", @@ -9712,8 +9622,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -9735,8 +9644,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", @@ -9775,7 +9683,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.0" @@ -9784,8 +9691,7 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-number": { "version": "2.1.0", @@ -9798,9 +9704,8 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-odd": { "version": "1.0.0", @@ -9841,7 +9746,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -9850,7 +9754,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, "requires": { "isobject": "3.0.1" }, @@ -9858,8 +9761,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -9884,8 +9786,7 @@ "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { "version": "1.0.4", @@ -9914,14 +9815,12 @@ "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=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-symbol": { "version": "1.0.2", @@ -9968,8 +9867,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.2", @@ -9980,8 +9878,7 @@ "isexe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" }, "isobject": { "version": "2.1.0", @@ -10250,7 +10147,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, "requires": { "is-buffer": "1.1.4" } @@ -10268,7 +10164,6 @@ "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" } @@ -10502,8 +10397,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, "lodash.defaults": { "version": "2.4.1", @@ -10730,14 +10624,12 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.0.0" @@ -10753,7 +10645,6 @@ "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" } @@ -10787,8 +10678,7 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { "version": "1.0.1", @@ -10799,14 +10689,12 @@ "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, "requires": { "object-visit": "1.0.1" } @@ -10981,7 +10869,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -10989,8 +10876,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "minstache": { "version": "1.2.0", @@ -11005,7 +10891,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, "requires": { "for-in": "1.0.2", "is-extendable": "1.0.1" @@ -11014,14 +10899,12 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -11058,8 +10941,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -11424,10 +11306,9 @@ } }, "nodemon": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.4.tgz", - "integrity": "sha512-hyK6vl65IPnky/ee+D3IWvVGgJa/m3No2/Xc/3wanS6Ce1MWjCzH6NnhPJ/vZM+6JFym16jtHx51lmCMB9HDtg==", - "dev": true, + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.5.tgz", + "integrity": "sha512-8806dC8dfBlbxQmqNOSEeay/qlbddKvFzxIGNxnPtxUlTtH77xsrC66RnA3M47HCSgMgE5bj+U586o50RowXBg==", "requires": { "chokidar": "2.0.4", "debug": "3.2.5", @@ -11445,7 +11326,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "requires": { "micromatch": "3.1.10", "normalize-path": "2.1.1" @@ -11454,14 +11334,12 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "array-unique": { "version": "0.3.2", @@ -11489,7 +11367,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "1.1.0", "array-unique": "0.3.2", @@ -11507,7 +11384,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -11518,7 +11394,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, "requires": { "anymatch": "2.0.0", "async-each": "1.0.1", @@ -11536,10 +11411,9 @@ } }, "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "dev": true, + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { "ms": "2.1.1" }, @@ -11547,8 +11421,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -11556,7 +11429,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { "is-descriptor": "1.0.2", "isobject": "3.0.1" @@ -11566,7 +11438,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "2.6.9", "define-property": "0.2.5", @@ -11581,7 +11452,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -11590,7 +11460,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -11599,7 +11468,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -11608,7 +11476,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -11618,8 +11485,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -11627,7 +11493,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "0.3.2", "define-property": "1.0.0", @@ -11643,7 +11508,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -11652,7 +11516,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -11663,7 +11526,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-number": "3.0.0", @@ -11675,7 +11537,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -11686,7 +11547,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, "optional": true, "requires": { "nan": "2.11.1", @@ -11696,24 +11556,20 @@ "abbrev": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "aproba": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, - "dev": true, "optional": true, "requires": { "delegates": "1.0.0", @@ -11722,15 +11578,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11739,35 +11591,28 @@ "chownr": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "debug": { "version": "2.6.9", "bundled": true, - "dev": true, "optional": true, "requires": { "ms": "2.0.0" @@ -11776,25 +11621,21 @@ "deep-extend": { "version": "0.5.1", "bundled": true, - "dev": true, "optional": true }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "bundled": true, - "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "bundled": true, - "dev": true, "optional": true, "requires": { "minipass": "2.2.4" @@ -11803,13 +11644,11 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, - "dev": true, "optional": true, "requires": { "aproba": "1.2.0", @@ -11825,7 +11664,6 @@ "glob": { "version": "7.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "fs.realpath": "1.0.0", @@ -11839,13 +11677,11 @@ "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.21", "bundled": true, - "dev": true, "optional": true, "requires": { "safer-buffer": "2.1.2" @@ -11854,7 +11690,6 @@ "ignore-walk": { "version": "3.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "minimatch": "3.0.4" @@ -11863,7 +11698,6 @@ "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "optional": true, "requires": { "once": "1.4.0", @@ -11872,19 +11706,16 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "ini": { "version": "1.3.5", "bundled": true, - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -11892,7 +11723,6 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "minimatch": { @@ -11905,13 +11735,11 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "minipass": { "version": "2.2.4", "bundled": true, - "dev": true, "requires": { "safe-buffer": "5.1.1", "yallist": "3.0.2" @@ -11920,7 +11748,6 @@ "minizlib": { "version": "1.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "minipass": "2.2.4" @@ -11929,7 +11756,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } @@ -11937,13 +11763,11 @@ "ms": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "needle": { "version": "2.2.0", "bundled": true, - "dev": true, "optional": true, "requires": { "debug": "2.6.9", @@ -11954,7 +11778,6 @@ "node-pre-gyp": { "version": "0.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "detect-libc": "1.0.3", @@ -11972,7 +11795,6 @@ "nopt": { "version": "4.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "abbrev": "1.1.1", @@ -11982,13 +11804,11 @@ "npm-bundled": { "version": "1.0.3", "bundled": true, - "dev": true, "optional": true }, "npm-packlist": { "version": "1.1.10", "bundled": true, - "dev": true, "optional": true, "requires": { "ignore-walk": "3.0.1", @@ -11998,7 +11818,6 @@ "npmlog": { "version": "4.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -12009,19 +11828,16 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, "optional": true }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -12029,19 +11845,16 @@ "os-homedir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "osenv": { "version": "0.1.5", "bundled": true, - "dev": true, "optional": true, "requires": { "os-homedir": "1.0.2", @@ -12051,19 +11864,16 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "rc": { "version": "1.2.7", "bundled": true, - "dev": true, "optional": true, "requires": { "deep-extend": "0.5.1", @@ -12075,7 +11885,6 @@ "minimist": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true } } @@ -12083,7 +11892,6 @@ "readable-stream": { "version": "2.3.6", "bundled": true, - "dev": true, "optional": true, "requires": { "core-util-is": "1.0.2", @@ -12098,7 +11906,6 @@ "rimraf": { "version": "2.6.2", "bundled": true, - "dev": true, "optional": true, "requires": { "glob": "7.1.2" @@ -12106,43 +11913,36 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, - "dev": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, - "dev": true, "optional": true }, "sax": { "version": "1.2.4", "bundled": true, - "dev": true, "optional": true }, "semver": { "version": "5.5.0", "bundled": true, - "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", "bundled": true, - "dev": true, "optional": true }, "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -12152,7 +11952,6 @@ "string_decoder": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { "safe-buffer": "5.1.1" @@ -12161,7 +11960,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -12169,13 +11967,11 @@ "strip-json-comments": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "tar": { "version": "4.4.1", "bundled": true, - "dev": true, "optional": true, "requires": { "chownr": "1.0.1", @@ -12190,13 +11986,11 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "wide-align": { "version": "1.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "string-width": "1.0.2" @@ -12204,13 +11998,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "yallist": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, @@ -12218,7 +12010,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, "requires": { "is-glob": "3.1.0", "path-dirname": "1.0.2" @@ -12228,7 +12019,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, "requires": { "is-extglob": "2.1.1" } @@ -12238,14 +12028,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -12254,7 +12042,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -12264,14 +12051,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -12280,7 +12065,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -12290,14 +12074,12 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, "requires": { "is-extglob": "2.1.1" } @@ -12306,7 +12088,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -12315,7 +12096,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -12325,26 +12105,22 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -12365,29 +12141,20 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.11" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "nan": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true, "optional": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -12406,22 +12173,19 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "3.0.0" } @@ -12430,7 +12194,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { "define-property": "2.0.2", "extend-shallow": "3.0.2", @@ -12442,7 +12205,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "requires": { "extend-shallow": "3.0.2", "safe-regex": "1.1.0" @@ -16640,7 +16402,6 @@ "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" } @@ -16706,7 +16467,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, "requires": { "copy-descriptor": "0.1.1", "define-property": "0.2.5", @@ -16717,7 +16477,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -16726,7 +16485,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "3.0.4" } @@ -16735,7 +16493,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "3.0.4" } @@ -16744,7 +16501,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -16754,8 +16510,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } } @@ -16771,7 +16526,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, "requires": { "isobject": "3.0.1" }, @@ -16779,8 +16533,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -16866,7 +16619,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { "isobject": "3.0.1" }, @@ -16874,8 +16626,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -17044,8 +16795,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", @@ -17087,7 +16837,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -17197,8 +16946,7 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { "version": "0.0.0", @@ -17209,8 +16957,7 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { "version": "2.1.0", @@ -17224,20 +16971,17 @@ "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=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "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 + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", @@ -17281,7 +17025,6 @@ "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, "requires": { "through": "2.3.8" } @@ -17314,8 +17057,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", @@ -17400,8 +17142,7 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "prelude-ls": { "version": "1.1.2", @@ -17412,8 +17153,7 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", @@ -17452,8 +17192,7 @@ "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=", - "dev": true + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { "version": "2.0.1", @@ -17530,7 +17269,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", - "dev": true, "requires": { "event-stream": "3.3.4" } @@ -17538,8 +17276,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", @@ -17551,7 +17288,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", "integrity": "sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q==", - "dev": true, "requires": { "ps-tree": "1.1.0" } @@ -17703,7 +17439,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "0.6.0", "ini": "1.3.4", @@ -17736,7 +17471,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -17751,7 +17485,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, "requires": { "graceful-fs": "4.1.10", "minimatch": "3.0.3", @@ -17844,7 +17577,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", - "dev": true, "requires": { "extend-shallow": "2.0.1" }, @@ -17853,7 +17585,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -17881,7 +17612,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, "requires": { "rc": "1.2.8", "safe-buffer": "5.1.1" @@ -17891,7 +17621,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, "requires": { "rc": "1.2.8" } @@ -17928,20 +17657,17 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -18112,8 +17838,7 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "restore-cursor": { "version": "2.0.0", @@ -18136,8 +17861,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "right-align": { "version": "0.1.3", @@ -18245,14 +17969,12 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", - "dev": true + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { "ret": "0.1.15" } @@ -18345,14 +18067,12 @@ "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, "requires": { "semver": "5.3.0" } @@ -18511,14 +18231,12 @@ "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -18530,7 +18248,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -18582,7 +18299,6 @@ "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" } @@ -18590,8 +18306,7 @@ "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 + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "sigmund": { "version": "1.0.1", @@ -18602,8 +18317,7 @@ "signal-exit": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.1.tgz", - "integrity": "sha1-WkyISZK2OnrNm623iUw+6c/MrYE=", - "dev": true + "integrity": "sha1-WkyISZK2OnrNm623iUw+6c/MrYE=" }, "single-line-log": { "version": "1.1.2", @@ -18647,7 +18361,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "0.11.2", "debug": "2.6.9", @@ -18663,7 +18376,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -18672,7 +18384,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -18681,7 +18392,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -18690,7 +18400,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -18700,14 +18409,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -18716,7 +18423,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -18727,7 +18433,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -18737,8 +18442,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -18746,7 +18450,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, "requires": { "define-property": "1.0.0", "isobject": "3.0.1", @@ -18756,8 +18459,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -18765,7 +18467,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -18773,14 +18474,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -18990,14 +18689,12 @@ "source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { "atob": "2.1.2", "decode-uri-component": "0.2.0", @@ -19018,8 +18715,7 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "sparkles": { "version": "1.0.0", @@ -19151,7 +18847,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, "requires": { "through": "2.3.8" } @@ -19160,7 +18855,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, "requires": { "extend-shallow": "3.0.2" }, @@ -19169,7 +18863,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "1.0.0", "is-extendable": "1.0.1" @@ -19179,7 +18872,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -19239,7 +18931,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { "define-property": "0.2.5", "object-copy": "0.1.0" @@ -19249,7 +18940,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -19258,7 +18948,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -19267,7 +18956,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -19277,14 +18965,12 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -19293,7 +18979,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -19304,7 +18989,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -19314,8 +18998,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -19348,7 +19031,6 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, "requires": { "duplexer": "0.1.1" } @@ -19418,8 +19100,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "strip-ansi": { "version": "3.0.1", @@ -19442,8 +19123,7 @@ "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 + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", @@ -19457,8 +19137,7 @@ "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=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { "version": "0.20.3", @@ -19552,7 +19231,6 @@ "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" } @@ -19572,8 +19250,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.1", @@ -19625,8 +19302,7 @@ "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=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { "version": "2.0.10", @@ -19668,7 +19344,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { "kind-of": "3.0.4" } @@ -19771,7 +19446,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "3.0.0", "repeat-string": "1.6.1" @@ -19781,7 +19455,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "3.0.4" } @@ -19791,8 +19464,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", - "dev": true, + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "requires": { "nopt": "1.0.10" }, @@ -19801,7 +19473,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, "requires": { "abbrev": "1.1.1" } @@ -20034,7 +19705,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", - "dev": true, "requires": { "debug": "2.6.9" } @@ -20043,7 +19713,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, "requires": { "arr-union": "3.1.0", "get-value": "2.0.6", @@ -20055,7 +19724,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -20064,7 +19732,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -20084,7 +19751,6 @@ "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" } @@ -20104,7 +19770,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { "has-value": "0.3.1", "isobject": "3.0.1" @@ -20114,7 +19779,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { "get-value": "2.0.6", "has-values": "0.1.4", @@ -20125,7 +19789,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -20135,34 +19798,29 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.4.1", @@ -20180,7 +19838,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "1.9.3" } @@ -20189,7 +19846,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -20199,14 +19855,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "3.0.0" } @@ -20239,8 +19893,7 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { "version": "0.11.0", @@ -20274,7 +19927,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -20282,8 +19934,7 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "useragent": { "version": "2.3.0", @@ -20325,8 +19976,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -20735,7 +20385,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -21150,7 +20801,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -21206,6 +20858,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -21249,12 +20902,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -22022,12 +21677,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -22047,7 +21704,8 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -22845,7 +22503,6 @@ "version": "1.2.11", "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, "requires": { "isexe": "1.1.2" } @@ -22866,10 +22523,9 @@ } }, "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "requires": { "string-width": "2.1.1" }, @@ -22877,20 +22533,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "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=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -22900,7 +22553,6 @@ "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" } @@ -22946,8 +22598,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", - "dev": true, + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -22957,14 +22608,12 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" } } }, @@ -22987,8 +22636,7 @@ "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 + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xmlhttprequest-ssl": { "version": "1.5.3", @@ -23011,8 +22659,7 @@ "yallist": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", - "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", - "dev": true + "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" }, "yaml-loader": { "version": "0.5.0", diff --git a/package.json b/package.json index 3ca24cc55..b5421a901 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "mysql2": "^1.6.1", "nightmare": "^3.0.1", "node-sass": "^4.9.3", - "nodemon": "^1.18.4", + "nodemon": "^1.18.5", "plugin-error": "^1.0.1", "raw-loader": "*", "run-sequence": "^2.2.1", @@ -79,6 +79,6 @@ "test": "nodemon -q services_tests.js -w services", "dbtest": "nodemon -q db_tests.js -w services/db/tests", "lint": "eslint ./ --cache --ignore-pattern .gitignore", - "services": "node --inspect ./node_modules/gulp/bin/gulp.js services" + "services": "nodemon --inspect -w services ./node_modules/gulp/bin/gulp.js services" } } diff --git a/services/db/install/dump/fixtures.sql b/services/db/install/dump/fixtures.sql index 75be58e18..89b79d003 100644 --- a/services/db/install/dump/fixtures.sql +++ b/services/db/install/dump/fixtures.sql @@ -325,19 +325,19 @@ INSERT INTO `vn`.`bankEntity`(`id`, `countryFk`, `name`, `bic`) INSERT INTO `vn`.`company`(`id`, `code`, `supplierAccountFk`, `workerManagerFk`, `companyCode`, `sage200Company`) VALUES - ( 69 , 'CCs', NULL, 30, NULL, 1), - ( 442 , 'VNL', 241, 30, 2 , 2), - ( 567 , 'VNH', NULL, 30, NULL, 3), - ( 791 , 'FTH', NULL, 30, NULL, 4), - ( 1381, 'ORN', NULL, 30, NULL, 5); + ( 69 , 'CCs', NULL, 30, NULL, 0), + ( 442 , 'VNL', 241, 30, 2 , 1), + ( 567 , 'VNH', NULL, 30, NULL, 4), + ( 791 , 'FTH', NULL, 30, NULL, 3), + ( 1381, 'ORN', NULL, 30, NULL, 7); -INSERT INTO `vn`.`invoiceOut`(`id`, `ref`, `serial`, `amount`, `issued`,`clientFk`, `created`, `companyFk`, `dued`, `booked`, `bankFk`, `pdf`) +INSERT INTO `vn`.`invoiceOut`(`id`,`ref`, `serial`, `amount`, `issued`,`clientFk`, `created`, `companyFk`, `dued`, `booked`, `bankFk`, `pdf`) VALUES - ( 1, 'T1111111' , 'T', 500 , DATE_ADD(CURDATE(), INTERVAL -2 MONTH), 101, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), - ( 2, 'V2222222' , 'V', 350.50 , DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 102, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), - ( 3, 'E3333333' , 'E', 90.30 , CURDATE(), 103, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), - ( 4, 'E4444444' , 'E', 290.30 , DATE_ADD(CURDATE(), INTERVAL +1 MONTH), 103, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), - ( 5, 'E5555555' , 'E', 190.30 , DATE_ADD(CURDATE(), INTERVAL +2 MONTH), 103, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1); + ( 1, '1', 'T', 500 , DATE_ADD(CURDATE(), INTERVAL -2 MONTH), 101, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), + ( 2, '1', 'V', 350.50 , DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 102, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), + ( 3, '1', 'E', 90.30 , CURDATE(), 103, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), + ( 4, '1', 'E', 290.30 , DATE_ADD(CURDATE(), INTERVAL +1 MONTH), 103, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1), + ( 5, '1', 'R', 190.30 , DATE_ADD(CURDATE(), INTERVAL +2 MONTH), 103, CURDATE(), 442, CURDATE(), CURDATE(), 1, 1); INSERT INTO `vn`.`ticket`(`id`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `created`) VALUES diff --git a/services/loopback/common/methods/state/list.js b/services/loopback/common/methods/state/list.js deleted file mode 100644 index 566b576de..000000000 --- a/services/loopback/common/methods/state/list.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = State => { - var serverFilter = {where: {order: {gt: 0}}, order: 'order, name'}; - State.defineScope(serverFilter); -}; diff --git a/services/loopback/common/methods/vn-model/rewriteDbError.js b/services/loopback/common/methods/vn-model/rewriteDbError.js deleted file mode 100644 index 1a4045662..000000000 --- a/services/loopback/common/methods/vn-model/rewriteDbError.js +++ /dev/null @@ -1,58 +0,0 @@ -module.exports = Self => { - /** - * Catches database errors overriding - * model.create() and model.upsert() methods - * @param {Object} replaceErrFunc - Callback - */ - Self.rewriteDbError = function(replaceErrFunc) { - this.once('attached', () => { - let realUpsert = this.upsert; - this.upsert = async(data, options, cb) => { - if (options instanceof Function) { - cb = options; - options = null; - } - - try { - await realUpsert.call(this, data, options); - if (cb) cb(); - } catch (err) { - let myErr = replaceErr(err, replaceErrFunc); - if (cb) - cb(myErr); - else - throw myErr; - } - }; - - let realCreate = this.create; - this.create = async(data, options, cb) => { - if (options instanceof Function) { - cb = options; - options = null; - } - - try { - await realCreate.call(this, data, options); - if (cb) cb(); - } catch (err) { - let myErr = replaceErr(err, replaceErrFunc); - if (cb) - cb(myErr); - else - throw myErr; - } - }; - }); - }; - - function replaceErr(err, replaceErrFunc) { - if (Array.isArray(err)) { - let errs = []; - for (let e of err) - errs.push(replaceErrFunc(e)); - return errs; - } - return replaceErrFunc(err); - } -}; diff --git a/services/loopback/common/methods/vn-model/specs/crud.spec.js b/services/loopback/common/methods/vn-model/specs/crud.spec.js index 3e7ce0525..c114bd0b8 100644 --- a/services/loopback/common/methods/vn-model/specs/crud.spec.js +++ b/services/loopback/common/methods/vn-model/specs/crud.spec.js @@ -8,13 +8,11 @@ describe('Model crud()', () => { expect(ItemBarcode.crud).toBeDefined(); }); - it('should create a new instance', async() => { + it('should create a new instance', async () => { let data = {code: '500', itemFk: '1'}; + let creates = [data]; - crudObject = { - create: [data] - }; - await ItemBarcode.crud(crudObject); + await ItemBarcode.crud(null, null, creates); let instance = await ItemBarcode.findOne({where: data}); insertId = instance.id; @@ -22,24 +20,21 @@ describe('Model crud()', () => { expect(instance.code).toEqual('500'); }); - it('should update the instance', async() => { - crudObject = { - update: [{ - where: {id: insertId}, - data: {code: '501', itemFk: 1} - }] - }; - await ItemBarcode.crud(crudObject); + it('should update the instance', async () => { + let updates = [{ + where: {id: insertId}, + data: {code: '501', itemFk: 1} + }]; + + await ItemBarcode.crud(null, updates); let instance = await ItemBarcode.findById(insertId); expect(instance.code).toEqual('501'); }); - it('should delete the created instance', async() => { - crudObject = { - delete: [insertId] - }; - await ItemBarcode.crud(crudObject); + it('should delete the created instance', async () => { + let deletes = [insertId]; + await ItemBarcode.crud(deletes); let instance = await ItemBarcode.findById(insertId); expect(instance).toEqual(null); diff --git a/services/loopback/common/methods/vn-model/validateBinded.js b/services/loopback/common/methods/vn-model/validateBinded.js deleted file mode 100644 index 3e5e3f156..000000000 --- a/services/loopback/common/methods/vn-model/validateBinded.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = function(Self) { - Self.validateBinded = function(propertyName, validatorFn, options) { - var customValidator = function(err) { - if (!validatorFn(this[propertyName])) err(); - }; - options.isExportable = true; - options.bindedFunction = validatorFn; - this.validate(propertyName, customValidator, options); - }; -}; diff --git a/services/loopback/common/models/agency.js b/services/loopback/common/models/agency.js index 9994624df..b649e9065 100644 --- a/services/loopback/common/models/agency.js +++ b/services/loopback/common/models/agency.js @@ -1,5 +1,4 @@ module.exports = Self => { - Self.defineScope({where: {isManaged: {neq: 0}}}); require('../methods/agency/landsThatDay')(Self); require('../methods/agency/getFirstShipped')(Self); }; diff --git a/services/loopback/common/models/state.js b/services/loopback/common/models/state.js index 06e1ac92d..d2b0aa30a 100644 --- a/services/loopback/common/models/state.js +++ b/services/loopback/common/models/state.js @@ -1,6 +1,4 @@ module.exports = Self => { - require('../methods/state/list')(Self); - /** * Checks if the alertLevel of a state is 0. * diff --git a/services/loopback/common/models/vn-model.js b/services/loopback/common/models/vn-model.js index e5c15be8a..3fb16a57f 100644 --- a/services/loopback/common/models/vn-model.js +++ b/services/loopback/common/models/vn-model.js @@ -5,261 +5,267 @@ const UserError = require('../helpers').UserError; module.exports = function(Self) { Self.ParameterizedSQL = ParameterizedSQL; - require('../methods/vn-model/validateBinded')(Self); - require('../methods/vn-model/rewriteDbError')(Self); require('../methods/vn-model/getSetValues')(Self); - Self.setup = function() { - Self.super_.setup.call(this); + Object.assign(Self, { + setup() { + Self.super_.setup.call(this); - // Register field ACL validation - this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx)); - this.beforeRemote('updateAll', ctx => this.checkUpdateAcls(ctx)); - this.beforeRemote('patchOrCreate', ctx => this.checkInsertAcls(ctx)); - this.beforeRemote('create', ctx => this.checkInsertAcls(ctx)); - this.beforeRemote('replaceById', ctx => this.checkInsertAcls(ctx)); - this.beforeRemote('replaceOrCreate', ctx => this.checkInsertAcls(ctx)); + // Register field ACL validation + this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx)); + this.beforeRemote('updateAll', ctx => this.checkUpdateAcls(ctx)); + this.beforeRemote('patchOrCreate', ctx => this.checkInsertAcls(ctx)); + this.beforeRemote('create', ctx => this.checkInsertAcls(ctx)); + this.beforeRemote('replaceById', ctx => this.checkInsertAcls(ctx)); + this.beforeRemote('replaceOrCreate', ctx => this.checkInsertAcls(ctx)); - this.remoteMethod('crud', { - description: 'Create, update or/and delete instances from model with a single request', - accessType: 'WRITE', - accepts: [ - { - arg: 'actions', - type: 'Object', - require: true, - description: 'Instances to update, example: {create: [instances], update: [instances], delete: [ids]}', - http: {source: 'body'} - } - ], - http: { - path: `/crud`, - verb: 'POST' - } - }); - }; - - Self.defineScope = function(serverFilter) { - this.remoteMethodCtx('list', { - accepts: [ - { - arg: 'filter', - type: 'object', - description: 'Filter defining where' - } - ], - returns: { - type: [this.modelName], - root: true - }, - http: { - verb: 'get', - path: '/list' - } - }); - - this.list = function(ctx, clientFilter, cb) { - let clientFields = (clientFilter && clientFilter.fields) ? clientFilter.fields : []; - let serverFields = (serverFilter && serverFilter.fields) ? serverFilter.fields : []; - let fields = clientFields.filter(itemC => { - return serverFields.some(itemS => itemS === itemC); + this.remoteMethod('crud', { + description: `Create, update or/and delete instances from model with a single request`, + accessType: 'WRITE', + accepts: [ + { + arg: 'deletes', + description: `Identifiers of instances to delete`, + type: ['Integer'] + }, { + arg: 'updates', + description: `Instances to update with it's identifier {where, data}`, + type: ['Object'] + }, { + arg: 'creates', + description: `Instances to create`, + type: ['Object'] + } + ] }); - let and = []; - let order; - let limit; - let filter = {order: order, limit: limit}; + }, - if (clientFilter && clientFilter.where) - and.push(clientFilter.where); - if (serverFilter && serverFilter.where) - and.push(serverFilter.where); + async crud(deletes, updates, creates) { + let transaction = await this.beginTransaction({}); + let options = {transaction}; - if (clientFilter && clientFilter.order) - order = clientFilter.order; - else if (serverFilter && serverFilter.order) - order = serverFilter.order; - - if (serverFilter && serverFilter.limit) - limit = serverFilter.limit; - else if (clientFilter && clientFilter.limit) - limit = clientFilter.limit; - - filter.where = (and.length > 0) && {and: and}; - filter.fields = fields; - - this.find(filter, function(err, states) { - if (err) - cb(err, null); - else - cb(null, states); - }); - }; - }; - - Self.remoteMethodCtx = function(methodName, args) { - let ctx = { - arg: 'context', - type: 'object', - http: function(ctx) { - return ctx; - } - }; - if (args.accepts === undefined) - args.accepts = []; - else if (!Array.isArray(args.accepts)) - args.accepts = [args.accepts]; - args.accepts.unshift(ctx); - this.remoteMethod(methodName, args); - }; - - Self.getConnection = function(cb) { - this.dataSource.connector.client.getConnection(cb); - }; - - Self.connectToService = function(ctx, dataSource) { - this.app.dataSources[dataSource].connector.remotes.auth = { - bearer: new Buffer(ctx.req.accessToken.id).toString('base64'), - sendImmediately: true - }; - }; - - Self.disconnectFromService = function(dataSource) { - this.app.dataSources[dataSource].connector.remotes.auth = { - bearer: new Buffer('').toString('base64'), - sendImmediately: true - }; - }; - - Self.crud = async function(actions) { - let transaction = await this.beginTransaction({}); - let options = {transaction: transaction}; - - try { - if (actions.delete && actions.delete.length) - await this.destroyAll({id: {inq: actions.delete}}, options); - - if (actions.update) { - try { + try { + if (deletes) { let promises = []; - actions.update.forEach(toUpdate => { - promises.push(this.upsertWithWhere(toUpdate.where, toUpdate.data, options)); - }); + for (let id of deletes) + promises.push(this.destroyById(id, options)); await Promise.all(promises); - } catch (error) { - throw error; } - } - if (actions.create && actions.create.length) { - try { - await this.create(actions.create, options); - } catch (error) { - throw error[error.length - 1]; + if (updates) { + let promises = []; + for (let update of updates) + promises.push(this.upsertWithWhere(update.where, update.data, options)); + await Promise.all(promises); } + if (creates && creates.length) + try { + await this.create(creates, options); + } catch (error) { + throw error[error.length - 1]; + } + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; } - await transaction.commit(); - } catch (error) { - await transaction.rollback(); - throw error; + }, + + /** + * Wrapper for remoteMethod() but adding the context as + * extra argument at the beginning of arguments list. + * + * @param {String} methodName The method name + * @param {Object} options The method options + */ + remoteMethodCtx(methodName, options) { + if (options.accepts === undefined) + options.accepts = []; + else if (!Array.isArray(options.accepts)) + options.accepts = [options.accepts]; + + options.accepts.unshift({ + arg: 'ctx', + type: 'Object', + http: {source: 'context'} + }); + this.remoteMethod(methodName, options); + }, + + /** + * Adds a validation, marking it as exportable to the browser. + * Exportable validation functions should be synchronous and totally + * independent from other code because they are parsed in the browser + * using eval(). + * + * @param {String} propertyName The property name + * @param {Function} validatorFn The validation function + * @param {Object} options The validation options + */ + validateBinded(propertyName, validatorFn, options) { + let customValidator = function(err) { + if (!validatorFn(this[propertyName])) err(); + }; + options.isExportable = true; + options.bindedFunction = validatorFn; + this.validate(propertyName, customValidator, options); + }, + + /** + * Catches database errors overriding create() and upsert() methods. + * + * @param {Function} replaceErrFunc - Callback + */ + rewriteDbError(replaceErrFunc) { + function replaceErr(err, replaceErrFunc) { + if (Array.isArray(err)) { + let errs = []; + for (let e of err) + errs.push(replaceErrFunc(e)); + return errs; + } + return replaceErrFunc(err); + } + + this.once('attached', () => { + let realUpsert = this.upsert; + this.upsert = async (data, options, cb) => { + if (options instanceof Function) { + cb = options; + options = null; + } + + try { + await realUpsert.call(this, data, options); + if (cb) cb(); + } catch (err) { + let myErr = replaceErr(err, replaceErrFunc); + if (cb) + cb(myErr); + else + throw myErr; + } + }; + + let realCreate = this.create; + this.create = async (data, options, cb) => { + if (options instanceof Function) { + cb = options; + options = null; + } + + try { + await realCreate.call(this, data, options); + if (cb) cb(); + } catch (err) { + let myErr = replaceErr(err, replaceErrFunc); + if (cb) + cb(myErr); + else + throw myErr; + } + }; + }); + }, + + /* + * Shortcut to VnMySQL.executeP() + */ + rawSql(query, params, options, cb) { + return this.dataSource.connector.executeP(query, params, options, cb); + }, + + /* + * Shortcut to VnMySQL.executeStmt() + */ + rawStmt(stmt, options) { + return this.dataSource.connector.executeStmt(stmt, options); + }, + + /* + * Shortcut to VnMySQL.makeLimit() + */ + makeLimit(filter) { + return this.dataSource.connector.makeLimit(filter); + }, + + /* + * Shortcut to VnMySQL.makeSuffix() + */ + makeSuffix(filter) { + return this.dataSource.connector.makeSuffix(filter); + }, + + /* + * Shortcut to VnMySQL.buildModelSuffix() + */ + buildSuffix(filter, tableAlias) { + return this.dataSource.connector.buildModelSuffix(this.modelName, filter, tableAlias); + }, + + async checkAcls(ctx, actionType) { + let userId = ctx.req.accessToken.userId; + let models = this.app.models; + let userRoles = await models.Account.getRoles(userId); + let data = ctx.args.data; + let modelAcls; + + function modifiedProperties(data) { + let properties = []; + + for (property in data) + properties.push(property); + + return properties; + } + + modelAcls = await models.FieldAcl.find({ + where: { + and: [ + {model: this.modelName}, + {role: {inq: userRoles}}, + {property: '*'}, + {or: [{actionType: '*'}, {actionType: actionType}]} + ] + } + }); + + let allowedAll = modelAcls.find(acl => { + return acl.property == '*'; + }); + + if (allowedAll) + return; + + modelAcls = await models.FieldAcl.find({ + where: { + and: [ + {model: this.modelName}, + {role: {inq: userRoles}}, + {property: {inq: modifiedProperties(data)}}, + {or: [{actionType: '*'}, {actionType: actionType}]} + ] + } + }); + + let propsHash = {}; + for (let acl of modelAcls) + propsHash[acl.property] = true; + + let allowedProperties = Object.keys(data).every(property => { + return propsHash[property]; + }); + + if (!allowedProperties) + throw new UserError(`You don't have enough privileges`); + }, + + checkUpdateAcls(ctx) { + return this.checkAcls(ctx, 'update'); + }, + + checkInsertAcls(ctx) { + return this.checkAcls(ctx, 'insert'); } - }; - - Self.checkAcls = async function(ctx, actionType) { - let userId = ctx.req.accessToken.userId; - let models = this.app.models; - let userRoles = await models.Account.getRoles(userId); - let data = ctx.args.data; - let modelAcls; - - function modifiedProperties(data) { - let properties = []; - - for (property in data) - properties.push(property); - - return properties; - } - - modelAcls = await models.FieldAcl.find({ - where: { - and: [ - {model: this.modelName}, - {role: {inq: userRoles}}, - {property: '*'}, - {or: [{actionType: '*'}, {actionType: actionType}]} - ] - } - }); - - let allowedAll = modelAcls.find(acl => { - return acl.property == '*'; - }); - - if (allowedAll) - return; - - modelAcls = await models.FieldAcl.find({ - where: { - and: [ - {model: this.modelName}, - {role: {inq: userRoles}}, - {property: {inq: modifiedProperties(data)}}, - {or: [{actionType: '*'}, {actionType: actionType}]} - ] - } - }); - - let propsHash = {}; - for (let acl of modelAcls) - propsHash[acl.property] = true; - - let allowedProperties = Object.keys(data).every(property => { - return propsHash[property]; - }); - - if (!allowedProperties) - throw new UserError(`You don't have enough privileges`); - }; - - Self.checkUpdateAcls = function(ctx) { - return this.checkAcls(ctx, 'update'); - }; - - Self.checkInsertAcls = function(ctx) { - return this.checkAcls(ctx, 'insert'); - }; - - /* - * Shortcut to VnMySQL.executeP() - */ - Self.rawSql = function(query, params, options, cb) { - return this.dataSource.connector.executeP(query, params, options, cb); - }; - - /* - * Shortcut to VnMySQL.executeStmt() - */ - Self.rawStmt = function(stmt, options) { - return this.dataSource.connector.executeStmt(stmt, options); - }; - - /* - * Shortcut to VnMySQL.makeLimit() - */ - Self.makeLimit = function(filter) { - return this.dataSource.connector.makeLimit(filter); - }; - - /* - * Shortcut to VnMySQL.makeSuffix() - */ - Self.makeSuffix = function(filter) { - return this.dataSource.connector.makeSuffix(filter); - }; - - /* - * Shortcut to VnMySQL.buildModelSuffix() - */ - Self.buildSuffix = function(filter, tableAlias) { - return this.dataSource.connector.buildModelSuffix(this.modelName, filter, tableAlias); - }; + }); }; diff --git a/services/loopback/server/connectors/vn-mysql.js b/services/loopback/server/connectors/vn-mysql.js index 046866ede..dee523be7 100644 --- a/services/loopback/server/connectors/vn-mysql.js +++ b/services/loopback/server/connectors/vn-mysql.js @@ -1,18 +1,11 @@ const mysql = require('mysql'); -const loopbackConnector = require('loopback-connector'); -const SqlConnector = loopbackConnector.SqlConnector; -const ParameterizedSQL = loopbackConnector.ParameterizedSQL; +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const MySQL = require('loopback-connector-mysql').MySQL; const EnumFactory = require('loopback-connector-mysql').EnumFactory; const fs = require('fs'); class VnMySQL extends MySQL { - constructor(settings) { - super(); - SqlConnector.call(this, 'mysql', settings); - } - toColumnValue(prop, val) { if (val == null || !prop || prop.type !== Date) return MySQL.prototype.toColumnValue.call(this, prop, val); @@ -237,12 +230,11 @@ exports.initialize = function initialize(dataSource, callback) { dataSource.EnumFactory = EnumFactory; - if (callback) { + if (callback) if (dataSource.settings.lazyConnect) { process.nextTick(function() { callback(); }); } else dataSource.connector.connect(callback); - } };