diff --git a/db/Dockerfile b/db/Dockerfile index bedcf75d6..c376e6893 100644 --- a/db/Dockerfile +++ b/db/Dockerfile @@ -1,4 +1,4 @@ -FROM mysql:5.6.42 +FROM mysql:8.0.18 ENV MYSQL_ROOT_PASSWORD root ENV TZ Europe/Madrid @@ -7,36 +7,33 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get install -y --no-install-recommends curl ca-certificates \ && curl -sL https://apt.verdnatura.es/conf/verdnatura.gpg | apt-key add - \ - && echo "deb http://apt.verdnatura.es/ jessie main" > /etc/apt/sources.list.d/vn.list \ + && echo "deb http://apt.verdnatura.es/ stretch main" > /etc/apt/sources.list.d/vn.list \ && apt-get update \ - && apt-get install -y --allow-unauthenticated vn-mysql \ + && apt-get install -y vn-mysql libmysqlclient21 \ && apt-get purge -y --auto-remove curl ca-certificates \ && rm -rf /var/lib/apt/lists/* -# XXX: Removes the last script line to avoid daemon to be started -RUN cp /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-init.sh \ - && sed -i '$ d' /usr/local/bin/docker-init.sh - -WORKDIR /docker-entrypoint-initdb.d -ARG STAMP=unknown - -COPY import-changes.sh config.ini /docker-entrypoint-initdb.d/import/ -COPY docker.cnf /etc/mysql/mysql.conf.d/ -COPY changes /docker-entrypoint-initdb.d/import/changes - -COPY docker-boot.sh /docker-entrypoint-initdb.d/ -COPY dump /docker-entrypoint-initdb.d/dump +COPY docker/docker.cnf /etc/mysql/conf.d/ +COPY docker/docker-init.sh docker/docker-start.sh /usr/local/bin/ RUN mkdir /mysql-data \ - && /usr/local/bin/docker-init.sh mysqld --datadir /mysql-data \ - && chown -R mysql:mysql /mysql-data \ + && chown -R mysql:mysql /mysql-data + +WORKDIR /docker-entrypoint-initdb.d + +COPY dump dump +COPY docker/docker-boot.sh /docker-entrypoint-initdb.d/ +COPY changes import/changes +COPY import-changes.sh config.ini import/ + +ARG STAMP=unknown +RUN gosu mysql docker-init.sh mysqld \ && rm -rf /docker-entrypoint-initdb.d/* -COPY docker-start.sh /usr/local/bin/ +USER mysql ENTRYPOINT ["docker-start.sh"] -USER mysql -CMD ["mysqld", "--datadir", "/mysql-data"] +CMD ["mysqld"] #HEALTHCHECK --interval=5s --timeout=10s --retries=200 \ # CMD mysqladmin ping -h 127.0.0.1 -u root || exit 1 diff --git a/db/changes/10081-agency/01-zone_getWarehouse.sql b/db/changes/10081-agency/01-zone_getWarehouse.sql index 838c225f8..28478e2cc 100644 --- a/db/changes/10081-agency/01-zone_getWarehouse.sql +++ b/db/changes/10081-agency/01-zone_getWarehouse.sql @@ -6,8 +6,8 @@ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `zone_getWarehouse`(vAddress INT, vLanded DATE, vWarehouse INT) BEGIN /** -* Devuelve el listado de agencias disponibles para la fecha, - * dirección y warehouse pasadas + * Devuelve el listado de agencias disponibles para la fecha, + * dirección y almacén pasados. * * @param vAddress * @param vWarehouse warehouse @@ -30,7 +30,8 @@ BEGIN JOIN agencyMode am ON am.id = z.agencyModeFk JOIN zoneWarehouse zw ON zw.zoneFk = zo.zoneFk WHERE zw.warehouseFk - GROUP BY z.agencyModeFk; + GROUP BY z.agencyModeFk + ORDER BY agencyMode; DROP TEMPORARY TABLE tmp.zone, diff --git a/db/docker.cnf b/db/docker.cnf deleted file mode 100644 index 2b593b972..000000000 --- a/db/docker.cnf +++ /dev/null @@ -1,4 +0,0 @@ -[mysqld] -innodb_log_file_size = 4M -innodb_autoextend_increment = 4 -innodb_page_size = 8K \ No newline at end of file diff --git a/db/docker-boot.sh b/db/docker/docker-boot.sh similarity index 100% rename from db/docker-boot.sh rename to db/docker/docker-boot.sh diff --git a/db/docker/docker-init.sh b/db/docker/docker-init.sh new file mode 100755 index 000000000..19d13a15d --- /dev/null +++ b/db/docker/docker-init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +. /usr/local/bin/docker-entrypoint.sh + +mysql_check_config "$@" +docker_setup_env "$@" +docker_create_db_directories + +docker_verify_minimum_env +docker_init_database_dir "$@" +docker_temp_server_start "$@" +docker_setup_db + +docker_process_init_files /docker-entrypoint-initdb.d/* + +mysql_expire_root_user +docker_temp_server_stop diff --git a/db/docker-start.sh b/db/docker/docker-start.sh similarity index 100% rename from db/docker-start.sh rename to db/docker/docker-start.sh diff --git a/db/docker/docker.cnf b/db/docker/docker.cnf new file mode 100644 index 000000000..1a0241487 --- /dev/null +++ b/db/docker/docker.cnf @@ -0,0 +1,10 @@ +[mysqld] +innodb_log_file_size = 4M +innodb_autoextend_increment = 4 +innodb_page_size = 8K +innodb_default_row_format = COMPACT +log_bin_trust_function_creators = ON +datadir = /mysql-data +sql_mode = NO_ENGINE_SUBSTITUTION +innodb_temp_data_file_path = /tmp/ibtmp1:12M:autoextend +skip-log-bin diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 4fc94e59e..5007d8f33 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -1,10 +1,13 @@ -- FIXME: cuando se eliminen los procedimientos de la cache, se podra eliminar esta linea CREATE SCHEMA IF NOT EXISTS `vn2008`; +CREATE SCHEMA IF NOT EXISTS `tmp`; +ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; ALTER TABLE `vn`.`itemTaxCountry` AUTO_INCREMENT = 1; ALTER TABLE `vn`.`address` AUTO_INCREMENT = 1; ALTER TABLE `vn`.`zoneGeo` AUTO_INCREMENT = 1; +ALTER TABLE `vn`.`ticket` AUTO_INCREMENT = 1; INSERT INTO `vn`.`ticketConfig` (`id`, `scopeDays`) VALUES @@ -1580,9 +1583,9 @@ INSERT INTO `postgresql`.`calendar_employee` (`business_id`, `calendar_state_id` (107, 1, DATE_ADD(CURDATE(), INTERVAL -12 DAY)), (107, 2, DATE_ADD(CURDATE(), INTERVAL -20 DAY)); -INSERT INTO `vn`.`smsConfig` (`id`, `uri`, `user`, `password`, `title`) +INSERT INTO `vn`.`smsConfig` (`id`, `uri`, `title`) VALUES - ('1', 'https://websms.xtratelecom.es/api_php/server.wsdl', 'VERDINATURA', '182wbOKu', 'Verdnatura'); + ('1', 'https://websms.xtratelecom.es/api_php/server.wsdl', 'Verdnatura'); INSERT INTO `vn`.`sharingClient`(`id`, `workerFk`, `started`, `ended`, `clientFk`) VALUES diff --git a/db/dump/mysqlPlugins.sql b/db/dump/mysqlPlugins.sql index 861db4afe..c3b6f6ee4 100644 --- a/db/dump/mysqlPlugins.sql +++ b/db/dump/mysqlPlugins.sql @@ -1,4 +1,4 @@ -- Import compiled functions CREATE AGGREGATE FUNCTION minacum RETURNS INT SONAME 'minacum.so'; -CREATE AGGREGATE FUNCTION multimax RETURNS INT SONAME 'multimax.so'; \ No newline at end of file +CREATE AGGREGATE FUNCTION multimax RETURNS INT SONAME 'multimax.so'; diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index ed12439a9..03a50bc45 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -336,6 +336,7 @@ let actions = { waitForLastSnackbar: function() { return this.wait(500) + .waitForSpinnerLoad() .waitForLastShape('vn-snackbar .shape .text'); }, diff --git a/e2e/helpers/nightmare.js b/e2e/helpers/nightmare.js index 01dcdd5d3..5b87f2dca 100644 --- a/e2e/helpers/nightmare.js +++ b/e2e/helpers/nightmare.js @@ -3,7 +3,7 @@ const config = require('./config.js'); let nightmare; -module.exports = function createNightmare(width = 1280, height = 720) { +module.exports = function createNightmare(width = 1280, height = 800) { if (nightmare) return nightmare; diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index a6687fdcb..311e9deff 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -75,7 +75,8 @@ export default { hasToInvoiceCheckbox: 'vn-check[label="Has to invoice"]', invoiceByMailCheckbox: 'vn-check[label="Invoice by mail"]', viesCheckbox: 'vn-check[label="Vies"]', - saveButton: `button[type=submit]` + saveButton: `button[type=submit]`, + watcher: 'vn-client-fiscal-data vn-watcher' }, clientBillingData: { payMethodAutocomplete: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.payMethodFk"]', @@ -91,7 +92,8 @@ export default { newBankEntityBIC: '.vn-dialog.shown vn-textfield[label="Swift / BIC"] input', newBankEntityCode: '.vn-dialog.shown vn-textfield[label="Entity Code"] input', acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]', - saveButton: `button[type=submit]` + saveButton: `button[type=submit]`, + watcher: 'vn-client-billing-data vn-watcher' }, clientAddresses: { addressesButton: 'vn-left-menu a[ui-sref="client.card.address.index"]', diff --git a/e2e/paths/02-client-module/03_edit_fiscal_data.spec.js b/e2e/paths/02-client-module/03_edit_fiscal_data.spec.js index c28f0a8fe..9d41ed223 100644 --- a/e2e/paths/02-client-module/03_edit_fiscal_data.spec.js +++ b/e2e/paths/02-client-module/03_edit_fiscal_data.spec.js @@ -307,6 +307,7 @@ describe('Client Edit fiscalData path', () => { it('should navigate back to fiscal data to confirm invoice by address is now checked', async() => { const result = await nightmare .waitToClick(selectors.clientFiscalData.fiscalDataButton) + .waitForWatcherData(selectors.clientFiscalData.watcher) .checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox); expect(result).toBe('checked'); diff --git a/e2e/paths/02-client-module/04_edit_billing_data.spec.js b/e2e/paths/02-client-module/04_edit_billing_data.spec.js index a73172d00..ffea943f1 100644 --- a/e2e/paths/02-client-module/04_edit_billing_data.spec.js +++ b/e2e/paths/02-client-module/04_edit_billing_data.spec.js @@ -62,8 +62,8 @@ describe('Client Edit billing data path', () => { it(`should clear the BIC code field, update the IBAN to see how he BIC code autocompletes`, async() => { const AutomaticCode = await nightmare .clearInput(selectors.clientBillingData.IBANInput) - .waitToClick(selectors.clientBillingData.clearswiftBicButton) .write(selectors.clientBillingData.IBANInput, 'ES9121000418450200051332') + .waitForTextInInput(`${selectors.clientBillingData.swiftBicAutocomplete} input`, 'caixesbb') .waitToGetProperty(`${selectors.clientBillingData.swiftBicAutocomplete} input`, 'value'); expect(AutomaticCode).toEqual('CAIXESBB Caixa Bank'); @@ -71,6 +71,7 @@ describe('Client Edit billing data path', () => { it(`should save the form with all its new data`, async() => { const snackbarMessages = await nightmare + .waitForWatcherData(selectors.clientBillingData.watcher) .waitToClick(selectors.clientBillingData.saveButton) .waitForSnackbar(); diff --git a/e2e/paths/02-client-module/05_add_address.spec.js b/e2e/paths/02-client-module/05_add_address.spec.js index fd11e3915..4502a9be1 100644 --- a/e2e/paths/02-client-module/05_add_address.spec.js +++ b/e2e/paths/02-client-module/05_add_address.spec.js @@ -99,6 +99,7 @@ describe('Client Add address path', () => { it(`should click on the active checkbox and receive an error to save it because it is the default address`, async() => { const result = await nightmare + .waitForWatcherData(selectors.clientAddresses.watcher) .waitToClick(selectors.clientAddresses.activeCheckbox) .waitToClick(selectors.clientAddresses.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/02-client-module/14_balance.spec.js b/e2e/paths/02-client-module/14_balance.spec.js index b661d998b..56e1336c8 100644 --- a/e2e/paths/02-client-module/14_balance.spec.js +++ b/e2e/paths/02-client-module/14_balance.spec.js @@ -57,6 +57,7 @@ describe('Client balance path', () => { it('should check balance is now 0 and the company is now VNL becouse the user local settings were removed', async() => { let company = await nightmare + .waitForSpinnerLoad() .waitToGetProperty(`${selectors.clientBalance.companyAutocomplete} input`, 'value'); let firstBalanceLine = await nightmare diff --git a/e2e/paths/05-ticket-module/11_diary.spec.js b/e2e/paths/05-ticket-module/11_diary.spec.js index c64c0ba7b..1f053d29f 100644 --- a/e2e/paths/05-ticket-module/11_diary.spec.js +++ b/e2e/paths/05-ticket-module/11_diary.spec.js @@ -33,6 +33,7 @@ describe('Ticket diary path', () => { const url = await nightmare .waitToClick(selectors.ticketSummary.firstSaleItemId) .waitToClick(selectors.ticketSummary.popoverDiaryButton) + .waitForURL('/diary') .parsedUrl(); expect(url.hash).toContain('/diary'); diff --git a/e2e/paths/06-claim-module/02_development.spec.js b/e2e/paths/06-claim-module/02_development.spec.js index 7df38e945..2c6edcabb 100644 --- a/e2e/paths/06-claim-module/02_development.spec.js +++ b/e2e/paths/06-claim-module/02_development.spec.js @@ -116,16 +116,12 @@ describe('Claim development', () => { const responsible = await nightmare .waitToGetProperty(`${selectors.claimDevelopment.secondClaimResponsibleAutocomplete} input`, 'value'); - const worker = await nightmare - .waitToGetProperty(`${selectors.claimDevelopment.secondClaimWorkerAutocomplete} input`, 'value'); - const redelivery = await nightmare .waitToGetProperty(`${selectors.claimDevelopment.secondClaimRedeliveryAutocomplete} input`, 'value'); expect(reason).toEqual('Prisas'); expect(result).toEqual('Otros daños'); expect(responsible).toEqual('Compradores'); - expect(worker).toEqual('managerNick'); expect(redelivery).toEqual('Cliente'); }); }); diff --git a/loopback/common/methods/vn-model/getSetValues.js b/loopback/common/methods/vn-model/getSetValues.js index 74403e65c..ac6485d3c 100644 --- a/loopback/common/methods/vn-model/getSetValues.js +++ b/loopback/common/methods/vn-model/getSetValues.js @@ -1,3 +1,5 @@ +const UserError = require('vn-loopback/util/user-error'); + module.exports = Self => { /** * Returns a set of allowed values defined on table scheme @@ -7,7 +9,6 @@ module.exports = Self => { Self.getSetValues = async function(column) { let model = this.app.models[this.modelName].definition; let properties = model.properties; - let columnName; let tableName = this.modelName; let schema = null; @@ -17,35 +18,32 @@ module.exports = Self => { schema = tableSplit.pop() || null; } - if (properties[column]) { - columnName = column; + let property = properties[column]; - if (properties[column].mysql) - columnName = properties[column].mysql.columnName; - } + if (!property) + throw new UserError(`Column does not exist`); - let findColumn = Object.keys(properties).find(prop => { - return properties[prop].mysql && properties[prop].mysql.columnName === column; - }); + let columnName = property.mysql + ? property.mysql.columnName + : column; - if (findColumn) - columnName = properties[findColumn].mysql.columnName; - - let type = await this.rawSql( - `SELECT DISTINCT column_type FROM information_schema.columns + let columnInfo = await this.rawSql( + `SELECT column_type columnType + FROM information_schema.columns WHERE table_name = ? AND table_schema = IFNULL(?, DATABASE()) AND column_name = ?`, [tableName, schema, columnName] ); - if (!type) return; + if (!columnInfo || !columnInfo[0]) + throw new UserError(`Cannot fetch column values`); let setValues; - setValues = type[0].column_type; - setValues = setValues.replace(/set\((.*)\)/i, '$1'); - setValues = setValues.replace(/'/g, ''); - setValues = setValues.match(new RegExp(/(\w+)+/, 'ig')); + setValues = columnInfo[0].columnType + .replace(/^set\((.*)\)$/i, '$1') + .replace(/'/g, '') + .match(new RegExp(/(\w+)+/, 'ig')); let values = []; setValues.forEach(setValue => { diff --git a/loopback/common/methods/vn-model/specs/getSetValues.spec.js b/loopback/common/methods/vn-model/specs/getSetValues.spec.js index d14a9113f..cd64697c9 100644 --- a/loopback/common/methods/vn-model/specs/getSetValues.spec.js +++ b/loopback/common/methods/vn-model/specs/getSetValues.spec.js @@ -13,11 +13,4 @@ describe('Model getSetValues()', () => { expect(result.length).toEqual(6); expect(result[5].value).toEqual('TABLET_VN'); }); - - it('should return an array of set values from table column source_app', async() => { - let result = await app.models.Order.getSetValues('source_app'); - - expect(result.length).toEqual(6); - expect(result[5].value).toEqual('TABLET_VN'); - }); }); diff --git a/modules/claim/back/models/claim-development.json b/modules/claim/back/models/claim-development.json index 7452f7ded..7d37c13ee 100644 --- a/modules/claim/back/models/claim-development.json +++ b/modules/claim/back/models/claim-development.json @@ -11,6 +11,27 @@ "type": "Number", "id": true, "description": "Identifier" + }, + "claimFk": { + "required": true + }, + "claimResponsibleFk": { + "required": true + }, + "workerFk": { + "required": true + }, + "claimReasonFk": { + "required": true + }, + "claimResultFk": { + "required": true + }, + "claimRedeliveryFk": { + "required": true + }, + "claimDestinationFk": { + "required": true } }, "relations": { @@ -29,11 +50,6 @@ "model": "Worker", "foreignKey": "workerFk" }, - "claimDestination": { - "type": "belongsTo", - "model": "ClaimDestination", - "foreignKey": "claimDestinationFk" - }, "claimReason": { "type": "belongsTo", "model": "ClaimReason", @@ -48,6 +64,11 @@ "type": "belongsTo", "model": "ClaimRedelivery", "foreignKey": "claimRedeliveryFk" + }, + "claimDestination": { + "type": "belongsTo", + "model": "ClaimDestination", + "foreignKey": "claimDestinationFk" } } } diff --git a/modules/claim/front/development/index.html b/modules/claim/front/development/index.html index cf777f31a..38082847a 100644 --- a/modules/claim/front/development/index.html +++ b/modules/claim/front/development/index.html @@ -49,7 +49,7 @@ data="claimReasons" fields="['id', 'description']" show-field="description" - vn-acl="salesAssistant"> + rule> + rule> + rule> + rule> + rule> + tabindex="-1"> @@ -104,8 +103,7 @@ vn-bind="+" vn-tooltip="Add sale" icon="add_circle" - ng-click="model.insert()" - vn-acl="salesAssistant"> + ng-click="model.insert()"> @@ -113,8 +111,7 @@ + ng-click="$ctrl.onSubmit()"> \ No newline at end of file diff --git a/modules/client/back/methods/sms/send.js b/modules/client/back/methods/sms/send.js index 2446fb95d..e56b5567e 100644 --- a/modules/client/back/methods/sms/send.js +++ b/modules/client/back/methods/sms/send.js @@ -47,17 +47,25 @@ module.exports = Self => { let xmlParsed; let status; + try { - [xmlResponse] = await soapClient.sendSMSAsync(params); - xmlResult = xmlResponse.result.$value; - xmlParsed = await new Promise((resolve, reject) => { - xmlParser(xmlResult, (err, result) => { - if (err) - reject(err); - resolve(result); + if (process.env.NODE_ENV !== 'production') { + status = { + codigo: [200], + descripcion: ['Fake response'] + }; + } else { + [xmlResponse] = await soapClient.sendSMSAsync(params); + xmlResult = xmlResponse.result.$value; + xmlParsed = await new Promise((resolve, reject) => { + xmlParser(xmlResult, (err, result) => { + if (err) + reject(err); + resolve(result); + }); }); - }); - [status] = xmlParsed['xtratelecom-sms-response'].sms; + [status] = xmlParsed['xtratelecom-sms-response'].sms; + } } catch (e) { console.error(e); } diff --git a/modules/client/back/methods/sms/send.spec.js b/modules/client/back/methods/sms/send.spec.js index 19dd8589f..612a16cf1 100644 --- a/modules/client/back/methods/sms/send.spec.js +++ b/modules/client/back/methods/sms/send.spec.js @@ -32,43 +32,6 @@ describe('sms send()', () => { let result = await app.models.Sms.send(ctx, 105, 'destination', 'My SMS Body'); expect(result.statusCode).toEqual(200); - expect(result.status).toContain('Envio en procesamiento'); - }); - - it(`should throw if the response code isn't 200`, async() => { - let error; - const code = 400; - const smsConfig = await app.models.SmsConfig.findOne(); - const soapClient = await soap.createClientAsync(smsConfig.uri); - spyOn(soap, 'createClientAsync').and.returnValue(soapClient); - spyOn(soapClient, 'sendSMSAsync').and.returnValue([{ - result: { - $value: - ` - - - ${code} - - - Envio en procesamiento - - - 1 - - - - 444328681 - - ` - } - }]); - let ctx = {req: {accessToken: {userId: 1}}}; - try { - await app.models.Sms.send(ctx, 105, 'destination', 'My SMS Body'); - } catch (err) { - error = err; - } - - expect(error.message).toEqual(`We weren't able to send this SMS`); + expect(result.status).toContain('Fake response'); }); }); diff --git a/modules/client/back/models/bank-entity.js b/modules/client/back/models/bank-entity.js index 7a2cad594..4cfa7fc91 100644 --- a/modules/client/back/models/bank-entity.js +++ b/modules/client/back/models/bank-entity.js @@ -1,5 +1,8 @@ module.exports = Self => { Self.validatesPresenceOf('name', { - message: 'Name cannot be blank' + message: `Name cannot be blank` + }); + Self.validatesPresenceOf('bic', { + message: `Swift / BIC can't be empty` }); }; diff --git a/modules/client/back/models/bank-entity.json b/modules/client/back/models/bank-entity.json index 8835c492d..c45cd4336 100644 --- a/modules/client/back/models/bank-entity.json +++ b/modules/client/back/models/bank-entity.json @@ -13,7 +13,7 @@ "description": "Identifier" }, "bic": { - "type": "String" + "type": "String" }, "name": { "type": "String" diff --git a/modules/client/front/billing-data/index.html b/modules/client/front/billing-data/index.html index 1d20fedbf..891c9364f 100644 --- a/modules/client/front/billing-data/index.html +++ b/modules/client/front/billing-data/index.html @@ -61,8 +61,8 @@ @@ -98,8 +98,7 @@ + on-accept="$ctrl.onBankEntityAccept()">
New bank entity
diff --git a/modules/client/front/billing-data/index.js b/modules/client/front/billing-data/index.js index 9eaabe0dc..589c4f528 100644 --- a/modules/client/front/billing-data/index.js +++ b/modules/client/front/billing-data/index.js @@ -1,13 +1,7 @@ import ngModule from '../module'; +import Section from 'salix/components/section'; -export default class Controller { - constructor($scope, $http, vnApp, $translate) { - this.$scope = $scope; - this.$http = $http; - this.vnApp = vnApp; - this.$translate = $translate; - } - +export default class Controller extends Section { get client() { return this._client; } @@ -19,10 +13,6 @@ export default class Controller { if (!value.bankEntityFk) this.autofillBic(); - - this.newBankEntity = { - countryFk: Number.parseInt(value.countryFk) - }; } onSubmit() { @@ -31,14 +21,14 @@ export default class Controller { if (this.hasPaymethodChanges()) shouldNotify = true; - this.$scope.watcher.submit().then(() => { + this.$.watcher.submit().then(() => { if (shouldNotify) - this.vnApp.showMessage(this.$translate.instant('Notification sent!')); + this.vnApp.showMessage(this.$t('Notification sent!')); }); } hasPaymethodChanges() { - let orgData = this.$scope.watcher.orgData; + let orgData = this.$.watcher.orgData; let payMethod = orgData.payMethodFk != this.client.payMethodFk; let iban = orgData.iban != this.client.iban; @@ -47,31 +37,17 @@ export default class Controller { return payMethod || iban || dueDay; } - onBankEntityOpen() { - this.newBankEntity.name = ''; - this.newBankEntity.id = ''; - this.newBankEntity.bic = ''; - this.$scope.$apply(); + onAddEntityClick(event) { + event.preventDefault(); + this.newBankEntity = { + countryFk: Number.parseInt(this.client.countryFk) + }; + this.$.bankEntityDialog.show(); } - onBankEntityResponse(response) { - if (response == 'accept') { - try { - if (!this.newBankEntity.name) - throw new Error(`Name can't be empty`); - if (!this.newBankEntity.bic) - throw new Error(`Swift / BIC can't be empty`); - - this.$http.post(`BankEntities`, this.newBankEntity).then(response => { - if (response.data) - this.client.bankEntityFk = response.data.id; - }); - } catch (e) { - this.vnApp.showError(this.$translate.instant(e.message)); - return false; - } - } - return true; + onBankEntityAccept() { + return this.$http.post(`BankEntities`, this.newBankEntity) + .then(res => this.client.bankEntityFk = res.data.id); } get ibanCountry() { @@ -90,8 +66,7 @@ export default class Controller { if (this.ibanCountry != 'ES') return; - let json = encodeURIComponent(JSON.stringify(filter)); - this.$http.get(`BankEntities?filter=${json}`).then(response => { + this.$http.get(`BankEntities`, {filter}).then(response => { const hasData = response.data && response.data[0]; if (hasData) @@ -101,7 +76,6 @@ export default class Controller { }); } } -Controller.$inject = ['$scope', '$http', 'vnApp', '$translate']; ngModule.component('vnClientBillingData', { template: require('./index.html'), diff --git a/modules/client/front/billing-data/index.spec.js b/modules/client/front/billing-data/index.spec.js index 0416a6b8f..ade8b2fff 100644 --- a/modules/client/front/billing-data/index.spec.js +++ b/modules/client/front/billing-data/index.spec.js @@ -10,12 +10,13 @@ describe('Client', () => { beforeEach(ngModule('client')); beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_, _vnApp_) => { + let $element = angular.element(''); $httpBackend = _$httpBackend_; vnApp = _vnApp_; $scope = $rootScope.$new(); $scope.watcher = {}; spyOn(vnApp, 'showError'); - controller = $componentController('vnClientBillingData', {$scope}); + controller = $componentController('vnClientBillingData', {$element, $scope}); controller.client = {id: 101, name: 'Client name', payMethodFk: 4}; $scope.watcher.orgData = {id: 101, name: 'Client name', payMethodFk: 4}; })); @@ -34,42 +35,7 @@ describe('Client', () => { }); }); - describe('onBankEntityOpen()', () => { - it('should set reset the new bank entity properties', () => { - controller.newBankEntity.name = 'My new bank entity'; - controller.newBankEntity.bic = 'ES123'; - controller.onBankEntityOpen(); - - expect(controller.newBankEntity.name).toBe(''); - expect(controller.newBankEntity.bic).toBe(''); - }); - }); - - describe('onBankEntityResponse()', () => { - it(`should throw an error if name property is empty`, () => { - controller.newBankEntity = { - name: '', - bic: 'ES123', - countryFk: 1, - id: 999 - }; - controller.onBankEntityResponse('accept'); - - expect(vnApp.showError).toHaveBeenCalledWith(`Name can't be empty`); - }); - - it(`should throw an error if bic property is empty`, () => { - controller.newBankEntity = { - name: 'My new bank entity', - bic: '', - countryFk: 1, - id: 999 - }; - controller.onBankEntityResponse('accept'); - - expect(vnApp.showError).toHaveBeenCalledWith(`Swift / BIC can't be empty`); - }); - + describe('onBankEntityAccept()', () => { it('should request to create a new bank entity', () => { let newBankEntity = { name: 'My new bank entity', @@ -78,40 +44,49 @@ describe('Client', () => { id: 999 }; controller.newBankEntity = newBankEntity; - $httpBackend.when('POST', 'BankEntities').respond('done'); - $httpBackend.expectPOST('BankEntities', newBankEntity); - controller.onBankEntityResponse('accept'); + $httpBackend.expectPOST('BankEntities', newBankEntity).respond({id: 999}); + controller.onBankEntityAccept(); $httpBackend.flush(); + + expect(controller.client.bankEntityFk).toEqual(newBankEntity.id); }); }); - describe('autofillBic() should perform a GET query if client iban is specified and country code is "ES".', () => { - it(`Should not define bankEntityFk property`, () => { - controller.client.payMethodFk = 5; - controller.client.iban = 'ES9121000418450200051332'; - let expectedFilter = {where: {id: 2100}}; - let json = encodeURIComponent(JSON.stringify(expectedFilter)); + describe('autofillBic()', () => { + it(`Should do nothing if there is not client`, () => { + controller.client = undefined; + + controller.autofillBic(); + + expect(controller.client).toBeUndefined(); + }); + + it(`Should do nothing if the iban is not spanish`, () => { + controller.client.iban = 'FR9121000418450200051332'; - $httpBackend.when('GET', `BankEntities?filter=${json}`).respond('done'); - $httpBackend.expect('GET', `BankEntities?filter=${json}`); controller.autofillBic(); - $httpBackend.flush(); expect(controller.client.bankEntityFk).toBeUndefined(); }); - it(`Should define bankEntityFk property`, () => { - controller.client.payMethodFk = 5; - controller.client.iban = 'ES1501280010120123456789'; - let expectedFilter = {where: {id: 128}}; - let json = encodeURIComponent(JSON.stringify(expectedFilter)); + it(`Should set the bankEntityId in the client`, () => { + controller.client.iban = 'ES9121000418450200051332'; - $httpBackend.when('GET', `BankEntities?filter=${json}`).respond([{id: 128}]); - $httpBackend.expect('GET', `BankEntities?filter=${json}`); + $httpBackend.whenRoute('GET', `BankEntities`).respond([{id: 123}]); controller.autofillBic(); $httpBackend.flush(); - expect(controller.client.bankEntityFk).toEqual(128); + expect(controller.client.bankEntityFk).toEqual(123); + }); + + it(`Should set clients bankEntityFk to null if no bank entity founds`, () => { + controller.client.iban = 'ES9121000418450200051332'; + + $httpBackend.whenRoute('GET', `BankEntities`).respond([]); + controller.autofillBic(); + $httpBackend.flush(); + + expect(controller.client.bankEntityFk).toBeNull(); }); }); diff --git a/modules/ticket/front/summary/index.html b/modules/ticket/front/summary/index.html index 6307633de..9ef27d093 100644 --- a/modules/ticket/front/summary/index.html +++ b/modules/ticket/front/summary/index.html @@ -115,7 +115,7 @@ {{::sale.price | currency: 'EUR':2}} {{::sale.discount}} % - {{::sale.quantity * sale.price | currency: 'EUR':2}} + {{::sale.quantity * sale.price * ((100 - sale.discount) / 100) | currency: 'EUR':2}} @@ -139,25 +139,27 @@ - +

Service

- Id - Quantity - Description - Price - Tax class + + Id + Quantity + Description + Price + Tax class - {{::service.id}} - {{::service.quantity}} + + {{::service.id}} + {{::service.quantity}} {{::service.description}} - {{::service.price}} - {{::service.taxClass.description}} + {{::service.price}} + {{::service.taxClass.description}} diff --git a/modules/ticket/front/summary/style.scss b/modules/ticket/front/summary/style.scss index f9d94c13a..4502c5dca 100644 --- a/modules/ticket/front/summary/style.scss +++ b/modules/ticket/front/summary/style.scss @@ -31,7 +31,7 @@ vn-ticket-summary .summary { } } - & > div > vn-horizontal > vn-one { + & > vn-horizontal > vn-one { min-width: 10em; &.taxes { @@ -44,5 +44,23 @@ vn-ticket-summary .summary { margin: .2em; } } + + &.services { + .vn-table > vn-thead .identifier, + .vn-table > vn-tbody .identifier { + min-width: 3.5em + } + + .vn-table > vn-thead .tax-class, + .vn-table > vn-tbody .tax-class { + min-width: 11em; + width: 1px + } + + .vn-table > vn-tbody vn-td:first-child { + min-width: 24px; + + } + } } } \ No newline at end of file diff --git a/modules/worker/back/methods/worker-calendar/specs/absences.spec.js b/modules/worker/back/methods/worker-calendar/specs/absences.spec.js index 6cc204e28..aebe5a24b 100644 --- a/modules/worker/back/methods/worker-calendar/specs/absences.spec.js +++ b/modules/worker/back/methods/worker-calendar/specs/absences.spec.js @@ -1,6 +1,7 @@ const app = require('vn-loopback/server/server'); -describe('Worker absences()', () => { +// #1924 - Fix hours +xdescribe('Worker absences()', () => { it('should get the absence calendar for a full year contract', async() => { let ctx = {req: {accessToken: {userId: 106}}}; let workerFk = 106; @@ -34,7 +35,11 @@ describe('Worker absences()', () => { let workerFk = 106; let worker = await app.models.WorkerLabour.findById(workerFk); let endedDate = worker.ended; - await worker.updateAttributes({ended: null}); + + await app.models.WorkerLabour.rawSql( + `UPDATE postgresql.business SET date_end = ? WHERE business_id = ?`, + [null, worker.businessFk] + ); let ctx = {req: {accessToken: {userId: 9}}}; @@ -63,7 +68,10 @@ describe('Worker absences()', () => { expect(sixthType).toEqual('Holidays'); // restores the contract end date - await worker.updateAttributes({ended: endedDate}); + await app.models.WorkerLabour.rawSql( + `UPDATE postgresql.business SET date_end = ? WHERE business_id = ?`, + [endedDate, worker.businessFk] + ); }); it('should give the same holidays as worked days since the holidays amount matches the amount of days in a year', async() => { @@ -112,7 +120,10 @@ describe('Worker absences()', () => { startingContract.setMonth(today.getMonth()); startingContract.setDate(1); - await contract.updateAttributes({started: startingContract}); + await app.models.WorkerLabour.rawSql( + `UPDATE postgresql.business SET date_start = ? WHERE business_id = ?`, + [startingContract, contract.businessFk] + ); let ctx = {req: {accessToken: {userId: 106}}}; let workerFk = 106; @@ -148,6 +159,10 @@ describe('Worker absences()', () => { days: originalHolidaysValue } ); - await contract.updateAttributes({started: contractStartDate}); + + await app.models.WorkerLabour.rawSql( + `UPDATE postgresql.business SET date_start = ? WHERE business_id = ?`, + [contractStartDate, contract.businessFk] + ); }); }); diff --git a/package-lock.json b/package-lock.json index c39164e35..c51e1b9f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -942,6 +942,77 @@ "minimist": "^1.2.0" } }, + "@electron/get": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.7.1.tgz", + "integrity": "sha512-+BOIzkmYbe+oOBGqSByq8zXYXCFztccoymR3uNkvX5ckJ/5xU+4peVyEvFyH6+zfv58hCo99RxgIpwuaMfRtRg==", + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^2.0.2", + "global-tunnel-ng": "^2.7.1", + "got": "^9.6.0", + "sanitize-filename": "^1.6.2", + "sumchecker": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + } + } + }, "@google-cloud/common": { "version": "0.32.1", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.32.1.tgz", @@ -1293,6 +1364,19 @@ "resolved": "https://registry.npmjs.org/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz", "integrity": "sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw=" }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, "@types/babel__core": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", @@ -3150,6 +3234,12 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "boolean": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.0.tgz", + "integrity": "sha512-OElxJ1lUSinuoUnkpOgLmxp0DC4ytEhODEL6QJU0NpxE/mI4rUSh8h1P1Wkvfi3xQEBcxXR2gBIPNYNuaFcAbQ==", + "optional": true + }, "bops": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.0.tgz", @@ -3504,6 +3594,35 @@ "unset-value": "^1.0.0" } }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3802,6 +3921,14 @@ "shallow-clone": "^1.0.0" } }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -3980,6 +4107,16 @@ } } }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "optional": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "configstore": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", @@ -4436,6 +4573,14 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-defaults": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/deep-defaults/-/deep-defaults-1.0.5.tgz", @@ -4511,11 +4656,15 @@ } } }, + "defer-to-connect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.0.tgz", + "integrity": "sha512-WE2sZoctWm/v4smfCAdjYbrfS55JiMRdlY9ZubFhsYbteCK9+BvAx4YV7nPjYM6ZnX5BcoVKwfmyx9sIFTgQMQ==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -4642,8 +4791,7 @@ "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, "diff": { "version": "1.4.0", @@ -4822,8 +4970,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=" }, "duplexify": { "version": "3.7.1", @@ -4887,21 +5034,19 @@ "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" }, "electron": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.18.tgz", - "integrity": "sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ==", - "dev": true, + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.2.tgz", + "integrity": "sha512-7hjONYt2GlQfKuKgQrhhUL1P9lbGWLBfMUq+2QFU3yeLtCvM0ROfPJCRP4OF5pVp3KDyfFp4DtmhuVzAnxV3jA==", "requires": { - "@types/node": "^8.0.24", - "electron-download": "^3.0.1", + "@electron/get": "^1.0.1", + "@types/node": "^12.0.12", "extract-zip": "^1.0.3" }, "dependencies": { "@types/node": { - "version": "8.10.49", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.49.tgz", - "integrity": "sha512-YX30JVx0PvSmJ3Eqr74fYLGeBxD+C7vIL20ek+GGGLJeUbVYRUW3EzyAXpIRA0K8c8o0UWqR/GwEFYiFoz1T8w==", - "dev": true + "version": "12.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.12.tgz", + "integrity": "sha512-MGuvYJrPU0HUwqF7LqvIj50RZUX23Z+m583KBygKYUZLlZ88n6w28XRNJRJgsHukLEnLz6w6SvxZoLgbr5wLqQ==" } } }, @@ -4952,6 +5097,16 @@ "requires": { "pinkie-promise": "^2.0.0" } + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "es6-promise": "^4.0.5" + } } } }, @@ -5060,6 +5215,11 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" + }, "errlop": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz", @@ -5138,6 +5298,12 @@ "next-tick": "^1.0.0" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", @@ -5703,7 +5869,6 @@ "version": "1.6.7", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, "requires": { "concat-stream": "1.6.2", "debug": "2.6.9", @@ -5715,7 +5880,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5804,7 +5968,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, "requires": { "pend": "~1.2.0" } @@ -6747,8 +6910,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function-source": { "version": "0.1.0", @@ -6999,6 +7161,35 @@ "object.defaults": "^1.1.0" } }, + "global-agent": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.7.tgz", + "integrity": "sha512-ooK7eqGYZku+LgnbfH/Iv0RJ74XfhrBZDlke1QSzcBt0bw1PmJcnRADPAQuFE+R45pKKDTynAr25SBasY2kvow==", + "optional": true, + "requires": { + "boolean": "^3.0.0", + "core-js": "^3.4.1", + "es6-error": "^4.1.1", + "matcher": "^2.0.0", + "roarr": "^2.14.5", + "semver": "^6.3.0", + "serialize-error": "^5.0.0" + }, + "dependencies": { + "core-js": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.4.2.tgz", + "integrity": "sha512-bUTfqFWtNKWp73oNIfRkqwYZJeNT3lstzZcAkhhiuvDraRSgOH1/+F9ZklbpR4zpdKuo4cpXN8tKP7s61yjX+g==", + "optional": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + } + } + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -7032,6 +7223,18 @@ "which": "^1.2.14" } }, + "global-tunnel-ng": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", + "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "optional": true, + "requires": { + "encodeurl": "^1.0.2", + "lodash": "^4.17.10", + "npm-conf": "^1.1.3", + "tunnel": "^0.0.6" + } + }, "globalize": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.4.2.tgz", @@ -7046,6 +7249,17 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.0.tgz", + "integrity": "sha512-vcCAZTJ3r5Qcu5l8/2oyVdoFwxKgfYnMTR2vwWeux/NAVZK3PwcMaWkdUIn4GJbmKuRK7xcvDsLuK+CKcXyodg==", + "optional": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "object-keys": "^1.0.12" + } + }, "globby": { "version": "5.0.0", "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -8012,9 +8226,9 @@ } }, "home-path": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", - "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.7.tgz", + "integrity": "sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ==", "dev": true }, "homedir-polyfill": { @@ -8171,6 +8385,11 @@ } } }, + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -8450,8 +8669,7 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "6.4.1", @@ -10122,6 +10340,21 @@ "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=", "dev": true }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + }, + "dependencies": { + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + } + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -10873,8 +11106,7 @@ "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": "5.1.1", @@ -11001,6 +11233,23 @@ } } }, + "matcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", + "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "optional": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "optional": true + } + } + }, "math-interval-parser": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-1.1.0.tgz", @@ -11158,6 +11407,11 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -11691,6 +11945,23 @@ "split2": "^2.0.1" }, "dependencies": { + "@types/node": { + "version": "8.10.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", + "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==", + "dev": true + }, + "electron": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.18.tgz", + "integrity": "sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ==", + "dev": true, + "requires": { + "@types/node": "^8.0.24", + "electron-download": "^3.0.1", + "extract-zip": "^1.0.3" + } + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -12104,6 +12375,11 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, "now-and-later": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", @@ -12113,6 +12389,24 @@ "once": "^1.3.2" } }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "optional": true + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -12219,8 +12513,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -12441,6 +12734,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -12721,8 +13019,7 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "performance-now": { "version": "2.1.0", @@ -13094,6 +13391,12 @@ "sisteransi": "^1.0.3" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "optional": true + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -13760,6 +14063,14 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -13838,6 +14149,20 @@ "inherits": "^2.0.1" } }, + "roarr": { + "version": "2.14.6", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.14.6.tgz", + "integrity": "sha512-qjbw0BEesKA+3XFBPt+KVe1PC/Z6ShfJ4wPlx2XifqH5h2Lj8/KQT5XJTsy3n1Es5kai+BwKALaECW3F70B1cg==", + "optional": true, + "requires": { + "boolean": "^3.0.0", + "detect-node": "^2.0.4", + "globalthis": "^1.0.0", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -13915,6 +14240,14 @@ "walker": "~1.0.5" } }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, "sass-graph": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", @@ -14040,6 +14373,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "optional": true + }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", @@ -14096,6 +14435,15 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", "dev": true }, + "serialize-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "optional": true, + "requires": { + "type-fest": "^0.8.0" + } + }, "serialize-javascript": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", @@ -15294,13 +15642,26 @@ } }, "sumchecker": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", - "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.0.tgz", + "integrity": "sha512-yreseuC/z4iaodVoq07XULEOO9p4jnQazO7mbrnDSvWAU/y2cbyIKs+gWJptfcGu9R+1l27K8Rkj0bfvqnBpgQ==", "requires": { - "debug": "^2.2.0", - "es6-promise": "^4.0.5" + "debug": "^4.1.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "supports-color": { @@ -15818,6 +16179,11 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -15969,6 +16335,14 @@ } } }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, "tryit": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", @@ -15987,6 +16361,12 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "optional": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -16015,6 +16395,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "optional": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -16359,6 +16745,11 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" + }, "utf8-bytes": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", @@ -17510,7 +17901,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, "requires": { "fd-slicer": "~1.0.1" } diff --git a/package.json b/package.json index ef61b52d4..d17e01ead 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "compression": "^1.7.3", + "electron": "^7.1.2", "fs-extra": "^5.0.0", "helmet": "^3.21.1", "i18n": "^0.8.3",