Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into pull-request-check-test
gitea/salix/pull-request-check-test This commit looks good Details

This commit is contained in:
Juan Ferrer 2019-12-12 15:15:28 +01:00
commit a47fa7a413
34 changed files with 671 additions and 286 deletions

View File

@ -1,4 +1,4 @@
FROM mysql:5.6.42 FROM mysql:8.0.18
ENV MYSQL_ROOT_PASSWORD root ENV MYSQL_ROOT_PASSWORD root
ENV TZ Europe/Madrid ENV TZ Europe/Madrid
@ -7,36 +7,33 @@ ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y --no-install-recommends curl ca-certificates \ && apt-get install -y --no-install-recommends curl ca-certificates \
&& curl -sL https://apt.verdnatura.es/conf/verdnatura.gpg | apt-key add - \ && 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 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 \ && apt-get purge -y --auto-remove curl ca-certificates \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# XXX: Removes the last script line to avoid daemon to be started COPY docker/docker.cnf /etc/mysql/conf.d/
RUN cp /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-init.sh \ COPY docker/docker-init.sh docker/docker-start.sh /usr/local/bin/
&& 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
RUN mkdir /mysql-data \ 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/* && rm -rf /docker-entrypoint-initdb.d/*
COPY docker-start.sh /usr/local/bin/ USER mysql
ENTRYPOINT ["docker-start.sh"] ENTRYPOINT ["docker-start.sh"]
USER mysql CMD ["mysqld"]
CMD ["mysqld", "--datadir", "/mysql-data"]
#HEALTHCHECK --interval=5s --timeout=10s --retries=200 \ #HEALTHCHECK --interval=5s --timeout=10s --retries=200 \
# CMD mysqladmin ping -h 127.0.0.1 -u root || exit 1 # CMD mysqladmin ping -h 127.0.0.1 -u root || exit 1

View File

@ -6,8 +6,8 @@ USE `vn`$$
CREATE DEFINER=`root`@`%` PROCEDURE `zone_getWarehouse`(vAddress INT, vLanded DATE, vWarehouse INT) CREATE DEFINER=`root`@`%` PROCEDURE `zone_getWarehouse`(vAddress INT, vLanded DATE, vWarehouse INT)
BEGIN BEGIN
/** /**
* Devuelve el listado de agencias disponibles para la fecha, * Devuelve el listado de agencias disponibles para la fecha,
* dirección y warehouse pasadas * dirección y almacén pasados.
* *
* @param vAddress * @param vAddress
* @param vWarehouse warehouse * @param vWarehouse warehouse
@ -30,7 +30,8 @@ BEGIN
JOIN agencyMode am ON am.id = z.agencyModeFk JOIN agencyMode am ON am.id = z.agencyModeFk
JOIN zoneWarehouse zw ON zw.zoneFk = zo.zoneFk JOIN zoneWarehouse zw ON zw.zoneFk = zo.zoneFk
WHERE zw.warehouseFk WHERE zw.warehouseFk
GROUP BY z.agencyModeFk; GROUP BY z.agencyModeFk
ORDER BY agencyMode;
DROP TEMPORARY TABLE DROP TEMPORARY TABLE
tmp.zone, tmp.zone,

View File

@ -1,4 +0,0 @@
[mysqld]
innodb_log_file_size = 4M
innodb_autoextend_increment = 4
innodb_page_size = 8K

17
db/docker/docker-init.sh Executable file
View File

@ -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

10
db/docker/docker.cnf Normal file
View File

@ -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

View File

@ -1,10 +1,13 @@
-- FIXME: cuando se eliminen los procedimientos de la cache, se podra eliminar esta linea -- 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 `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`.`itemTaxCountry` AUTO_INCREMENT = 1;
ALTER TABLE `vn`.`address` AUTO_INCREMENT = 1; ALTER TABLE `vn`.`address` AUTO_INCREMENT = 1;
ALTER TABLE `vn`.`zoneGeo` AUTO_INCREMENT = 1; ALTER TABLE `vn`.`zoneGeo` AUTO_INCREMENT = 1;
ALTER TABLE `vn`.`ticket` AUTO_INCREMENT = 1;
INSERT INTO `vn`.`ticketConfig` (`id`, `scopeDays`) INSERT INTO `vn`.`ticketConfig` (`id`, `scopeDays`)
VALUES VALUES
@ -1580,9 +1583,9 @@ INSERT INTO `postgresql`.`calendar_employee` (`business_id`, `calendar_state_id`
(107, 1, DATE_ADD(CURDATE(), INTERVAL -12 DAY)), (107, 1, DATE_ADD(CURDATE(), INTERVAL -12 DAY)),
(107, 2, DATE_ADD(CURDATE(), INTERVAL -20 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 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`) INSERT INTO `vn`.`sharingClient`(`id`, `workerFk`, `started`, `ended`, `clientFk`)
VALUES VALUES

View File

@ -336,6 +336,7 @@ let actions = {
waitForLastSnackbar: function() { waitForLastSnackbar: function() {
return this.wait(500) return this.wait(500)
.waitForSpinnerLoad()
.waitForLastShape('vn-snackbar .shape .text'); .waitForLastShape('vn-snackbar .shape .text');
}, },

View File

@ -3,7 +3,7 @@ const config = require('./config.js');
let nightmare; let nightmare;
module.exports = function createNightmare(width = 1280, height = 720) { module.exports = function createNightmare(width = 1280, height = 800) {
if (nightmare) if (nightmare)
return nightmare; return nightmare;

View File

@ -75,7 +75,8 @@ export default {
hasToInvoiceCheckbox: 'vn-check[label="Has to invoice"]', hasToInvoiceCheckbox: 'vn-check[label="Has to invoice"]',
invoiceByMailCheckbox: 'vn-check[label="Invoice by mail"]', invoiceByMailCheckbox: 'vn-check[label="Invoice by mail"]',
viesCheckbox: 'vn-check[label="Vies"]', viesCheckbox: 'vn-check[label="Vies"]',
saveButton: `button[type=submit]` saveButton: `button[type=submit]`,
watcher: 'vn-client-fiscal-data vn-watcher'
}, },
clientBillingData: { clientBillingData: {
payMethodAutocomplete: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.payMethodFk"]', 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', newBankEntityBIC: '.vn-dialog.shown vn-textfield[label="Swift / BIC"] input',
newBankEntityCode: '.vn-dialog.shown vn-textfield[label="Entity Code"] input', newBankEntityCode: '.vn-dialog.shown vn-textfield[label="Entity Code"] input',
acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]', acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]',
saveButton: `button[type=submit]` saveButton: `button[type=submit]`,
watcher: 'vn-client-billing-data vn-watcher'
}, },
clientAddresses: { clientAddresses: {
addressesButton: 'vn-left-menu a[ui-sref="client.card.address.index"]', addressesButton: 'vn-left-menu a[ui-sref="client.card.address.index"]',

View File

@ -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() => { it('should navigate back to fiscal data to confirm invoice by address is now checked', async() => {
const result = await nightmare const result = await nightmare
.waitToClick(selectors.clientFiscalData.fiscalDataButton) .waitToClick(selectors.clientFiscalData.fiscalDataButton)
.waitForWatcherData(selectors.clientFiscalData.watcher)
.checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox); .checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox);
expect(result).toBe('checked'); expect(result).toBe('checked');

View File

@ -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() => { it(`should clear the BIC code field, update the IBAN to see how he BIC code autocompletes`, async() => {
const AutomaticCode = await nightmare const AutomaticCode = await nightmare
.clearInput(selectors.clientBillingData.IBANInput) .clearInput(selectors.clientBillingData.IBANInput)
.waitToClick(selectors.clientBillingData.clearswiftBicButton)
.write(selectors.clientBillingData.IBANInput, 'ES9121000418450200051332') .write(selectors.clientBillingData.IBANInput, 'ES9121000418450200051332')
.waitForTextInInput(`${selectors.clientBillingData.swiftBicAutocomplete} input`, 'caixesbb')
.waitToGetProperty(`${selectors.clientBillingData.swiftBicAutocomplete} input`, 'value'); .waitToGetProperty(`${selectors.clientBillingData.swiftBicAutocomplete} input`, 'value');
expect(AutomaticCode).toEqual('CAIXESBB Caixa Bank'); 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() => { it(`should save the form with all its new data`, async() => {
const snackbarMessages = await nightmare const snackbarMessages = await nightmare
.waitForWatcherData(selectors.clientBillingData.watcher)
.waitToClick(selectors.clientBillingData.saveButton) .waitToClick(selectors.clientBillingData.saveButton)
.waitForSnackbar(); .waitForSnackbar();

View File

@ -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() => { 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 const result = await nightmare
.waitForWatcherData(selectors.clientAddresses.watcher)
.waitToClick(selectors.clientAddresses.activeCheckbox) .waitToClick(selectors.clientAddresses.activeCheckbox)
.waitToClick(selectors.clientAddresses.saveButton) .waitToClick(selectors.clientAddresses.saveButton)
.waitForLastSnackbar(); .waitForLastSnackbar();

View File

@ -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() => { 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 let company = await nightmare
.waitForSpinnerLoad()
.waitToGetProperty(`${selectors.clientBalance.companyAutocomplete} input`, 'value'); .waitToGetProperty(`${selectors.clientBalance.companyAutocomplete} input`, 'value');
let firstBalanceLine = await nightmare let firstBalanceLine = await nightmare

View File

@ -33,6 +33,7 @@ describe('Ticket diary path', () => {
const url = await nightmare const url = await nightmare
.waitToClick(selectors.ticketSummary.firstSaleItemId) .waitToClick(selectors.ticketSummary.firstSaleItemId)
.waitToClick(selectors.ticketSummary.popoverDiaryButton) .waitToClick(selectors.ticketSummary.popoverDiaryButton)
.waitForURL('/diary')
.parsedUrl(); .parsedUrl();
expect(url.hash).toContain('/diary'); expect(url.hash).toContain('/diary');

View File

@ -116,16 +116,12 @@ describe('Claim development', () => {
const responsible = await nightmare const responsible = await nightmare
.waitToGetProperty(`${selectors.claimDevelopment.secondClaimResponsibleAutocomplete} input`, 'value'); .waitToGetProperty(`${selectors.claimDevelopment.secondClaimResponsibleAutocomplete} input`, 'value');
const worker = await nightmare
.waitToGetProperty(`${selectors.claimDevelopment.secondClaimWorkerAutocomplete} input`, 'value');
const redelivery = await nightmare const redelivery = await nightmare
.waitToGetProperty(`${selectors.claimDevelopment.secondClaimRedeliveryAutocomplete} input`, 'value'); .waitToGetProperty(`${selectors.claimDevelopment.secondClaimRedeliveryAutocomplete} input`, 'value');
expect(reason).toEqual('Prisas'); expect(reason).toEqual('Prisas');
expect(result).toEqual('Otros daños'); expect(result).toEqual('Otros daños');
expect(responsible).toEqual('Compradores'); expect(responsible).toEqual('Compradores');
expect(worker).toEqual('managerNick');
expect(redelivery).toEqual('Cliente'); expect(redelivery).toEqual('Cliente');
}); });
}); });

View File

@ -1,3 +1,5 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => { module.exports = Self => {
/** /**
* Returns a set of allowed values defined on table scheme * Returns a set of allowed values defined on table scheme
@ -7,7 +9,6 @@ module.exports = Self => {
Self.getSetValues = async function(column) { Self.getSetValues = async function(column) {
let model = this.app.models[this.modelName].definition; let model = this.app.models[this.modelName].definition;
let properties = model.properties; let properties = model.properties;
let columnName;
let tableName = this.modelName; let tableName = this.modelName;
let schema = null; let schema = null;
@ -17,35 +18,32 @@ module.exports = Self => {
schema = tableSplit.pop() || null; schema = tableSplit.pop() || null;
} }
if (properties[column]) { let property = properties[column];
columnName = column;
if (properties[column].mysql) if (!property)
columnName = properties[column].mysql.columnName; throw new UserError(`Column does not exist`);
}
let findColumn = Object.keys(properties).find(prop => { let columnName = property.mysql
return properties[prop].mysql && properties[prop].mysql.columnName === column; ? property.mysql.columnName
}); : column;
if (findColumn) let columnInfo = await this.rawSql(
columnName = properties[findColumn].mysql.columnName; `SELECT column_type columnType
FROM information_schema.columns
let type = await this.rawSql(
`SELECT DISTINCT column_type FROM information_schema.columns
WHERE table_name = ? WHERE table_name = ?
AND table_schema = IFNULL(?, DATABASE()) AND table_schema = IFNULL(?, DATABASE())
AND column_name = ?`, AND column_name = ?`,
[tableName, schema, columnName] [tableName, schema, columnName]
); );
if (!type) return; if (!columnInfo || !columnInfo[0])
throw new UserError(`Cannot fetch column values`);
let setValues; let setValues;
setValues = type[0].column_type; setValues = columnInfo[0].columnType
setValues = setValues.replace(/set\((.*)\)/i, '$1'); .replace(/^set\((.*)\)$/i, '$1')
setValues = setValues.replace(/'/g, ''); .replace(/'/g, '')
setValues = setValues.match(new RegExp(/(\w+)+/, 'ig')); .match(new RegExp(/(\w+)+/, 'ig'));
let values = []; let values = [];
setValues.forEach(setValue => { setValues.forEach(setValue => {

View File

@ -13,11 +13,4 @@ describe('Model getSetValues()', () => {
expect(result.length).toEqual(6); expect(result.length).toEqual(6);
expect(result[5].value).toEqual('TABLET_VN'); 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');
});
}); });

View File

@ -11,6 +11,27 @@
"type": "Number", "type": "Number",
"id": true, "id": true,
"description": "Identifier" "description": "Identifier"
},
"claimFk": {
"required": true
},
"claimResponsibleFk": {
"required": true
},
"workerFk": {
"required": true
},
"claimReasonFk": {
"required": true
},
"claimResultFk": {
"required": true
},
"claimRedeliveryFk": {
"required": true
},
"claimDestinationFk": {
"required": true
} }
}, },
"relations": { "relations": {
@ -29,11 +50,6 @@
"model": "Worker", "model": "Worker",
"foreignKey": "workerFk" "foreignKey": "workerFk"
}, },
"claimDestination": {
"type": "belongsTo",
"model": "ClaimDestination",
"foreignKey": "claimDestinationFk"
},
"claimReason": { "claimReason": {
"type": "belongsTo", "type": "belongsTo",
"model": "ClaimReason", "model": "ClaimReason",
@ -48,6 +64,11 @@
"type": "belongsTo", "type": "belongsTo",
"model": "ClaimRedelivery", "model": "ClaimRedelivery",
"foreignKey": "claimRedeliveryFk" "foreignKey": "claimRedeliveryFk"
},
"claimDestination": {
"type": "belongsTo",
"model": "ClaimDestination",
"foreignKey": "claimDestinationFk"
} }
} }
} }

View File

@ -49,7 +49,7 @@
data="claimReasons" data="claimReasons"
fields="['id', 'description']" fields="['id', 'description']"
show-field="description" show-field="description"
vn-acl="salesAssistant"> rule>
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
@ -58,7 +58,7 @@
data="claimResults" data="claimResults"
fields="['id', 'description']" fields="['id', 'description']"
show-field="description" show-field="description"
vn-acl="salesAssistant"> rule>
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
@ -67,7 +67,7 @@
data="claimResponsibles" data="claimResponsibles"
fields="['id', 'description']" fields="['id', 'description']"
show-field="description" show-field="description"
vn-acl="salesAssistant"> rule>
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
@ -78,7 +78,7 @@
value-field="id" value-field="id"
where="{role: 'employee'}" where="{role: 'employee'}"
label="Worker" label="Worker"
vn-acl="salesAssistant"> rule>
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
@ -87,15 +87,14 @@
data="claimRedeliveries" data="claimRedeliveries"
fields="['id', 'description']" fields="['id', 'description']"
show-field="description" show-field="description"
vn-acl="salesAssistant"> rule>
</vn-autocomplete> </vn-autocomplete>
<vn-icon-button <vn-icon-button
class="vn-my-md" class="vn-my-md"
vn-tooltip="Remove sale" vn-tooltip="Remove sale"
icon="delete" icon="delete"
ng-click="model.remove($index)" ng-click="model.remove($index)"
tabindex="-1" tabindex="-1">
vn-acl="salesAssistant">
</vn-icon-button> </vn-icon-button>
</vn-horizontal> </vn-horizontal>
</form> </form>
@ -104,8 +103,7 @@
vn-bind="+" vn-bind="+"
vn-tooltip="Add sale" vn-tooltip="Add sale"
icon="add_circle" icon="add_circle"
ng-click="model.insert()" ng-click="model.insert()">
vn-acl="salesAssistant">
</vn-icon-button> </vn-icon-button>
</vn-one> </vn-one>
</vn-vertical> </vn-vertical>
@ -113,8 +111,7 @@
<vn-button-bar> <vn-button-bar>
<vn-submit <vn-submit
label="Save" label="Save"
ng-click="$ctrl.onSubmit()" ng-click="$ctrl.onSubmit()">
vn-acl="salesAssistant">
</vn-submit> </vn-submit>
</vn-button-bar> </vn-button-bar>
</vn-vertical> </vn-vertical>

View File

@ -47,17 +47,25 @@ module.exports = Self => {
let xmlParsed; let xmlParsed;
let status; let status;
try { try {
[xmlResponse] = await soapClient.sendSMSAsync(params); if (process.env.NODE_ENV !== 'production') {
xmlResult = xmlResponse.result.$value; status = {
xmlParsed = await new Promise((resolve, reject) => { codigo: [200],
xmlParser(xmlResult, (err, result) => { descripcion: ['Fake response']
if (err) };
reject(err); } else {
resolve(result); [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) { } catch (e) {
console.error(e); console.error(e);
} }

View File

@ -32,43 +32,6 @@ describe('sms send()', () => {
let result = await app.models.Sms.send(ctx, 105, 'destination', 'My SMS Body'); let result = await app.models.Sms.send(ctx, 105, 'destination', 'My SMS Body');
expect(result.statusCode).toEqual(200); expect(result.statusCode).toEqual(200);
expect(result.status).toContain('Envio en procesamiento'); expect(result.status).toContain('Fake response');
});
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:
`<xtratelecom-sms-response>
<sms>
<codigo>
${code}
</codigo>
<descripcion>
Envio en procesamiento
</descripcion>
<messageId>
1
</messageId>
</sms>
<procesoId>
444328681
</procesoId>
</xtratelecom-sms-response>`
}
}]);
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`);
}); });
}); });

View File

@ -1,5 +1,8 @@
module.exports = Self => { module.exports = Self => {
Self.validatesPresenceOf('name', { Self.validatesPresenceOf('name', {
message: 'Name cannot be blank' message: `Name cannot be blank`
});
Self.validatesPresenceOf('bic', {
message: `Swift / BIC can't be empty`
}); });
}; };

View File

@ -13,7 +13,7 @@
"description": "Identifier" "description": "Identifier"
}, },
"bic": { "bic": {
"type": "String" "type": "String"
}, },
"name": { "name": {
"type": "String" "type": "String"

View File

@ -61,8 +61,8 @@
<vn-icon-button <vn-icon-button
vn-auto vn-auto
icon="add_circle" icon="add_circle"
ng-click="$ctrl.onAddEntityClick($event)"
vn-tooltip="New bank entity" vn-tooltip="New bank entity"
vn-dialog="bankEntityDialog"
vn-acl="salesAssistant"> vn-acl="salesAssistant">
</vn-icon-button> </vn-icon-button>
</append> </append>
@ -98,8 +98,7 @@
<!-- Create bank entity dialog --> <!-- Create bank entity dialog -->
<vn-dialog class="edit" <vn-dialog class="edit"
vn-id="bankEntityDialog" vn-id="bankEntityDialog"
on-open="$ctrl.onBankEntityOpen()" on-accept="$ctrl.onBankEntityAccept()">
on-response="$ctrl.onBankEntityResponse($response)">
<tpl-body> <tpl-body>
<h5 class="vn-py-sm" translate>New bank entity</h5> <h5 class="vn-py-sm" translate>New bank entity</h5>
<vn-horizontal> <vn-horizontal>

View File

@ -1,13 +1,7 @@
import ngModule from '../module'; import ngModule from '../module';
import Section from 'salix/components/section';
export default class Controller { export default class Controller extends Section {
constructor($scope, $http, vnApp, $translate) {
this.$scope = $scope;
this.$http = $http;
this.vnApp = vnApp;
this.$translate = $translate;
}
get client() { get client() {
return this._client; return this._client;
} }
@ -19,10 +13,6 @@ export default class Controller {
if (!value.bankEntityFk) if (!value.bankEntityFk)
this.autofillBic(); this.autofillBic();
this.newBankEntity = {
countryFk: Number.parseInt(value.countryFk)
};
} }
onSubmit() { onSubmit() {
@ -31,14 +21,14 @@ export default class Controller {
if (this.hasPaymethodChanges()) if (this.hasPaymethodChanges())
shouldNotify = true; shouldNotify = true;
this.$scope.watcher.submit().then(() => { this.$.watcher.submit().then(() => {
if (shouldNotify) if (shouldNotify)
this.vnApp.showMessage(this.$translate.instant('Notification sent!')); this.vnApp.showMessage(this.$t('Notification sent!'));
}); });
} }
hasPaymethodChanges() { hasPaymethodChanges() {
let orgData = this.$scope.watcher.orgData; let orgData = this.$.watcher.orgData;
let payMethod = orgData.payMethodFk != this.client.payMethodFk; let payMethod = orgData.payMethodFk != this.client.payMethodFk;
let iban = orgData.iban != this.client.iban; let iban = orgData.iban != this.client.iban;
@ -47,31 +37,17 @@ export default class Controller {
return payMethod || iban || dueDay; return payMethod || iban || dueDay;
} }
onBankEntityOpen() { onAddEntityClick(event) {
this.newBankEntity.name = ''; event.preventDefault();
this.newBankEntity.id = ''; this.newBankEntity = {
this.newBankEntity.bic = ''; countryFk: Number.parseInt(this.client.countryFk)
this.$scope.$apply(); };
this.$.bankEntityDialog.show();
} }
onBankEntityResponse(response) { onBankEntityAccept() {
if (response == 'accept') { return this.$http.post(`BankEntities`, this.newBankEntity)
try { .then(res => this.client.bankEntityFk = res.data.id);
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;
} }
get ibanCountry() { get ibanCountry() {
@ -90,8 +66,7 @@ export default class Controller {
if (this.ibanCountry != 'ES') return; if (this.ibanCountry != 'ES') return;
let json = encodeURIComponent(JSON.stringify(filter)); this.$http.get(`BankEntities`, {filter}).then(response => {
this.$http.get(`BankEntities?filter=${json}`).then(response => {
const hasData = response.data && response.data[0]; const hasData = response.data && response.data[0];
if (hasData) if (hasData)
@ -101,7 +76,6 @@ export default class Controller {
}); });
} }
} }
Controller.$inject = ['$scope', '$http', 'vnApp', '$translate'];
ngModule.component('vnClientBillingData', { ngModule.component('vnClientBillingData', {
template: require('./index.html'), template: require('./index.html'),

View File

@ -10,12 +10,13 @@ describe('Client', () => {
beforeEach(ngModule('client')); beforeEach(ngModule('client'));
beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_, _vnApp_) => { beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_, _vnApp_) => {
let $element = angular.element('<vn-client-billing-data></vn-client-billing-data>');
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
vnApp = _vnApp_; vnApp = _vnApp_;
$scope = $rootScope.$new(); $scope = $rootScope.$new();
$scope.watcher = {}; $scope.watcher = {};
spyOn(vnApp, 'showError'); spyOn(vnApp, 'showError');
controller = $componentController('vnClientBillingData', {$scope}); controller = $componentController('vnClientBillingData', {$element, $scope});
controller.client = {id: 101, name: 'Client name', payMethodFk: 4}; controller.client = {id: 101, name: 'Client name', payMethodFk: 4};
$scope.watcher.orgData = {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()', () => { describe('onBankEntityAccept()', () => {
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`);
});
it('should request to create a new bank entity', () => { it('should request to create a new bank entity', () => {
let newBankEntity = { let newBankEntity = {
name: 'My new bank entity', name: 'My new bank entity',
@ -78,40 +44,49 @@ describe('Client', () => {
id: 999 id: 999
}; };
controller.newBankEntity = newBankEntity; controller.newBankEntity = newBankEntity;
$httpBackend.when('POST', 'BankEntities').respond('done'); $httpBackend.expectPOST('BankEntities', newBankEntity).respond({id: 999});
$httpBackend.expectPOST('BankEntities', newBankEntity); controller.onBankEntityAccept();
controller.onBankEntityResponse('accept');
$httpBackend.flush(); $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".', () => { describe('autofillBic()', () => {
it(`Should not define bankEntityFk property`, () => { it(`Should do nothing if there is not client`, () => {
controller.client.payMethodFk = 5; controller.client = undefined;
controller.client.iban = 'ES9121000418450200051332';
let expectedFilter = {where: {id: 2100}}; controller.autofillBic();
let json = encodeURIComponent(JSON.stringify(expectedFilter));
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(); controller.autofillBic();
$httpBackend.flush();
expect(controller.client.bankEntityFk).toBeUndefined(); expect(controller.client.bankEntityFk).toBeUndefined();
}); });
it(`Should define bankEntityFk property`, () => { it(`Should set the bankEntityId in the client`, () => {
controller.client.payMethodFk = 5; controller.client.iban = 'ES9121000418450200051332';
controller.client.iban = 'ES1501280010120123456789';
let expectedFilter = {where: {id: 128}};
let json = encodeURIComponent(JSON.stringify(expectedFilter));
$httpBackend.when('GET', `BankEntities?filter=${json}`).respond([{id: 128}]); $httpBackend.whenRoute('GET', `BankEntities`).respond([{id: 123}]);
$httpBackend.expect('GET', `BankEntities?filter=${json}`);
controller.autofillBic(); controller.autofillBic();
$httpBackend.flush(); $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();
}); });
}); });

View File

@ -115,7 +115,7 @@
</vn-td> </vn-td>
<vn-td number>{{::sale.price | currency: 'EUR':2}}</vn-td> <vn-td number>{{::sale.price | currency: 'EUR':2}}</vn-td>
<vn-td number>{{::sale.discount}} %</vn-td> <vn-td number>{{::sale.discount}} %</vn-td>
<vn-td number>{{::sale.quantity * sale.price | currency: 'EUR':2}}</vn-td> <vn-td number>{{::sale.quantity * sale.price * ((100 - sale.discount) / 100) | currency: 'EUR':2}}</vn-td>
</vn-tr> </vn-tr>
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>
@ -139,25 +139,27 @@
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>
</vn-one> </vn-one>
<vn-one ng-if="$ctrl.summary.services.length != 0"> <vn-one class="services" ng-if="$ctrl.summary.services.length != 0">
<h4 translate>Service</h4> <h4 translate>Service</h4>
<vn-table model="model"> <vn-table model="model">
<vn-thead> <vn-thead>
<vn-tr> <vn-tr>
<vn-th number>Id</vn-th> <vn-th shrink></vn-th>
<vn-th number>Quantity</vn-th> <vn-th class="identifier" number shrink>Id</vn-th>
<vn-th>Description</vn-th> <vn-th number shrink>Quantity</vn-th>
<vn-th number>Price</vn-th> <vn-th expand>Description</vn-th>
<vn-th>Tax class</vn-th> <vn-th number shrink>Price</vn-th>
<vn-th class="tax-class">Tax class</vn-th>
</vn-tr> </vn-tr>
</vn-thead> </vn-thead>
<vn-tbody> <vn-tbody>
<vn-tr ng-repeat="service in $ctrl.summary.services"> <vn-tr ng-repeat="service in $ctrl.summary.services">
<vn-td number>{{::service.id}}</vn-td> <vn-td></vn-td>
<vn-td number>{{::service.quantity}}</vn-td> <vn-td class="identifier" number shrink>{{::service.id}}</vn-td>
<vn-td number shrink>{{::service.quantity}}</vn-td>
<vn-td expand>{{::service.description}}</vn-td> <vn-td expand>{{::service.description}}</vn-td>
<vn-td number>{{::service.price}}</vn-td> <vn-td number shrink>{{::service.price}}</vn-td>
<vn-td>{{::service.taxClass.description}}</vn-td> <vn-td class="tax-class">{{::service.taxClass.description}}</vn-td>
</vn-tr> </vn-tr>
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>

View File

@ -31,7 +31,7 @@ vn-ticket-summary .summary {
} }
} }
& > div > vn-horizontal > vn-one { & > vn-horizontal > vn-one {
min-width: 10em; min-width: 10em;
&.taxes { &.taxes {
@ -44,5 +44,23 @@ vn-ticket-summary .summary {
margin: .2em; 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;
}
}
} }
} }

View File

@ -1,6 +1,7 @@
const app = require('vn-loopback/server/server'); 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() => { it('should get the absence calendar for a full year contract', async() => {
let ctx = {req: {accessToken: {userId: 106}}}; let ctx = {req: {accessToken: {userId: 106}}};
let workerFk = 106; let workerFk = 106;
@ -34,7 +35,11 @@ describe('Worker absences()', () => {
let workerFk = 106; let workerFk = 106;
let worker = await app.models.WorkerLabour.findById(workerFk); let worker = await app.models.WorkerLabour.findById(workerFk);
let endedDate = worker.ended; 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}}}; let ctx = {req: {accessToken: {userId: 9}}};
@ -63,7 +68,10 @@ describe('Worker absences()', () => {
expect(sixthType).toEqual('Holidays'); expect(sixthType).toEqual('Holidays');
// restores the contract end date // 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() => { 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.setMonth(today.getMonth());
startingContract.setDate(1); 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 ctx = {req: {accessToken: {userId: 106}}};
let workerFk = 106; let workerFk = 106;
@ -148,6 +159,10 @@ describe('Worker absences()', () => {
days: originalHolidaysValue days: originalHolidaysValue
} }
); );
await contract.updateAttributes({started: contractStartDate});
await app.models.WorkerLabour.rawSql(
`UPDATE postgresql.business SET date_start = ? WHERE business_id = ?`,
[contractStartDate, contract.businessFk]
);
}); });
}); });

466
package-lock.json generated
View File

@ -942,6 +942,77 @@
"minimist": "^1.2.0" "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": { "@google-cloud/common": {
"version": "0.32.1", "version": "0.32.1",
"resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.32.1.tgz", "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", "resolved": "https://registry.npmjs.org/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz",
"integrity": "sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw=" "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": { "@types/babel__core": {
"version": "7.1.3", "version": "7.1.3",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz",
@ -3150,6 +3234,12 @@
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
"dev": true "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": { "bops": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/bops/-/bops-1.0.0.tgz", "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.0.tgz",
@ -3504,6 +3594,35 @@
"unset-value": "^1.0.0" "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": { "callsites": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@ -3802,6 +3921,14 @@
"shallow-clone": "^1.0.0" "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": { "clone-stats": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", "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": { "configstore": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz",
@ -4436,6 +4573,14 @@
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
"dev": true "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": { "deep-defaults": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/deep-defaults/-/deep-defaults-1.0.5.tgz", "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": { "define-properties": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": { "requires": {
"object-keys": "^1.0.12" "object-keys": "^1.0.12"
} }
@ -4642,8 +4791,7 @@
"detect-node": { "detect-node": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
"dev": true
}, },
"diff": { "diff": {
"version": "1.4.0", "version": "1.4.0",
@ -4822,8 +4970,7 @@
"duplexer3": { "duplexer3": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
"dev": true
}, },
"duplexify": { "duplexify": {
"version": "3.7.1", "version": "3.7.1",
@ -4887,21 +5034,19 @@
"integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q=="
}, },
"electron": { "electron": {
"version": "2.0.18", "version": "7.1.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-2.0.18.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.2.tgz",
"integrity": "sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ==", "integrity": "sha512-7hjONYt2GlQfKuKgQrhhUL1P9lbGWLBfMUq+2QFU3yeLtCvM0ROfPJCRP4OF5pVp3KDyfFp4DtmhuVzAnxV3jA==",
"dev": true,
"requires": { "requires": {
"@types/node": "^8.0.24", "@electron/get": "^1.0.1",
"electron-download": "^3.0.1", "@types/node": "^12.0.12",
"extract-zip": "^1.0.3" "extract-zip": "^1.0.3"
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
"version": "8.10.49", "version": "12.12.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.49.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.12.tgz",
"integrity": "sha512-YX30JVx0PvSmJ3Eqr74fYLGeBxD+C7vIL20ek+GGGLJeUbVYRUW3EzyAXpIRA0K8c8o0UWqR/GwEFYiFoz1T8w==", "integrity": "sha512-MGuvYJrPU0HUwqF7LqvIj50RZUX23Z+m583KBygKYUZLlZ88n6w28XRNJRJgsHukLEnLz6w6SvxZoLgbr5wLqQ=="
"dev": true
} }
} }
}, },
@ -4952,6 +5097,16 @@
"requires": { "requires": {
"pinkie-promise": "^2.0.0" "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", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" "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": { "errlop": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz", "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz",
@ -5138,6 +5298,12 @@
"next-tick": "^1.0.0" "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": { "es6-iterator": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
@ -5703,7 +5869,6 @@
"version": "1.6.7", "version": "1.6.7",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
"integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
"dev": true,
"requires": { "requires": {
"concat-stream": "1.6.2", "concat-stream": "1.6.2",
"debug": "2.6.9", "debug": "2.6.9",
@ -5715,7 +5880,6 @@
"version": "1.6.2", "version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
"requires": { "requires": {
"buffer-from": "^1.0.0", "buffer-from": "^1.0.0",
"inherits": "^2.0.3", "inherits": "^2.0.3",
@ -5804,7 +5968,6 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
"integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
"dev": true,
"requires": { "requires": {
"pend": "~1.2.0" "pend": "~1.2.0"
} }
@ -6747,8 +6910,7 @@
"function-bind": { "function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"dev": true
}, },
"function-source": { "function-source": {
"version": "0.1.0", "version": "0.1.0",
@ -6999,6 +7161,35 @@
"object.defaults": "^1.1.0" "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": { "global-dirs": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
@ -7032,6 +7223,18 @@
"which": "^1.2.14" "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": { "globalize": {
"version": "1.4.2", "version": "1.4.2",
"resolved": "https://registry.npmjs.org/globalize/-/globalize-1.4.2.tgz", "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.4.2.tgz",
@ -7046,6 +7249,17 @@
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true "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": { "globby": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
@ -8012,9 +8226,9 @@
} }
}, },
"home-path": { "home-path": {
"version": "1.0.6", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.7.tgz",
"integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", "integrity": "sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ==",
"dev": true "dev": true
}, },
"homedir-polyfill": { "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": { "http-deceiver": {
"version": "1.2.7", "version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@ -8450,8 +8669,7 @@
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
"dev": true
}, },
"inquirer": { "inquirer": {
"version": "6.4.1", "version": "6.4.1",
@ -10122,6 +10340,21 @@
"integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=", "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=",
"dev": true "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": { "killable": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@ -10873,8 +11106,7 @@
"lowercase-keys": { "lowercase-keys": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
"dev": true
}, },
"lru-cache": { "lru-cache": {
"version": "5.1.1", "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": { "math-interval-parser": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-1.1.0.tgz", "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", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" "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": { "minimalistic-assert": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@ -11691,6 +11945,23 @@
"split2": "^2.0.1" "split2": "^2.0.1"
}, },
"dependencies": { "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": { "glob": {
"version": "7.1.4", "version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
@ -12104,6 +12375,11 @@
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true "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": { "now-and-later": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
@ -12113,6 +12389,24 @@
"once": "^1.3.2" "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": { "npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -12219,8 +12513,7 @@
"object-keys": { "object-keys": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
"dev": true
}, },
"object-visit": { "object-visit": {
"version": "1.0.1", "version": "1.0.1",
@ -12441,6 +12734,11 @@
"os-tmpdir": "^1.0.0" "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": { "p-defer": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
@ -12721,8 +13019,7 @@
"pend": { "pend": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
"dev": true
}, },
"performance-now": { "performance-now": {
"version": "2.1.0", "version": "2.1.0",
@ -13094,6 +13391,12 @@
"sisteransi": "^1.0.3" "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": { "proxy-addr": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
@ -13760,6 +14063,14 @@
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
"dev": true "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": { "restore-cursor": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
@ -13838,6 +14149,20 @@
"inherits": "^2.0.1" "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": { "rsvp": {
"version": "4.8.5", "version": "4.8.5",
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
@ -13915,6 +14240,14 @@
"walker": "~1.0.5" "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": { "sass-graph": {
"version": "2.2.4", "version": "2.2.4",
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", "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", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" "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": { "semver-diff": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
@ -14096,6 +14435,15 @@
"integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=",
"dev": true "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": { "serialize-javascript": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
@ -15294,13 +15642,26 @@
} }
}, },
"sumchecker": { "sumchecker": {
"version": "1.3.1", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.0.tgz",
"integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", "integrity": "sha512-yreseuC/z4iaodVoq07XULEOO9p4jnQazO7mbrnDSvWAU/y2cbyIKs+gWJptfcGu9R+1l27K8Rkj0bfvqnBpgQ==",
"dev": true,
"requires": { "requires": {
"debug": "^2.2.0", "debug": "^4.1.0"
"es6-promise": "^4.0.5" },
"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": { "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": { "to-regex": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "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": { "tryit": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz",
@ -15987,6 +16361,12 @@
"integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
"dev": true "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": { "tunnel-agent": {
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@ -16015,6 +16395,12 @@
"prelude-ls": "~1.1.2" "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": { "type-is": {
"version": "1.6.18", "version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "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==", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true "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": { "utf8-bytes": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz",
@ -17510,7 +17901,6 @@
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
"integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
"dev": true,
"requires": { "requires": {
"fd-slicer": "~1.0.1" "fd-slicer": "~1.0.1"
} }

View File

@ -10,6 +10,7 @@
}, },
"dependencies": { "dependencies": {
"compression": "^1.7.3", "compression": "^1.7.3",
"electron": "^7.1.2",
"fs-extra": "^5.0.0", "fs-extra": "^5.0.0",
"helmet": "^3.21.1", "helmet": "^3.21.1",
"i18n": "^0.8.3", "i18n": "^0.8.3",