diff --git a/CHANGELOG.md b/CHANGELOG.md index a346591d8..e64b0a400 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,36 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2320.01] - 2023-05-25 + +### Added +- (Tickets -> Crear Factura) Al facturar se envia automáticamente el pdf al cliente + + +### Changed +- (Trabajadores -> Nuevo trabajador) Los clientes se crean sin 'TR' pero se añade tipo de negocio 'Trabajador' + +### Fixed +- + + + +## [2318.01] - 2023-05-08 + +### Added +- (Usuarios -> Histórico) Nueva sección +- (Roles -> Histórico) Nueva sección +- (General -> Traducciones) Correo de bienvenida a clientes al portugués y al francés + +### Changed +- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral + +### Fixed +- (Ticket -> Boxing) Arreglado selección de horas +- (Cesta -> Índice) Optimizada búsqueda + + + ## [2314.01] - 2023-04-20 ### Added @@ -12,9 +42,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - (Monitor tickets) Muestra un icono al lado de la zona, si el ticket es frágil y se envía por agencia - (Facturas recibidas -> Bases negativas) Nueva sección -### Changed -- - ### Fixed - (Clientes -> Morosos) Ahora se mantienen los elementos seleccionados al hacer sroll. diff --git a/Jenkinsfile b/Jenkinsfile index b1706d802..5f329ee61 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,6 +52,7 @@ pipeline { }}} environment { NODE_ENV = "" + TZ = 'Europe/Madrid' } parallel { stage('Frontend') { diff --git a/back/methods/campaign/spec/latest.spec.js b/back/methods/campaign/spec/latest.spec.js index 59e4c1e7a..d03d970c9 100644 --- a/back/methods/campaign/spec/latest.spec.js +++ b/back/methods/campaign/spec/latest.spec.js @@ -1,9 +1,9 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; describe('campaign latest()', () => { it('should return the campaigns from the last year', async() => { const now = Date.vnNew(); - const result = await app.models.Campaign.latest(); + const result = await models.Campaign.latest(); const randomIndex = Math.floor(Math.random() * result.length); const campaignDated = result[randomIndex].dated; @@ -14,7 +14,7 @@ describe('campaign latest()', () => { it('should return the campaigns from the current year', async() => { const now = Date.vnNew(); const currentYear = now.getFullYear(); - const result = await app.models.Campaign.latest({ + const result = await models.Campaign.latest({ where: {dated: {like: `%${currentYear}%`}} }); diff --git a/back/methods/campaign/spec/upcoming.spec.js b/back/methods/campaign/spec/upcoming.spec.js index 2aec5117f..c43444b40 100644 --- a/back/methods/campaign/spec/upcoming.spec.js +++ b/back/methods/campaign/spec/upcoming.spec.js @@ -1,8 +1,8 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('campaign upcoming()', () => { it('should return the upcoming campaign but from the last year', async() => { - const response = await app.models.Campaign.upcoming(); + const response = await models.Campaign.upcoming(); const campaignDated = response.dated; const now = Date.vnNew(); diff --git a/back/methods/chat/send.js b/back/methods/chat/send.js index 79b20e307..ab84b0ec3 100644 --- a/back/methods/chat/send.js +++ b/back/methods/chat/send.js @@ -26,7 +26,7 @@ module.exports = Self => { Self.send = async(ctx, to, message) => { const models = Self.app.models; const accessToken = ctx.req.accessToken; - const sender = await models.Account.findById(accessToken.userId); + const sender = await models.VnUser.findById(accessToken.userId); const recipient = to.replace('@', ''); if (sender.name != recipient) { diff --git a/back/methods/chat/sendCheckingPresence.js b/back/methods/chat/sendCheckingPresence.js index 29232490a..274ec3a5b 100644 --- a/back/methods/chat/sendCheckingPresence.js +++ b/back/methods/chat/sendCheckingPresence.js @@ -29,8 +29,8 @@ module.exports = Self => { const models = Self.app.models; const userId = ctx.req.accessToken.userId; - const sender = await models.Account.findById(userId, {fields: ['id']}); - const recipient = await models.Account.findById(recipientId, null); + const sender = await models.VnUser.findById(userId, {fields: ['id']}); + const recipient = await models.VnUser.findById(recipientId, null); // Prevent sending messages to yourself if (recipientId == userId) return false; diff --git a/back/methods/chat/sendQueued.js b/back/methods/chat/sendQueued.js index ef1a417ab..9a23af379 100644 --- a/back/methods/chat/sendQueued.js +++ b/back/methods/chat/sendQueued.js @@ -58,7 +58,7 @@ module.exports = Self => { const models = Self.app.models; const recipientName = chat.recipient.slice(1); - const recipient = await models.Account.findOne({ + const recipient = await models.VnUser.findOne({ where: { name: recipientName } @@ -104,7 +104,7 @@ module.exports = Self => { } const models = Self.app.models; - const sender = await models.Account.findById(senderFk); + const sender = await models.VnUser.findById(senderFk); const login = await Self.getServiceAuth(); const avatar = `${login.host}/avatar/${sender.name}`; diff --git a/back/methods/chat/spec/notifyIssue.spec.js b/back/methods/chat/spec/notifyIssue.spec.js index 1aab51793..64aeebbb1 100644 --- a/back/methods/chat/spec/notifyIssue.spec.js +++ b/back/methods/chat/spec/notifyIssue.spec.js @@ -1,12 +1,12 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('Chat notifyIssue()', () => { const ctx = {req: {accessToken: {userId: 1}}}; ctx.req.__ = value => { return value; }; - const chatModel = app.models.Chat; - const osTicketModel = app.models.OsTicket; + const chatModel = models.Chat; + const osTicketModel = models.OsTicket; const departmentId = 31; it(`should not call to the send() method and neither return a response`, async() => { @@ -29,7 +29,7 @@ describe('Chat notifyIssue()', () => { // eslint-disable-next-line max-len const expectedMessage = `@all ➔ There's a new urgent ticket:\r\n[ID: 00001 - Issue title @batman](https://cau.verdnatura.es/scp/tickets.php?id=1)`; - const department = await app.models.Department.findById(departmentId); + const department = await models.Department.findById(departmentId); let orgChatName = department.chatName; await department.updateAttribute('chatName', 'IT'); diff --git a/back/methods/chat/spec/send.spec.js b/back/methods/chat/spec/send.spec.js index dd07a1342..e910f3fab 100644 --- a/back/methods/chat/spec/send.spec.js +++ b/back/methods/chat/spec/send.spec.js @@ -1,16 +1,16 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('Chat send()', () => { it('should return true as response', async() => { let ctx = {req: {accessToken: {userId: 1}}}; - let response = await app.models.Chat.send(ctx, '@salesPerson', 'I changed something'); + let response = await models.Chat.send(ctx, '@salesPerson', 'I changed something'); expect(response).toEqual(true); }); it('should return false as response', async() => { let ctx = {req: {accessToken: {userId: 18}}}; - let response = await app.models.Chat.send(ctx, '@salesPerson', 'I changed something'); + let response = await models.Chat.send(ctx, '@salesPerson', 'I changed something'); expect(response).toEqual(false); }); diff --git a/back/methods/collection/setSaleQuantity.js b/back/methods/collection/setSaleQuantity.js index 4ac3d6d4b..0638539e3 100644 --- a/back/methods/collection/setSaleQuantity.js +++ b/back/methods/collection/setSaleQuantity.js @@ -40,8 +40,7 @@ module.exports = Self => { try { const sale = await models.Sale.findById(saleId, null, myOptions); const saleUpdated = await sale.updateAttributes({ - originalQuantity: sale.quantity, - quantity: quantity + quantity }, myOptions); if (tx) await tx.commit(); diff --git a/back/methods/collection/spec/getSectors.spec.js b/back/methods/collection/spec/getSectors.spec.js index d453220a0..d8fa60663 100644 --- a/back/methods/collection/spec/getSectors.spec.js +++ b/back/methods/collection/spec/getSectors.spec.js @@ -1,8 +1,8 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('getSectors()', () => { it('return list of sectors', async() => { - let response = await app.models.Collection.getSectors(); + let response = await models.Collection.getSectors(); expect(response.length).toBeGreaterThan(0); expect(response[0].id).toEqual(1); diff --git a/back/methods/collection/spec/newCollection.spec.js b/back/methods/collection/spec/newCollection.spec.js index 6abe73f8e..e729594d1 100644 --- a/back/methods/collection/spec/newCollection.spec.js +++ b/back/methods/collection/spec/newCollection.spec.js @@ -1,10 +1,10 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('newCollection()', () => { it('should return a new collection', async() => { pending('#3400 analizar que hacer con rutas de back collection'); let ctx = {req: {accessToken: {userId: 1106}}}; - let response = await app.models.Collection.newCollection(ctx, 1, 1, 1); + let response = await models.Collection.newCollection(ctx, 1, 1, 1); expect(response.length).toBeGreaterThan(0); expect(response[0].ticketFk).toEqual(2); diff --git a/back/methods/collection/spec/setSaleQuantity.spec.js b/back/methods/collection/spec/setSaleQuantity.spec.js index acdf2ebb5..fdc1bce1a 100644 --- a/back/methods/collection/spec/setSaleQuantity.spec.js +++ b/back/methods/collection/spec/setSaleQuantity.spec.js @@ -30,7 +30,7 @@ describe('setSaleQuantity()', () => { await models.Collection.setSaleQuantity(saleId, newQuantity, options); const updateSale = await models.Sale.findById(saleId, null, options); - expect(updateSale.originalQuantity).toEqual(originalSale.quantity); + expect(updateSale.quantity).not.toEqual(originalSale.quantity); expect(updateSale.quantity).toEqual(newQuantity); await tx.rollback(); diff --git a/back/methods/dms/specs/downloadFile.spec.js b/back/methods/dms/specs/downloadFile.spec.js index 763c2a0c1..1cfc944ce 100644 --- a/back/methods/dms/specs/downloadFile.spec.js +++ b/back/methods/dms/specs/downloadFile.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('dms downloadFile()', () => { let dmsId = 1; @@ -6,7 +6,7 @@ describe('dms downloadFile()', () => { it('should return a response for an employee with text content-type', async() => { let workerId = 1107; let ctx = {req: {accessToken: {userId: workerId}}}; - const result = await app.models.Dms.downloadFile(ctx, dmsId); + const result = await models.Dms.downloadFile(ctx, dmsId); expect(result[1]).toEqual('text/plain'); }); @@ -16,7 +16,7 @@ describe('dms downloadFile()', () => { let ctx = {req: {accessToken: {userId: clientId}}}; let error; - await app.models.Dms.downloadFile(ctx, dmsId).catch(e => { + await models.Dms.downloadFile(ctx, dmsId).catch(e => { error = e; }).finally(() => { expect(error.message).toEqual(`You don't have enough privileges`); diff --git a/back/methods/dms/specs/removeFile.spec.js b/back/methods/dms/specs/removeFile.spec.js index 28ce5d0fd..59a2acecb 100644 --- a/back/methods/dms/specs/removeFile.spec.js +++ b/back/methods/dms/specs/removeFile.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('dms removeFile()', () => { let dmsId = 1; @@ -8,7 +8,7 @@ describe('dms removeFile()', () => { let ctx = {req: {accessToken: {userId: clientId}}}; let error; - await app.models.Dms.removeFile(ctx, dmsId).catch(e => { + await models.Dms.removeFile(ctx, dmsId).catch(e => { error = e; }).finally(() => { expect(error.message).toEqual(`You don't have enough privileges`); diff --git a/back/methods/dms/specs/updateFile.spec.js b/back/methods/dms/specs/updateFile.spec.js index 87ee372ec..c99bdda02 100644 --- a/back/methods/dms/specs/updateFile.spec.js +++ b/back/methods/dms/specs/updateFile.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('dms updateFile()', () => { it(`should return an error for a user without enough privileges`, async() => { @@ -11,7 +11,7 @@ describe('dms updateFile()', () => { let ctx = {req: {accessToken: {userId: clientId}}, args: {dmsTypeId: dmsTypeId}}; let error; - await app.models.Dms.updateFile(ctx, dmsId, warehouseId, companyId, dmsTypeId).catch(e => { + await models.Dms.updateFile(ctx, dmsId, warehouseId, companyId, dmsTypeId).catch(e => { error = e; }).finally(() => { expect(error.message).toEqual(`You don't have enough privileges`); diff --git a/back/methods/dms/specs/uploadFile.spec.js b/back/methods/dms/specs/uploadFile.spec.js index fda911bad..862f9fc47 100644 --- a/back/methods/dms/specs/uploadFile.spec.js +++ b/back/methods/dms/specs/uploadFile.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('dms uploadFile()', () => { it(`should return an error for a user without enough privileges`, async() => { @@ -7,7 +7,7 @@ describe('dms uploadFile()', () => { let ctx = {req: {accessToken: {userId: clientId}}, args: {dmsTypeId: ticketDmsTypeId}}; let error; - await app.models.Dms.uploadFile(ctx).catch(e => { + await models.Dms.uploadFile(ctx).catch(e => { error = e; }).finally(() => { expect(error.message).toEqual(`You don't have enough privileges`); diff --git a/back/methods/docuware/deliveryNoteEmail.js b/back/methods/docuware/deliveryNoteEmail.js index 1f9d7556f..1557a3a87 100644 --- a/back/methods/docuware/deliveryNoteEmail.js +++ b/back/methods/docuware/deliveryNoteEmail.js @@ -4,25 +4,25 @@ module.exports = Self => { Self.remoteMethodCtx('deliveryNoteEmail', { description: 'Sends the delivery note email with an docuware attached PDF', accessType: 'WRITE', + accessScopes: ['docuwareDeliveryNoteEmail'], accepts: [ { arg: 'id', - type: 'string', + type: 'number', required: true, description: 'The ticket id', - http: {source: 'path'} - }, - { - arg: 'recipient', - type: 'string', - description: 'The recipient email', - required: true, }, { arg: 'recipientId', type: 'number', description: 'The client id', - required: false + required: true + }, + { + arg: 'recipient', + type: 'string', + description: 'The recipient email', + required: false, } ], returns: [ @@ -41,12 +41,13 @@ module.exports = Self => { } ], http: { - path: '/:id/delivery-note-email', + path: '/delivery-note-email', verb: 'POST' } }); - Self.deliveryNoteEmail = async(ctx, id) => { + Self.deliveryNoteEmail = async(ctx, id, recipientId, recipient) => { + const models = Self.app.models; const args = Object.assign({}, ctx.args); const params = { recipient: args.recipient, @@ -57,9 +58,14 @@ module.exports = Self => { for (const param in args) params[param] = args[param]; + if (!recipient) { + client = await models.Client.findById(recipientId, {fields: ['email']}); + params.recipient = client.email; + } + const email = new Email('delivery-note', params); - const docuwareFile = await Self.app.models.Docuware.download(ctx, id, 'deliveryNote'); + const docuwareFile = await models.Docuware.download(ctx, id, 'deliveryNote'); return email.send({ overrideAttachments: true, diff --git a/back/methods/image/specs/download.spec.js b/back/methods/image/specs/download.spec.js index 758f884ae..1258a916a 100644 --- a/back/methods/image/specs/download.spec.js +++ b/back/methods/image/specs/download.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('image download()', () => { const collection = 'user'; @@ -8,7 +8,7 @@ describe('image download()', () => { it('should return the image content-type of the user', async() => { const userId = 9; - const image = await app.models.Image.download(ctx, collection, size, userId); + const image = await models.Image.download(ctx, collection, size, userId); const contentType = image[1]; expect(contentType).toEqual('image/png'); @@ -16,7 +16,7 @@ describe('image download()', () => { it(`should return false if the user doesn't have image`, async() => { const userId = 1110; - const image = await app.models.Image.download(ctx, collection, size, userId); + const image = await models.Image.download(ctx, collection, size, userId); expect(image).toBeFalse(); }); diff --git a/back/methods/image/specs/upload.spec.js b/back/methods/image/specs/upload.spec.js index 7cb2ae6f9..144770bcf 100644 --- a/back/methods/image/specs/upload.spec.js +++ b/back/methods/image/specs/upload.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('image upload()', () => { describe('as buyer', () => { @@ -16,7 +16,7 @@ describe('image upload()', () => { let error; try { - await app.models.Image.upload(ctx); + await models.Image.upload(ctx); } catch (err) { error = err; } @@ -25,7 +25,7 @@ describe('image upload()', () => { }); it('should call to the TempContainer upload method for the collection "catalog"', async() => { - const containerModel = app.models.TempContainer; + const containerModel = models.TempContainer; spyOn(containerModel, 'upload'); const ctx = {req: {accessToken: {userId: buyerId}}, @@ -36,7 +36,7 @@ describe('image upload()', () => { }; try { - await app.models.Image.upload(ctx); + await models.Image.upload(ctx); } catch (err) { } expect(containerModel.upload).toHaveBeenCalled(); @@ -49,7 +49,7 @@ describe('image upload()', () => { const itemId = 4; it('should be able to call to the TempContainer upload method for the collection "user"', async() => { - const containerModel = app.models.TempContainer; + const containerModel = models.TempContainer; spyOn(containerModel, 'upload'); const ctx = {req: {accessToken: {userId: marketingId}}, @@ -60,14 +60,14 @@ describe('image upload()', () => { }; try { - await app.models.Image.upload(ctx); + await models.Image.upload(ctx); } catch (err) { } expect(containerModel.upload).toHaveBeenCalled(); }); it('should be able to call to the TempContainer upload method for the collection "catalog"', async() => { - const containerModel = app.models.TempContainer; + const containerModel = models.TempContainer; spyOn(containerModel, 'upload'); const ctx = {req: {accessToken: {userId: marketingId}}, @@ -78,7 +78,7 @@ describe('image upload()', () => { }; try { - await app.models.Image.upload(ctx); + await models.Image.upload(ctx); } catch (err) { } expect(containerModel.upload).toHaveBeenCalled(); @@ -91,7 +91,7 @@ describe('image upload()', () => { const itemId = 4; it('should upload a file for the collection "user" and call to the TempContainer upload method', async() => { - const containerModel = app.models.TempContainer; + const containerModel = models.TempContainer; spyOn(containerModel, 'upload'); const ctx = {req: {accessToken: {userId: hhrrId}}, @@ -102,7 +102,7 @@ describe('image upload()', () => { }; try { - await app.models.Image.upload(ctx); + await models.Image.upload(ctx); } catch (err) { } expect(containerModel.upload).toHaveBeenCalled(); @@ -118,7 +118,7 @@ describe('image upload()', () => { let error; try { - await app.models.Image.upload(ctx); + await models.Image.upload(ctx); } catch (err) { error = err; } diff --git a/back/methods/starred-module/specs/getStarredModules.spec.js b/back/methods/starred-module/specs/getStarredModules.spec.js index c962bc471..bf9bd1d73 100644 --- a/back/methods/starred-module/specs/getStarredModules.spec.js +++ b/back/methods/starred-module/specs/getStarredModules.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); const LoopBackContext = require('loopback-context'); describe('getStarredModules()', () => { @@ -19,13 +19,13 @@ describe('getStarredModules()', () => { }); it(`should return the starred modules for a given user`, async() => { - const newStarred = await app.models.StarredModule.create({workerFk: 9, moduleFk: 'customer', position: 1}); - const starredModules = await app.models.StarredModule.getStarredModules(ctx); + const newStarred = await models.StarredModule.create({workerFk: 9, moduleFk: 'customer', position: 1}); + const starredModules = await models.StarredModule.getStarredModules(ctx); expect(starredModules.length).toEqual(1); expect(starredModules[0].moduleFk).toEqual('customer'); // restores - await app.models.StarredModule.destroyById(newStarred.id); + await models.StarredModule.destroyById(newStarred.id); }); }); diff --git a/back/methods/starred-module/specs/setPosition.spec.js b/back/methods/starred-module/specs/setPosition.spec.js index 5421bd62b..a428fcf22 100644 --- a/back/methods/starred-module/specs/setPosition.spec.js +++ b/back/methods/starred-module/specs/setPosition.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); const LoopBackContext = require('loopback-context'); describe('setPosition()', () => { @@ -21,7 +21,7 @@ describe('setPosition()', () => { }); it('should increase the orders module position by replacing it with clients and vice versa', async() => { - const tx = await app.models.StarredModule.beginTransaction({}); + const tx = await models.StarredModule.beginTransaction({}); const filter = { where: { @@ -32,24 +32,24 @@ describe('setPosition()', () => { try { const options = {transaction: tx}; - await app.models.StarredModule.toggleStarredModule(ctx, 'order', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options); + await models.StarredModule.toggleStarredModule(ctx, 'order', options); + await models.StarredModule.toggleStarredModule(ctx, 'customer', options); - let orders = await app.models.StarredModule.findOne(filter, options); + let orders = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'customer'; - let clients = await app.models.StarredModule.findOne(filter, options); + let clients = await models.StarredModule.findOne(filter, options); expect(orders.position).toEqual(1); expect(clients.position).toEqual(2); - await app.models.StarredModule.setPosition(ctx, 'customer', 'left', options); + await models.StarredModule.setPosition(ctx, 'customer', 'left', options); filter.where.moduleFk = 'customer'; - clients = await app.models.StarredModule.findOne(filter, options); + clients = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'order'; - orders = await app.models.StarredModule.findOne(filter, options); + orders = await models.StarredModule.findOne(filter, options); expect(clients.position).toEqual(1); expect(orders.position).toEqual(2); @@ -62,7 +62,7 @@ describe('setPosition()', () => { }); it('should decrease the orders module position by replacing it with clients and vice versa', async() => { - const tx = await app.models.StarredModule.beginTransaction({}); + const tx = await models.StarredModule.beginTransaction({}); const filter = { where: { @@ -73,24 +73,24 @@ describe('setPosition()', () => { try { const options = {transaction: tx}; - await app.models.StarredModule.toggleStarredModule(ctx, 'order', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options); + await models.StarredModule.toggleStarredModule(ctx, 'order', options); + await models.StarredModule.toggleStarredModule(ctx, 'customer', options); - let orders = await app.models.StarredModule.findOne(filter, options); + let orders = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'customer'; - let clients = await app.models.StarredModule.findOne(filter, options); + let clients = await models.StarredModule.findOne(filter, options); expect(orders.position).toEqual(1); expect(clients.position).toEqual(2); - await app.models.StarredModule.setPosition(ctx, 'order', 'right', options); + await models.StarredModule.setPosition(ctx, 'order', 'right', options); filter.where.moduleFk = 'order'; - orders = await app.models.StarredModule.findOne(filter, options); + orders = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'customer'; - clients = await app.models.StarredModule.findOne(filter, options); + clients = await models.StarredModule.findOne(filter, options); expect(orders.position).toEqual(2); expect(clients.position).toEqual(1); @@ -103,7 +103,7 @@ describe('setPosition()', () => { }); it('should switch two modules after adding and deleting several modules', async() => { - const tx = await app.models.StarredModule.beginTransaction({}); + const tx = await models.StarredModule.beginTransaction({}); const filter = { where: { @@ -115,29 +115,29 @@ describe('setPosition()', () => { try { const options = {transaction: tx}; - await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'order', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'order', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'item', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'claim', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'order', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'zone', options); + await models.StarredModule.toggleStarredModule(ctx, 'customer', options); + await models.StarredModule.toggleStarredModule(ctx, 'order', options); + await models.StarredModule.toggleStarredModule(ctx, 'customer', options); + await models.StarredModule.toggleStarredModule(ctx, 'order', options); + await models.StarredModule.toggleStarredModule(ctx, 'item', options); + await models.StarredModule.toggleStarredModule(ctx, 'claim', options); + await models.StarredModule.toggleStarredModule(ctx, 'customer', options); + await models.StarredModule.toggleStarredModule(ctx, 'order', options); + await models.StarredModule.toggleStarredModule(ctx, 'zone', options); - const items = await app.models.StarredModule.findOne(filter, options); + const items = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'claim'; - const claims = await app.models.StarredModule.findOne(filter, options); + const claims = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'customer'; - let clients = await app.models.StarredModule.findOne(filter, options); + let clients = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'order'; - let orders = await app.models.StarredModule.findOne(filter, options); + let orders = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'zone'; - const zones = await app.models.StarredModule.findOne(filter, options); + const zones = await models.StarredModule.findOne(filter, options); expect(items.position).toEqual(1); expect(claims.position).toEqual(2); @@ -145,13 +145,13 @@ describe('setPosition()', () => { expect(orders.position).toEqual(4); expect(zones.position).toEqual(5); - await app.models.StarredModule.setPosition(ctx, 'customer', 'right', options); + await models.StarredModule.setPosition(ctx, 'customer', 'right', options); filter.where.moduleFk = 'order'; - orders = await app.models.StarredModule.findOne(filter, options); + orders = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'customer'; - clients = await app.models.StarredModule.findOne(filter, options); + clients = await models.StarredModule.findOne(filter, options); expect(orders.position).toEqual(3); expect(clients.position).toEqual(4); @@ -164,7 +164,7 @@ describe('setPosition()', () => { }); it('should switch two modules after adding and deleting a module between them', async() => { - const tx = await app.models.StarredModule.beginTransaction({}); + const tx = await models.StarredModule.beginTransaction({}); const filter = { where: { @@ -176,25 +176,25 @@ describe('setPosition()', () => { try { const options = {transaction: tx}; - await app.models.StarredModule.toggleStarredModule(ctx, 'item', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'claim', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'order', options); - await app.models.StarredModule.toggleStarredModule(ctx, 'zone', options); + await models.StarredModule.toggleStarredModule(ctx, 'item', options); + await models.StarredModule.toggleStarredModule(ctx, 'customer', options); + await models.StarredModule.toggleStarredModule(ctx, 'claim', options); + await models.StarredModule.toggleStarredModule(ctx, 'order', options); + await models.StarredModule.toggleStarredModule(ctx, 'zone', options); - const items = await app.models.StarredModule.findOne(filter, options); + const items = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'customer'; - let clients = await app.models.StarredModule.findOne(filter, options); + let clients = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'claim'; - const claims = await app.models.StarredModule.findOne(filter, options); + const claims = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'order'; - let orders = await app.models.StarredModule.findOne(filter, options); + let orders = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'zone'; - const zones = await app.models.StarredModule.findOne(filter, options); + const zones = await models.StarredModule.findOne(filter, options); expect(items.position).toEqual(1); expect(clients.position).toEqual(2); @@ -202,14 +202,14 @@ describe('setPosition()', () => { expect(orders.position).toEqual(4); expect(zones.position).toEqual(5); - await app.models.StarredModule.toggleStarredModule(ctx, 'claim', options); - await app.models.StarredModule.setPosition(ctx, 'customer', 'right', options); + await models.StarredModule.toggleStarredModule(ctx, 'claim', options); + await models.StarredModule.setPosition(ctx, 'customer', 'right', options); filter.where.moduleFk = 'customer'; - clients = await app.models.StarredModule.findOne(filter, options); + clients = await models.StarredModule.findOne(filter, options); filter.where.moduleFk = 'order'; - orders = await app.models.StarredModule.findOne(filter, options); + orders = await models.StarredModule.findOne(filter, options); expect(orders.position).toEqual(2); expect(clients.position).toEqual(4); diff --git a/back/methods/starred-module/specs/toggleStarredModule.spec.js b/back/methods/starred-module/specs/toggleStarredModule.spec.js index 1195834e7..848c1475a 100644 --- a/back/methods/starred-module/specs/toggleStarredModule.spec.js +++ b/back/methods/starred-module/specs/toggleStarredModule.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); const LoopBackContext = require('loopback-context'); describe('toggleStarredModule()', () => { @@ -21,16 +21,16 @@ describe('toggleStarredModule()', () => { }); it('should create a new starred module and then remove it by calling the method again with same args', async() => { - const starredModule = await app.models.StarredModule.toggleStarredModule(ctx, 'order'); - let starredModules = await app.models.StarredModule.getStarredModules(ctx); + const starredModule = await models.StarredModule.toggleStarredModule(ctx, 'order'); + let starredModules = await models.StarredModule.getStarredModules(ctx); expect(starredModules.length).toEqual(1); expect(starredModule.moduleFk).toEqual('order'); expect(starredModule.workerFk).toEqual(activeCtx.accessToken.userId); expect(starredModule.position).toEqual(starredModules.length); - await app.models.StarredModule.toggleStarredModule(ctx, 'order'); - starredModules = await app.models.StarredModule.getStarredModules(ctx); + await models.StarredModule.toggleStarredModule(ctx, 'order'); + starredModules = await models.StarredModule.getStarredModules(ctx); expect(starredModules.length).toEqual(0); }); diff --git a/back/methods/account/acl.js b/back/methods/vn-user/acl.js similarity index 95% rename from back/methods/account/acl.js rename to back/methods/vn-user/acl.js index bc1990e1d..4f4bf0623 100644 --- a/back/methods/account/acl.js +++ b/back/methods/vn-user/acl.js @@ -22,7 +22,7 @@ module.exports = Self => { let userId = ctx.req.accessToken.userId; let models = Self.app.models; - let user = await models.Account.findById(userId, { + let user = await Self.findById(userId, { fields: ['id', 'name', 'nickname', 'email', 'lang'], include: { relation: 'userConfig', diff --git a/back/methods/account/privileges.js b/back/methods/vn-user/privileges.js similarity index 78% rename from back/methods/account/privileges.js rename to back/methods/vn-user/privileges.js index 5c5e7409d..690ce74a3 100644 --- a/back/methods/account/privileges.js +++ b/back/methods/vn-user/privileges.js @@ -1,9 +1,14 @@ const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { - Self.remoteMethodCtx('privileges', { + Self.remoteMethod('privileges', { description: 'Change role and hasGrant if user has privileges', accepts: [ + { + arg: 'ctx', + type: 'Object', + http: {source: 'context'} + }, { arg: 'id', type: 'number', @@ -39,9 +44,9 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const user = await models.Account.findById(userId, {fields: ['hasGrant']}, myOptions); + const user = await Self.findById(userId, {fields: ['hasGrant']}, myOptions); - const userToUpdate = await models.Account.findById(id, { + const userToUpdate = await Self.findById(id, { fields: ['id', 'name', 'hasGrant', 'roleFk', 'password'], include: { relation: 'role', @@ -54,7 +59,7 @@ module.exports = Self => { if (!user.hasGrant) throw new UserError(`You don't have grant privilege`); - const hasRoleFromUser = await models.Account.hasRole(userId, userToUpdate.role().name, myOptions); + const hasRoleFromUser = await Self.hasRole(userId, userToUpdate.role().name, myOptions); if (!hasRoleFromUser) throw new UserError(`You don't own the role and you can't assign it to another user`); @@ -64,7 +69,7 @@ module.exports = Self => { if (roleFk) { const role = await models.Role.findById(roleFk, {fields: ['name']}, myOptions); - const hasRole = await models.Account.hasRole(userId, role.name, myOptions); + const hasRole = await Self.hasRole(userId, role.name, myOptions); if (!hasRole) throw new UserError(`You don't own the role and you can't assign it to another user`); @@ -73,6 +78,6 @@ module.exports = Self => { } await userToUpdate.save(userToUpdate); - await models.UserAccount.sync(userToUpdate.name); + await models.Account.sync(userToUpdate.name); }; }; diff --git a/back/methods/account/recover-password.js b/back/methods/vn-user/recover-password.js similarity index 85% rename from back/methods/account/recover-password.js rename to back/methods/vn-user/recover-password.js index 787a45284..34f5dd545 100644 --- a/back/methods/account/recover-password.js +++ b/back/methods/vn-user/recover-password.js @@ -20,7 +20,7 @@ module.exports = Self => { const usesEmail = user.indexOf('@') !== -1; if (!usesEmail) { - const account = await models.Account.findOne({ + const account = await models.VnUser.findOne({ fields: ['email'], where: {name: user} }); @@ -28,7 +28,7 @@ module.exports = Self => { } try { - await models.user.resetPassword({email: user, emailTemplate: 'recover-password'}); + await Self.resetPassword({email: user, emailTemplate: 'recover-password'}); } catch (err) { if (err.code === 'EMAIL_NOT_FOUND') return; diff --git a/back/methods/account/login.js b/back/methods/vn-user/signIn.js similarity index 67% rename from back/methods/account/login.js rename to back/methods/vn-user/signIn.js index 7393e8374..da3172ae4 100644 --- a/back/methods/account/login.js +++ b/back/methods/vn-user/signIn.js @@ -1,14 +1,14 @@ -const md5 = require('md5'); const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { - Self.remoteMethod('login', { + Self.remoteMethod('signIn', { description: 'Login a user with username/email and password', accepts: [ { arg: 'user', type: 'String', description: 'The user name or email', + http: {source: 'form'}, required: true }, { arg: 'password', @@ -21,20 +21,20 @@ module.exports = Self => { root: true }, http: { - path: `/login`, + path: `/signIn`, verb: 'POST' } }); - Self.login = async function(user, password) { - let $ = Self.app.models; + Self.signIn = async function(user, password) { + let models = Self.app.models; let token; let usesEmail = user.indexOf('@') !== -1; let userInfo = usesEmail ? {email: user} : {username: user}; - let instance = await $.User.findOne({ + let instance = await Self.findOne({ fields: ['username', 'password'], where: userInfo }); @@ -42,29 +42,27 @@ module.exports = Self => { let where = usesEmail ? {email: user} : {name: user}; - let account = await Self.findOne({ - fields: ['active', 'password'], + let vnUser = await Self.findOne({ + fields: ['active'], where }); - let validCredentials = instance && ( - await instance.hasPassword(password) || - account.password == md5(password || '') - ); + let validCredentials = instance + && await instance.hasPassword(password); if (validCredentials) { - if (!account.active) + if (!vnUser.active) throw new UserError('User disabled'); try { - await $.UserAccount.sync(instance.username, password); + await models.Account.sync(instance.username, password); } catch (err) { console.warn(err); } } let loginInfo = Object.assign({password}, userInfo); - token = await $.User.login(loginInfo, 'user'); + token = await Self.login(loginInfo, 'user'); return {token: token.id}; }; }; diff --git a/back/methods/account/specs/privileges.spec.js b/back/methods/vn-user/specs/privileges.spec.js similarity index 74% rename from back/methods/account/specs/privileges.spec.js rename to back/methods/vn-user/specs/privileges.spec.js index edfe0f03f..3d25eecf9 100644 --- a/back/methods/account/specs/privileges.spec.js +++ b/back/methods/vn-user/specs/privileges.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -describe('account privileges()', () => { +describe('VnUser privileges()', () => { const employeeId = 1; const developerId = 9; const sysadminId = 66; @@ -10,13 +10,13 @@ describe('account privileges()', () => { it('should throw an error when user not has privileges', async() => { const ctx = {req: {accessToken: {userId: developerId}}}; - const tx = await models.Account.beginTransaction({}); + const tx = await models.VnUser.beginTransaction({}); let error; try { const options = {transaction: tx}; - await models.Account.privileges(ctx, employeeId, null, true, options); + await models.VnUser.privileges(ctx, employeeId, null, true, options); await tx.rollback(); } catch (e) { @@ -29,13 +29,13 @@ describe('account privileges()', () => { it('should throw an error when user has privileges but not has the role', async() => { const ctx = {req: {accessToken: {userId: sysadminId}}}; - const tx = await models.Account.beginTransaction({}); + const tx = await models.VnUser.beginTransaction({}); let error; try { const options = {transaction: tx}; - await models.Account.privileges(ctx, employeeId, rootId, null, options); + await models.VnUser.privileges(ctx, employeeId, rootId, null, options); await tx.rollback(); } catch (e) { @@ -48,13 +48,13 @@ describe('account privileges()', () => { it('should throw an error when user has privileges but not has the role from user', async() => { const ctx = {req: {accessToken: {userId: sysadminId}}}; - const tx = await models.Account.beginTransaction({}); + const tx = await models.VnUser.beginTransaction({}); let error; try { const options = {transaction: tx}; - await models.Account.privileges(ctx, itBossId, developerId, null, options); + await models.VnUser.privileges(ctx, itBossId, developerId, null, options); await tx.rollback(); } catch (e) { @@ -67,7 +67,7 @@ describe('account privileges()', () => { it('should change role', async() => { const ctx = {req: {accessToken: {userId: sysadminId}}}; - const tx = await models.Account.beginTransaction({}); + const tx = await models.VnUser.beginTransaction({}); const options = {transaction: tx}; const agency = await models.Role.findOne({ @@ -79,8 +79,8 @@ describe('account privileges()', () => { let error; let result; try { - await models.Account.privileges(ctx, clarkKent, agency.id, null, options); - result = await models.Account.findById(clarkKent, null, options); + await models.VnUser.privileges(ctx, clarkKent, agency.id, null, options); + result = await models.VnUser.findById(clarkKent, null, options); await tx.rollback(); } catch (e) { @@ -94,14 +94,14 @@ describe('account privileges()', () => { it('should change hasGrant', async() => { const ctx = {req: {accessToken: {userId: sysadminId}}}; - const tx = await models.Account.beginTransaction({}); + const tx = await models.VnUser.beginTransaction({}); let error; let result; try { const options = {transaction: tx}; - await models.Account.privileges(ctx, clarkKent, null, true, options); - result = await models.Account.findById(clarkKent, null, options); + await models.VnUser.privileges(ctx, clarkKent, null, true, options); + result = await models.VnUser.findById(clarkKent, null, options); await tx.rollback(); } catch (e) { diff --git a/back/methods/account/specs/login.spec.js b/back/methods/vn-user/specs/signIn.js similarity index 57% rename from back/methods/account/specs/login.spec.js rename to back/methods/vn-user/specs/signIn.js index 59eea2612..b46c645d6 100644 --- a/back/methods/account/specs/login.spec.js +++ b/back/methods/vn-user/specs/signIn.js @@ -1,25 +1,25 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); -describe('account login()', () => { +describe('VnUser signIn()', () => { describe('when credentials are correct', () => { it('should return the token', async() => { - let login = await app.models.Account.login('salesAssistant', 'nightmare'); - let accessToken = await app.models.AccessToken.findById(login.token); + let login = await models.VnUser.signIn('salesAssistant', 'nightmare'); + let accessToken = await models.AccessToken.findById(login.token); let ctx = {req: {accessToken: accessToken}}; expect(login.token).toBeDefined(); - await app.models.Account.logout(ctx); + await models.VnUser.signOut(ctx); }); it('should return the token if the user doesnt exist but the client does', async() => { - let login = await app.models.Account.login('PetterParker', 'nightmare'); - let accessToken = await app.models.AccessToken.findById(login.token); + let login = await models.VnUser.signIn('PetterParker', 'nightmare'); + let accessToken = await models.AccessToken.findById(login.token); let ctx = {req: {accessToken: accessToken}}; expect(login.token).toBeDefined(); - await app.models.Account.logout(ctx); + await models.VnUser.signOut(ctx); }); }); @@ -28,7 +28,7 @@ describe('account login()', () => { let error; try { - await app.models.Account.login('IDontExist', 'TotallyWrongPassword'); + await models.VnUser.signIn('IDontExist', 'TotallyWrongPassword'); } catch (e) { error = e; } diff --git a/back/methods/account/specs/logout.spec.js b/back/methods/vn-user/specs/signOut.js similarity index 59% rename from back/methods/account/specs/logout.spec.js rename to back/methods/vn-user/specs/signOut.js index b3d69d6ef..c84e86f05 100644 --- a/back/methods/account/specs/logout.spec.js +++ b/back/methods/vn-user/specs/signOut.js @@ -1,13 +1,13 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); -describe('account logout()', () => { +describe('VnUser signOut()', () => { it('should logout and remove token after valid login', async() => { - let loginResponse = await app.models.Account.login('buyer', 'nightmare'); - let accessToken = await app.models.AccessToken.findById(loginResponse.token); + let loginResponse = await models.VnUser.signOut('buyer', 'nightmare'); + let accessToken = await models.AccessToken.findById(loginResponse.token); let ctx = {req: {accessToken: accessToken}}; - let logoutResponse = await app.models.Account.logout(ctx); - let tokenAfterLogout = await app.models.AccessToken.findById(loginResponse.token); + let logoutResponse = await models.VnUser.signOut(ctx); + let tokenAfterLogout = await models.AccessToken.findById(loginResponse.token); expect(logoutResponse).toBeTrue(); expect(tokenAfterLogout).toBeNull(); @@ -18,7 +18,7 @@ describe('account logout()', () => { let ctx = {req: {accessToken: {id: 'invalidToken'}}}; try { - response = await app.models.Account.logout(ctx); + response = await models.VnUser.signOut(ctx); } catch (e) { error = e; } @@ -32,7 +32,7 @@ describe('account logout()', () => { let ctx = {req: {accessToken: null}}; try { - response = await app.models.Account.logout(ctx); + response = await models.VnUser.signOut(ctx); } catch (e) { error = e; } diff --git a/back/methods/account/validate-token.js b/back/methods/vn-user/validate-token.js similarity index 100% rename from back/methods/account/validate-token.js rename to back/methods/vn-user/validate-token.js diff --git a/back/model-config.json b/back/model-config.json index 29676e979..ff2bf5850 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -1,7 +1,4 @@ { - "Account": { - "dataSource": "vn" - }, "AccountingType": { "dataSource": "vn" }, @@ -125,10 +122,10 @@ "UserConfigView": { "dataSource": "vn" }, - "UserLog": { + "Warehouse": { "dataSource": "vn" }, - "Warehouse": { + "VnUser": { "dataSource": "vn" }, "OsTicket": { diff --git a/back/models/account.js b/back/models/account.js deleted file mode 100644 index 6d71a4e52..000000000 --- a/back/models/account.js +++ /dev/null @@ -1,139 +0,0 @@ -/* eslint max-len: ["error", { "code": 150 }]*/ -const md5 = require('md5'); -const LoopBackContext = require('loopback-context'); -const {Email} = require('vn-print'); - -module.exports = Self => { - require('../methods/account/login')(Self); - require('../methods/account/logout')(Self); - require('../methods/account/acl')(Self); - require('../methods/account/change-password')(Self); - require('../methods/account/set-password')(Self); - require('../methods/account/recover-password')(Self); - require('../methods/account/validate-token')(Self); - require('../methods/account/privileges')(Self); - - // Validations - - Self.validatesFormatOf('email', { - message: 'Invalid email', - allowNull: true, - allowBlank: true, - with: /^[\w|.|-]+@[\w|-]+(\.[\w|-]+)*(,[\w|.|-]+@[\w|-]+(\.[\w|-]+)*)*$/ - }); - - Self.validatesUniquenessOf('name', { - message: `A client with that Web User name already exists` - }); - - Self.observe('before save', async function(ctx) { - if (ctx.currentInstance && ctx.currentInstance.id && ctx.data && ctx.data.password) - ctx.data.password = md5(ctx.data.password); - }); - - Self.afterRemote('prototype.patchAttributes', async(ctx, instance) => { - if (!ctx.args || !ctx.args.data.email) return; - const models = Self.app.models; - - const loopBackContext = LoopBackContext.getCurrentContext(); - const httpCtx = {req: loopBackContext.active}; - const httpRequest = httpCtx.req.http.req; - const headers = httpRequest.headers; - const origin = headers.origin; - const url = origin.split(':'); - - const userId = ctx.instance.id; - const user = await models.user.findById(userId); - - class Mailer { - async send(verifyOptions, cb) { - const params = { - url: verifyOptions.verifyHref, - recipient: verifyOptions.to, - lang: ctx.req.getLocale() - }; - - const email = new Email('email-verify', params); - email.send(); - - cb(null, verifyOptions.to); - } - } - - const options = { - type: 'email', - to: instance.email, - from: {}, - redirect: `${origin}/#!/account/${instance.id}/basic-data?emailConfirmed`, - template: false, - mailer: new Mailer, - host: url[1].split('/')[2], - port: url[2], - protocol: url[0], - user: Self - }; - - await user.verify(options); - }); - - Self.remoteMethod('getCurrentUserData', { - description: 'Gets the current user data', - accepts: [ - { - arg: 'ctx', - type: 'object', - http: {source: 'context'} - } - ], - returns: { - type: 'object', - root: true - }, - http: { - verb: 'GET', - path: '/getCurrentUserData' - } - }); - - Self.getCurrentUserData = async function(ctx) { - let userId = ctx.req.accessToken.userId; - return await Self.findById(userId, { - fields: ['id', 'name', 'nickname'] - }); - }; - - /** - * Checks if user has a role. - * - * @param {Integer} userId The user id - * @param {String} name The role name - * @param {object} options Options - * @return {Boolean} %true if user has the role, %false otherwise - */ - Self.hasRole = async function(userId, name, options) { - let roles = await Self.getRoles(userId, options); - return roles.some(role => role == name); - }; - - /** - * Get all user roles. - * - * @param {Integer} userId The user id - * @param {object} options Options - * @return {object} User role list - */ - Self.getRoles = async(userId, options) => { - let result = await Self.rawSql( - `SELECT r.name - FROM account.user u - JOIN account.roleRole rr ON rr.role = u.role - JOIN account.role r ON r.id = rr.inheritsFrom - WHERE u.id = ?`, [userId], options); - - let roles = []; - for (const role of result) - roles.push(role.name); - - return roles; - }; -}; diff --git a/back/models/dms-type.js b/back/models/dms-type.js index 267c905e9..c9329f30b 100644 --- a/back/models/dms-type.js +++ b/back/models/dms-type.js @@ -54,8 +54,8 @@ module.exports = Self => { const writeRole = dmsType.writeRole() && dmsType.writeRole().name; const requiredRole = readRole || writeRole; - const hasRequiredRole = await models.Account.hasRole(myUserId, requiredRole, options); - const isRoot = await models.Account.hasRole(myUserId, 'root', options); + const hasRequiredRole = await models.VnUser.hasRole(myUserId, requiredRole, options); + const isRoot = await models.VnUser.hasRole(myUserId, 'root', options); if (isRoot || hasRequiredRole) return true; diff --git a/back/models/email-user.json b/back/models/email-user.json index 81c01ab0c..57935fe79 100644 --- a/back/models/email-user.json +++ b/back/models/email-user.json @@ -20,7 +20,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } }, diff --git a/back/models/image-collection.js b/back/models/image-collection.js index 8ea3c6f12..2c4d274ee 100644 --- a/back/models/image-collection.js +++ b/back/models/image-collection.js @@ -53,8 +53,8 @@ module.exports = Self => { const writeRole = collection.writeRole() && collection.writeRole().name; const requiredRole = readRole || writeRole; - const hasRequiredRole = await models.Account.hasRole(myUserId, requiredRole, options); - const isRoot = await models.Account.hasRole(myUserId, 'root', options); + const hasRequiredRole = await models.VnUser.hasRole(myUserId, requiredRole, options); + const isRoot = await models.VnUser.hasRole(myUserId, 'root', options); if (isRoot || hasRequiredRole) return true; diff --git a/back/models/notificationQueue.json b/back/models/notificationQueue.json index 9790ea595..994230031 100644 --- a/back/models/notificationQueue.json +++ b/back/models/notificationQueue.json @@ -31,7 +31,7 @@ }, "author": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "authorFk" } } diff --git a/back/models/notificationSubscription.json b/back/models/notificationSubscription.json index a640e0917..d1632f925 100644 --- a/back/models/notificationSubscription.json +++ b/back/models/notificationSubscription.json @@ -29,7 +29,7 @@ }, "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } } diff --git a/back/models/specs/company.spec.js b/back/models/specs/company.spec.js index 4adc6d96b..e30d45a59 100644 --- a/back/models/specs/company.spec.js +++ b/back/models/specs/company.spec.js @@ -1,8 +1,8 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('loopback model Company', () => { it('should check that the company FTH doesnt exists', async() => { - let result = await app.models.Company.findOne({where: {code: 'FTH'}}); + let result = await models.Company.findOne({where: {code: 'FTH'}}); expect(result).toBeFalsy(); }); diff --git a/back/models/specs/dms.spec.js b/back/models/specs/dms.spec.js index 93ae1d1e0..3f13e88ff 100644 --- a/back/models/specs/dms.spec.js +++ b/back/models/specs/dms.spec.js @@ -1,6 +1,6 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('Dms', () => { - const Dms = app.models.Dms; + const Dms = models.Dms; describe('getFile()', () => { it('should return a response with text content-type', async() => { @@ -23,7 +23,7 @@ describe('Dms', () => { it('should return an error for a record does not exists', async() => { let error = {}; try { - await app.models.Dms.getFile('NotExistentId'); + await models.Dms.getFile('NotExistentId'); } catch (e) { error = e; } diff --git a/back/models/specs/user.spec.js b/back/models/specs/user.spec.js index 124afdc0c..78835e6eb 100644 --- a/back/models/specs/user.spec.js +++ b/back/models/specs/user.spec.js @@ -1,7 +1,7 @@ const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); -describe('account recoverPassword()', () => { +describe('VnUser recoverPassword()', () => { const userId = 1107; const activeCtx = { @@ -21,9 +21,9 @@ describe('account recoverPassword()', () => { it('should send email with token', async() => { const userId = 1107; - const user = await models.Account.findById(userId); + const user = await models.VnUser.findById(userId); - await models.Account.recoverPassword(user.email); + await models.VnUser.recoverPassword(user.email); const result = await models.AccessToken.findOne({where: {userId: userId}}); diff --git a/back/models/specs/account.spec.js b/back/models/specs/vn-user.spec.js similarity index 63% rename from back/models/specs/account.spec.js rename to back/models/specs/vn-user.spec.js index f31c81b75..3700b919a 100644 --- a/back/models/specs/account.spec.js +++ b/back/models/specs/vn-user.spec.js @@ -1,14 +1,14 @@ const models = require('vn-loopback/server/server').models; -describe('loopback model Account', () => { +describe('loopback model VnUser', () => { it('should return true if the user has the given role', async() => { - let result = await models.Account.hasRole(1, 'employee'); + let result = await models.VnUser.hasRole(1, 'employee'); expect(result).toBeTruthy(); }); it('should return false if the user doesnt have the given role', async() => { - let result = await models.Account.hasRole(1, 'administrator'); + let result = await models.VnUser.hasRole(1, 'administrator'); expect(result).toBeFalsy(); }); diff --git a/back/models/user-config-view.json b/back/models/user-config-view.json index f9235725c..ab9c37668 100644 --- a/back/models/user-config-view.json +++ b/back/models/user-config-view.json @@ -26,7 +26,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } } diff --git a/back/models/user-config.json b/back/models/user-config.json index 8e4684713..52125dc01 100644 --- a/back/models/user-config.json +++ b/back/models/user-config.json @@ -39,9 +39,9 @@ "model": "Company", "foreignKey": "companyFk" }, - "account": { + "VnUser": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } } diff --git a/back/models/user.js b/back/models/user.js deleted file mode 100644 index b24d702b3..000000000 --- a/back/models/user.js +++ /dev/null @@ -1,27 +0,0 @@ -const LoopBackContext = require('loopback-context'); -const {Email} = require('vn-print'); - -module.exports = function(Self) { - Self.on('resetPasswordRequest', async function(info) { - const loopBackContext = LoopBackContext.getCurrentContext(); - const httpCtx = {req: loopBackContext.active}; - const httpRequest = httpCtx.req.http.req; - const headers = httpRequest.headers; - const origin = headers.origin; - - const user = await Self.app.models.Account.findById(info.user.id); - const params = { - recipient: info.email, - lang: user.lang, - url: `${origin}/#!/reset-password?access_token=${info.accessToken.id}` - }; - - const options = Object.assign({}, info.options); - for (const param in options) - params[param] = options[param]; - - const email = new Email(options.emailTemplate, params); - - return email.send(); - }); -}; diff --git a/back/models/user.json b/back/models/user.json deleted file mode 100644 index d992fd9db..000000000 --- a/back/models/user.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "user", - "base": "User", - "options": { - "mysql": { - "table": "salix.User" - }, - "resetPasswordTokenTTL": "604800" - }, - "properties": { - "id": { - "id": true, - "type": "number", - "forceId": false - }, - "username":{ - "type": "string" - } - } -} \ No newline at end of file diff --git a/back/models/vn-user.js b/back/models/vn-user.js new file mode 100644 index 000000000..84ba11794 --- /dev/null +++ b/back/models/vn-user.js @@ -0,0 +1,110 @@ +const vnModel = require('vn-loopback/common/models/vn-model'); +const LoopBackContext = require('loopback-context'); +const {Email} = require('vn-print'); + +module.exports = function(Self) { + vnModel(Self); + + require('../methods/vn-user/signIn')(Self); + require('../methods/vn-user/acl')(Self); + require('../methods/vn-user/recover-password')(Self); + require('../methods/vn-user/validate-token')(Self); + require('../methods/vn-user/privileges')(Self); + + // Validations + + Self.validatesFormatOf('email', { + message: 'Invalid email', + allowNull: true, + allowBlank: true, + with: /^[\w|.|-]+@[\w|-]+(\.[\w|-]+)*(,[\w|.|-]+@[\w|-]+(\.[\w|-]+)*)*$/ + }); + + Self.validatesUniquenessOf('name', { + message: `A client with that Web User name already exists` + }); + + Self.remoteMethod('getCurrentUserData', { + description: 'Gets the current user data', + accepts: [ + { + arg: 'ctx', + type: 'Object', + http: {source: 'context'} + } + ], + returns: { + type: 'Object', + root: true + }, + http: { + verb: 'GET', + path: '/getCurrentUserData' + } + }); + + Self.getCurrentUserData = async function(ctx) { + let userId = ctx.req.accessToken.userId; + return await Self.findById(userId, { + fields: ['id', 'name', 'nickname'] + }); + }; + + /** + * Checks if user has a role. + * + * @param {Integer} userId The user id + * @param {String} name The role name + * @param {Object} options Options + * @return {Boolean} %true if user has the role, %false otherwise + */ + Self.hasRole = async function(userId, name, options) { + const roles = await Self.getRoles(userId, options); + return roles.some(role => role == name); + }; + + /** + * Get all user roles. + * + * @param {Integer} userId The user id + * @param {Object} options Options + * @return {Object} User role list + */ + Self.getRoles = async(userId, options) => { + const result = await Self.rawSql( + `SELECT r.name + FROM account.user u + JOIN account.roleRole rr ON rr.role = u.role + JOIN account.role r ON r.id = rr.inheritsFrom + WHERE u.id = ?`, [userId], options); + + const roles = []; + for (const role of result) + roles.push(role.name); + + return roles; + }; + + Self.on('resetPasswordRequest', async function(info) { + const loopBackContext = LoopBackContext.getCurrentContext(); + const httpCtx = {req: loopBackContext.active}; + const httpRequest = httpCtx.req.http.req; + const headers = httpRequest.headers; + const origin = headers.origin; + + const user = await Self.app.models.VnUser.findById(info.user.id); + const params = { + recipient: info.email, + lang: user.lang, + url: `${origin}/#!/reset-password?access_token=${info.accessToken.id}` + }; + + const options = Object.assign({}, info.options); + for (const param in options) + params[param] = options[param]; + + const email = new Email(options.emailTemplate, params); + + return email.send(); + }); +}; diff --git a/back/models/account.json b/back/models/vn-user.json similarity index 86% rename from back/models/account.json rename to back/models/vn-user.json index 5e35c711a..17efc8ce6 100644 --- a/back/models/account.json +++ b/back/models/vn-user.json @@ -1,11 +1,13 @@ { - "name": "Account", - "base": "VnModel", + "name": "VnUser", + "base": "User", + "validateUpsert": true, "options": { "mysql": { "table": "account.user" } }, + "resetPasswordTokenTTL": "604800", "properties": { "id": { "type": "number", @@ -15,6 +17,19 @@ "type": "string", "required": true }, + "username": { + "type": "string", + "mysql": { + "columnName": "name" + } + }, + "password": { + "type": "string", + "required": true, + "mysql": { + "columnName": "bcryptPassword" + } + }, "roleFk": { "type": "number", "mysql": { @@ -27,10 +42,6 @@ "lang": { "type": "string" }, - "password": { - "type": "string", - "required": true - }, "bcryptPassword": { "type": "string" }, @@ -40,9 +51,6 @@ "email": { "type": "string" }, - "emailVerified": { - "type": "boolean" - }, "created": { "type": "date" }, @@ -86,7 +94,7 @@ }, "acls": [ { - "property": "login", + "property": "signIn", "accessType": "EXECUTE", "principalType": "ROLE", "principalId": "$everyone", @@ -100,13 +108,6 @@ "permission": "ALLOW" }, { - "property": "logout", - "accessType": "EXECUTE", - "principalType": "ROLE", - "principalId": "$authenticated", - "permission": "ALLOW" - }, - { "property": "validateToken", "accessType": "EXECUTE", "principalType": "ROLE", diff --git a/back/tests.js b/back/tests.js index a377011d3..97e548d33 100644 --- a/back/tests.js +++ b/back/tests.js @@ -34,6 +34,8 @@ async function test() { app.boot(bootOptions, err => err ? reject(err) : resolve()); }); + // FIXME: Workaround to wait for loopback to be ready + await app.models.Application.status(); const Jasmine = require('jasmine'); const jasmine = new Jasmine(); diff --git a/db/.archive/225201/00-invoiceOut_new.sql b/db/.archive/225201/00-invoiceOut_new.sql index 10a42d40d..4c60b50bc 100644 --- a/db/.archive/225201/00-invoiceOut_new.sql +++ b/db/.archive/225201/00-invoiceOut_new.sql @@ -8,7 +8,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`( BEGIN /** * Creación de facturas emitidas. - * requiere previamente tabla ticketToInvoice(id). + * requiere previamente tabla tmp.ticketToInvoice(id). * * @param vSerial serie a la cual se hace la factura * @param vInvoiceDate fecha de la factura @@ -36,13 +36,13 @@ BEGIN SELECT t.clientFk, t.companyFk INTO vClient, vCompany - FROM ticketToInvoice tt + FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id LIMIT 1; - -- Eliminem de ticketToInvoice els tickets que no han de ser facturats + -- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats DELETE ti.* - FROM ticketToInvoice ti + FROM tmp.ticketToInvoice ti JOIN ticket t ON t.id = ti.id JOIN sale s ON s.ticketFk = t.id JOIN item i ON i.id = s.itemFk @@ -57,7 +57,7 @@ BEGIN SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t LEFT JOIN sale s ON s.ticketFk = t.id LEFT JOIN ticketService ts ON ts.ticketFk = t.id; @@ -100,13 +100,13 @@ BEGIN WHERE id = vNewInvoiceId; UPDATE ticket t - JOIN ticketToInvoice ti ON ti.id = t.id + JOIN tmp.ticketToInvoice ti ON ti.id = t.id SET t.refFk = vNewRef; DROP TEMPORARY TABLE IF EXISTS tmp.updateInter; CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador - FROM ticketToInvoice ti + FROM tmp.ticketToInvoice ti LEFT JOIN ticketState ts ON ti.id = ts.ticket JOIN state s WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id); @@ -116,7 +116,7 @@ BEGIN INSERT INTO ticketLog (action, userFk, originFk, description) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) - FROM ticketToInvoice ti; + FROM tmp.ticketToInvoice ti; CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); @@ -159,7 +159,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL `ticket_getTax`('NATIONAL'); @@ -220,6 +220,6 @@ BEGIN END IF; - DROP TEMPORARY TABLE `ticketToInvoice`; + DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`; END$$ DELIMITER ; diff --git a/db/changes/230401/00-ACL.sql b/db/changes/230401/00-ACL.sql new file mode 100644 index 000000000..ae9f781f7 --- /dev/null +++ b/db/changes/230401/00-ACL.sql @@ -0,0 +1,18 @@ +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) +VALUES ('VnUser', '*', '*', 'ALLOW', 'ROLE', 'employee'); + +INSERT INTO `salix`.`ACL` (id, model, property, accessType, permission, principalType, principalId) +VALUES ('VnUser', 'acl', 'READ', 'ALLOW', 'ROLE', 'account'); + +INSERT INTO `salix`.`ACL` (id, model, property, accessType, permission, principalType, principalId) +VALUES ('VnUser', 'getCurrentUserData', 'READ', 'ALLOW', 'ROLE', 'account'); + +INSERT INTO `salix`.`ACL` (id, model, property, accessType, permission, principalType, principalId) +VALUES ('VnUser', 'changePassword', '*', 'ALLOW', 'ROLE', 'account'); + + + +UPDATE `hedera`.`imageCollection` t +SET t.model = 'VnUser' +WHERE t.id = 6; + diff --git a/db/changes/231001/02-invoiceOut_new.sql b/db/changes/231001/02-invoiceOut_new.sql index 0fd91ef58..d2b96eff7 100644 --- a/db/changes/231001/02-invoiceOut_new.sql +++ b/db/changes/231001/02-invoiceOut_new.sql @@ -10,14 +10,14 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`( BEGIN /** * Creación de facturas emitidas. - * requiere previamente tabla ticketToInvoice(id). + * requiere previamente tabla tmp.ticketToInvoice(id). * * @param vSerial serie a la cual se hace la factura * @param vInvoiceDate fecha de la factura * @param vTaxArea tipo de iva en relacion a la empresa y al cliente * @param vNewInvoiceId id de la factura que se acaba de generar * @return vNewInvoiceId - */ + */ DECLARE vIsAnySaleToInvoice BOOL; DECLARE vIsAnyServiceToInvoice BOOL; DECLARE vNewRef VARCHAR(255); @@ -37,32 +37,32 @@ BEGIN DECLARE vMaxShipped DATE; SET vInvoiceDate = IFNULL(vInvoiceDate, util.CURDATE()); - - SELECT t.clientFk, - t.companyFk, + + SELECT t.clientFk, + t.companyFk, MAX(DATE(t.shipped)), DATE(vInvoiceDate) >= invoiceOut_getMaxIssued( - vSerial, - t.companyFk, + vSerial, + t.companyFk, YEAR(vInvoiceDate)) - INTO vClientFk, + INTO vClientFk, vCompanyFk, vMaxShipped, vIsCorrectInvoiceDate - FROM ticketToInvoice tt + FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id; - IF(vMaxShipped > vInvoiceDate) THEN + IF(vMaxShipped > vInvoiceDate) THEN CALL util.throw("Invoice date can't be less than max date"); END IF; - + IF NOT vIsCorrectInvoiceDate THEN CALL util.throw('Exists an invoice with a previous date'); END IF; - - -- Eliminem de ticketToInvoice els tickets que no han de ser facturats + + -- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats DELETE ti.* - FROM ticketToInvoice ti + FROM tmp.ticketToInvoice ti JOIN ticket t ON t.id = ti.id JOIN sale s ON s.ticketFk = t.id JOIN item i ON i.id = s.itemFk @@ -77,11 +77,11 @@ BEGIN SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0 INTO vIsAnySaleToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN sale s ON s.ticketFk = t.id; SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN ticketService ts ON ts.ticketFk = t.id; IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice) @@ -121,13 +121,13 @@ BEGIN WHERE id = vNewInvoiceId; UPDATE ticket t - JOIN ticketToInvoice ti ON ti.id = t.id + JOIN tmp.ticketToInvoice ti ON ti.id = t.id SET t.refFk = vNewRef; DROP TEMPORARY TABLE IF EXISTS tmp.updateInter; CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador - FROM ticketToInvoice ti + FROM tmp.ticketToInvoice ti LEFT JOIN ticketState ts ON ti.id = ts.ticket JOIN state s WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id); @@ -137,7 +137,7 @@ BEGIN INSERT INTO ticketLog (action, userFk, originFk, description) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) - FROM ticketToInvoice ti; + FROM tmp.ticketToInvoice ti; CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); @@ -157,12 +157,12 @@ BEGIN WHERE io.id = vNewInvoiceId; DROP TEMPORARY TABLE tmp.updateInter; - - SELECT COUNT(*), id + + SELECT COUNT(*), id INTO vIsInterCompany, vInterCompanyFk - FROM company + FROM company WHERE clientFk = vClientFk; - + IF (vIsInterCompany) THEN INSERT INTO invoiceIn(supplierFk, supplierRef, issued, companyFk) @@ -175,7 +175,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL `ticket_getTax`('NATIONAL'); @@ -201,7 +201,7 @@ BEGIN ) sub; INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) - SELECT vNewInvoiceInFk, + SELECT vNewInvoiceInFk, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, @vTaxableBaseServices, 0) taxableBase, i.expenceFk, @@ -215,13 +215,13 @@ BEGIN ORDER BY tt.priority; CALL invoiceInDueDay_calculate(vNewInvoiceInFk); - - SELECT COUNT(*) INTO vIsCEESerial + + SELECT COUNT(*) INTO vIsCEESerial FROM invoiceOutSerial WHERE code = vSerial; IF vIsCEESerial THEN - + INSERT INTO invoiceInIntrastat ( invoiceInFk, intrastatFk, @@ -253,6 +253,6 @@ BEGIN DROP TEMPORARY TABLE tmp.ticketServiceTax; END IF; END IF; - DROP TEMPORARY TABLE `ticketToInvoice`; + DROP TEMPORARY TABLE tmp.`ticketToInvoice`; END$$ -DELIMITER ; \ No newline at end of file +DELIMITER ; diff --git a/db/changes/231201/00-wagon.sql b/db/changes/231201/00-wagon.sql index 3e4d225d7..9e817bac4 100644 --- a/db/changes/231201/00-wagon.sql +++ b/db/changes/231201/00-wagon.sql @@ -56,8 +56,6 @@ CREATE TABLE `vn`.`collectionWagonTicket` ( ALTER TABLE `vn`.`wagon` ADD `typeFk` int(11) unsigned NOT NULL; ALTER TABLE `vn`.`wagon` ADD `label` int(11) unsigned NOT NULL; -ALTER TABLE `vn`.`wagon` ADD CONSTRAINT `wagon_type` FOREIGN KEY (`typeFk`) REFERENCES `wagonType` (`id`) ON UPDATE CASCADE; - INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('WagonType', '*', '*', 'ALLOW', 'ROLE', 'productionAssi'), @@ -70,3 +68,4 @@ INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `pri ('WagonType', 'createWagonType', '*', 'ALLOW', 'ROLE', 'productionAssi'), ('WagonType', 'deleteWagonType', '*', 'ALLOW', 'ROLE', 'productionAssi'), ('WagonType', 'editWagonType', '*', 'ALLOW', 'ROLE', 'productionAssi'); + diff --git a/db/changes/231801/00-aclClientInforma.sql b/db/changes/231801/00-aclClientInforma.sql new file mode 100644 index 000000000..6222d2632 --- /dev/null +++ b/db/changes/231801/00-aclClientInforma.sql @@ -0,0 +1,3 @@ +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) +VALUES ('ClientInforma', '*', 'READ', 'ALLOW', 'ROLE', 'employee'), + ('ClientInforma', '*', 'WRITE', 'ALLOW', 'ROLE', 'financial'); diff --git a/db/changes/231801/00-acl_receiptEmail.sql b/db/changes/231801/00-acl_receiptEmail.sql new file mode 100644 index 000000000..2de8adf50 --- /dev/null +++ b/db/changes/231801/00-acl_receiptEmail.sql @@ -0,0 +1,3 @@ +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) + VALUES + ('Receipt', 'receiptEmail', '*', 'ALLOW', 'ROLE', 'salesAssistant'); diff --git a/db/changes/231801/00-clientInforma.sql b/db/changes/231801/00-clientInforma.sql new file mode 100644 index 000000000..9bf757fc3 --- /dev/null +++ b/db/changes/231801/00-clientInforma.sql @@ -0,0 +1,16 @@ +ALTER TABLE `vn`.`client` ADD rating INT UNSIGNED DEFAULT NULL NULL COMMENT 'información proporcionada por Informa'; +ALTER TABLE `vn`.`client` ADD recommendedCredit INT UNSIGNED DEFAULT NULL NULL COMMENT 'información proporcionada por Informa'; + +CREATE TABLE `vn`.`clientInforma` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `clientFk` int(11) NOT NULL, + `rating` int(10) unsigned DEFAULT NULL, + `recommendedCredit` int(10) unsigned DEFAULT NULL, + `workerFk` int(10) unsigned NOT NULL, + `created` timestamp NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + KEY `informaWorkers_fk_idx` (`workerFk`), + KEY `informaClientFk` (`clientFk`), + CONSTRAINT `informa_ClienteFk` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `informa_workers_fk` FOREIGN KEY (`workerFk`) REFERENCES `worker` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='información proporcionada por Informa, se actualiza desde el hook de client (salix)'; diff --git a/db/changes/231801/00-client_setRatingAcl.sql b/db/changes/231801/00-client_setRatingAcl.sql new file mode 100644 index 000000000..b041b131a --- /dev/null +++ b/db/changes/231801/00-client_setRatingAcl.sql @@ -0,0 +1,64 @@ +DELETE FROM `salix`.`ACL` WHERE id=7; + +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) + VALUES + ('Client', 'setRating', 'WRITE', 'ALLOW', 'ROLE', 'financial'); + +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) + VALUES + ('Client', '*', 'READ', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'addressesPropagateRe', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'canBeInvoiced', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'canCreateTicket', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'consumption', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'createAddress', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'createWithUser', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'extendedListFilter', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'getAverageInvoiced', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'getCard', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'getDebt', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'getMana', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'transactions', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'hasCustomerRole', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'isValidClient', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'lastActiveTickets', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'sendSms', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'setPassword', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'summary', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'updateAddress', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'updateFiscalData', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'updateUser', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'uploadFile', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'campaignMetricsPdf', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'campaignMetricsEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'clientWelcomeHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'clientWelcomeEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'printerSetupHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'printerSetupEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'sepaCoreEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'letterDebtorPdf', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'letterDebtorStHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'letterDebtorStEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'letterDebtorNdHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'letterDebtorNdEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'clientDebtStatementPdf', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'clientDebtStatementHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'clientDebtStatementEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'creditRequestPdf', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'creditRequestHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'creditRequestEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'incotermsAuthorizationPdf', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'incotermsAuthorizationHtml', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'incotermsAuthorizationEmail', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'consumptionSendQueued', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'filter', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'getClientOrSupplierReference', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'upsert', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'create', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'replaceById', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'updateAttributes', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'updateAttributes', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'deleteById', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'replaceOrCreate', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'updateAll', '*', 'ALLOW', 'ROLE', 'employee'), + ('Client', 'upsertWithWhere', '*', 'ALLOW', 'ROLE', 'employee'); diff --git a/db/changes/231801/00-deleteProcs_refund.sql b/db/changes/231801/00-deleteProcs_refund.sql new file mode 100644 index 000000000..8bf8982f4 --- /dev/null +++ b/db/changes/231801/00-deleteProcs_refund.sql @@ -0,0 +1,2 @@ +DROP PROCEDURE `vn`.`refund`; +DROP PROCEDURE `vn`.`ticket_doRefund`; diff --git a/db/changes/231801/00-deviceProduction.sql b/db/changes/231801/00-deviceProduction.sql new file mode 100644 index 000000000..37a2f1371 --- /dev/null +++ b/db/changes/231801/00-deviceProduction.sql @@ -0,0 +1,5 @@ +DROP TRIGGER `vn`.`deviceProduction_afterInsert`; +DROP TRIGGER `vn`.`deviceProduction_afterUpdate`; + +DROP TRIGGER `vn`.`deviceProductionUser_afterDelete`; + diff --git a/db/changes/231801/00-kkearEntryNotes.sql b/db/changes/231801/00-kkearEntryNotes.sql new file mode 100644 index 000000000..ff5c7ce29 --- /dev/null +++ b/db/changes/231801/00-kkearEntryNotes.sql @@ -0,0 +1 @@ +ALTER TABLE `vn`.`entry` DROP COLUMN `notes`; \ No newline at end of file diff --git a/db/changes/231801/00-newCompanyI18n.sql b/db/changes/231801/00-newCompanyI18n.sql new file mode 100644 index 000000000..948b9cb08 --- /dev/null +++ b/db/changes/231801/00-newCompanyI18n.sql @@ -0,0 +1,9 @@ +-- vn.companyI18n definition +CREATE TABLE `vn`.`companyI18n` ( + `companyFk` smallint(5) unsigned NOT NULL, + `lang` char(2) CHARACTER SET utf8mb3 NOT NULL, + `footnotes` longtext COLLATE utf8mb3_unicode_ci DEFAULT NULL, + PRIMARY KEY (`companyFk`,`lang`), + CONSTRAINT `companyI18n_FK` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + diff --git a/db/changes/231801/00-newTableWeb.sql b/db/changes/231801/00-newTableWeb.sql new file mode 100644 index 000000000..1a2402956 --- /dev/null +++ b/db/changes/231801/00-newTableWeb.sql @@ -0,0 +1 @@ +ALTER TABLE `vn`.`company` ADD `web` varchar(100) NULL; \ No newline at end of file diff --git a/db/changes/231801/00-observationEmailACL.sql b/db/changes/231801/00-observationEmailACL.sql new file mode 100644 index 000000000..1a5d475e8 --- /dev/null +++ b/db/changes/231801/00-observationEmailACL.sql @@ -0,0 +1,3 @@ +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) + VALUES + ('Defaulter', 'observationEmail', 'WRITE', 'ALLOW', 'ROLE', 'employee'); diff --git a/db/changes/231801/00-optimiceZoneEstimatedDelivery.sql b/db/changes/231801/00-optimiceZoneEstimatedDelivery.sql new file mode 100644 index 000000000..209e1efc3 --- /dev/null +++ b/db/changes/231801/00-optimiceZoneEstimatedDelivery.sql @@ -0,0 +1,77 @@ +CREATE OR REPLACE +ALGORITHM = UNDEFINED VIEW `vn`.`zoneEstimatedDelivery` AS +select + `t`.`zoneFk` AS `zoneFk`, + cast(`util`.`VN_CURDATE`() + interval hour(ifnull(`zc`.`hour`, `z`.`hour`)) * 60 + minute(ifnull(`zc`.`hour`, `z`.`hour`)) minute as time) AS `hourTheoretical`, + cast(sum(`sv`.`volume`) as decimal(5, 1)) AS `totalVolume`, + cast(sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) as decimal(5, 1)) AS `remainingVolume`, + greatest( + ifnull(`lhp`.`m3`, 0), + ifnull(`dl`.`minSpeed`, 0) + ) AS `speed`, + cast(`zc`.`hour` + interval -sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0)) minute as time) AS `hourEffective`, + floor(-sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0))) AS `minutesLess`, + cast(`zc`.`hour` + interval -sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0)) minute as time) AS `etc` +from + ( + ( + ( + ( + ( + ( + ( + ( + ( + `vn`.`ticket` `t` + join `vn`.`ticketStateToday` `tst` on + ( + `tst`.`ticket` = `t`.`id` + ) + ) + join `vn`.`state` `s` on + ( + `s`.`id` = `tst`.`state` + ) + ) + join `vn`.`saleVolume` `sv` on + ( + `sv`.`ticketFk` = `t`.`id` + ) + ) + left join `vn`.`lastHourProduction` `lhp` on + ( + `lhp`.`warehouseFk` = `t`.`warehouseFk` + ) + ) + join `vn`.`warehouse` `w` on + ( + `w`.`id` = `t`.`warehouseFk` + ) + ) + join `vn`.`warehouseAlias` `wa` on + ( + `wa`.`id` = `w`.`aliasFk` + ) + ) + straight_join `vn`.`zone` `z` on + ( + `z`.`id` = `t`.`zoneFk` + ) + ) + left join `vn`.`zoneClosure` `zc` on + ( + `zc`.`zoneFk` = `t`.`zoneFk` + and `zc`.`dated` = `util`.`VN_CURDATE`() + ) + ) + left join `cache`.`departure_limit` `dl` on + ( + `dl`.`warehouse_id` = `t`.`warehouseFk` + and `dl`.`fecha` = `util`.`VN_CURDATE`() + ) + ) +where + `w`.`hasProduction` <> 0 + and cast(`t`.`shipped` as date) = `util`.`VN_CURDATE`() +group by + `t`.`zoneFk`; diff --git a/db/changes/231801/00-saleTracking.sql b/db/changes/231801/00-saleTracking.sql new file mode 100644 index 000000000..d651a2447 --- /dev/null +++ b/db/changes/231801/00-saleTracking.sql @@ -0,0 +1,5 @@ +DROP PROCEDURE IF EXISTS `vn`.`sale_setQuantity`; +DROP PROCEDURE IF EXISTS `vn`.`collection_updateSale`; +DROP PROCEDURE IF EXISTS `vn`.`replaceMovimientosMark`; +DROP PROCEDURE IF EXISTS `vn`.`saleTracking_Replace`; +DROP PROCEDURE IF EXISTS `vn`.`sale_updateOriginalQuantity`; diff --git a/db/changes/231801/00-ticketConfig.sql b/db/changes/231801/00-ticketConfig.sql new file mode 100644 index 000000000..7c8aa83a4 --- /dev/null +++ b/db/changes/231801/00-ticketConfig.sql @@ -0,0 +1 @@ +ALTER TABLE `vn`.`ticketConfig` ADD daysForWarningClaim INT DEFAULT 2 NOT NULL COMMENT 'dias restantes hasta que salte el aviso de reclamación fuera de plazo'; diff --git a/db/changes/231801/00-updateIsVies.sql b/db/changes/231801/00-updateIsVies.sql new file mode 100644 index 000000000..4e5277559 --- /dev/null +++ b/db/changes/231801/00-updateIsVies.sql @@ -0,0 +1,5 @@ + UPDATE `vn`.`supplier` s + JOIN `vn`.`country` c ON c.id = s.countryFk + SET s.nif = MID(REPLACE(s.nif, ' ', ''), 3, LENGTH(REPLACE(s.nif, ' ', '')) - 1) + WHERE s.isVies = TRUE + AND c.code = LEFT(REPLACE(s.nif, ' ', ''), 2); diff --git a/db/changes/231801/00-updateisViesClient.sql b/db/changes/231801/00-updateisViesClient.sql new file mode 100644 index 000000000..a153c5219 --- /dev/null +++ b/db/changes/231801/00-updateisViesClient.sql @@ -0,0 +1,5 @@ +UPDATE IGNORE `vn`.`client` c + JOIN `vn`.`country` co ON co.id = c.countryFk + SET c.fi = MID(REPLACE(c.fi, ' ', ''), 3, LENGTH(REPLACE(c.fi, ' ', '')) - 1) + WHERE c.isVies = TRUE + AND co.code = LEFT(REPLACE(c.fi, ' ', ''), 2); diff --git a/db/changes/231801/00-userAcl.sql b/db/changes/231801/00-userAcl.sql new file mode 100644 index 000000000..64803bf18 --- /dev/null +++ b/db/changes/231801/00-userAcl.sql @@ -0,0 +1,21 @@ +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) + VALUES + ('VnUser', '*', '*', 'ALLOW', 'ROLE', 'employee'), + ('VnUser','acl','READ','ALLOW','ROLE','account'), + ('VnUser','getCurrentUserData','READ','ALLOW','ROLE','account'), + ('VnUser','changePassword', 'WRITE', 'ALLOW', 'ROLE', 'account'), + ('Account','exists','READ','ALLOW','ROLE','account'); + +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) + VALUES + ('Account','exists','READ','ALLOW','ROLE','account'); + +DELETE FROM `salix`.`ACL` WHERE (model, property) = ('Account', 'acl'); +DELETE FROM `salix`.`ACL` WHERE (model, property) = ('Account', 'getCurrentUserData'); +DELETE FROM `salix`.`ACL` WHERE (model, property) = ('Account', 'changePassword'); +DELETE FROM `salix`.`ACL` WHERE model = 'UserAccount'; + +UPDATE `hedera`.`imageCollection` t +SET t.model = 'VnUser' +WHERE t.id = 6; + diff --git a/db/changes/231801/00-userRoleLog.sql b/db/changes/231801/00-userRoleLog.sql new file mode 100644 index 000000000..ae5da13cb --- /dev/null +++ b/db/changes/231801/00-userRoleLog.sql @@ -0,0 +1,4 @@ +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) + VALUES + ('UserLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee'), + ('RoleLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee'); diff --git a/db/changes/231801/01-viewCompany10L.sql b/db/changes/231801/01-viewCompany10L.sql new file mode 100644 index 000000000..335827b42 --- /dev/null +++ b/db/changes/231801/01-viewCompany10L.sql @@ -0,0 +1,12 @@ +-- vn.companyL10n source + +CREATE OR REPLACE +ALGORITHM = UNDEFINED VIEW `vn`.`companyL10n` AS +select + `c`.`id` AS `id`, + ifnull(`ci`.`footnotes`, `c`.`footnotes`) AS `footnotes` +from + (`vn`.`company` `c` +left join `vn`.`companyI18n` `ci` on + (`ci`.`companyFk` = `c`.`id` + and `ci`.`lang` = `util`.`LANG`())); \ No newline at end of file diff --git a/db/changes/232001/.gitkeep b/db/changes/232001/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/db/changes/232001/00-clientWorkerName.sql b/db/changes/232001/00-clientWorkerName.sql new file mode 100644 index 000000000..676d26691 --- /dev/null +++ b/db/changes/232001/00-clientWorkerName.sql @@ -0,0 +1,73 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clientCreate`( + vFirstname VARCHAR(50), + vSurnames VARCHAR(50), + vFi VARCHAR(9), + vAddress TEXT, + vPostcode CHAR(5), + vCity VARCHAR(25), + vProvinceFk SMALLINT(5), + vCompanyFk SMALLINT(5), + vPhone VARCHAR(11), + vEmail VARCHAR(255), + vUserFk INT) +BEGIN +/** + * Create new client + * + */ + DECLARE vPayMethodFk INT DEFAULT 4; + DECLARE vDueDay INT DEFAULT 5; + DECLARE vDefaultCredit DECIMAL(10, 2) DEFAULT 300.00; + DECLARE vIsTaxDataChecked TINYINT(1) DEFAULT 1; + DECLARE vHasCoreVnl BOOLEAN DEFAULT TRUE; + DECLARE vMandateTypeFk INT DEFAULT 2; + + INSERT INTO `client` ( + id, + name, + street, + fi, + phone, + email, + provinceFk, + city, + postcode, + socialName, + payMethodFk, + dueDay, + credit, + isTaxDataChecked, + hasCoreVnl, + isEqualizated) + VALUES ( + vUserFk, + CONCAT(vFirstname, ' ', vSurnames), + vAddress, + TRIM(vFi), + vPhone, + vEmail, + vProvinceFk, + vCity, + vPostcode, + CONCAT(vSurnames, ' ', vFirstname), + vPayMethodFk, + vDueDay, + vDefaultCredit, + vIsTaxDataChecked, + vHasCoreVnl, + FALSE + ) ON duplicate key update + payMethodFk = vPayMethodFk, + dueDay = vDueDay, + credit = vDefaultCredit, + isTaxDataChecked = vIsTaxDataChecked, + hasCoreVnl = vHasCoreVnl, + isActive = TRUE; + + IF (SELECT COUNT(*) FROM mandate WHERE clientFk = vUserFk AND companyFk = vCompanyFk AND mandateTypeFk = vMandateTypeFk) = 0 THEN + INSERT INTO mandate (clientFk, companyFk, mandateTypeFk) + VALUES (vUserFk, vCompanyFk, vMandateTypeFk); + END IF; +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/changes/232001/00-createWorker.sql b/db/changes/232001/00-createWorker.sql new file mode 100644 index 000000000..0ea7ecbe8 --- /dev/null +++ b/db/changes/232001/00-createWorker.sql @@ -0,0 +1,14 @@ +INSERT INTO `vn`.`businessType` (`code`, `description`) + VALUES ('worker','Trabajador'); + +ALTER TABLE `vn`.`workerConfig` ADD businessTypeFk varchar(100) NULL + COMMENT 'Tipo de negocio por defecto al dar de alta un trabajador nuevo'; + +UPDATE `vn`.`workerConfig` + SET businessTypeFk = 'worker' + WHERE id = 1; + + UPDATE `vn`.`client` c + JOIN `vn`.`worker` w ON w.id = c.id + SET c.name = REPLACE(c.name, 'TR ', ''), + c.businessTypeFk = 'worker'; diff --git a/db/changes/232001/00-invoiceOut_new.sql b/db/changes/232001/00-invoiceOut_new.sql new file mode 100644 index 000000000..b4fc5c824 --- /dev/null +++ b/db/changes/232001/00-invoiceOut_new.sql @@ -0,0 +1,254 @@ +DROP PROCEDURE IF EXISTS `vn`.`invoiceOut_new`; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`( + vSerial VARCHAR(255), + vInvoiceDate DATE, + vTaxArea VARCHAR(25), + OUT vNewInvoiceId INT) +BEGIN +/** + * Creación de facturas emitidas. + * requiere previamente tabla tmp.ticketToInvoice(id). + * + * @param vSerial serie a la cual se hace la factura + * @param vInvoiceDate fecha de la factura + * @param vTaxArea tipo de iva en relacion a la empresa y al cliente + * @param vNewInvoiceId id de la factura que se acaba de generar + * @return vNewInvoiceId + */ + DECLARE vIsAnySaleToInvoice BOOL; + DECLARE vIsAnyServiceToInvoice BOOL; + DECLARE vNewRef VARCHAR(255); + DECLARE vWorker INT DEFAULT account.myUser_getId(); + DECLARE vCompanyFk INT; + DECLARE vInterCompanyFk INT; + DECLARE vClientFk INT; + DECLARE vCplusStandardInvoiceTypeFk INT DEFAULT 1; + DECLARE vCplusCorrectingInvoiceTypeFk INT DEFAULT 6; + DECLARE vCplusSimplifiedInvoiceTypeFk INT DEFAULT 2; + DECLARE vCorrectingSerial VARCHAR(1) DEFAULT 'R'; + DECLARE vSimplifiedSerial VARCHAR(1) DEFAULT 'S'; + DECLARE vNewInvoiceInFk INT; + DECLARE vIsInterCompany BOOL DEFAULT FALSE; + DECLARE vIsCEESerial BOOL DEFAULT FALSE; + DECLARE vIsCorrectInvoiceDate BOOL; + DECLARE vMaxShipped DATE; + + SET vInvoiceDate = IFNULL(vInvoiceDate, util.VN_CURDATE()); + + SELECT t.clientFk, + t.companyFk, + MAX(DATE(t.shipped)), + DATE(vInvoiceDate) >= invoiceOut_getMaxIssued( + vSerial, + t.companyFk, + YEAR(vInvoiceDate)) + INTO vClientFk, + vCompanyFk, + vMaxShipped, + vIsCorrectInvoiceDate + FROM tmp.ticketToInvoice tt + JOIN ticket t ON t.id = tt.id; + + IF(vMaxShipped > vInvoiceDate) THEN + CALL util.throw("Invoice date can't be less than max date"); + END IF; + + IF NOT vIsCorrectInvoiceDate THEN + CALL util.throw('Exists an invoice with a previous date'); + END IF; + + -- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats + DELETE ti.* + FROM tmp.ticketToInvoice ti + JOIN ticket t ON t.id = ti.id + JOIN sale s ON s.ticketFk = t.id + JOIN item i ON i.id = s.itemFk + JOIN supplier su ON su.id = t.companyFk + JOIN client c ON c.id = t.clientFk + LEFT JOIN itemTaxCountry itc ON itc.itemFk = i.id AND itc.countryFk = su.countryFk + WHERE (YEAR(t.shipped) < 2001 AND t.isDeleted) + OR c.isTaxDataChecked = FALSE + OR t.isDeleted + OR c.hasToInvoice = FALSE + OR itc.id IS NULL; + + SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0 + INTO vIsAnySaleToInvoice + FROM tmp.ticketToInvoice t + JOIN sale s ON s.ticketFk = t.id; + + SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice + FROM tmp.ticketToInvoice t + JOIN ticketService ts ON ts.ticketFk = t.id; + + IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice) + AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase()) + THEN + + -- el trigger añade el siguiente Id_Factura correspondiente a la vSerial + INSERT INTO invoiceOut( + ref, + serial, + issued, + clientFk, + dued, + companyFk, + cplusInvoiceType477Fk + ) + SELECT + 1, + vSerial, + vInvoiceDate, + vClientFk, + getDueDate(vInvoiceDate, dueDay), + vCompanyFk, + IF(vSerial = vCorrectingSerial, + vCplusCorrectingInvoiceTypeFk, + IF(vSerial = vSimplifiedSerial, + vCplusSimplifiedInvoiceTypeFk, + vCplusStandardInvoiceTypeFk)) + FROM client + WHERE id = vClientFk; + + SET vNewInvoiceId = LAST_INSERT_ID(); + + SELECT `ref` + INTO vNewRef + FROM invoiceOut + WHERE id = vNewInvoiceId; + + UPDATE ticket t + JOIN tmp.ticketToInvoice ti ON ti.id = t.id + SET t.refFk = vNewRef; + + DROP TEMPORARY TABLE IF EXISTS tmp.updateInter; + CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY + SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador + FROM tmp.ticketToInvoice ti + LEFT JOIN ticketState ts ON ti.id = ts.ticket + JOIN state s + WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id); + + INSERT INTO ticketTracking(stateFk,ticketFk,workerFk) + SELECT * FROM tmp.updateInter; + + CALL invoiceExpenceMake(vNewInvoiceId); + CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); + + UPDATE invoiceOut io + JOIN ( + SELECT SUM(amount) total + FROM invoiceOutExpence + WHERE invoiceOutFk = vNewInvoiceId + ) base + JOIN ( + SELECT SUM(vat) total + FROM invoiceOutTax + WHERE invoiceOutFk = vNewInvoiceId + ) vat + SET io.amount = base.total + vat.total + WHERE io.id = vNewInvoiceId; + + DROP TEMPORARY TABLE tmp.updateInter; + + SELECT COUNT(*), id + INTO vIsInterCompany, vInterCompanyFk + FROM company + WHERE clientFk = vClientFk; + + IF (vIsInterCompany) THEN + + INSERT INTO invoiceIn(supplierFk, supplierRef, issued, companyFk) + SELECT vCompanyFk, vNewRef, vInvoiceDate, vInterCompanyFk; + + SET vNewInvoiceInFk = LAST_INSERT_ID(); + + DROP TEMPORARY TABLE IF EXISTS tmp.ticket; + CREATE TEMPORARY TABLE tmp.ticket + (KEY (ticketFk)) + ENGINE = MEMORY + SELECT id ticketFk + FROM tmp.ticketToInvoice; + + CALL `ticket_getTax`('NATIONAL'); + + SET @vTaxableBaseServices := 0.00; + SET @vTaxCodeGeneral := NULL; + + INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) + SELECT vNewInvoiceInFk, + @vTaxableBaseServices, + sub.expenceFk, + sub.taxTypeSageFk, + sub.transactionTypeSageFk + FROM ( + SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase, + i.expenceFk, + i.taxTypeSageFk, + i.transactionTypeSageFk, + @vTaxCodeGeneral := i.taxClassCodeFk + FROM tmp.ticketServiceTax tst + JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tst.code + WHERE i.isService + HAVING taxableBase + ) sub; + + INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) + SELECT vNewInvoiceInFk, + SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, + @vTaxableBaseServices, 0) taxableBase, + i.expenceFk, + i.taxTypeSageFk , + i.transactionTypeSageFk + FROM tmp.ticketTax tt + JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tt.code + WHERE !i.isService + GROUP BY tt.pgcFk + HAVING taxableBase + ORDER BY tt.priority; + + CALL invoiceInDueDay_calculate(vNewInvoiceInFk); + + SELECT COUNT(*) INTO vIsCEESerial + FROM invoiceOutSerial + WHERE code = vSerial; + + IF vIsCEESerial THEN + + INSERT INTO invoiceInIntrastat ( + invoiceInFk, + intrastatFk, + amount, + stems, + countryFk, + net) + SELECT + vNewInvoiceInFk, + i.intrastatFk, + SUM(CAST((s.quantity * s.price * (100 - s.discount) / 100 ) AS DECIMAL(10, 2))), + SUM(CAST(IFNULL(i.stems, 1) * s.quantity AS DECIMAL(10, 2))), + su.countryFk, + CAST(SUM(IFNULL(i.stems, 1) + * s.quantity + * IF(ic.grams, ic.grams, IFNULL(i.weightByPiece, 0)) / 1000) AS DECIMAL(10, 2)) + FROM sale s + JOIN ticket t ON s.ticketFk = t.id + JOIN supplier su ON su.id = t.companyFk + JOIN item i ON i.id = s.itemFk + LEFT JOIN itemCost ic ON ic.itemFk = i.id AND ic.warehouseFk = t.warehouseFk + WHERE t.refFk = vNewRef + GROUP BY i.intrastatFk; + + END IF; + DROP TEMPORARY TABLE tmp.ticket; + DROP TEMPORARY TABLE tmp.ticketAmount; + DROP TEMPORARY TABLE tmp.ticketTax; + DROP TEMPORARY TABLE tmp.ticketServiceTax; + END IF; + END IF; + DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`; +END$$ +DELIMITER ; diff --git a/db/changes/232001/00-wagon.sql b/db/changes/232001/00-wagon.sql new file mode 100644 index 000000000..bdb384db5 --- /dev/null +++ b/db/changes/232001/00-wagon.sql @@ -0,0 +1 @@ +ALTER TABLE `vn`.`wagon` ADD CONSTRAINT `wagon_type` FOREIGN KEY (`typeFk`) REFERENCES `wagonType` (`id`) ON UPDATE CASCADE; diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 42298e158..d08cecdd8 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -98,20 +98,20 @@ INSERT INTO `hedera`.`tpvConfig`(`id`, `currency`, `terminal`, `transactionType` VALUES (1, 978, 1, 0, 2000, 9, 0); -INSERT INTO `account`.`user`(`id`,`name`,`nickname`, `password`,`role`,`active`,`email`,`lang`, `image`) +INSERT INTO `account`.`user`(`id`,`name`,`nickname`, `bcryptPassword`, `password`,`role`,`active`,`email`,`lang`, `image`) VALUES - (1101, 'BruceWayne', 'Bruce Wayne', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'BruceWayne@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1102, 'PetterParker', 'Petter Parker', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'PetterParker@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1103, 'ClarkKent', 'Clark Kent', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'ClarkKent@mydomain.com', 'fr', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1104, 'TonyStark', 'Tony Stark', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'TonyStark@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1105, 'MaxEisenhardt', 'Max Eisenhardt', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1106, 'DavidCharlesHaller', 'David Charles Haller', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'DavidCharlesHaller@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1107, 'HankPym', 'Hank Pym', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'HankPym@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1108, 'CharlesXavier', 'Charles Xavier', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'CharlesXavier@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1109, 'BruceBanner', 'Bruce Banner', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'BruceBanner@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1110, 'JessicaJones', 'Jessica Jones', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'JessicaJones@mydomain.com', 'en', NULL), - (1111, 'Missing', 'Missing', 'ac754a330530832ba1bf7687f577da91', 2, 0, NULL, 'en', NULL), - (1112, 'Trash', 'Trash', 'ac754a330530832ba1bf7687f577da91', 2, 0, NULL, 'en', NULL); + (1101, 'BruceWayne', 'Bruce Wayne', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'BruceWayne@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1102, 'PetterParker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'PetterParker@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1103, 'ClarkKent', 'Clark Kent', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'ClarkKent@mydomain.com', 'fr', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1104, 'TonyStark', 'Tony Stark', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'TonyStark@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1105, 'MaxEisenhardt', 'Max Eisenhardt', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1106, 'DavidCharlesHaller', 'David Charles Haller', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'DavidCharlesHaller@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1107, 'HankPym', 'Hank Pym', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'HankPym@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1108, 'CharlesXavier', 'Charles Xavier', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'CharlesXavier@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1109, 'BruceBanner', 'Bruce Banner', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'BruceBanner@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1110, 'JessicaJones', 'Jessica Jones', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 1, 1, 'JessicaJones@mydomain.com', 'en', NULL), + (1111, 'Missing', 'Missing', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 0, NULL, 'en', NULL), + (1112, 'Trash', 'Trash', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 'ac754a330530832ba1bf7687f577da91', 2, 0, NULL, 'en', NULL); INSERT INTO `account`.`mailAlias`(`id`, `alias`, `description`, `isPublic`) VALUES @@ -546,7 +546,8 @@ INSERT INTO `vn`.`supplier`(`id`, `name`, `nickname`,`account`,`countryFk`,`nif` VALUES (1, 'Plants SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), (2, 'Farmer King', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE(), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), - (442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'); + (442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), + (1381, 'Ornamentales', 'Ornamentales', 7185000440, 1, '03815934E', 0, util.VN_CURDATE(), 1, 'supplier address 4', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'); INSERT INTO `vn`.`supplierContact`(`id`, `supplierFk`, `phone`, `mobile`, `email`, `observation`, `name`) VALUES @@ -1408,16 +1409,16 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO (7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1), (8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2); -INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `notes`, `evaNotes`) +INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes`) VALUES - (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, '', ''), - (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'this is the note two', 'observation two'), - (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'this is the note three', 'observation three'), - (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'this is the note four', 'observation four'), - (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'this is the note five', 'observation five'), - (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'this is the note six', 'observation six'), - (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'this is the note seven', 'observation seven'), - (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '', ''); + (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, ''), + (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'observation two'), + (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'observation three'), + (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'observation four'), + (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five'), + (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six'), + (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven'), + (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, ''); INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`) VALUES @@ -2769,10 +2770,23 @@ UPDATE `account`.`user` INSERT INTO `vn`.`ticketLog` (`originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description`) VALUES - (7, 18, 'update', 'Sale', '{"quantity":1}', '{"quantity":10}', 1, NULL), - (7, 18, 'update', 'Ticket', '{"quantity":1,"concept":"Chest ammo box"}', '{"quantity":10,"concept":"Chest ammo box"}', 1, NULL), - (7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 1, NULL), - (7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 1x0.5m de '5' a '10'"); + (7, 18, 'update', 'Sale', '{"quantity":1}', '{"quantity":10}', 1, NULL), + (7, 18, 'update', 'Ticket', '{"quantity":1,"concept":"Chest ammo box"}', '{"quantity":10,"concept":"Chest ammo box"}', 1, NULL), + (7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 1, NULL), + (7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 1x0.5m de '5' a '10'"); + +INSERT INTO `vn`.`ticketLog` (originFk, userFk, `action`, creationDate, changedModel, changedModelId, changedModelValue, oldInstance, newInstance, description) + VALUES + (1, NULL, 'delete', '2001-06-09 11:00:04', 'Ticket', 45, 'Spider Man' , NULL, NULL, NULL), + (1, 18, 'select', '2001-06-09 11:00:03', 'Ticket', 45, 'Spider Man' , NULL, NULL, NULL), + (1, NULL, 'update', '2001-05-09 10:00:02', 'Sale', 69854, 'Armor' , '{"isPicked": false}','{"isPicked": true}', NULL), + (1, 18, 'update', '2001-01-01 10:05:01', 'Sale', 69854, 'Armor' , NULL, NULL, 'Armor quantity changed from ''15'' to ''10'''), + (1, NULL, 'delete', '2001-01-01 10:00:10', 'Sale', 5689, 'Shield' , '{"quantity":10,"concept":"Shield"}', NULL, NULL), + (1, 18, 'insert', '2000-12-31 15:00:05', 'Sale', 69854, 'Armor' , NULL,'{"quantity":15,"concept":"Armor", "price": 345.99, "itemFk": 2}', NULL), + (1, 18, 'update', '2000-12-28 08:40:45', 'Ticket', 45, 'Spider Man' , '{"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"isBlocked":false,"hasPriority":false,"companyFk":442,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}','{"warehouseFk":61,"shipped":"2023-05-17T22:00:00.000Z","nickname":"Spider Man","isSigned":false,"isLabeled":false,"isPrinted":false,"packages":1,"hour":0,"isBlocked":true,"hasPriority":true,"companyFk":443,"landed":"2023-05-18T22:00:00.000Z","isBoxed":false,"isDeleted":false,"zoneFk":713,"zonePrice":13,"zoneBonus":1}', NULL), + (1, 18, 'select', '2000-12-27 03:40:30', 'Ticket', 45, NULL , NULL, NULL, NULL), + (1, 18, 'insert', '2000-04-10 09:40:15', 'Sale', 5689, 'Shield' , NULL, '{"quantity":10,"concept":"Shield", "price": 10.5, "itemFk": 1}', NULL), + (1, 18, 'insert', '1999-05-09 10:00:00', 'Ticket', 45, 'Super Man' , NULL, '{"id":45,"clientFk":8608,"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","addressFk":48637,"isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"created":"2023-05-16T11:42:56.000Z","isBlocked":false,"hasPriority":false,"companyFk":442,"agencyModeFk":639,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}', NULL); INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`) VALUES @@ -2789,7 +2803,7 @@ INSERT INTO `vn`.`profileType` (`id`, `name`) INSERT INTO `salix`.`url` (`appName`, `environment`, `url`) VALUES - ('lilium', 'dev', 'http://localhost:8080/#/'), + ('lilium', 'dev', 'http://localhost:9000/#/'), ('salix', 'dev', 'http://localhost:5000/#!/'); INSERT INTO `vn`.`report` (`id`, `name`, `paperSizeFk`, `method`) @@ -2800,9 +2814,9 @@ INSERT INTO `vn`.`payDemDetail` (`id`, `detail`) VALUES (1, 1); -INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`) +INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`, `businessTypeFk`) VALUES - (1, NULL, 1); + (1, NULL, 1, 'worker'); INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`) VALUES diff --git a/db/dump/structure.sql b/db/dump/structure.sql index 089cb00ec..caac02d3d 100644 --- a/db/dump/structure.sql +++ b/db/dump/structure.sql @@ -42776,7 +42776,7 @@ CREATE DEFINER=`root`@`localhost` FUNCTION `hasAnyNegativeBase`() RETURNS tinyin BEGIN /* Calcula si existe alguna base imponible negativa -* Requiere la tabla temporal vn.ticketToInvoice(id) +* Requiere la tabla temporal tmp.ticketToInvoice(id) * * returns BOOLEAN */ @@ -42787,7 +42787,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL ticket_getTax(NULL); @@ -55223,7 +55223,7 @@ DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceExpenceMake`(IN vInvoice INT) BEGIN /* Inserta las partidas de gasto correspondientes a la factura - * REQUIERE tabla ticketToInvoice + * REQUIERE tabla tmp.ticketToInvoice * @param vInvoice Numero de factura */ DELETE FROM invoiceOutExpence @@ -55233,7 +55233,7 @@ BEGIN SELECT vInvoice, expenceFk, SUM(ROUND(quantity * price * (100 - discount)/100,2)) amount - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN sale s ON s.ticketFk = t.id JOIN item i ON i.id = s.itemFk GROUP BY i.expenceFk @@ -55243,7 +55243,7 @@ BEGIN SELECT vInvoice, tst.expenceFk, SUM(ROUND(ts.quantity * ts.price ,2)) amount - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN ticketService ts ON ts.ticketFk = t.id JOIN ticketServiceType tst ON tst.id = ts.ticketServiceTypeFk HAVING amount != 0; @@ -55270,9 +55270,9 @@ BEGIN SET vMaxTicketDate = vn2008.DAYEND(vMaxTicketDate); - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT Id_Ticket id FROM vn2008.Tickets WHERE (Fecha BETWEEN vMinDateTicket @@ -55305,8 +55305,8 @@ BEGIN SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR); SET vMaxTicketDate = util.dayend(vMaxTicketDate); - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT id FROM ticket t @@ -55333,9 +55333,9 @@ DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceFromTicket`(IN vTicket INT) BEGIN - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT id FROM vn.ticket @@ -55931,9 +55931,9 @@ BEGIN JOIN invoiceOut io ON io.companyFk = s.id WHERE io.id = vInvoiceFk; - DROP TEMPORARY TABLE IF EXISTS ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM ticket WHERE refFk = vInvoiceRef; @@ -56408,9 +56408,9 @@ BEGIN JOIN client c ON c.id = io.clientFk WHERE io.id = vInvoice; - DROP TEMPORARY TABLE IF EXISTS ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM ticket WHERE refFk = vInvoiceRef; @@ -56456,7 +56456,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOut_exportationFromClient`( vCompanyFk INT) BEGIN /** - * Genera tabla temporal ticketToInvoice necesaría para el proceso de facturación + * Genera tabla temporal tmp.ticketToInvoice necesaría para el proceso de facturación * Los abonos quedan excluidos en las exportaciones * * @param vMaxTicketDate Fecha hasta la cual cogerá tickets para facturar @@ -56467,8 +56467,8 @@ BEGIN SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR); SET vMaxTicketDate = util.dayend(vMaxTicketDate); - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT t.id @@ -56503,7 +56503,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOut_new`( BEGIN /** * Creación de facturas emitidas. - * requiere previamente tabla ticketToInvoice(id). + * requiere previamente tabla tmp.ticketToInvoice(id). * * @param vSerial serie a la cual se hace la factura * @param vInvoiceDate fecha de la factura @@ -56531,13 +56531,13 @@ BEGIN SELECT t.clientFk, t.companyFk INTO vClientFk, vCompanyFk - FROM ticketToInvoice tt + FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id LIMIT 1; - -- Eliminem de ticketToInvoice els tickets que no han de ser facturats + -- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats DELETE ti.* - FROM ticketToInvoice ti + FROM tmp.ticketToInvoice ti JOIN ticket t ON t.id = ti.id JOIN sale s ON s.ticketFk = t.id JOIN item i ON i.id = s.itemFk @@ -56552,7 +56552,7 @@ BEGIN SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t LEFT JOIN sale s ON s.ticketFk = t.id LEFT JOIN ticketService ts ON ts.ticketFk = t.id; @@ -56593,13 +56593,13 @@ BEGIN WHERE id = vNewInvoiceId; UPDATE ticket t - JOIN ticketToInvoice ti ON ti.id = t.id + JOIN tmp.ticketToInvoice ti ON ti.id = t.id SET t.refFk = vNewRef; DROP TEMPORARY TABLE IF EXISTS tmp.updateInter; CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador - FROM ticketToInvoice ti + FROM tmp.ticketToInvoice ti LEFT JOIN ticketState ts ON ti.id = ts.ticket JOIN state s WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id); @@ -56609,7 +56609,7 @@ BEGIN INSERT INTO ticketLog (action, userFk, originFk, description) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) - FROM ticketToInvoice ti; + FROM tmp.ticketToInvoice ti; CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); @@ -56647,7 +56647,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL `ticket_getTax`('NATIONAL'); @@ -56725,7 +56725,7 @@ BEGIN DROP TEMPORARY TABLE tmp.ticketServiceTax; END IF; END IF; - DROP TEMPORARY TABLE `ticketToInvoice`; + DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -56876,7 +56876,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL ticket_getTax(vTaxArea); @@ -68751,7 +68751,7 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `ticketToInvoiceByAddress` */; +/*!50003 DROP PROCEDURE IF EXISTS `tmp`.`ticketToInvoiceByAddress` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; @@ -68771,9 +68771,9 @@ BEGIN SET vEnded = util.dayEnd(vEnded); - DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE vn.ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM vn.ticket WHERE addressFk = vAddress @@ -68807,9 +68807,9 @@ BEGIN SET vEnded = util.dayEnd(vEnded); - DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE vn.ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM vn.ticket WHERE clientFk = vClient @@ -68870,9 +68870,9 @@ BEGIN JOIN vn.client c ON c.id = io.clientFk WHERE io.id = vInvoice; - DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE vn.ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM vn.ticket WHERE refFk = vInvoiceRef; diff --git a/db/export-data.sh b/db/export-data.sh index bdf8049e0..11358e64c 100755 --- a/db/export-data.sh +++ b/db/export-data.sh @@ -68,6 +68,7 @@ TABLES=( time volumeConfig workCenter + companyI18n ) dump_tables ${TABLES[@]} diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 7d80c69ee..fe3ef08bd 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -156,14 +156,14 @@ let actions = { await this.waitForSpinnerLoad(); }, - accessToSection: async function(state) { + accessToSection: async function(state, name = 'Others') { await this.waitForSelector('vn-left-menu'); let nested = await this.evaluate(state => { return document.querySelector(`vn-left-menu li li > a[ui-sref="${state}"]`) != null; }, state); if (nested) { - let selector = 'vn-left-menu vn-item-section > vn-icon[icon=keyboard_arrow_down]'; + let selector = `vn-left-menu li[name="${name}"]`; await this.evaluate(selector => { document.querySelector(selector).scrollIntoViewIfNeeded(); }, selector); @@ -414,7 +414,7 @@ let actions = { const selector = 'vn-snackbar .shape.shown'; await this.waitForSelector(selector); - let message = await this.evaluate(selector => { + const message = await this.evaluate(selector => { const shape = document.querySelector(selector); const message = { text: shape.querySelector('.text').innerText @@ -431,6 +431,8 @@ let actions = { return message; }, selector); + message.isSuccess = message.type == 'success'; + await this.hideSnackbar(); return message; }, @@ -466,28 +468,6 @@ let actions = { }, selector); }, - clearInput: async function(selector) { - await this.waitForSelector(selector); - - let field = await this.evaluate(selector => { - return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field; - }, selector); - - if ((field != null && field != '') || field == '0') { - let coords = await this.evaluate(selector => { - let rect = document.querySelector(selector).getBoundingClientRect(); - return {x: rect.x + (rect.width / 2), y: rect.y + (rect.height / 2), width: rect.width}; - }, selector); - await this.mouse.move(coords.x, coords.y); - await this.waitForSelector(`${selector} [icon="clear"]`, {visible: true}); - await this.waitToClick(`${selector} [icon="clear"]`); - } - - await this.evaluate(selector => { - return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field == ''; - }, selector); - }, - autocompleteSearch: async function(selector, searchValue) { let builtSelector = await this.selectorFormater(selector); @@ -519,17 +499,15 @@ let actions = { checkboxState: async function(selector) { await this.waitForSelector(selector); - return this.evaluate(selector => { - let checkbox = document.querySelector(selector); - switch (checkbox.$ctrl.field) { - case null: - return 'intermediate'; - case true: - return 'checked'; - default: - return 'unchecked'; - } - }, selector); + const value = await this.getInputValue(selector); + switch (value) { + case null: + return 'intermediate'; + case true: + return 'checked'; + default: + return 'unchecked'; + } }, isDisabled: async function(selector) { @@ -622,6 +600,138 @@ let actions = { waitForContentLoaded: async function() { await this.waitForSpinnerLoad(); + }, + + async getInputValue(selector) { + return this.evaluate(selector => { + const input = document.querySelector(selector); + return input.$ctrl.field; + }, selector); + }, + + async getValue(selector) { + return await this.waitToGetProperty(selector, 'value'); + }, + + async innerText(selector) { + const element = await this.$(selector); + const handle = await element.getProperty('innerText'); + return handle.jsonValue(); + }, + + async setInput(selector, value) { + const input = await this.$(selector); + const tagName = (await input.evaluate(e => e.tagName)).toLowerCase(); + + switch (tagName) { + case 'vn-textfield': + case 'vn-datalist': + case 'vn-input-number': + await this.clearInput(selector); + if (value) + await this.write(selector, value.toString()); + break; + case 'vn-autocomplete': + if (value) + await this.autocompleteSearch(selector, value.toString()); + else + await this.clearInput(selector); + break; + case 'vn-date-picker': + if (value) + await this.pickDate(selector, value); + else + await this.clearInput(selector); + break; + case 'vn-input-time': + if (value) + await this.pickTime(selector, value); + else + await this.clearInput(selector); + break; + case 'vn-check': + for (let i = 0; i < 3; i++) { + if (await this.getInput(selector) == value) break; + await this.click(selector); + } + break; + } + }, + + async getInput(selector) { + const input = await this.$(selector); + const tagName = (await input.evaluate(e => e.tagName)).toLowerCase(); + let el; + let value; + + switch (tagName) { + case 'vn-textfield': + case 'vn-autocomplete': + case 'vn-input-time': + case 'vn-datalist': + el = await input.$('input'); + value = await el.getProperty('value'); + return value.jsonValue(); + case 'vn-check': + case 'vn-input-number': + return await this.getInputValue(selector); + case 'vn-textarea': + el = await input.$('textarea'); + value = await el.getProperty('value'); + return value.jsonValue(); + case 'vn-date-picker': + el = await input.$('input'); + value = await el.getProperty('value'); + if (value) { + const date = new Date(await value.jsonValue()); + date.setUTCHours(0, 0, 0, 0); + return date; + } else + return null; + default: + value = await this.innerText(selector); + return value.jsonValue(); + } + }, + + async clearInput(selector) { + await this.waitForSelector(selector); + + let field = await this.evaluate(selector => { + return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field; + }, selector); + + if ((field != null && field != '') || field == '0') { + let coords = await this.evaluate(selector => { + let rect = document.querySelector(selector).getBoundingClientRect(); + return {x: rect.x + (rect.width / 2), y: rect.y + (rect.height / 2), width: rect.width}; + }, selector); + await this.mouse.move(coords.x, coords.y); + await this.waitForSelector(`${selector} [icon="clear"]`, {visible: true}); + await this.waitToClick(`${selector} [icon="clear"]`); + } + + await this.evaluate(selector => { + return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field == ''; + }, selector); + }, + + async fetchForm(selector, inputNames) { + const values = {}; + for (const inputName of inputNames) + values[inputName] = await this.getInput(`${selector} [vn-name="${inputName}"]`); + return values; + }, + + async fillForm(selector, values) { + for (const inputName in values) + await this.setInput(`${selector} [vn-name="${inputName}"]`, values[inputName]); + }, + + async sendForm(selector, values) { + if (values) await this.fillForm(selector, values); + await this.click(`${selector} button[type=submit]`); + return await this.waitForSnackbar(); } }; @@ -629,12 +739,14 @@ export function extendPage(page) { for (let name in actions) { page[name] = async(...args) => { try { - return actions[name].apply(page, args); + return await actions[name].apply(page, args); } catch (err) { let stringArgs = args - .map(i => typeof i == 'function' ? 'Function' : i) + .map(i => typeof i == 'function' ? 'Function' : `'${i}'`) .join(', '); - throw new Error(`.${name}(${stringArgs}): ${err.message}`); + const myErr = new Error(`${err.message}\n at Page.${name}(${stringArgs})`); + myErr.stack = err.stack; + throw myErr; } }; } diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 84db638e3..b19db24d7 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -193,10 +193,6 @@ export default { saveNewPoscode: '#savePostcode', createButton: 'vn-client-create button[type=submit]' }, - clientDescriptor: { - moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]', - simpleTicketButton: '.vn-menu [name="simpleTicket"]' - }, clientBasicData: { name: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.name"]', contact: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.contact"]', @@ -231,23 +227,6 @@ export default { saveButton: 'button[type=submit]', watcher: 'vn-client-fiscal-data vn-watcher' }, - clientBillingData: { - payMethod: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.payMethodFk"]', - IBAN: 'vn-client-billing-data vn-textfield[ng-model="$ctrl.client.iban"]', - dueDay: 'vn-client-billing-data vn-input-number[ng-model="$ctrl.client.dueDay"]', - receivedCoreLCRCheckbox: 'vn-client-billing-data vn-check[label="Received LCR"]', - receivedCoreVNLCheckbox: 'vn-client-billing-data vn-check[label="Received core VNL"]', - receivedB2BVNLCheckbox: 'vn-client-billing-data vn-check[label="Received B2B VNL"]', - swiftBic: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.bankEntityFk"]', - newBankEntityButton: 'vn-client-billing-data vn-icon-button[vn-tooltip="New bank entity"] > button', - newBankEntityName: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.name"]', - newBankEntityBIC: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.bic"]', - newBankEntityCountry: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.data.countryFk"]', - newBankEntityCode: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.id"]', - acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]', - saveButton: 'vn-client-billing-data button[type=submit]', - watcher: 'vn-client-billing-data vn-watcher' - }, clientAddresses: { addressesButton: 'vn-left-menu a[ui-sref="client.card.address.index"]', createAddress: 'vn-client-address-index vn-float-button', @@ -283,12 +262,6 @@ export default { cancelEditAddressButton: 'vn-client-address-edit > form > vn-button-bar > vn-button > button', watcher: 'vn-client-address-edit vn-watcher' }, - clientWebAccess: { - enableWebAccessCheckbox: 'vn-check[label="Enable web access"]', - userName: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.name"]', - email: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.email"]', - saveButton: 'button[type=submit]' - }, clientNotes: { addNoteFloatButton: 'vn-float-button', note: 'vn-textarea[ng-model="$ctrl.note.text"]', @@ -312,30 +285,6 @@ export default { clientMandate: { firstMandateText: 'vn-client-mandate vn-card vn-table vn-tbody > vn-tr' }, - clientLog: { - lastModificationPreviousValue: 'vn-client-log vn-tr table tr td.before', - lastModificationCurrentValue: 'vn-client-log vn-tr table tr td.after', - namePreviousValue: 'vn-client-log vn-tr table tr:nth-child(1) td.before', - nameCurrentValue: 'vn-client-log vn-tr table tr:nth-child(1) td.after', - activePreviousValue: 'vn-client-log vn-tr:nth-child(2) table tr:nth-child(2) td.before', - activeCurrentValue: 'vn-client-log vn-tr:nth-child(2) table tr:nth-child(2) td.after' - - }, - clientBalance: { - company: 'vn-client-balance-index vn-autocomplete[ng-model="$ctrl.companyId"]', - newPaymentButton: `vn-float-button`, - newPaymentBank: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.bankFk"]', - newPaymentAmount: '.vn-dialog.shown vn-input-number[ng-model="$ctrl.amountPaid"]', - newDescription: 'vn-textfield[ng-model="$ctrl.receipt.description"]', - deliveredAmount: '.vn-dialog vn-input-number[ng-model="$ctrl.deliveredAmount"]', - refundAmount: '.vn-dialog vn-input-number[ng-model="$ctrl.amountToReturn"]', - saveButton: '.vn-dialog.shown [response="accept"]', - anyBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr', - firstLineBalance: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(8)', - firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable', - firstLineReferenceInput: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable > div > field > vn-textfield', - compensationButton: 'vn-client-balance-index vn-icon-button[vn-dialog="send_compensation"]' - }, webPayment: { confirmFirstPaymentButton: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon-button[icon="done_all"]', firstPaymentConfirmed: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon[icon="check"]' @@ -414,7 +363,7 @@ export default { saveFieldsButton: '.vn-popover.shown vn-button[label="Save"] > button' }, itemFixedPrice: { - add: 'vn-fixed-price vn-icon-button[icon="add_circle"]', + add: 'vn-fixed-price vn-icon-button[vn-tooltip="Add fixed price"]', firstItemID: 'vn-fixed-price tr:nth-child(2) vn-autocomplete[ng-model="price.itemFk"]', fourthFixedPrice: 'vn-fixed-price tr:nth-child(5)', fourthItemID: 'vn-fixed-price tr:nth-child(5) vn-autocomplete[ng-model="price.itemFk"]', @@ -427,7 +376,18 @@ export default { fourthEnded: 'vn-fixed-price tr:nth-child(5) vn-date-picker[ng-model="price.ended"]', fourthDeleteIcon: 'vn-fixed-price tr:nth-child(5) > td:nth-child(9) > vn-icon-button[icon="delete"]', orderColumnId: 'vn-fixed-price th[field="itemFk"]', - removeWarehouseFilter: 'vn-searchbar > form > vn-textfield > div.container > div.prepend > prepend > div > span:nth-child(1) > vn-icon > i' + removeWarehouseFilter: 'vn-searchbar > form > vn-textfield > div.container > div.prepend > prepend > div > span:nth-child(1) > vn-icon > i', + generalSearchFilter: 'vn-fixed-price-search-panel vn-textfield[ng-model="$ctrl.filter.search"]', + reignFilter: 'vn-fixed-price-search-panel vn-horizontal.item-category vn-one', + typeFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="$ctrl.filter.typeFk"]', + buyerFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="$ctrl.filter.buyerFk"]', + warehouseFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="$ctrl.filter.warehouseFk"]', + mineFilter: 'vn-fixed-price-search-panel vn-check[ng-model="$ctrl.filter.mine"]', + hasMinPriceFilter: 'vn-fixed-price-search-panel vn-check[ng-model="$ctrl.filter.hasMinPrice"]', + addTag: 'vn-fixed-price-search-panel vn-icon-button[icon="add_circle"]', + tagFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="itemTag.tagFk"]', + tagValueFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="itemTag.value"]', + chip: 'vn-fixed-price-search-panel vn-chip > vn-icon' }, itemCreateView: { temporalName: 'vn-item-create vn-textfield[ng-model="$ctrl.item.provisionalName"]', @@ -470,10 +430,6 @@ export default { packingOut: 'vn-input-number[ng-model="$ctrl.item.packingOut"]', isActiveCheckbox: 'vn-check[label="Active"]', priceInKgCheckbox: 'vn-check[label="Price in kg"]', - newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button', - newIntrastatId: '.vn-dialog.shown vn-input-number[ng-model="$ctrl.newIntrastat.intrastatId"]', - newIntrastatDescription: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.newIntrastat.description"]', - acceptIntrastatButton: '.vn-dialog.shown button[response="accept"]', submitBasicDataButton: `button[type=submit]` }, itemTags: { @@ -626,13 +582,6 @@ export default { saveButton: '.vn-dialog.shown [response="accept"]', expeditionRow: 'vn-ticket-expedition vn-table vn-tbody > vn-tr' }, - ticketPackages: { - firstPackage: 'vn-autocomplete[label="Package"]', - firstQuantity: 'vn-ticket-package vn-horizontal:nth-child(1) vn-input-number[ng-model="package.quantity"]', - firstRemovePackageButton: 'vn-icon-button[vn-tooltip="Remove package"]', - addPackageButton: 'vn-icon-button[vn-tooltip="Add package"]', - savePackagesButton: `button[type=submit]` - }, ticketSales: { setOk: 'vn-ticket-sale vn-tool-bar > vn-button[label="Ok"] > button', saleLine: 'vn-table div > vn-tbody > vn-tr vn-check', @@ -744,6 +693,7 @@ export default { anyDocument: 'vn-ticket-dms-index > vn-data-viewer vn-tbody vn-tr' }, ticketFuture: { + searchResult: 'vn-ticket-future tbody tr', openAdvancedSearchButton: 'vn-searchbar .append vn-icon[icon="arrow_drop_down"]', originDated: 'vn-date-picker[label="Origin date"]', futureDated: 'vn-date-picker[label="Destination date"]', @@ -759,7 +709,6 @@ export default { problems: 'vn-check[label="With problems"]', tableButtonSearch: 'vn-button[vn-tooltip="Search"]', moveButton: 'vn-button[vn-tooltip="Future tickets"]', - acceptButton: '.vn-confirm.shown button[response="accept"]', firstCheck: 'tbody > tr:nth-child(1) > td > vn-check', multiCheck: 'vn-multi-check', tableId: 'vn-textfield[name="id"]', @@ -877,15 +826,6 @@ export default { landedDatePicker: 'vn-date-picker[label="Landed"]', createButton: 'button[type=submit]' }, - orderSummary: { - id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span', - alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span', - consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(6) span', - subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)', - vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)', - total: 'vn-order-summary vn-one.taxes > p:nth-child(3)', - sale: 'vn-order-summary vn-tbody > vn-tr', - }, orderCatalog: { plantRealmButton: 'vn-order-catalog > vn-side-menu vn-icon[icon="icon-plant"]', type: 'vn-order-catalog vn-autocomplete[data="$ctrl.itemTypes"]', @@ -903,14 +843,6 @@ export default { fifthFilterRemoveButton: 'vn-order-catalog > vn-side-menu .chips > vn-chip:nth-child(5) vn-icon[icon=cancel]', sixthFilterRemoveButton: 'vn-order-catalog > vn-side-menu .chips > vn-chip:nth-child(6) vn-icon[icon=cancel]', }, - orderBasicData: { - client: 'vn-autocomplete[label="Client"]', - address: 'vn-autocomplete[label="Address"]', - agency: 'vn-autocomplete[label="Agency"]', - observation: 'vn-textarea[label="Notes"]', - saveButton: `button[type=submit]`, - acceptButton: '.vn-confirm.shown button[response="accept"]' - }, orderLine: { orderSubtotal: 'vn-order-line .header :first-child', firstLineDeleteButton: 'vn-order-line vn-tbody > vn-tr:nth-child(1) vn-icon[icon="delete"]', @@ -950,16 +882,6 @@ export default { goToRouteSummaryButton: 'vn-route-summary > vn-card > h5 > a', }, - routeBasicData: { - worker: 'vn-route-basic-data vn-autocomplete[ng-model="$ctrl.route.workerFk"]', - vehicle: 'vn-route-basic-data vn-autocomplete[ng-model="$ctrl.route.vehicleFk"]', - kmStart: 'vn-route-basic-data vn-input-number[ng-model="$ctrl.route.kmStart"]', - kmEnd: 'vn-route-basic-data vn-input-number[ng-model="$ctrl.route.kmEnd"]', - createdDate: 'vn-route-basic-data vn-date-picker[ng-model="$ctrl.route.created"]', - startedHour: 'vn-route-basic-data vn-input-time[ng-model="$ctrl.route.started"]', - finishedHour: 'vn-route-basic-data vn-input-time[ng-model="$ctrl.route.finished"]', - saveButton: 'vn-route-basic-data button[type=submit]' - }, routeTickets: { firstTicketPriority: 'vn-route-tickets vn-tr:nth-child(1) vn-input-number[ng-model="ticket.priority"]', firstTicketCheckbox: 'vn-route-tickets vn-tr:nth-child(1) vn-check', @@ -989,9 +911,9 @@ export default { saveButton: 'vn-worker-basic-data button[type=submit]' }, workerNotes: { - addNoteFloatButton: 'vn-worker-note vn-float-button', - note: 'vn-textarea[ng-model="$ctrl.note.text"]', - saveButton: 'button[type=submit]', + addNoteFloatButton: 'vn-worker-note vn-icon[icon="add"]', + note: 'vn-note-worker-create vn-textarea[ng-model="$ctrl.note.text"]', + saveButton: 'vn-note-worker-create button[type=submit]', firstNoteText: 'vn-worker-note .text' }, workerPbx: { @@ -1244,22 +1166,6 @@ export default { confirmed: 'vn-entry-summary vn-check[label="Confirmed"]', anyBuyLine: 'vn-entry-summary tr.dark-row' }, - entryBasicData: { - reference: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.reference"]', - invoiceNumber: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.invoiceNumber"]', - notes: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.notes"]', - observations: 'vn-entry-basic-data vn-textarea[ng-model="$ctrl.entry.observation"]', - supplier: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.supplierFk"]', - currency: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.currencyFk"]', - commission: 'vn-entry-basic-data vn-input-number[ng-model="$ctrl.entry.commission"]', - company: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.companyFk"]', - ordered: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isOrdered"]', - confirmed: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isConfirmed"]', - inventory: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isExcludedFromAvailable"]', - raid: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isRaid"]', - booked: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isBooked"]', - save: 'vn-entry-basic-data button[type=submit]', - }, entryDescriptor: { agency: 'vn-entry-descriptor div.body vn-label-value:nth-child(1) span', travelsQuicklink: 'vn-entry-descriptor vn-quick-link[icon="local_airport"] > a', @@ -1350,18 +1256,6 @@ export default { notes: 'vn-supplier-basic-data vn-textarea[ng-model="$ctrl.supplier.note"]', saveButton: 'vn-supplier-basic-data button[type="submit"]', }, - supplierFiscalData: { - socialName: 'vn-supplier-fiscal-data vn-textfield[ng-model="$ctrl.supplier.name"]', - taxNumber: 'vn-supplier-fiscal-data vn-textfield[ng-model="$ctrl.supplier.nif"]', - account: 'vn-supplier-fiscal-data vn-textfield[ng-model="$ctrl.supplier.account"]', - sageTaxType: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.sageTaxTypeFk"]', - sageWihholding: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.sageWithholdingFk"]', - postCode: 'vn-supplier-fiscal-data vn-datalist[ng-model="$ctrl.supplier.postCode"]', - city: 'vn-supplier-fiscal-data vn-datalist[ng-model="$ctrl.supplier.city"]', - province: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.provinceFk"]', - country: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.countryFk"]', - saveButton: 'vn-supplier-fiscal-data button[type="submit"]', - }, supplierBillingData: { payMethod: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payMethodFk"]', payDem: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payDemFk"]', diff --git a/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js b/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js index a3d747f1c..c4f091d1f 100644 --- a/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js +++ b/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js @@ -15,91 +15,55 @@ describe('SmartTable SearchBar integration', () => { await browser.close(); }); - describe('as filters in smart-table section', () => { - it('should search by type in searchBar', async() => { - await page.waitToClick(selectors.itemsIndex.openAdvancedSearchButton); - await page.autocompleteSearch(selectors.itemsIndex.advancedSearchItemType, 'Anthurium'); - await page.waitToClick(selectors.itemsIndex.advancedSearchButton); - await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3); + it('should search by type in searchBar, reload page and have same results', async() => { + await page.waitToClick(selectors.itemsIndex.openAdvancedSearchButton); + await page.autocompleteSearch(selectors.itemsIndex.advancedSearchItemType, 'Anthurium'); + await page.waitToClick(selectors.itemsIndex.advancedSearchButton); + await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3); + + await page.reload({ + waitUntil: 'networkidle2' }); - it('should reload page and have same results', async() => { - await page.reload({ - waitUntil: 'networkidle2' - }); + await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3); - await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3); + await page.waitToClick(selectors.itemsIndex.advancedSmartTableButton); + await page.write(selectors.itemsIndex.advancedSmartTableGrouping, '1'); + await page.keyboard.press('Enter'); + await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2); + + await page.reload({ + waitUntil: 'networkidle2' }); - it('should search by grouping in smartTable', async() => { - await page.waitToClick(selectors.itemsIndex.advancedSmartTableButton); - await page.write(selectors.itemsIndex.advancedSmartTableGrouping, '1'); - await page.keyboard.press('Enter'); - await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2); - }); - - it('should now reload page and have same results', async() => { - await page.reload({ - waitUntil: 'networkidle2' - }); - - await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2); - }); + await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2); }); - describe('as filters in section without smart-table', () => { - it('go to zone section', async() => { - await page.loginAndModule('salesPerson', 'zone'); - await page.waitToClick(selectors.globalItems.searchButton); - }); + it('should filter in section without smart-table and search in searchBar go to zone section', async() => { + await page.loginAndModule('salesPerson', 'zone'); + await page.waitToClick(selectors.globalItems.searchButton); - it('should search in searchBar first time', async() => { - await page.doSearch('A'); - const count = await page.countElement(selectors.zoneIndex.searchResult); + await page.doSearch('A'); + const firstCount = await page.countElement(selectors.zoneIndex.searchResult); - expect(count).toEqual(7); - }); + await page.doSearch('A'); + const secondCount = await page.countElement(selectors.zoneIndex.searchResult); - it('should search in searchBar second time', async() => { - await page.doSearch('A'); - const count = await page.countElement(selectors.zoneIndex.searchResult); - - expect(count).toEqual(7); - }); - - it('should search in searchBar third time', async() => { - await page.doSearch('A'); - const count = await page.countElement(selectors.zoneIndex.searchResult); - - expect(count).toEqual(7); - }); + expect(firstCount).toEqual(7); + expect(secondCount).toEqual(7); }); - describe('as orders', () => { - it('should order by first id', async() => { - await page.loginAndModule('developer', 'item'); - await page.accessToSection('item.fixedPrice'); - await page.doSearch(); + it('should order orders by first id and order by last id, reload page and have same order', async() => { + await page.loginAndModule('developer', 'item'); + await page.accessToSection('item.fixedPrice'); + await page.keyboard.press('Enter'); - const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value'); + await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '1'); - expect(result).toEqual('1'); - }); - - it('should order by last id', async() => { - await page.waitToClick(selectors.itemFixedPrice.orderColumnId); - const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value'); - - expect(result).toEqual('3'); - }); - - it('should reload page and have same order', async() => { - await page.reload({ - waitUntil: 'networkidle2' - }); - const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value'); - - expect(result).toEqual('3'); + await page.waitToClick(selectors.itemFixedPrice.orderColumnId); + await page.reload({ + waitUntil: 'networkidle2' }); + await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '13'); }); }); diff --git a/e2e/paths/02-client/03_edit_fiscal_data.spec.js b/e2e/paths/02-client/03_edit_fiscal_data.spec.js index 2a56cb535..0babb5396 100644 --- a/e2e/paths/02-client/03_edit_fiscal_data.spec.js +++ b/e2e/paths/02-client/03_edit_fiscal_data.spec.js @@ -171,100 +171,40 @@ describe('Client Edit fiscalData path', () => { expect(result).toEqual('SMASH'); }); - it('should confirm the fiscal id have been edited', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.fiscalId, 'value'); + it('should confirm the fiscal data have been edited', async() => { + const fiscalId = await page.waitToGetProperty(selectors.clientFiscalData.fiscalId, 'value'); + const address = await page.waitToGetProperty(selectors.clientFiscalData.address, 'value'); + const postcode = await page.waitToGetProperty(selectors.clientFiscalData.postcode, 'value'); + const sageTax = await page.waitToGetProperty(selectors.clientFiscalData.sageTax, 'value'); + const sageTransaction = await page.waitToGetProperty(selectors.clientFiscalData.sageTransaction, 'value'); + const city = await page.waitToGetProperty(selectors.clientFiscalData.city, 'value'); + const province = await page.waitToGetProperty(selectors.clientFiscalData.province, 'value'); + const country = await page.waitToGetProperty(selectors.clientFiscalData.country, 'value'); + const active = await page.checkboxState(selectors.clientFiscalData.activeCheckbox); + const frozen = await page.checkboxState(selectors.clientFiscalData.frozenCheckbox); + const hasToInvoice = await page.checkboxState(selectors.clientFiscalData.hasToInvoiceCheckbox); + const vies = await page.checkboxState(selectors.clientFiscalData.viesCheckbox); + const notifyByMail = await page.checkboxState(selectors.clientFiscalData.notifyByMailCheckbox); + const invoiceByAddress = await page.checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox); + const equalizationTax = await page.checkboxState(selectors.clientFiscalData.equalizationTaxCheckbox); + const verifiedData = await page.checkboxState(selectors.clientFiscalData.verifiedDataCheckbox); - expect(result).toEqual('94980061C'); - }); - - it('should confirm the address have been edited', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.address, 'value'); - - expect(result).toEqual('Somewhere edited'); - }); - - it('should confirm the postcode have been edited', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.postcode, 'value'); - - expect(result).toContain('46000'); - }); - - it('should confirm the sageTax have been edited', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.sageTax, 'value'); - - expect(result).toEqual('Operaciones no sujetas'); - }); - - it('should confirm the sageTransaction have been edited', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.sageTransaction, 'value'); - - expect(result).toEqual('36: Regularización de inversiones'); - }); - - it('should confirm the city have been autocompleted', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.city, 'value'); - - expect(result).toEqual('Valencia'); - }); - - it(`should confirm the province have been autocompleted`, async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.province, 'value'); - - expect(result).toContain('Province one'); - }); - - it('should confirm the country have been autocompleted', async() => { - const result = await page.waitToGetProperty(selectors.clientFiscalData.country, 'value'); - - expect(result).toEqual('España'); - }); - - it('should confirm active checkbox is unchecked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.activeCheckbox); - - expect(result).toBe('unchecked'); - }); - - it('should confirm frozen checkbox is checked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.frozenCheckbox); - - expect(result).toBe('checked'); - }); - - it('should confirm Has to invoice checkbox is unchecked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.hasToInvoiceCheckbox); - - expect(result).toBe('unchecked'); - }); - - it('should confirm Vies checkbox is checked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.viesCheckbox); - - expect(result).toBe('checked'); - }); - - it('should confirm Notify by email checkbox is unchecked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.notifyByMailCheckbox); - - expect(result).toBe('unchecked'); - }); - - it('should confirm invoice by address checkbox is checked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox); - - expect(result).toBe('checked'); - }); - - it('should confirm Equalization tax checkbox is unchecked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.equalizationTaxCheckbox); - - expect(result).toBe('unchecked'); - }); - - it('should confirm Verified data checkbox is checked', async() => { - const result = await page.checkboxState(selectors.clientFiscalData.verifiedDataCheckbox); - - expect(result).toBe('checked'); + expect(fiscalId).toEqual('94980061C'); + expect(address).toEqual('Somewhere edited'); + expect(postcode).toContain('46000'); + expect(sageTax).toEqual('Operaciones no sujetas'); + expect(sageTransaction).toEqual('Regularización de inversiones'); + expect(city).toEqual('Valencia'); + expect(province).toContain('Province one'); + expect(country).toEqual('España'); + expect(active).toBe('unchecked'); + expect(frozen).toBe('checked'); + expect(hasToInvoice).toBe('unchecked'); + expect(vies).toBe('checked'); + expect(notifyByMail).toBe('unchecked'); + expect(invoiceByAddress).toBe('checked'); + expect(equalizationTax).toBe('unchecked'); + expect(verifiedData).toBe('checked'); }); // confirm invoice by address checkbox gets checked if the EQtax differs between addresses step 1 diff --git a/e2e/paths/02-client/04_edit_billing_data.spec.js b/e2e/paths/02-client/04_edit_billing_data.spec.js index de3270f93..10eb85406 100644 --- a/e2e/paths/02-client/04_edit_billing_data.spec.js +++ b/e2e/paths/02-client/04_edit_billing_data.spec.js @@ -1,6 +1,23 @@ -import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + payMethod: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.payMethodFk"]', + IBAN: 'vn-client-billing-data vn-textfield[ng-model="$ctrl.client.iban"]', + dueDay: 'vn-client-billing-data vn-input-number[ng-model="$ctrl.client.dueDay"]', + receivedCoreLCRCheckbox: 'vn-client-billing-data vn-check[label="Received LCR"]', + receivedCoreVNLCheckbox: 'vn-client-billing-data vn-check[label="Received core VNL"]', + receivedB2BVNLCheckbox: 'vn-client-billing-data vn-check[label="Received B2B VNL"]', + swiftBic: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.bankEntityFk"]', + newBankEntityButton: 'vn-client-billing-data vn-icon-button[vn-tooltip="New bank entity"] > button', + newBankEntityName: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.name"]', + newBankEntityBIC: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.bic"]', + newBankEntityCountry: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.data.countryFk"]', + newBankEntityCode: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.id"]', + acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]', + saveButton: 'vn-client-billing-data button[type=submit]', + watcher: 'vn-client-billing-data vn-watcher' +}; + describe('Client Edit billing data path', () => { let browser; let page; @@ -17,93 +34,72 @@ describe('Client Edit billing data path', () => { }); it(`should attempt to edit the billing data without an IBAN but fail`, async() => { - await page.autocompleteSearch(selectors.clientBillingData.payMethod, 'PayMethod with IBAN'); - await page.autocompleteSearch(selectors.clientBillingData.swiftBic, 'BBKKESMMMMM'); - await page.clearInput(selectors.clientBillingData.dueDay); - await page.write(selectors.clientBillingData.dueDay, '60'); - await page.waitForTextInField(selectors.clientBillingData.dueDay, '60'); - await page.waitToClick(selectors.clientBillingData.receivedCoreLCRCheckbox); - await page.waitToClick(selectors.clientBillingData.receivedCoreVNLCheckbox); - await page.waitToClick(selectors.clientBillingData.receivedB2BVNLCheckbox); - await page.waitToClick(selectors.clientBillingData.saveButton); + await page.autocompleteSearch($.payMethod, 'PayMethod with IBAN'); + await page.autocompleteSearch($.swiftBic, 'BBKKESMMMMM'); + await page.clearInput($.dueDay); + await page.write($.dueDay, '60'); + await page.waitForTextInField($.dueDay, '60'); + await page.waitToClick($.receivedCoreLCRCheckbox); + await page.waitToClick($.receivedCoreVNLCheckbox); + await page.waitToClick($.receivedB2BVNLCheckbox); + await page.waitToClick($.saveButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('That payment method requires an IBAN'); }); it(`should create a new BIC code`, async() => { - await page.waitToClick(selectors.clientBillingData.newBankEntityButton); - await page.write(selectors.clientBillingData.newBankEntityName, 'Gotham City Bank'); - await page.write(selectors.clientBillingData.newBankEntityBIC, 'GTHMCT'); - await page.autocompleteSearch(selectors.clientBillingData.newBankEntityCountry, 'España'); - await page.write(selectors.clientBillingData.newBankEntityCode, '9999'); - await page.waitToClick(selectors.clientBillingData.acceptBankEntityButton); + await page.waitToClick($.newBankEntityButton); + await page.write($.newBankEntityName, 'Gotham City Bank'); + await page.write($.newBankEntityBIC, 'GTHMCT'); + await page.autocompleteSearch($.newBankEntityCountry, 'España'); + await page.write($.newBankEntityCode, '9999'); + await page.waitToClick($.acceptBankEntityButton); const message = await page.waitForSnackbar(); - await page.waitForTextInField(selectors.clientBillingData.swiftBic, 'Gotham City Bank'); - const newcode = await page.waitToGetProperty(selectors.clientBillingData.swiftBic, 'value'); - - expect(newcode).toEqual('GTHMCT Gotham City Bank'); + await page.waitForTextInField($.swiftBic, 'GTHMCT'); + const newcode = await page.waitToGetProperty($.swiftBic, 'value'); + expect(newcode).toEqual('GTHMCT'); expect(message.text).toContain('Data saved!'); }); it(`should confirm the IBAN pay method was sucessfully saved`, async() => { - const payMethod = await page.waitToGetProperty(selectors.clientBillingData.payMethod, 'value'); + const payMethod = await page.waitToGetProperty($.payMethod, 'value'); expect(payMethod).toEqual('PayMethod with IBAN'); }); it(`should clear the BIC code field, update the IBAN to see how he BIC code autocompletes`, async() => { - await page.write(selectors.clientBillingData.IBAN, 'ES9121000418450200051332'); + await page.write($.IBAN, 'ES9121000418450200051332'); await page.keyboard.press('Tab'); await page.keyboard.press('Tab'); - await page.waitForTextInField(selectors.clientBillingData.swiftBic, 'caixesbb'); - let automaticCode = await page.waitToGetProperty(selectors.clientBillingData.swiftBic, 'value'); + await page.waitForTextInField($.swiftBic, 'caixesbb'); + let automaticCode = await page.waitToGetProperty($.swiftBic, 'value'); - expect(automaticCode).toEqual('CAIXESBB Caixa Bank'); + expect(automaticCode).toEqual('CAIXESBB'); }); it(`should save the form with all its new data`, async() => { - await page.waitForWatcherData(selectors.clientBillingData.watcher); - await page.waitToClick(selectors.clientBillingData.saveButton); + await page.waitForWatcherData($.watcher); + await page.waitToClick($.saveButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Notification sent!'); }); - it('should confirm the due day have been edited', async() => { - const dueDate = await page.waitToGetProperty(selectors.clientBillingData.dueDay, 'value'); + it('should confirm the billing data have been edited', async() => { + const dueDate = await page.waitToGetProperty($.dueDay, 'value'); + const IBAN = await page.waitToGetProperty($.IBAN, 'value'); + const swiftBic = await page.waitToGetProperty($.swiftBic, 'value'); + const receivedCoreLCR = await page.checkboxState($.receivedCoreLCRCheckbox); + const receivedCoreVNL = await page.checkboxState($.receivedCoreVNLCheckbox); + const receivedB2BVNL = await page.checkboxState($.receivedB2BVNLCheckbox); expect(dueDate).toEqual('60'); - }); - - it('should confirm the IBAN was saved', async() => { - const IBAN = await page.waitToGetProperty(selectors.clientBillingData.IBAN, 'value'); - expect(IBAN).toEqual('ES9121000418450200051332'); - }); - - it('should confirm the swift / BIC code was saved', async() => { - const code = await page.waitToGetProperty(selectors.clientBillingData.swiftBic, 'value'); - - expect(code).toEqual('CAIXESBB Caixa Bank'); - }); - - it('should confirm Received LCR checkbox is checked', async() => { - const result = await page.checkboxState(selectors.clientBillingData.receivedCoreLCRCheckbox); - - expect(result).toBe('checked'); - }); - - it('should confirm Received core VNL checkbox is unchecked', async() => { - const result = await page.checkboxState(selectors.clientBillingData.receivedCoreVNLCheckbox); - - expect(result).toBe('unchecked'); - }); - - it('should confirm Received B2B VNL checkbox is unchecked', async() => { - const result = await page.checkboxState(selectors.clientBillingData.receivedB2BVNLCheckbox); - - expect(result).toBe('unchecked'); + expect(swiftBic).toEqual('CAIXESBB'); + expect(receivedCoreLCR).toBe('checked'); + expect(receivedCoreVNL).toBe('unchecked'); + expect(receivedB2BVNL).toBe('unchecked'); }); }); diff --git a/e2e/paths/02-client/07_edit_web_access.spec.js b/e2e/paths/02-client/07_edit_web_access.spec.js index 29b39f788..5386d12bd 100644 --- a/e2e/paths/02-client/07_edit_web_access.spec.js +++ b/e2e/paths/02-client/07_edit_web_access.spec.js @@ -1,88 +1,56 @@ -/* eslint max-len: ["error", { "code": 150 }]*/ -import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; -describe('Client Edit web access path', () => { +const $ = { + enableWebAccess: 'vn-client-web-access vn-check[label="Enable web access"]', + userName: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.name"]', + email: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.email"]', + saveButton: 'vn-client-web-access button[type=submit]', + nameValue: 'vn-client-log .change:nth-child(1) .basic-json:nth-child(2) vn-json-value', + activeValue: 'vn-client-log .change:nth-child(2) .basic-json:nth-child(1) vn-json-value' +}; + +describe('Client web access path', () => { let browser; let page; + beforeAll(async() => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('salesPerson', 'client'); await page.accessToSearchResult('max'); - await page.accessToSection('client.card.webAccess'); }); afterAll(async() => { await browser.close(); }); - it('should uncheck the Enable web access checkbox', async() => { - await page.waitToClick(selectors.clientWebAccess.enableWebAccessCheckbox); - await page.waitToClick(selectors.clientWebAccess.saveButton); - const message = await page.waitForSnackbar(); + it('should modify and save web access attributes', async() => { + await page.accessToSection('client.card.webAccess'); + await page.click($.enableWebAccess); + await page.click($.saveButton); + const enableMessage = await page.waitForSnackbar(); + await page.overwrite($.userName, 'Legion'); + await page.overwrite($.email, 'legion@marvel.com'); + await page.click($.saveButton); + const modifyMessage = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it(`should update the name`, async() => { - await page.clearInput(selectors.clientWebAccess.userName); - await page.write(selectors.clientWebAccess.userName, 'Legion'); - await page.waitToClick(selectors.clientWebAccess.saveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should update the email`, async() => { - await page.clearInput(selectors.clientWebAccess.email); - await page.write(selectors.clientWebAccess.email, 'legion@marvel.com'); - await page.waitToClick(selectors.clientWebAccess.saveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should reload the section and confirm web access is now unchecked', async() => { await page.reloadSection('client.card.webAccess'); - const result = await page.checkboxState(selectors.clientWebAccess.enableWebAccessCheckbox); + const hasAccess = await page.checkboxState($.enableWebAccess); + const userName = await page.getValue($.userName); + const email = await page.getValue($.email); - expect(result).toBe('unchecked'); - }); - - it('should confirm web access name have been updated', async() => { - const result = await page.waitToGetProperty(selectors.clientWebAccess.userName, 'value'); - - expect(result).toEqual('Legion'); - }); - - it('should confirm web access email have been updated', async() => { - const result = await page.waitToGetProperty(selectors.clientWebAccess.email, 'value'); - - expect(result).toEqual('legion@marvel.com'); - }); - - it(`should navigate to the log section`, async() => { await page.accessToSection('client.card.log'); - }); + const logName = await page.innerText($.nameValue); + const logActive = await page.innerText($.activeValue); - it(`should confirm the last log shows the updated client name and no modifications on active checkbox`, async() => { - let namePreviousValue = await page - .waitToGetProperty(selectors.clientLog.namePreviousValue, 'innerText'); - let nameCurrentValue = await page - .waitToGetProperty(selectors.clientLog.nameCurrentValue, 'innerText'); + expect(enableMessage.type).toBe('success'); + expect(modifyMessage.type).toBe('success'); - expect(namePreviousValue).toEqual('MaxEisenhardt'); - expect(nameCurrentValue).toEqual('Legion'); - }); + expect(hasAccess).toBe('unchecked'); + expect(userName).toEqual('Legion'); + expect(email).toEqual('legion@marvel.com'); - it(`should confirm the penultimate log shows the updated active and no modifications on client name`, async() => { - let activePreviousValue = await page - .waitToGetProperty(selectors.clientLog.activePreviousValue, 'innerText'); - let activeCurrentValue = await page - .waitToGetProperty(selectors.clientLog.activeCurrentValue, 'innerText'); - - expect(activePreviousValue).toEqual('✓'); - expect(activeCurrentValue).toEqual('✗'); + expect(logName).toEqual('Legion'); + expect(logActive).toEqual('✗'); }); }); diff --git a/e2e/paths/02-client/10_add_greuge.spec.js b/e2e/paths/02-client/10_add_greuge.spec.js index 6ea923a28..9141c499a 100644 --- a/e2e/paths/02-client/10_add_greuge.spec.js +++ b/e2e/paths/02-client/10_add_greuge.spec.js @@ -29,19 +29,16 @@ describe('Client Add greuge path', () => { expect(message.text).toContain('Some fields are invalid'); }); - it(`should create a new greuge with all its data`, async() => { + it(`should create a new greuge with all its data and confirm the greuge was added to the list`, async() => { await page.write(selectors.clientGreuge.amount, '999'); await page.waitForTextInField(selectors.clientGreuge.amount, '999'); await page.write(selectors.clientGreuge.description, 'new armor for Batman!'); await page.waitToClick(selectors.clientGreuge.saveButton); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the greuge was added to the list', async() => { const result = await page.waitToGetProperty(selectors.clientGreuge.firstGreugeText, 'innerText'); + expect(message.text).toContain('Data saved!'); expect(result).toContain(999); expect(result).toContain('new armor for Batman!'); expect(result).toContain('Diff'); diff --git a/e2e/paths/02-client/13_log.spec.js b/e2e/paths/02-client/13_log.spec.js index 8f186d842..5292b1a65 100644 --- a/e2e/paths/02-client/13_log.spec.js +++ b/e2e/paths/02-client/13_log.spec.js @@ -28,22 +28,4 @@ describe('Client log path', () => { it('should navigate to the log section', async() => { await page.accessToSection('client.card.log'); }); - - it('should check the previous value of the last logged change', async() => { - let lastModificationPreviousValue = await page - .waitToGetProperty(selectors.clientLog.lastModificationPreviousValue, 'innerText'); - - expect(lastModificationPreviousValue).toContain('DavidCharlesHaller'); - }); - - it('should check the current value of the last logged change', async() => { - let lastModificationPreviousValue = await page - .waitToGetProperty(selectors.clientLog.lastModificationPreviousValue, 'innerText'); - - let lastModificationCurrentValue = await page. - waitToGetProperty(selectors.clientLog.lastModificationCurrentValue, 'innerText'); - - expect(lastModificationPreviousValue).toEqual('DavidCharlesHaller'); - expect(lastModificationCurrentValue).toEqual('this is a test'); - }); }); diff --git a/e2e/paths/02-client/14_balance.spec.js b/e2e/paths/02-client/14_balance.spec.js index d3de842e3..b1c0f7eea 100644 --- a/e2e/paths/02-client/14_balance.spec.js +++ b/e2e/paths/02-client/14_balance.spec.js @@ -1,6 +1,17 @@ import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + company: 'vn-client-balance-index vn-autocomplete[ng-model="$ctrl.companyId"]', + newPaymentButton: `vn-float-button`, + newPayment: '.vn-dialog.shown', + refundAmount: '.vn-dialog.shown [vn-name="amountToReturn"]', + saveButton: '.vn-dialog.shown [response="accept"]', + firstLineBalance: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(8)', + firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable', + firstLineReferenceInput: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable vn-textfield', +}; + describe('Client balance path', () => { let browser; let page; @@ -18,125 +29,100 @@ describe('Client balance path', () => { it('should now edit the local user config data', async() => { await page.waitToClick(selectors.globalItems.userMenuButton); await page.autocompleteSearch(selectors.globalItems.userLocalCompany, 'CCs'); - const message = await page.waitForSnackbar(); + const companyMessage = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should access to the balance section to check the data shown matches the local settings', async() => { await page.accessToSection('client.card.balance.index'); - let result = await page.waitToGetProperty(selectors.clientBalance.company, 'value'); + const company = await page.getValue($.company); - expect(result).toEqual('CCs'); - }); - - it('should now clear the user local settings', async() => { await page.waitToClick(selectors.globalItems.userMenuButton); await page.clearInput(selectors.globalItems.userConfigThirdAutocomplete); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should reload the section', async() => { await page.closePopup(); await page.reloadSection('client.card.balance.index'); + + expect(companyMessage.isSuccess).toBeTrue(); + expect(company).toEqual('CCs'); + expect(message.isSuccess).toBeTrue(); }); it('should create a new payment that clears the debt', async() => { - await page.closePopup(); - await page.waitToClick(selectors.clientBalance.newPaymentButton); - await page.autocompleteSearch(selectors.clientBalance.newPaymentBank, 'Cash'); - await page.clearInput(selectors.clientBalance.newDescription); - await page.write(selectors.clientBalance.newDescription, 'Description'); - await page.waitToClick(selectors.clientBalance.saveButton); + await page.waitToClick($.newPaymentButton); + await page.fillForm($.newPayment, { + bank: 'Cash', + description: 'Description', + viewReceipt: false + }); + await page.respondToDialog('accept'); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); + expect(message.isSuccess).toBeTrue(); }); - it('should edit the 1st line reference', async() => { - await page.waitToClick(selectors.clientBalance.firstLineReference); - await page.write(selectors.clientBalance.firstLineReferenceInput, 'Miscellaneous payment'); + it('should edit the 1st line reference and check data', async() => { + await page.waitToClick($.firstLineReference); + await page.write($.firstLineReferenceInput, 'Miscellaneous payment'); await page.keyboard.press('Enter'); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should check balance is now 0, the reference was saved and the company is now VNL becouse the user local settings were removed', async() => { await page.waitForSpinnerLoad(); - let company = await page - .waitToGetProperty(selectors.clientBalance.company, 'value'); - - let reference = await page - .waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText'); - - let firstBalanceLine = await page - .waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText'); + let company = await page.getValue($.company); + let reference = await page.innerText($.firstLineReference); + let firstBalanceLine = await page.innerText($.firstLineBalance); + expect(message.isSuccess).toBeTrue(); expect(company).toEqual('VNL'); expect(reference).toEqual('Miscellaneous payment'); expect(firstBalanceLine).toContain('0.00'); }); - it('should create a new payment and check the cash comparison works correctly', async() => { - const amountPaid = '100'; - const cashHanded = '500'; - const expectedRefund = '400'; - - await page.waitToClick(selectors.clientBalance.newPaymentButton); - await page.write(selectors.clientBalance.newPaymentAmount, amountPaid); - await page.clearInput(selectors.clientBalance.newDescription); - await page.write(selectors.clientBalance.newDescription, 'Payment'); - await page.write(selectors.clientBalance.deliveredAmount, cashHanded); - const refund = await page.waitToGetProperty(selectors.clientBalance.refundAmount, 'value'); - await page.waitToClick(selectors.clientBalance.saveButton); + it('should create a new payment, check the cash comparison works correctly and balance value is -100', async() => { + await page.waitToClick($.newPaymentButton); + await page.fillForm($.newPayment, { + amountPaid: 100, + description: 'Payment', + deliveredAmount: 500, + viewReceipt: false + }); + const refund = await page.getValue($.refundAmount); + await page.respondToDialog('accept'); const message = await page.waitForSnackbar(); - expect(refund).toEqual(expectedRefund); - expect(message.text).toContain('Data saved!'); - }); - - it('should check the balance value is now -100', async() => { - let result = await page - .waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText'); + const result = await page.innerText($.firstLineBalance); + expect(refund).toEqual('400'); + expect(message.isSuccess).toBeTrue(); expect(result).toContain('-€100.00'); }); it('should create a new payment and check the cash exceeded the maximum', async() => { - const amountPaid = '1001'; - - await page.closePopup(); - await page.waitToClick(selectors.clientBalance.newPaymentButton); - await page.autocompleteSearch(selectors.clientBalance.newPaymentBank, 'Cash'); - await page.write(selectors.clientBalance.newPaymentAmount, amountPaid); - await page.clearInput(selectors.clientBalance.newDescription); - await page.write(selectors.clientBalance.newDescription, 'Payment'); - await page.waitToClick(selectors.clientBalance.saveButton); + await page.waitToClick($.newPaymentButton); + await page.fillForm($.newPayment, { + bank: 'Cash', + amountPaid: 1001, + description: 'Payment' + }); + await page.waitToClick($.saveButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Amount exceeded'); }); - it('should create a new payment that sets the balance back to the original negative value', async() => { + it('should create a new payment that sets the balance back to negative value and check it', async() => { await page.closePopup(); - await page.waitToClick(selectors.clientBalance.newPaymentButton); - await page.autocompleteSearch(selectors.clientBalance.newPaymentBank, 'Pay on receipt'); - await page.overwrite(selectors.clientBalance.newPaymentAmount, '-150'); - await page.clearInput(selectors.clientBalance.newDescription); - await page.write(selectors.clientBalance.newDescription, 'Description'); - await page.waitToClick(selectors.clientBalance.saveButton); + await page.waitToClick($.newPaymentButton); + + await page.fillForm($.newPayment, { + bank: 'Pay on receipt', + amountPaid: -150, + description: 'Description' + }); + await page.respondToDialog('accept'); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should check balance is now 50', async() => { - let result = await page - .waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText'); + const result = await page.innerText($.firstLineBalance); + expect(message.isSuccess).toBeTrue(); expect(result).toEqual('€50.00'); }); @@ -149,12 +135,9 @@ describe('Client balance path', () => { await page.waitForState('client.index'); }); - it('should now search for the user Petter Parker', async() => { + it('should now search for the user Petter Parker not check the payment button is not present', async() => { await page.accessToSearchResult('Petter Parker'); await page.accessToSection('client.card.balance.index'); - }); - - it('should not be able to click the new payment button as it isnt present', async() => { - await page.waitForSelector(selectors.clientBalance.newPaymentButton, {hidden: true}); + await page.waitForSelector($.newPaymentButton, {hidden: true}); }); }); diff --git a/e2e/paths/02-client/21_defaulter.spec.js b/e2e/paths/02-client/21_defaulter.spec.js index 0eb16441f..97e62abef 100644 --- a/e2e/paths/02-client/21_defaulter.spec.js +++ b/e2e/paths/02-client/21_defaulter.spec.js @@ -50,7 +50,7 @@ describe('Client defaulter path', () => { expect(message.text).toContain(`The message can't be empty`); }); - it('shoul checked all defaulters', async() => { + it('should checked all defaulters', async() => { await page.loginAndModule('insurance', 'client'); await page.accessToSection('client.defaulter'); diff --git a/e2e/paths/02-client/23_send_compensation.spec.js b/e2e/paths/02-client/23_send_compensation.spec.js index 6ec8936a8..7ab2d0bac 100644 --- a/e2e/paths/02-client/23_send_compensation.spec.js +++ b/e2e/paths/02-client/23_send_compensation.spec.js @@ -1,6 +1,11 @@ -import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + company: 'vn-client-balance-index vn-autocomplete[ng-model="$ctrl.companyId"]', + compensationButton: 'vn-client-balance-index vn-icon-button[vn-dialog="send_compensation"]', + saveButton: '.vn-dialog.shown [response="accept"]' +}; + describe('Client Send balance compensation', () => { let browser; let page; @@ -17,9 +22,9 @@ describe('Client Send balance compensation', () => { }); it(`should click on send compensation button`, async() => { - await page.autocompleteSearch(selectors.clientBalance.company, 'VNL'); - await page.waitToClick(selectors.clientBalance.compensationButton); - await page.waitToClick(selectors.clientBalance.saveButton); + await page.autocompleteSearch($.company, 'VNL'); + await page.waitToClick($.compensationButton); + await page.waitToClick($.saveButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Notification sent!'); diff --git a/e2e/paths/04-item/02_basic_data.spec.js b/e2e/paths/04-item/02_basic_data.spec.js index 3cf142816..bb8f3f134 100644 --- a/e2e/paths/04-item/02_basic_data.spec.js +++ b/e2e/paths/04-item/02_basic_data.spec.js @@ -1,14 +1,23 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + form: 'vn-item-basic-data form', + intrastatForm: '.vn-dialog.shown form', + newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button' +}; + describe('Item Edit basic data path', () => { let browser; let page; + beforeAll(async() => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('buyer', 'item'); await page.accessToSearchResult('Melee weapon combat fist 15cm'); + }); + + beforeEach(async() => { await page.accessToSection('item.card.basicData'); }); @@ -16,124 +25,42 @@ describe('Item Edit basic data path', () => { await browser.close(); }); - it(`should check the descritor edit button is visible for buyer`, async() => { - await page.waitForSelector(selectors.itemDescriptor.editButton, {visible: true}); - }); + it(`should edit the item basic data and confirm the item data was edited`, async() => { + const values = { + name: 'Rose of Purity', + longName: 'RS Rose of Purity', + type: 'Anthurium', + intrastat: 'Coral y materiales similares', + origin: 'Spain', + relevancy: 1, + generic: 'Pallet', + isActive: false, + priceInKg: true, + isFragile: true, + packingOut: 5 + }; - it(`should edit the item basic data`, async() => { - await page.clearInput(selectors.itemBasicData.name); - await page.write(selectors.itemBasicData.name, 'Rose of Purity'); - await page.clearInput(selectors.itemBasicData.longName); - await page.write(selectors.itemBasicData.longName, 'RS Rose of Purity'); - await page.autocompleteSearch(selectors.itemBasicData.type, 'Anthurium'); - await page.autocompleteSearch(selectors.itemBasicData.intrastat, 'Coral y materiales similares'); - await page.autocompleteSearch(selectors.itemBasicData.origin, 'Spain'); - await page.clearInput(selectors.itemBasicData.relevancy); - await page.write(selectors.itemBasicData.relevancy, '1'); - await page.clearInput(selectors.itemBasicData.generic); - await page.autocompleteSearch(selectors.itemBasicData.generic, '16'); - await page.waitToClick(selectors.itemBasicData.isActiveCheckbox); - await page.waitToClick(selectors.itemBasicData.priceInKgCheckbox); - await page.waitToClick(selectors.itemBasicData.isFragile); - await page.write(selectors.itemBasicData.packingOut, '5'); - await page.waitToClick(selectors.itemBasicData.submitBasicDataButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should create a new intrastat`, async() => { - await page.waitToClick(selectors.itemBasicData.newIntrastatButton); - await page.write(selectors.itemBasicData.newIntrastatId, '588420239'); - await page.write(selectors.itemBasicData.newIntrastatDescription, 'Tropical Flowers'); - await page.waitToClick(selectors.itemBasicData.acceptIntrastatButton); - await page.waitForTextInField(selectors.itemBasicData.intrastat, 'Tropical Flowers'); - let newcode = await page.waitToGetProperty(selectors.itemBasicData.intrastat, 'value'); - - expect(newcode).toEqual('588420239 Tropical Flowers'); - }); - - it('should save with the new intrastat', async() => { - await page.waitToClick(selectors.itemBasicData.submitBasicDataButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the item name was edited`, async() => { + const message = await page.sendForm($.form, values); await page.reloadSection('item.card.basicData'); - const result = await page.waitToGetProperty(selectors.itemBasicData.name, 'value'); + const formValues = await page.fetchForm($.form, Object.keys(values)); - expect(result).toEqual('Rose of Purity'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual(values); }); - it(`should confirm the item type was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.type, 'value'); + it(`should create a new intrastat and save it`, async() => { + await page.click($.newIntrastatButton); + await page.fillForm($.intrastatForm, { + id: '588420239', + description: 'Tropical Flowers' + }); + await page.respondToDialog('accept'); - expect(result).toEqual('Anthurium'); - }); + const message = await page.sendForm($.form); + await page.reloadSection('item.card.basicData'); + const formValues = await page.fetchForm($.form, ['intrastat']); - it(`should confirm the item intrastat was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.intrastat, 'value'); - - expect(result).toEqual('588420239 Tropical Flowers'); - }); - - it(`should confirm the item relevancy was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.relevancy, 'value'); - - expect(result).toEqual('1'); - }); - - it(`should confirm the item origin was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.origin, 'value'); - - expect(result).toEqual('Spain'); - }); - - it(`should confirm the item generic was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.generic, 'value'); - - expect(result).toEqual('16 - Pallet'); - }); - - it(`should confirm the item long name was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.longName, 'value'); - - expect(result).toEqual('RS Rose of Purity'); - }); - - it('should confirm isFragile checkbox is unchecked', async() => { - const result = await page - .checkboxState(selectors.itemBasicData.isFragile); - - expect(result).toBe('checked'); - }); - - it('should confirm isActive checkbox is unchecked', async() => { - const result = await page - .checkboxState(selectors.itemBasicData.isActiveCheckbox); - - expect(result).toBe('unchecked'); - }); - - it('should confirm the priceInKg checkbox is checked', async() => { - const result = await page - .checkboxState(selectors.itemBasicData.priceInKgCheckbox); - - expect(result).toBe('checked'); - }); - - it(`should confirm the item packingOut was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBasicData.packingOut, 'value'); - - expect(result).toEqual('5'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual({intrastat: 'Tropical Flowers'}); }); }); diff --git a/e2e/paths/04-item/03_tax.spec.js b/e2e/paths/04-item/03_tax.spec.js index 8b3b0f8b1..83f4e6bee 100644 --- a/e2e/paths/04-item/03_tax.spec.js +++ b/e2e/paths/04-item/03_tax.spec.js @@ -53,12 +53,4 @@ describe('Item edit tax path', () => { expect(firstVatType).toEqual('Reduced VAT'); }); - - // # #2680 Undo changes button bugs - xit(`should now click the undo changes button and see the form is restored`, async() => { - await page.waitToClick(selectors.itemTax.undoChangesButton); - const firstVatType = await page.waitToGetProperty(selectors.itemTax.firstClass, 'value'); - - expect(firstVatType).toEqual('General VAT'); - }); }); diff --git a/e2e/paths/04-item/07_create.spec.js b/e2e/paths/04-item/07_create.spec.js index 33324cdba..c20be9ebc 100644 --- a/e2e/paths/04-item/07_create.spec.js +++ b/e2e/paths/04-item/07_create.spec.js @@ -1,6 +1,10 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + form: 'vn-item-create form' +}; + describe('Item Create', () => { let browser; let page; @@ -14,13 +18,6 @@ describe('Item Create', () => { await browser.close(); }); - it(`should search for the item Infinity Gauntlet to confirm it isn't created yet`, async() => { - await page.doSearch('Infinity Gauntlet'); - const resultsCount = await page.countElement(selectors.itemsIndex.searchResult); - - expect(resultsCount).toEqual(0); - }); - it('should access to the create item view by clicking the create floating button', async() => { await page.waitToClick(selectors.itemsIndex.createItemButton); await page.waitForState('item.create'); @@ -37,44 +34,32 @@ describe('Item Create', () => { }); it('should throw an error when insert an invalid priority', async() => { - await page.write(selectors.itemCreateView.temporalName, 'Infinity Gauntlet'); - await page.autocompleteSearch(selectors.itemCreateView.type, 'Crisantemo'); - await page.autocompleteSearch(selectors.itemCreateView.intrastat, 'Coral y materiales similares'); - await page.autocompleteSearch(selectors.itemCreateView.origin, 'Holand'); - await page.clearInput(selectors.itemCreateView.priority); - await page.waitToClick(selectors.itemCreateView.createButton); - const message = await page.waitForSnackbar(); + const values = { + name: 'Infinity Gauntlet', + type: 'Crisantemo', + intrastat: 'Coral y materiales similares', + origin: 'Holand', + priority: null + }; + const message = await page.sendForm($.form, values); expect(message.text).toContain('Valid priorities'); }); it('should create the Infinity Gauntlet item', async() => { - await page.autocompleteSearch(selectors.itemCreateView.priority, '2'); - await page.waitToClick(selectors.itemCreateView.createButton); - const message = await page.waitForSnackbar(); + const values = { + name: 'Infinity Gauntlet', + type: 'Crisantemo', + intrastat: 'Coral y materiales similares', + origin: 'Holand', + priority: '2' + }; - expect(message.text).toContain('Data saved!'); - }); + await page.fillForm($.form, values); + const formValues = await page.fetchForm($.form, Object.keys(values)); + const message = await page.sendForm($.form); - it('should confirm Infinity Gauntlet item was created', async() => { - let result = await page - .waitToGetProperty(selectors.itemBasicData.name, 'value'); - - expect(result).toEqual('Infinity Gauntlet'); - - result = await page - .waitToGetProperty(selectors.itemBasicData.type, 'value'); - - expect(result).toEqual('Crisantemo'); - - result = await page - .waitToGetProperty(selectors.itemBasicData.intrastat, 'value'); - - expect(result).toEqual('5080000 Coral y materiales similares'); - - result = await page - .waitToGetProperty(selectors.itemBasicData.origin, 'value'); - - expect(result).toEqual('Holand'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual(values); }); }); diff --git a/e2e/paths/04-item/10_item_log.spec.js b/e2e/paths/04-item/10_item_log.spec.js index 6a7bd7ae2..dc467044d 100644 --- a/e2e/paths/04-item/10_item_log.spec.js +++ b/e2e/paths/04-item/10_item_log.spec.js @@ -42,23 +42,4 @@ describe('Item log path', () => { await page.waitForSelector(selectors.itemsIndex.createItemButton); await page.waitForState('item.index'); }); - - it(`should search for the created item and navigate to it's log section`, async() => { - await page.accessToSearchResult('Knowledge artifact'); - await page.accessToSection('item.card.log'); - }); - - it(`should confirm the log is showing 4 entries`, async() => { - await page.waitForSelector(selectors.itemLog.anyLineCreated); - const anyLineCreatedCount = await page.countElement(selectors.itemLog.anyLineCreated); - - expect(anyLineCreatedCount).toEqual(4); - }); - - xit(`should confirm the log is showing the intrastat for the created item`, async() => { - const fifthLineCreatedProperty = await page - .waitToGetProperty(selectors.itemLog.fifthLineCreatedProperty, 'innerText'); - - expect(fifthLineCreatedProperty).toEqual('05080000'); - }); }); diff --git a/e2e/paths/04-item/13_fixedPrice.spec.js b/e2e/paths/04-item/13_fixedPrice.spec.js index ec8238b87..37c4401b0 100644 --- a/e2e/paths/04-item/13_fixedPrice.spec.js +++ b/e2e/paths/04-item/13_fixedPrice.spec.js @@ -1,47 +1,95 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = selectors.itemFixedPrice; + describe('Item fixed prices path', () => { let browser; let page; + let httpRequest; + beforeAll(async() => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('buyer', 'item'); await page.accessToSection('item.fixedPrice'); + page.on('request', req => { + if (req.url().includes(`FixedPrices/filter`)) + httpRequest = req.url(); + }); }); afterAll(async() => { await browser.close(); }); + it('should filter using all the fields', async() => { + await page.write($.generalSearchFilter, 'item'); + await page.keyboard.press('Enter'); + + expect(httpRequest).toContain('search=item'); + + await page.click($.chip); + await page.click($.reignFilter); + + expect(httpRequest).toContain('categoryFk'); + + await page.autocompleteSearch($.typeFilter, 'Alstroemeria'); + + expect(httpRequest).toContain('typeFk'); + + await page.click($.chip); + await page.autocompleteSearch($.buyerFilter, 'buyerNick'); + + expect(httpRequest).toContain('buyerFk'); + + await page.click($.chip); + await page.autocompleteSearch($.warehouseFilter, 'Algemesi'); + + expect(httpRequest).toContain('warehouseFk'); + + await page.click($.chip); + await page.click($.mineFilter); + + expect(httpRequest).toContain('mine=true'); + + await page.click($.chip); + await page.click($.hasMinPriceFilter); + + expect(httpRequest).toContain('hasMinPrice=true'); + + await page.click($.chip); + await page.click($.addTag); + await page.autocompleteSearch($.tagFilter, 'Color'); + await page.autocompleteSearch($.tagValueFilter, 'Brown'); + + expect(httpRequest).toContain('tags'); + + await page.click($.chip); + }); + it('should click on the add new fixed price button', async() => { - await page.waitToClick(selectors.itemFixedPrice.removeWarehouseFilter); - await page.waitForSpinnerLoad(); - await page.waitToClick(selectors.itemFixedPrice.add); - await page.waitForSelector(selectors.itemFixedPrice.fourthFixedPrice); + await page.waitToClick($.add); + await page.waitForSelector($.fourthFixedPrice); }); it('should fill the fixed price data', async() => { const now = Date.vnNew(); - await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one'); - await page.writeOnEditableTD(selectors.itemFixedPrice.fourthGroupingPrice, '1'); - await page.writeOnEditableTD(selectors.itemFixedPrice.fourthPackingPrice, '1'); - await page.write(selectors.itemFixedPrice.fourthMinPrice, '1'); - await page.pickDate(selectors.itemFixedPrice.fourthStarted, now); - await page.pickDate(selectors.itemFixedPrice.fourthEnded, now); + await page.autocompleteSearch($.fourthWarehouse, 'Warehouse one'); + await page.writeOnEditableTD($.fourthGroupingPrice, '1'); + await page.writeOnEditableTD($.fourthPackingPrice, '1'); + await page.write($.fourthMinPrice, '1'); + await page.pickDate($.fourthStarted, now); + await page.pickDate($.fourthEnded, now); const message = await page.waitForSnackbar(); expect(message.text).toContain('Data saved!'); }); it('should reload the section and check the created price has the expected ID', async() => { - await page.accessToSection('item.index'); - await page.accessToSection('item.fixedPrice'); - await page.waitToClick(selectors.itemFixedPrice.removeWarehouseFilter); - await page.waitForSpinnerLoad(); + await page.goto(`http://localhost:5000/#!/item/fixed-price`); - const result = await page.waitToGetProperty(selectors.itemFixedPrice.fourthItemID, 'value'); + const result = await page.waitToGetProperty($.fourthItemID, 'value'); expect(result).toContain('13'); }); diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js index f9b520981..2c9646708 100644 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js @@ -246,9 +246,11 @@ describe('Ticket Edit sale path', () => { it('should select the third sale and create a claim of it', async() => { await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); + await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); await page.waitToClick(selectors.ticketSales.moreMenu); await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim); + await page.waitToClick(selectors.globalItems.acceptButton); await page.waitForState('claim.card.basicData'); }); @@ -314,7 +316,7 @@ describe('Ticket Edit sale path', () => { it('should confirm the transfered quantity is the correct one', async() => { const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleQuantityCell, 'innerText'); - expect(result).toContain('20'); + expect(result).toContain('10'); }); it('should go back to the original ticket sales section', async() => { @@ -423,20 +425,6 @@ describe('Ticket Edit sale path', () => { expect(result).toBeFalsy(); }); - // tickets no longer update their totals instantly, a task performed ever 5-10 mins does it. disabled this test until it changes. - xit('should update all sales discount', async() => { - await page.closePopup(); - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuUpdateDiscount); - await page.waitForSelector(selectors.ticketSales.moreMenuUpdateDiscountInput); - await page.type(selectors.ticketSales.moreMenuUpdateDiscountInput, '100'); - await page.keyboard.press('Enter'); - await page.waitForTextInElement(selectors.ticketSales.totalImport, '0.00'); - const result = await page.waitToGetProperty(selectors.ticketSales.totalImport, 'innerText'); - - expect(result).toContain('0.00'); - }); - it('should log in as Production role and go to a target ticket summary', async() => { await page.loginAndModule('production', 'ticket'); await page.accessToSearchResult('13'); diff --git a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js b/e2e/paths/05-ticket/02_expeditions_and_log.spec.js index ae5e2fb0c..edccd5561 100644 --- a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js +++ b/e2e/paths/05-ticket/02_expeditions_and_log.spec.js @@ -29,20 +29,4 @@ describe('Ticket expeditions and log path', () => { expect(result).toEqual(3); }); - - it(`should confirm the expedition deleted is shown now in the ticket log`, async() => { - await page.accessToSection('ticket.card.log'); - const user = await page - .waitToGetProperty(selectors.ticketLog.user, 'innerText'); - - const action = await page - .waitToGetProperty(selectors.ticketLog.action, 'innerText'); - - const id = await page - .waitToGetProperty(selectors.ticketLog.id, 'innerText'); - - expect(user).toContain('production'); - expect(action).toContain('Deletes'); - expect(id).toEqual('2'); - }); }); diff --git a/e2e/paths/05-ticket/04_packages.spec.js b/e2e/paths/05-ticket/04_packages.spec.js index f874307a8..2b79e9cb6 100644 --- a/e2e/paths/05-ticket/04_packages.spec.js +++ b/e2e/paths/05-ticket/04_packages.spec.js @@ -1,6 +1,13 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + firstPackage: 'vn-autocomplete[label="Package"]', + firstQuantity: 'vn-ticket-package vn-horizontal:nth-child(1) vn-input-number[ng-model="package.quantity"]', + firstRemovePackageButton: 'vn-icon-button[vn-tooltip="Remove package"]', + addPackageButton: 'vn-icon-button[vn-tooltip="Add package"]', + savePackagesButton: `button[type=submit]` +}; + describe('Ticket Create packages path', () => { let browser; let page; @@ -18,19 +25,19 @@ describe('Ticket Create packages path', () => { }); it(`should attempt create a new package but receive an error if package is blank`, async() => { - await page.waitToClick(selectors.ticketPackages.firstRemovePackageButton); - await page.waitToClick(selectors.ticketPackages.addPackageButton); - await page.write(selectors.ticketPackages.firstQuantity, '99'); - await page.waitToClick(selectors.ticketPackages.savePackagesButton); + await page.waitToClick($.firstRemovePackageButton); + await page.waitToClick($.addPackageButton); + await page.write($.firstQuantity, '99'); + await page.waitToClick($.savePackagesButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Package cannot be blank'); }); it(`should delete the first package and receive and error to save a new one with blank quantity`, async() => { - await page.clearInput(selectors.ticketPackages.firstQuantity); - await page.autocompleteSearch(selectors.ticketPackages.firstPackage, 'Container medical box 1m'); - await page.waitToClick(selectors.ticketPackages.savePackagesButton); + await page.clearInput($.firstQuantity); + await page.autocompleteSearch($.firstPackage, 'Container medical box 1m'); + await page.waitToClick($.savePackagesButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Some fields are invalid'); @@ -40,15 +47,15 @@ describe('Ticket Create packages path', () => { const result = await page .evaluate(selector => { return document.querySelector(`${selector} input`).checkValidity(); - }, selectors.ticketPackages.firstQuantity); + }, $.firstQuantity); expect(result).toBeTruthy(); }); it(`should create a new package with correct data`, async() => { - await page.clearInput(selectors.ticketPackages.firstQuantity); - await page.write(selectors.ticketPackages.firstQuantity, '-99'); - await page.waitToClick(selectors.ticketPackages.savePackagesButton); + await page.clearInput($.firstQuantity); + await page.write($.firstQuantity, '-99'); + await page.waitToClick($.savePackagesButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Data saved!'); @@ -56,15 +63,15 @@ describe('Ticket Create packages path', () => { it(`should confirm the first select is the expected one`, async() => { await page.reloadSection('ticket.card.package'); - await page.waitForTextInField(selectors.ticketPackages.firstPackage, 'Container medical box 1m'); - const result = await page.waitToGetProperty(selectors.ticketPackages.firstPackage, 'value'); + await page.waitForTextInField($.firstPackage, 'Container medical box 1m'); + const result = await page.waitToGetProperty($.firstPackage, 'value'); - expect(result).toEqual('7 : Container medical box 1m'); + expect(result).toEqual('Container medical box 1m'); }); it(`should confirm quantity is just a number and the string part was ignored by the imput number`, async() => { - await page.waitForTextInField(selectors.ticketPackages.firstQuantity, '-99'); - const result = await page.waitToGetProperty(selectors.ticketPackages.firstQuantity, 'value'); + await page.waitForTextInField($.firstQuantity, '-99'); + const result = await page.waitToGetProperty($.firstQuantity, 'value'); expect(result).toEqual('-99'); }); diff --git a/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js b/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js index a68ce894e..51ead6461 100644 --- a/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js +++ b/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js @@ -1,6 +1,11 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + form: 'vn-ticket-create-card', + moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]', + simpleTicketButton: '.vn-menu [name="simpleTicket"]' +}; + describe('Ticket create from client path', () => { let browser; let page; @@ -16,20 +21,17 @@ describe('Ticket create from client path', () => { await browser.close(); }); - it('should click the create simple ticket on the descriptor menu', async() => { - await page.waitToClick(selectors.clientDescriptor.moreMenu); - await page.waitToClick(selectors.clientDescriptor.simpleTicketButton); + it('should create simple ticket and check if the client details are the expected ones', async() => { + await page.waitToClick($.moreMenu); + await page.waitToClick($.simpleTicketButton); await page.waitForState('ticket.create'); - }); - it('should check if the client details are the expected ones', async() => { - const client = await page - .waitToGetProperty(selectors.createTicketView.client, 'value'); + const values = { + client: 'Petter Parker', + address: 'Petter Parker' + }; + const formValues = await page.fetchForm($.form, Object.keys(values)); - const address = await page - .waitToGetProperty(selectors.createTicketView.address, 'value'); - - expect(client).toContain('Petter Parker'); - expect(address).toContain('20 Ingram Street'); + expect(formValues).toEqual(values); }); }); diff --git a/e2e/paths/05-ticket/17_log.spec.js b/e2e/paths/05-ticket/17_log.spec.js index 32829ee74..e1da2df44 100644 --- a/e2e/paths/05-ticket/17_log.spec.js +++ b/e2e/paths/05-ticket/17_log.spec.js @@ -31,30 +31,4 @@ describe('Ticket log path', () => { expect(message.text).toContain('Data saved!'); }); - - it('should navigate to the log section', async() => { - await page.accessToSection('ticket.card.log'); - }); - - it('should set the viewport width to 1920 to see the table full width', async() => { - await page.setViewport({ - width: 1920, - height: 0, - }); - - const result = await page.waitToGetProperty(selectors.ticketLog.firstTD, 'innerText'); - - expect(result.length).not.toBeGreaterThan('20'); - }); - - it('should set the viewport width to 800 to see the table shrink and move data to the 1st column', async() => { - await page.setViewport({ - width: 800, - height: 0, - }); - - const result = await page.waitToGetProperty(selectors.ticketLog.firstTD, 'innerText'); - - expect(result.length).toBeGreaterThan('15'); - }); }); diff --git a/e2e/paths/05-ticket/18_index_payout.spec.js b/e2e/paths/05-ticket/18_index_payout.spec.js index 220dacf61..7e5201d11 100644 --- a/e2e/paths/05-ticket/18_index_payout.spec.js +++ b/e2e/paths/05-ticket/18_index_payout.spec.js @@ -1,5 +1,10 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + newPayment: '.vn-dialog.shown', + anyBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr', + firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable' +}; describe('Ticket index payout path', () => { let browser; @@ -8,17 +13,14 @@ describe('Ticket index payout path', () => { beforeAll(async() => { browser = await getBrowser(); page = browser.page; + await page.loginAndModule('administrative', 'ticket'); + await page.waitForState('ticket.index'); }); afterAll(async() => { await browser.close(); }); - it('should navigate to the ticket index', async() => { - await page.loginAndModule('administrative', 'ticket'); - await page.waitForState('ticket.index'); - }); - it('should check the second ticket from a client and 1 of another', async() => { await page.waitToClick(selectors.globalItems.searchButton); await page.waitToClick(selectors.ticketsIndex.thirdTicketCheckbox); @@ -42,27 +44,27 @@ describe('Ticket index payout path', () => { await page.waitForSelector(selectors.ticketsIndex.payoutCompany); }); - it('should fill the company and bank to perform a payout', async() => { - await page.autocompleteSearch(selectors.ticketsIndex.payoutCompany, 'VNL'); - await page.autocompleteSearch(selectors.ticketsIndex.payoutBank, 'cash'); - await page.write(selectors.clientBalance.newPaymentAmount, '100'); - await page.write(selectors.ticketsIndex.payoutDescription, 'Payment'); - await page.waitToClick(selectors.ticketsIndex.submitPayout); + it('should fill the company and bank to perform a payout and check a new balance line was entered', async() => { + await page.fillForm($.newPayment, { + company: 'VNL', + bank: 'cash', + amountPaid: 100, + description: 'Payment', + viewReceipt: false + }); + await page.respondToDialog('accept'); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should navigate to the client balance section and check a new balance line was entered', async() => { await page.waitToClick(selectors.globalItems.homeButton); await page.selectModule('client'); await page.accessToSearchResult('1101'); await page.accessToSection('client.card.balance.index'); - await page.waitForSelector(selectors.clientBalance.anyBalanceLine); - const count = await page.countElement(selectors.clientBalance.anyBalanceLine); - const reference = await page.waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText'); + await page.waitForSelector($.anyBalanceLine); + const count = await page.countElement($.anyBalanceLine); + const reference = await page.innerText($.firstLineReference); + expect(message.isSuccess).toBeTrue(); expect(count).toEqual(4); - expect(reference).toContain('Cash, Albaran: 7, 8Payment'); + expect(reference).toContain('Payment'); }); }); diff --git a/e2e/paths/05-ticket/21_future.spec.js b/e2e/paths/05-ticket/21_future.spec.js index 3c52048c7..82525c1db 100644 --- a/e2e/paths/05-ticket/21_future.spec.js +++ b/e2e/paths/05-ticket/21_future.spec.js @@ -1,6 +1,7 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; -// https://redmine.verdnatura.es/issues/5616 + +// 'https:// redmine.verdnatura.es/issues/5642' xdescribe('Ticket Future path', () => { let browser; let page; @@ -44,94 +45,67 @@ xdescribe('Ticket Future path', () => { expect(message.text).toContain('originDated is a required argument'); }); - it('should search with the required data', async() => { - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketFuture.submit); + // it('should search with the required data', async() => { + // await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); + // await page.waitToClick(selectors.ticketFuture.submit); - expect(httpRequest).toBeDefined(); - }); + // expect(httpRequest).toBeDefined(); + // }); - it('should search with the origin IPT', async() => { - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); + // it('should search with the origin IPT', async() => { + // await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.autocompleteSearch(selectors.ticketFuture.ipt, 'H'); - await page.waitToClick(selectors.ticketFuture.submit); + // await page.autocompleteSearch(selectors.ticketFuture.ipt, 'H'); + // await page.waitToClick(selectors.ticketFuture.submit); - expect(httpRequest).toContain('ipt=H'); - }); + // expect(httpRequest).toContain('ipt=H'); + // }); - it('should search with the destination IPT', async() => { - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); + // it('should search with the destination IPT', async() => { + // await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.ipt); + // await page.clearInput(selectors.ticketFuture.ipt); - await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'H'); - await page.waitToClick(selectors.ticketFuture.submit); + // await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'H'); + // await page.waitToClick(selectors.ticketFuture.submit); - expect(httpRequest).toContain('futureIpt=H'); - }); + // expect(httpRequest).toContain('futureIpt=H'); + // }); - it('should search with the origin grouped state', async() => { - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); + // it('should search with the origin grouped state', async() => { + // await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.futureIpt); + // await page.clearInput(selectors.ticketFuture.futureIpt); - await page.autocompleteSearch(selectors.ticketFuture.state, 'Free'); - await page.waitToClick(selectors.ticketFuture.submit); + // await page.autocompleteSearch(selectors.ticketFuture.state, 'Free'); + // await page.waitToClick(selectors.ticketFuture.submit); - expect(httpRequest).toContain('state=FREE'); - }); + // expect(httpRequest).toContain('state=FREE'); + // }); - it('should search with the destination grouped state', async() => { - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); + // it('should search with the destination grouped state', async() => { + // await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.state); + // await page.clearInput(selectors.ticketFuture.state); - await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free'); - await page.waitToClick(selectors.ticketFuture.submit); + // await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free'); + // await page.waitToClick(selectors.ticketFuture.submit); - expect(httpRequest).toContain('futureState=FREE'); + // expect(httpRequest).toContain('futureState=FREE'); - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.futureState); - await page.waitToClick(selectors.ticketFuture.submit); - }); + // await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); + // await page.clearInput(selectors.ticketFuture.futureState); + // await page.waitToClick(selectors.ticketFuture.submit); + // }); - it('should search in smart-table with an ID Origin', async() => { - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.write(selectors.ticketFuture.tableId, '1'); - await page.keyboard.press('Enter'); + // it('should check the three last tickets and move to the future', async() => { + // await page.waitForNumberOfElements(selectors.ticketFuture.searchResult, 4); + // await page.waitToClick(selectors.ticketFuture.multiCheck); + // await page.waitToClick(selectors.ticketFuture.firstCheck); + // await page.waitToClick(selectors.ticketFuture.moveButton); + // await page.waitToClick(selectors.globalItems.acceptButton); + // const message = await page.waitForSnackbar(); - expect(httpRequest).toContain('id'); - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - }); - - it('should search in smart-table with an IPT Destination', async() => { - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.autocompleteSearch(selectors.ticketFuture.tableFutureIpt, 'H'); - - expect(httpRequest).toContain('futureIpt'); - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - }); - - it('should search in smart-table with an ID Destination', async() => { - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.write(selectors.ticketFuture.tableFutureId, '1'); - await page.keyboard.press('Enter'); - - expect(httpRequest).toContain('futureId'); - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketFuture.submit); - }); - - it('should check the three last tickets and move to the future', async() => { - await page.waitToClick(selectors.ticketFuture.multiCheck); - await page.waitToClick(selectors.ticketFuture.firstCheck); - await page.waitToClick(selectors.ticketFuture.moveButton); - await page.waitToClick(selectors.ticketFuture.acceptButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Tickets moved successfully!'); - }); + // expect(message.text).toContain('Tickets moved successfully!'); + // }); }); diff --git a/e2e/paths/05-ticket/22_advance.spec.js b/e2e/paths/05-ticket/22_advance.spec.js index f8626d56d..f27120b3b 100644 --- a/e2e/paths/05-ticket/22_advance.spec.js +++ b/e2e/paths/05-ticket/22_advance.spec.js @@ -1,6 +1,7 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; -// https://redmine.verdnatura.es/issues/5616 + +// 'https:// redmine.verdnatura.es/issues/5642' xdescribe('Ticket Advance path', () => { let browser; let page; @@ -45,65 +46,43 @@ xdescribe('Ticket Advance path', () => { expect(message.text).toContain('dateFuture is a required argument'); }); - it('should search with the required data', async() => { - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketAdvance.submit); + // it('should search with the required data', async() => { + // await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); + // await page.waitToClick(selectors.ticketAdvance.submit); - expect(httpRequest).toBeDefined(); - }); + // expect(httpRequest).toBeDefined(); + // }); - it('should search with the origin IPT', async() => { - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'H'); - await page.waitToClick(selectors.ticketAdvance.submit); + // it('should search with the origin IPT', async() => { + // await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); + // await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'H'); + // await page.waitToClick(selectors.ticketAdvance.submit); - expect(httpRequest).toContain('futureIpt=H'); + // expect(httpRequest).toContain('futureIpt=H'); - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.futureIpt); - await page.waitToClick(selectors.ticketAdvance.submit); - }); + // await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); + // await page.clearInput(selectors.ticketAdvance.futureIpt); + // await page.waitToClick(selectors.ticketAdvance.submit); + // }); - it('should search with the destination IPT', async() => { - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'H'); - await page.waitToClick(selectors.ticketAdvance.submit); + // it('should search with the destination IPT', async() => { + // await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); + // await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'H'); + // await page.waitToClick(selectors.ticketAdvance.submit); - expect(httpRequest).toContain('ipt=H'); + // expect(httpRequest).toContain('ipt=H'); - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.ipt); - await page.waitToClick(selectors.ticketAdvance.submit); - }); + // await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); + // await page.clearInput(selectors.ticketAdvance.ipt); + // await page.waitToClick(selectors.ticketAdvance.submit); + // }); - it('should search in smart-table with an IPT Origin', async() => { - await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); - await page.autocompleteSearch(selectors.ticketAdvance.tableFutureIpt, 'V'); + // it('should check the first ticket and move to the present', async() => { + // await page.waitToClick(selectors.ticketAdvance.firstCheck); + // await page.waitToClick(selectors.ticketAdvance.moveButton); + // await page.waitToClick(selectors.ticketAdvance.acceptButton); + // const message = await page.waitForSnackbar(); - expect(httpRequest).toContain('futureIpt'); - - await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketAdvance.submit); - }); - - it('should search in smart-table with an IPT Destination', async() => { - await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); - await page.autocompleteSearch(selectors.ticketAdvance.tableIpt, 'V'); - - expect(httpRequest).toContain('ipt'); - - await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketAdvance.submit); - }); - - it('should check the first ticket and move to the present', async() => { - await page.waitToClick(selectors.ticketAdvance.firstCheck); - await page.waitToClick(selectors.ticketAdvance.moveButton); - await page.waitToClick(selectors.ticketAdvance.acceptButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Tickets moved successfully!'); - }); + // expect(message.text).toContain('Tickets moved successfully!'); + // }); }); diff --git a/e2e/paths/07-order/01_summary.spec.js b/e2e/paths/07-order/01_summary.spec.js index 922d5eeee..9df481ef6 100644 --- a/e2e/paths/07-order/01_summary.spec.js +++ b/e2e/paths/07-order/01_summary.spec.js @@ -1,6 +1,15 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span', + alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span', + consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(6) span', + subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)', + vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)', + total: 'vn-order-summary vn-one.taxes > p:nth-child(3)', + sale: 'vn-order-summary vn-tbody > vn-tr', +}; + describe('Order summary path', () => { let browser; let page; @@ -15,49 +24,23 @@ describe('Order summary path', () => { await browser.close(); }); - it('should reach the order summary section', async() => { + it('should reach the order summary section and check data', async() => { await page.waitForState('order.card.summary'); - }); - it('should check the summary contains the order id', async() => { - const result = await page.waitToGetProperty(selectors.orderSummary.id, 'innerText'); + const id = await page.innerText($.id); + const alias = await page.innerText($.alias); + const consignee = await page.innerText($.consignee); + const subtotal = await page.innerText($.subtotal); + const vat = await page.innerText($.vat); + const total = await page.innerText($.total); + const sale = await page.countElement($.sale); - expect(result).toEqual('16'); - }); - - it('should check the summary contains the order alias', async() => { - const result = await page.waitToGetProperty(selectors.orderSummary.alias, 'innerText'); - - expect(result).toEqual('Many places'); - }); - - it('should check the summary contains the order consignee', async() => { - const result = await page.waitToGetProperty(selectors.orderSummary.consignee, 'innerText'); - - expect(result).toEqual('address 26 - Gotham (Province one)'); - }); - - it('should check the summary contains the order subtotal', async() => { - const result = await page.waitToGetProperty(selectors.orderSummary.subtotal, 'innerText'); - - expect(result.length).toBeGreaterThan(1); - }); - - it('should check the summary contains the order vat', async() => { - const result = await page.waitToGetProperty(selectors.orderSummary.vat, 'innerText'); - - expect(result.length).toBeGreaterThan(1); - }); - - it('should check the summary contains the order total', async() => { - const result = await page.waitToGetProperty(selectors.orderSummary.total, 'innerText'); - - expect(result.length).toBeGreaterThan(1); - }); - - it('should check the summary contains the order sales', async() => { - const result = await page.countElement(selectors.orderSummary.sale); - - expect(result).toBeGreaterThan(0); + expect(id).toEqual('16'); + expect(alias).toEqual('Many places'); + expect(consignee).toEqual('address 26 - Gotham (Province one)'); + expect(subtotal.length).toBeGreaterThan(1); + expect(vat.length).toBeGreaterThan(1); + expect(total.length).toBeGreaterThan(1); + expect(sale).toBeGreaterThan(0); }); }); diff --git a/e2e/paths/07-order/02_basic_data.spec.js b/e2e/paths/07-order/02_basic_data.spec.js index 90eaf269e..b2c21b071 100644 --- a/e2e/paths/07-order/02_basic_data.spec.js +++ b/e2e/paths/07-order/02_basic_data.spec.js @@ -1,6 +1,13 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + form: 'vn-order-basic-data form', + observation: 'vn-order-basic-data form [vn-name="note"]', + saveButton: `vn-order-basic-data form button[type=submit]`, + acceptButton: '.vn-confirm.shown button[response="accept"]' +}; + describe('Order edit basic data path', () => { let browser; let page; @@ -20,90 +27,43 @@ describe('Order edit basic data path', () => { describe('when confirmed order', () => { it('should not be able to change the client', async() => { - await page.autocompleteSearch(selectors.orderBasicData.client, 'Tony Stark'); - await page.autocompleteSearch(selectors.orderBasicData.address, 'Tony Stark'); - await page.waitToClick(selectors.orderBasicData.saveButton); - const message = await page.waitForSnackbar(); + const message = await page.sendForm($.form, { + client: 'Tony Stark', + address: 'Tony Stark', + }); - expect(message.text).toContain(`You can't make changes on the basic data of an confirmed order or with rows`); - }); - }); - - describe('when order with rows', () => { - it('should now navigate to order index', async() => { - const orderId = '16'; - - await page.waitToClick(selectors.orderDescriptor.returnToModuleIndexButton); - await page.waitToClick(selectors.globalItems.acceptButton); - await page.waitForContentLoaded(); - await page.accessToSearchResult(orderId); - await page.accessToSection('order.card.basicData'); - await page.waitForSelector(selectors.orderBasicData.observation, {visible: true}); - await page.waitForState('order.card.basicData'); - }); - - it('should not be able to change anything', async() => { - await page.write(selectors.orderBasicData.observation, 'observation'); - await page.waitToClick(selectors.orderBasicData.saveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(`You can't make changes on the basic data of an confirmed order or with rows`); + expect(message.text).toContain(`You can't make changes on the basic data`); }); }); describe('when new order', () => { - it('should navigate to the order index and click the new order button', async() => { + it('should create an order and edit its basic data', async() => { await page.waitToClick(selectors.globalItems.returnToModuleIndexButton); - await page.waitToClick(selectors.orderBasicData.acceptButton); + await page.waitToClick($.acceptButton); await page.waitForContentLoaded(); await page.waitToClick(selectors.ordersIndex.createOrderButton); await page.waitForState('order.create'); - }); - it('should now create a new one', async() => { await page.autocompleteSearch(selectors.createOrderView.client, 'Jessica Jones'); await page.pickDate(selectors.createOrderView.landedDatePicker); await page.autocompleteSearch(selectors.createOrderView.agency, 'Other agency'); await page.waitToClick(selectors.createOrderView.createButton); await page.waitForState('order.card.catalog'); - }); - it('should navigate to the basic data section of the new order', async() => { await page.accessToSection('order.card.basicData'); - await page.waitForState('order.card.basicData'); - }); - it('should be able to modify all the properties', async() => { - await page.autocompleteSearch(selectors.orderBasicData.client, 'Tony Stark'); - await page.autocompleteSearch(selectors.orderBasicData.address, 'Tony Stark'); - await page.autocompleteSearch(selectors.orderBasicData.agency, 'Other agency'); - await page.write(selectors.orderBasicData.observation, 'my observation'); - await page.waitToClick(selectors.orderBasicData.saveButton); - const message = await page.waitForSnackbar(); + const values = { + client: 'Tony Stark', + address: 'Tony Stark', + agencyMode: 'Other agency' + }; - expect(message.text).toContain('Data saved!'); - }); - - it('should now confirm the client have been edited', async() => { + const message = await page.sendForm($.form, values); await page.reloadSection('order.card.basicData'); - const result = await page - .waitToGetProperty(selectors.orderBasicData.client, 'value'); + const formValues = await page.fetchForm($.form, Object.keys(values)); - expect(result).toEqual('1104: Tony Stark'); - }); - - it('should now confirm the agency have been edited', async() => { - const result = await page - .waitToGetProperty(selectors.orderBasicData.agency, 'value'); - - expect(result).toEqual('Other agency'); - }); - - it('should now confirm the observations have been edited', async() => { - const result = await page - .waitToGetProperty(selectors.orderBasicData.observation, 'value'); - - expect(result).toEqual('my observation'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual(values); }); }); }); diff --git a/e2e/paths/08-route/02_basic_data.spec.js b/e2e/paths/08-route/02_basic_data.spec.js index ff8361499..7ab7dda42 100644 --- a/e2e/paths/08-route/02_basic_data.spec.js +++ b/e2e/paths/08-route/02_basic_data.spec.js @@ -1,4 +1,3 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; describe('Route basic Data path', () => { @@ -17,47 +16,27 @@ describe('Route basic Data path', () => { await browser.close(); }); - it('should edit the route basic data', async() => { + it('should edit the route basic data and confirm the route was edited', async() => { const nextMonth = Date.vnNew(); nextMonth.setMonth(nextMonth.getMonth() + 1); + nextMonth.setUTCHours(0, 0, 0, 0); - await page.autocompleteSearch(selectors.routeBasicData.worker, 'adminBossNick'); - await page.autocompleteSearch(selectors.routeBasicData.vehicle, '1111-IMK'); - await page.pickDate(selectors.routeBasicData.createdDate, nextMonth); - await page.clearInput(selectors.routeBasicData.kmStart); - await page.write(selectors.routeBasicData.kmStart, '1'); - await page.clearInput(selectors.routeBasicData.kmEnd); - await page.write(selectors.routeBasicData.kmEnd, '2'); - await page.type(`${selectors.routeBasicData.startedHour} input`, '0800'); - await page.type(`${selectors.routeBasicData.finishedHour} input`, '1230'); - await page.waitToClick(selectors.routeBasicData.saveButton); - const message = await page.waitForSnackbar(); + const form = 'vn-route-basic-data form'; + const values = { + worker: 'adminBossNick', + vehicle: '1111-IMK', + created: nextMonth, + kmStart: 1, + kmEnd: 2, + started: '08:00', + finished: '12:30', + }; - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the worker was edited', async() => { + const message = await page.sendForm(form, values); await page.reloadSection('route.card.basicData'); - const worker = await page.waitToGetProperty(selectors.routeBasicData.worker, 'value'); + const formValues = await page.fetchForm(form, Object.keys(values)); - expect(worker).toEqual('adminBoss - adminBossNick'); - }); - - it('should confirm the vehicle was edited', async() => { - const vehicle = await page.waitToGetProperty(selectors.routeBasicData.vehicle, 'value'); - - expect(vehicle).toEqual('1111-IMK'); - }); - - it('should confirm the km start was edited', async() => { - const kmStart = await page.waitToGetProperty(selectors.routeBasicData.kmStart, 'value'); - - expect(kmStart).toEqual('1'); - }); - - it('should confirm the km end was edited', async() => { - const kmEnd = await page.waitToGetProperty(selectors.routeBasicData.kmEnd, 'value'); - - expect(kmEnd).toEqual('2'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual(values); }); }); diff --git a/e2e/paths/08-route/04_tickets.spec.js b/e2e/paths/08-route/04_tickets.spec.js index 950e11d3e..ccd5562c2 100644 --- a/e2e/paths/08-route/04_tickets.spec.js +++ b/e2e/paths/08-route/04_tickets.spec.js @@ -57,11 +57,4 @@ describe('Route tickets path', () => { it('should now count how many tickets are in route to find one less', async() => { await page.waitForNumberOfElements(selectors.routeTickets.anyTicket, 0); }); - - // #2862 updateVolume() route descriptor no actualiza volumen - xit('should confirm the route volume on the descriptor has been updated by the changes made', async() => { - const result = await page.waitToGetProperty(selectors.routeDescriptor.volume, 'innerText'); - - expect(result).toEqual('0 / 50 m³'); - }); }); diff --git a/e2e/paths/09-invoice-in/04_tax.spec.js b/e2e/paths/09-invoice-in/04_tax.spec.js index b1dbe2008..d51c39048 100644 --- a/e2e/paths/09-invoice-in/04_tax.spec.js +++ b/e2e/paths/09-invoice-in/04_tax.spec.js @@ -17,55 +17,36 @@ describe('InvoiceIn tax path', () => { await browser.close(); }); - it('should add a new tax', async() => { + it('should add a new tax and check it', async() => { await page.waitToClick(selectors.invoiceInTax.addTaxButton); await page.autocompleteSearch(selectors.invoiceInTax.thirdExpense, '6210000567'); await page.write(selectors.invoiceInTax.thirdTaxableBase, '100'); - await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, '6'); + await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, 'H.P. IVA'); await page.autocompleteSearch(selectors.invoiceInTax.thirdTransactionType, 'Operaciones exentas'); await page.waitToClick(selectors.invoiceInTax.saveButton); const message = await page.waitForSnackbar(); - expect(message.text).toContain('Data saved!'); - }); - - it('should navigate to the summary and check the taxable base sum is correct', async() => { await page.waitToClick(selectors.invoiceInDescriptor.summaryIcon); await page.waitForState('invoiceIn.card.summary'); - const result = await page.waitToGetProperty(selectors.invoiceInSummary.totalTaxableBase, 'innerText'); + const total = await page.waitToGetProperty(selectors.invoiceInSummary.totalTaxableBase, 'innerText'); - expect(result).toEqual('Taxable base €1,323.16'); - }); - - it('should navigate back to tax section, check the reciently added line contains the expected expense', async() => { await page.accessToSection('invoiceIn.card.tax'); - const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpense, 'value'); - expect(result).toEqual('6210000567: Alquiler VNH'); - }); + const thirdExpense = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpense, 'value'); + const thirdTaxableBase = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxableBase, 'value'); + const thirdTaxType = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxType, 'value'); + const thirdTransactionType = await page.waitToGetProperty(selectors.invoiceInTax.thirdTransactionType, 'value'); + const thirdRate = await page.waitToGetProperty(selectors.invoiceInTax.thirdRate, 'value'); - it('should check the reciently added line contains the expected taxable base', async() => { - const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxableBase, 'value'); + expect(message.text).toContain('Data saved!'); - expect(result).toEqual('100'); - }); + expect(total).toEqual('Taxable base €1,323.16'); - it('should check the reciently added line contains the expected tax type', async() => { - const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxType, 'value'); - - expect(result).toEqual('6: H.P. IVA 4% CEE'); - }); - - it('should check the reciently added line contains the expected transaction type', async() => { - const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdTransactionType, 'value'); - - expect(result).toEqual('37: Operaciones exentas'); - }); - - it('should check the reciently added line contains the expected rate', async() => { - const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdRate, 'value'); - - expect(result).toEqual('€4.00'); + expect(thirdExpense).toEqual('6210000567'); + expect(thirdTaxableBase).toEqual('100'); + expect(thirdTaxType).toEqual('H.P. IVA 4% CEE'); + expect(thirdTransactionType).toEqual('Operaciones exentas'); + expect(thirdRate).toEqual('€4.00'); }); it('should delete the added line', async() => { diff --git a/e2e/paths/09-invoice-in/05_serial.spec.js b/e2e/paths/09-invoice-in/05_serial.spec.js index 3aa94f48c..8be5660da 100644 --- a/e2e/paths/09-invoice-in/05_serial.spec.js +++ b/e2e/paths/09-invoice-in/05_serial.spec.js @@ -35,7 +35,7 @@ describe('InvoiceIn serial path', () => { }); it('should go to index and check if the search-panel has the correct params', async() => { - await page.click(selectors.invoiceInSerial.goToIndex); + await page.waitToClick(selectors.invoiceInSerial.goToIndex); const params = await page.$$(selectors.invoiceInIndex.topbarSearchParams); const serial = await params[0].getProperty('title'); const isBooked = await params[1].getProperty('title'); diff --git a/e2e/paths/09-invoice-out/03_manualInvoice.spec.js b/e2e/paths/09-invoice-out/03_manualInvoice.spec.js index abb9ca7e7..dfaa55ef9 100644 --- a/e2e/paths/09-invoice-out/03_manualInvoice.spec.js +++ b/e2e/paths/09-invoice-out/03_manualInvoice.spec.js @@ -15,49 +15,39 @@ describe('InvoiceOut manual invoice path', () => { await browser.close(); }); - it('should open the manual invoice form', async() => { + it('should create an invoice from a ticket', async() => { await page.waitToClick(selectors.invoiceOutIndex.createInvoice); await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm); - }); - it('should create an invoice from a ticket', async() => { await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTicket, '15'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national'); await page.waitToClick(selectors.invoiceOutIndex.saveInvoice); const message = await page.waitForSnackbar(); + await page.waitForState('invoiceOut.card.summary'); + expect(message.text).toContain('Data saved!'); }); - it(`should have been redirected to the created invoice summary`, async() => { - await page.waitForState('invoiceOut.card.summary'); - }); - - it(`should navigate back to the invoiceOut index`, async() => { + it(`should create another invoice from a client`, async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.invoiceOutButton); await page.waitForSelector(selectors.invoiceOutIndex.topbarSearch); await page.waitForState('invoiceOut.index'); - }); - it('should now open the manual invoice form', async() => { await page.waitToClick(selectors.invoiceOutIndex.createInvoice); await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm); - }); - it('should create an invoice from a client', async() => { await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceClient, 'Max Eisenhardt'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national'); await page.waitToClick(selectors.invoiceOutIndex.saveInvoice); const message = await page.waitForSnackbar(); + await page.waitForState('invoiceOut.card.summary'); + expect(message.text).toContain('Data saved!'); }); - - it(`should have been redirected to the created invoice summary`, async() => { - await page.waitForState('invoiceOut.card.summary'); - }); }); diff --git a/e2e/paths/09-invoice-out/04_globalInvoice.spec.js b/e2e/paths/09-invoice-out/04_globalInvoice.spec.js index 23aa3593c..64cddfa25 100644 --- a/e2e/paths/09-invoice-out/04_globalInvoice.spec.js +++ b/e2e/paths/09-invoice-out/04_globalInvoice.spec.js @@ -18,7 +18,6 @@ describe('InvoiceOut global invoice path', () => { }); let invoicesBeforeOneClient; - let invoicesBeforeAllClients; let now = Date.vnNew(); it('should count the amount of invoices listed before globla invoces are made', async() => { @@ -27,13 +26,10 @@ describe('InvoiceOut global invoice path', () => { expect(invoicesBeforeOneClient).toBeGreaterThanOrEqual(4); }); - it('should open the global invoice form', async() => { - await page.accessToSection('invoiceOut.global-invoicing'); - }); - it('should create a global invoice for charles xavier today', async() => { + await page.accessToSection('invoiceOut.global-invoicing'); await page.waitToClick(selectors.invoiceOutGlobalInvoicing.oneClient); - await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.clientId, '1108'); + await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.clientId, 'Charles Xavier'); await page.pickDate(selectors.invoiceOutGlobalInvoicing.invoiceDate, now); await page.pickDate(selectors.invoiceOutGlobalInvoicing.maxShipped, now); await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.printer, '1'); diff --git a/e2e/paths/10-travel/01_create.spec.js b/e2e/paths/10-travel/01_create.spec.js index 15da42d5d..98ade4852 100644 --- a/e2e/paths/10-travel/01_create.spec.js +++ b/e2e/paths/10-travel/01_create.spec.js @@ -4,9 +4,6 @@ import getBrowser from '../../helpers/puppeteer'; describe('Travel create path', () => { let browser; let page; - const date = Date.vnNew(); - const day = 15; - date.setDate(day); beforeAll(async() => { browser = await getBrowser(); @@ -18,60 +15,28 @@ describe('Travel create path', () => { await browser.close(); }); - it('should open the create travel form by clicking on the "new" button', async() => { + it('should create a new travel and check it was created with the correct data', async() => { + const date = Date.vnNew(); + date.setDate(15); + date.setUTCHours(0, 0, 0, 0); + await page.waitToClick(selectors.travelIndex.newTravelButton); await page.waitForState('travel.create'); - }); - it('should fill the reference, agency and ship date then save the form', async() => { - await page.write(selectors.travelIndex.reference, 'Testing reference'); - await page.autocompleteSearch(selectors.travelIndex.agency, 'inhouse pickup'); - await page.pickDate(selectors.travelIndex.shipDate, date); // this line autocompletes another 3 fields - await page.waitForTimeout(1000); - await page.waitToClick(selectors.travelIndex.save); + const values = { + reference: 'Testing reference', + agencyMode: 'inhouse pickup', + shipped: date, + landed: date, + warehouseOut: 'Warehouse One', + warehouseIn: 'Warehouse Five' + }; - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should check the user was redirected to the travel basic data upon creation', async() => { + const message = await page.sendForm('vn-travel-create form', values); await page.waitForState('travel.card.basicData'); - }); + const formValues = await page.fetchForm('vn-travel-basic-data form', Object.keys(values)); - it('should check the travel was created with the correct reference', async() => { - const reference = await page.waitToGetProperty(selectors.travelBasicData.reference, 'value'); - - expect(reference).toContain('Testing reference'); - }); - - it('should check the travel was created with the correct agency', async() => { - const agency = await page.waitToGetProperty(selectors.travelBasicData.agency, 'value'); - - expect(agency).toContain('inhouse pickup'); - }); - - it('should check the travel was created with the correct shiping date', async() => { - const shipDate = await page.waitToGetProperty(selectors.travelBasicData.shippedDate, 'value'); - - expect(shipDate).toContain(day); - }); - - it('should check the travel was created with the correct landing date', async() => { - const landingDate = await page.waitToGetProperty(selectors.travelBasicData.deliveryDate, 'value'); - - expect(landingDate).toContain(day); - }); - - it('should check the travel was created with the correct warehouseOut', async() => { - const warehouseOut = await page.waitToGetProperty(selectors.travelBasicData.outputWarehouse, 'value'); - - expect(warehouseOut).toContain('Warehouse One'); - }); - - it('should check the travel was created with the correct warehouseIn', async() => { - const warehouseIn = await page.waitToGetProperty(selectors.travelBasicData.inputWarehouse, 'value'); - - expect(warehouseIn).toContain('Warehouse Five'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual(values); }); }); diff --git a/e2e/paths/11-zone/02_descriptor.spec.js b/e2e/paths/11-zone/02_descriptor.spec.js index 12a1c8f68..f3c0e7740 100644 --- a/e2e/paths/11-zone/02_descriptor.spec.js +++ b/e2e/paths/11-zone/02_descriptor.spec.js @@ -29,14 +29,4 @@ describe('Zone descriptor path', () => { expect(count).toEqual(0); }); - - it('should check the ticket whom lost the zone and see evidence on the logs', async() => { - await page.waitToClick(selectors.globalItems.homeButton); - await page.selectModule('ticket'); - await page.accessToSearchResult('20'); - await page.accessToSection('ticket.card.log'); - const lastChanges = await page.waitToGetProperty(selectors.ticketLog.changes, 'innerText'); - - expect(lastChanges).toContain('1'); - }); }); diff --git a/e2e/paths/12-entry/03_latestBuys.spec.js b/e2e/paths/12-entry/03_latestBuys.spec.js index a73e12659..9ec072912 100644 --- a/e2e/paths/12-entry/03_latestBuys.spec.js +++ b/e2e/paths/12-entry/03_latestBuys.spec.js @@ -42,20 +42,6 @@ describe('Entry lastest buys path', () => { expect(httpRequests.find(req => req.includes(('typeFk')))).toBeDefined(); }); - it('should filter by from date', async() => { - await page.pickDate(selectors.entryLatestBuys.fromInput, new Date()); - await page.waitToClick(selectors.entryLatestBuys.chip); - - expect(httpRequests.find(req => req.includes(('from')))).toBeDefined(); - }); - - it('should filter by to date', async() => { - await page.pickDate(selectors.entryLatestBuys.toInput, new Date()); - await page.waitToClick(selectors.entryLatestBuys.chip); - - expect(httpRequests.find(req => req.includes(('to')))).toBeDefined(); - }); - it('should filter by sales person', async() => { await page.autocompleteSearch(selectors.entryLatestBuys.salesPersonInput, 'buyerNick'); await page.waitToClick(selectors.entryLatestBuys.chip); diff --git a/e2e/paths/12-entry/04_create.spec.js b/e2e/paths/12-entry/04_create.spec.js index 20fa6b23d..537637671 100644 --- a/e2e/paths/12-entry/04_create.spec.js +++ b/e2e/paths/12-entry/04_create.spec.js @@ -21,8 +21,8 @@ describe('Entry create path', () => { }); it('should fill the form to create a valid entry then redirect to basic Data', async() => { - await page.autocompleteSearch(selectors.entryIndex.newEntrySupplier, '2'); - await page.autocompleteSearch(selectors.entryIndex.newEntryTravel, 'Warehouse Three'); + await page.autocompleteSearch(selectors.entryIndex.newEntrySupplier, 'The farmer'); + await page.autocompleteSearch(selectors.entryIndex.newEntryTravel, 'Warehouse'); await page.autocompleteSearch(selectors.entryIndex.newEntryCompany, 'ORN'); await page.waitToClick(selectors.entryIndex.saveNewEntry); diff --git a/e2e/paths/12-entry/05_basicData.spec.js b/e2e/paths/12-entry/05_basicData.spec.js index 3b5f40c35..15282820e 100644 --- a/e2e/paths/12-entry/05_basicData.spec.js +++ b/e2e/paths/12-entry/05_basicData.spec.js @@ -1,6 +1,22 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; +const $ = { + reference: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.reference"]', + invoiceNumber: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.invoiceNumber"]', + notes: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.notes"]', + observations: 'vn-entry-basic-data vn-textarea[ng-model="$ctrl.entry.observation"]', + supplier: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.supplierFk"]', + currency: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.currencyFk"]', + commission: 'vn-entry-basic-data vn-input-number[ng-model="$ctrl.entry.commission"]', + company: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.companyFk"]', + ordered: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isOrdered"]', + confirmed: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isConfirmed"]', + inventory: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isExcludedFromAvailable"]', + raid: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isRaid"]', + booked: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isBooked"]', + save: 'vn-entry-basic-data button[type=submit]', +}; + describe('Entry basic data path', () => { let browser; let page; @@ -17,105 +33,49 @@ describe('Entry basic data path', () => { await browser.close(); }); - it('should edit the basic data', async() => { - await page.write(selectors.entryBasicData.reference, 'new movement 8'); - await page.write(selectors.entryBasicData.invoiceNumber, 'new movement 8'); - await page.write(selectors.entryBasicData.notes, 'new notes'); - await page.write(selectors.entryBasicData.observations, ' edited'); - await page.autocompleteSearch(selectors.entryBasicData.supplier, 'Plants nick'); - await page.autocompleteSearch(selectors.entryBasicData.currency, 'eur'); - await page.clearInput(selectors.entryBasicData.commission); - await page.write(selectors.entryBasicData.commission, '100'); - await page.autocompleteSearch(selectors.entryBasicData.company, 'CCs'); - await page.waitToClick(selectors.entryBasicData.ordered); - await page.waitToClick(selectors.entryBasicData.confirmed); - await page.waitToClick(selectors.entryBasicData.inventory); - await page.waitToClick(selectors.entryBasicData.raid); - await page.waitToClick(selectors.entryBasicData.booked); - await page.waitToClick(selectors.entryBasicData.save); - + it('should edit the basic data and confirm the reference was edited', async() => { + await page.write($.reference, 'new movement 8'); + await page.write($.invoiceNumber, 'new movement 8'); + await page.write($.observations, ' edited'); + await page.autocompleteSearch($.supplier, 'Plants nick'); + await page.autocompleteSearch($.currency, 'eur'); + await page.clearInput($.commission); + await page.write($.commission, '100'); + await page.autocompleteSearch($.company, 'CCs'); + await page.waitToClick($.ordered); + await page.waitToClick($.confirmed); + await page.waitToClick($.inventory); + await page.waitToClick($.raid); + await page.waitToClick($.booked); + await page.waitToClick($.save); const message = await page.waitForSnackbar(); + await page.reloadSection('entry.card.basicData'); + const reference = await page.waitToGetProperty($.reference, 'value'); + const supplier = await page.waitToGetProperty($.supplier, 'value'); + const invoiceNumber = await page.waitToGetProperty($.invoiceNumber, 'value'); + const observations = await page.waitToGetProperty($.observations, 'value'); + const currency = await page.waitToGetProperty($.currency, 'value'); + const commission = await page.waitToGetProperty($.commission, 'value'); + const company = await page.waitToGetProperty($.company, 'value'); + const ordered = await page.checkboxState($.ordered); + const confirmed = await page.checkboxState($.confirmed); + const inventory = await page.checkboxState($.inventory); + const raid = await page.checkboxState($.raid); + const booked = await page.checkboxState($.booked); + expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the reference was edited', async() => { - await page.reloadSection('entry.card.basicData'); - const result = await page.waitToGetProperty(selectors.entryBasicData.reference, 'value'); - - expect(result).toEqual('new movement 8'); - }); - - it('should confirm the invoiceNumber was edited', async() => { - await page.reloadSection('entry.card.basicData'); - const result = await page.waitToGetProperty(selectors.entryBasicData.invoiceNumber, 'value'); - - expect(result).toEqual('new movement 8'); - }); - - it('should confirm the note was edited', async() => { - const result = await page.waitToGetProperty(selectors.entryBasicData.notes, 'value'); - - expect(result).toEqual('new notes'); - }); - - it('should confirm the observation was edited', async() => { - const result = await page.waitToGetProperty(selectors.entryBasicData.observations, 'value'); - - expect(result).toEqual('observation two edited'); - }); - - it('should confirm the supplier was edited', async() => { - const result = await page.waitToGetProperty(selectors.entryBasicData.supplier, 'value'); - - expect(result).toEqual('1 - Plants nick'); - }); - - it('should confirm the currency was edited', async() => { - const result = await page.waitToGetProperty(selectors.entryBasicData.currency, 'value'); - - expect(result).toEqual('EUR'); - }); - - it('should confirm the commission was edited', async() => { - const result = await page.waitToGetProperty(selectors.entryBasicData.commission, 'value'); - - expect(result).toEqual('100'); - }); - - it('should confirm the company was edited', async() => { - const result = await page.waitToGetProperty(selectors.entryBasicData.company, 'value'); - - expect(result).toEqual('CCs'); - }); - - it('should confirm ordered was edited', async() => { - const result = await page.checkboxState(selectors.entryBasicData.ordered); - - expect(result).toBe('checked'); - }); - - it('should confirm confirmed was edited', async() => { - const result = await page.checkboxState(selectors.entryBasicData.confirmed); - - expect(result).toBe('checked'); - }); - - it('should confirm inventory was edited', async() => { - const result = await page.checkboxState(selectors.entryBasicData.inventory); - - expect(result).toBe('checked'); - }); - - it('should confirm raid was edited', async() => { - const result = await page.checkboxState(selectors.entryBasicData.raid); - - expect(result).toBe('checked'); - }); - - it('should confirm booked was edited', async() => { - const result = await page.checkboxState(selectors.entryBasicData.booked); - - expect(result).toBe('checked'); + expect(reference).toEqual('new movement 8'); + expect(supplier).toEqual('Plants nick'); + expect(invoiceNumber).toEqual('new movement 8'); + expect(observations).toEqual('observation two edited'); + expect(currency).toEqual('EUR'); + expect(commission).toEqual('100'); + expect(company).toEqual('CCs'); + expect(ordered).toBe('checked'); + expect(confirmed).toBe('checked'); + expect(inventory).toBe('checked'); + expect(raid).toBe('checked'); + expect(booked).toBe('checked'); }); }); diff --git a/e2e/paths/12-entry/07_buys.spec.js b/e2e/paths/12-entry/07_buys.spec.js index 4487394df..e501452bc 100644 --- a/e2e/paths/12-entry/07_buys.spec.js +++ b/e2e/paths/12-entry/07_buys.spec.js @@ -86,40 +86,47 @@ describe('Entry import, create and edit buys path', () => { await page.waitForNumberOfElements(selectors.entryBuys.anyBuyLine, 2); }); - it('should edit the newest buy', async() => { + it('should edit the newest buy and check data', async() => { await page.clearInput(selectors.entryBuys.secondBuyPackingPrice); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyPackingPrice, '100'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.clearInput(selectors.entryBuys.secondBuyGroupingPrice); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyGroupingPrice, '200'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.clearInput(selectors.entryBuys.secondBuyPrice); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyPrice, '300'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.clearInput(selectors.entryBuys.secondBuyGrouping); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyGrouping, '400'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.clearInput(selectors.entryBuys.secondBuyPacking); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyPacking, '500'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.clearInput(selectors.entryBuys.secondBuyWeight); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyWeight, '600'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.clearInput(selectors.entryBuys.secondBuyStickers); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyStickers, '700'); + await page.keyboard.press('Enter'); await page.waitForSnackbar(); await page.autocompleteSearch(selectors.entryBuys.secondBuyPackage, '94'); @@ -128,60 +135,28 @@ describe('Entry import, create and edit buys path', () => { await page.clearInput(selectors.entryBuys.secondBuyQuantity); await page.waitForTimeout(250); await page.write(selectors.entryBuys.secondBuyQuantity, '800'); - }); + await page.keyboard.press('Enter'); - it('should reload the section and check the packing price is as expected', async() => { await page.reloadSection('entry.card.buy.index'); - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPackingPrice, 'value'); - expect(result).toEqual('100'); - }); + const secondBuyPackingPrice = await page.getValue(selectors.entryBuys.secondBuyPackingPrice); + const secondBuyGroupingPrice = await page.getValue(selectors.entryBuys.secondBuyGroupingPrice); + const secondBuyPrice = await page.getValue(selectors.entryBuys.secondBuyPrice); + const secondBuyGrouping = await page.getValue(selectors.entryBuys.secondBuyGrouping); + const secondBuyPacking = await page.getValue(selectors.entryBuys.secondBuyPacking); + const secondBuyWeight = await page.getValue(selectors.entryBuys.secondBuyWeight); + const secondBuyStickers = await page.getValue(selectors.entryBuys.secondBuyStickers); + const secondBuyPackage = await page.getValue(selectors.entryBuys.secondBuyPackage); + const secondBuyQuantity = await page.getValue(selectors.entryBuys.secondBuyQuantity); - it('should reload the section and check the grouping price is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyGroupingPrice, 'value'); - - expect(result).toEqual('200'); - }); - - it('should reload the section and check the price is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPrice, 'value'); - - expect(result).toEqual('300'); - }); - - it('should reload the section and check the grouping is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyGrouping, 'value'); - - expect(result).toEqual('400'); - }); - - it('should reload the section and check the packing is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPacking, 'value'); - - expect(result).toEqual('500'); - }); - - it('should reload the section and check the weight is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyWeight, 'value'); - - expect(result).toEqual('600'); - }); - - it('should reload the section and check the stickers are as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyStickers, 'value'); - - expect(result).toEqual('700'); - }); - - it('should reload the section and check the package is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPackage, 'value'); - - expect(result).toEqual('94'); - }); - - it('should reload the section and check the quantity is as expected', async() => { - const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyQuantity, 'value'); - - expect(result).toEqual('800'); + expect(secondBuyPackingPrice).toEqual('100'); + expect(secondBuyGroupingPrice).toEqual('200'); + expect(secondBuyPrice).toEqual('300'); + expect(secondBuyGrouping).toEqual('400'); + expect(secondBuyPacking).toEqual('500'); + expect(secondBuyWeight).toEqual('600'); + expect(secondBuyStickers).toEqual('700'); + expect(secondBuyPackage).toEqual('94'); + expect(secondBuyQuantity).toEqual('800'); }); }); diff --git a/e2e/paths/13-supplier/02_basic_data.spec.js b/e2e/paths/13-supplier/02_basic_data.spec.js index 9d86e11d4..72ea6d890 100644 --- a/e2e/paths/13-supplier/02_basic_data.spec.js +++ b/e2e/paths/13-supplier/02_basic_data.spec.js @@ -64,14 +64,4 @@ describe('Supplier basic data path', () => { expect(result).toEqual('Some notes'); }); - - it('should navigate to the log section', async() => { - await page.accessToSection('supplier.card.log'); - }); - - it('should check the changes have been recorded', async() => { - const result = await page.waitToGetProperty('vn-tr table tr:nth-child(3) td.after', 'innerText'); - - expect(result).toEqual('Some notes'); - }); }); diff --git a/e2e/paths/13-supplier/03_fiscal_data.spec.js b/e2e/paths/13-supplier/03_fiscal_data.spec.js index 4f9581e32..80c6c79b2 100644 --- a/e2e/paths/13-supplier/03_fiscal_data.spec.js +++ b/e2e/paths/13-supplier/03_fiscal_data.spec.js @@ -1,4 +1,3 @@ -import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; describe('Supplier fiscal data path', () => { @@ -10,102 +9,48 @@ describe('Supplier fiscal data path', () => { page = browser.page; await page.loginAndModule('administrative', 'supplier'); await page.accessToSearchResult('2'); - await page.accessToSection('supplier.card.fiscalData'); }); afterAll(async() => { await browser.close(); }); - it('should attempt to edit the fiscal data but fail as the tax number is invalid', async() => { - await page.clearInput(selectors.supplierFiscalData.city); - await page.clearInput(selectors.supplierFiscalData.province); - await page.clearInput(selectors.supplierFiscalData.country); - await page.clearInput(selectors.supplierFiscalData.postCode); - await page.write(selectors.supplierFiscalData.city, 'Valencia'); - await page.waitForTimeout(1000); // must repeat this action twice or fails. also #2699 may be a cool solution to this. - await page.clearInput(selectors.supplierFiscalData.city); - await page.write(selectors.supplierFiscalData.city, 'Valencia'); - await page.clearInput(selectors.supplierFiscalData.socialName); - await page.write(selectors.supplierFiscalData.socialName, 'Farmer King SL'); - await page.clearInput(selectors.supplierFiscalData.taxNumber); - await page.write(selectors.supplierFiscalData.taxNumber, 'Wrong tax number'); - await page.clearInput(selectors.supplierFiscalData.account); - await page.write(selectors.supplierFiscalData.account, '0123456789'); - await page.autocompleteSearch(selectors.supplierFiscalData.sageWihholding, 'retencion estimacion objetiva'); - await page.autocompleteSearch(selectors.supplierFiscalData.sageTaxType, 'operaciones no sujetas'); + it('should attempt to edit the fiscal data and check data is saved', async() => { + await page.accessToSection('supplier.card.fiscalData'); - await page.waitToClick(selectors.supplierFiscalData.saveButton); - const message = await page.waitForSnackbar(); + const form = 'vn-supplier-fiscal-data form'; + const values = { + province: null, + country: null, + postcode: null, + city: 'Valencia', + socialName: 'Farmer King SL', + taxNumber: 'Wrong tax number', + account: '0123456789', + sageWithholding: 'retencion estimacion objetiva', + sageTaxType: 'operaciones no sujetas' + }; - expect(message.text).toContain('Invalid Tax number'); - }); + const errorMessage = await page.sendForm(form, values); + const message = await page.sendForm(form, { + taxNumber: '12345678Z' + }); - it('should save the changes as the tax number is valid this time', async() => { - await page.clearInput(selectors.supplierFiscalData.taxNumber); - await page.write(selectors.supplierFiscalData.taxNumber, '12345678Z'); - - await page.waitToClick(selectors.supplierFiscalData.saveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should reload the section', async() => { await page.reloadSection('supplier.card.fiscalData'); - }); + const formValues = await page.fetchForm(form, Object.keys(values)); - it('should check the socialName was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.socialName, 'value'); - - expect(result).toEqual('Farmer King SL'); - }); - - it('should check the taxNumber was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.taxNumber, 'value'); - - expect(result).toEqual('12345678Z'); - }); - - it('should check the account was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.account, 'value'); - - expect(result).toEqual('0123456789'); - }); - - it('should check the sageWihholding was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.sageWihholding, 'value'); - - expect(result).toEqual('RETENCION ESTIMACION OBJETIVA'); - }); - - it('should check the sageTaxType was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.sageTaxType, 'value'); - - expect(result).toEqual('Operaciones no sujetas'); - }); - - it('should check the postCode was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.postCode, 'value'); - - expect(result).toEqual('46000'); - }); - - it('should check the city was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.city, 'value'); - - expect(result).toEqual('Valencia'); - }); - - it('should check the province was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.province, 'value'); - - expect(result).toEqual('Province one (España)'); - }); - - it('should check the country was edited', async() => { - const result = await page.waitToGetProperty(selectors.supplierFiscalData.country, 'value'); - - expect(result).toEqual('España'); + expect(errorMessage.text).toContain('Invalid Tax number'); + expect(message.isSuccess).toBeTrue(); + expect(formValues).toEqual({ + province: 'Province one', + country: 'España', + postcode: '46000', + city: 'Valencia', + socialName: 'Farmer King SL', + taxNumber: '12345678Z', + account: '0123456789', + sageWithholding: 'RETENCION ESTIMACION OBJETIVA', + sageTaxType: 'Operaciones no sujetas' + }); }); }); diff --git a/e2e/paths/14-account/04_acl.spec.js b/e2e/paths/14-account/04_acl.spec.js index c400dbfb2..ce2a63b14 100644 --- a/e2e/paths/14-account/04_acl.spec.js +++ b/e2e/paths/14-account/04_acl.spec.js @@ -23,7 +23,7 @@ describe('Account ACL path', () => { it('should create new acl', async() => { await page.autocompleteSearch(selectors.accountAcl.role, 'sysadmin'); - await page.autocompleteSearch(selectors.accountAcl.model, 'UserAccount'); + await page.autocompleteSearch(selectors.accountAcl.model, 'Account'); await page.autocompleteSearch(selectors.accountAcl.accessType, '*'); await page.autocompleteSearch(selectors.accountAcl.permission, 'ALLOW'); await page.waitToClick(selectors.accountAcl.save); diff --git a/front/core/components/autocomplete/index.js b/front/core/components/autocomplete/index.js index 52491f7e0..2539c4ef4 100755 --- a/front/core/components/autocomplete/index.js +++ b/front/core/components/autocomplete/index.js @@ -174,7 +174,6 @@ export default class Autocomplete extends Field { refreshDisplayed() { let display = ''; - let hasTemplate = this.$transclude && this.$transclude.isSlotFilled('tplItem'); if (this._selection && this.showField) { if (this.multiple && Array.isArray(this._selection)) { @@ -182,19 +181,8 @@ export default class Autocomplete extends Field { if (display.length > 0) display += ', '; display += item[this.showField]; } - } else { + } else display = this._selection[this.showField]; - if (hasTemplate) { - let template = this.$transclude(() => {}, null, 'tplItem'); - const element = template[0]; - const description = element.querySelector('.text-secondary'); - if (description) description.remove(); - - const displayElement = angular.element(element); - const displayText = displayElement.text(); - display = this.$interpolate(displayText)(this._selection); - } - } } this.input.value = display; diff --git a/front/core/components/avatar/index.html b/front/core/components/avatar/index.html new file mode 100644 index 000000000..2819e1d50 --- /dev/null +++ b/front/core/components/avatar/index.html @@ -0,0 +1,5 @@ +
+ {{::$ctrl.val && $ctrl.val.charAt(0).toUpperCase()}} +
+
+
diff --git a/front/core/components/avatar/index.js b/front/core/components/avatar/index.js new file mode 100644 index 000000000..ec3a27d1d --- /dev/null +++ b/front/core/components/avatar/index.js @@ -0,0 +1,33 @@ +import ngModule from '../../module'; +import Component from 'core/lib/component'; +import {hashToColor} from '../../lib/string'; +import './style.scss'; + +/** + * Displays colored avatar based on value. + * + * @property {*} val The value + */ +export default class Avatar extends Component { + get val() { + return this._val; + } + + set val(value) { + this._val = value; + + const val = value || ''; + const el = this.element; + el.style.backgroundColor = hashToColor(val); + el.title = val; + } +} + +ngModule.vnComponent('vnAvatar', { + template: require('./index.html'), + controller: Avatar, + bindings: { + val: '@?' + }, + transclude: true +}); diff --git a/front/core/components/avatar/style.scss b/front/core/components/avatar/style.scss new file mode 100644 index 000000000..272930821 --- /dev/null +++ b/front/core/components/avatar/style.scss @@ -0,0 +1,32 @@ +@import "variables"; + +vn-avatar { + display: block; + border-radius: 50%; + overflow: hidden; + height: 36px; + width: 36px; + font-size: 22px; + background-color: $color-main; + position: relative; + + & > * { + width: 100%; + height: 100%; + } + & > .letter { + display: flex; + align-items: center; + justify-content: center; + } + & > .image { + position: absolute; + top: 0; + left: 0; + + & > img { + width: 100%; + height: 100%; + } + } +} diff --git a/front/core/components/data-viewer/index.js b/front/core/components/data-viewer/index.js index 8d0d94402..b480997da 100644 --- a/front/core/components/data-viewer/index.js +++ b/front/core/components/data-viewer/index.js @@ -7,11 +7,10 @@ export default class DataViewer { } get status() { - if (this.model) - return this.model.status; - if (this.isLoading) return 'loading'; + if (this.model) + return this.model.status; if (!this.data) return 'clear'; if (this.data.length) diff --git a/front/core/components/field/index.js b/front/core/components/field/index.js index 40ea01e47..7ce840555 100644 --- a/front/core/components/field/index.js +++ b/front/core/components/field/index.js @@ -20,7 +20,7 @@ export default class Field extends FormInput { super.$onInit(); if (this.info) this.classList.add('has-icons'); - this.input.addEventListener('change', event => + this.element.addEventListener('change', event => this.onChange(event)); } @@ -166,7 +166,7 @@ export default class Field extends FormInput { if (event.defaultPrevented) return; event.preventDefault(); this.field = null; - this.input.dispatchEvent(new Event('change')); + this.element.dispatchEvent(new Event('change')); } buildInput(type) { diff --git a/front/core/components/index.js b/front/core/components/index.js index 86ab89212..45d182121 100644 --- a/front/core/components/index.js +++ b/front/core/components/index.js @@ -17,6 +17,7 @@ import './pagination/pagination'; import './searchbar/searchbar'; import './scroll-up/scroll-up'; import './autocomplete'; +import './avatar'; import './button'; import './button-menu'; import './calendar'; @@ -32,6 +33,7 @@ import './float-button'; import './icon-menu'; import './icon-button'; import './input-number'; +import './json-value'; import './label-value'; import './range'; import './input-time'; diff --git a/front/core/components/json-value/index.js b/front/core/components/json-value/index.js new file mode 100644 index 000000000..6b7517417 --- /dev/null +++ b/front/core/components/json-value/index.js @@ -0,0 +1,79 @@ +import ngModule from '../../module'; +import Component from 'core/lib/component'; +import './style.scss'; + +const maxStrLen = 512; + +/** + * Displays pretty JSON value. + * + * @property {*} value The value + */ +export default class Controller extends Component { + get value() { + return this._value; + } + + set value(value) { + const wasEmpty = this._value === undefined; + this._value = value; + + let text; + let cssClass; + const type = typeof value; + + if (value == null) { + text = '∅'; + cssClass = 'null'; + } else { + cssClass = type; + switch (type) { + case 'number': + if (Number.isInteger(value)) + text = value; + else + text = Math.round((value + Number.EPSILON) * 1000) / 1000; + break; + case 'boolean': + text = value ? '✓' : '✗'; + cssClass = value ? 'true' : 'false'; + break; + case 'string': + text = value.length <= maxStrLen + ? value + : value.substring(0, maxStrLen) + '...'; + break; + case 'object': + if (value instanceof Date) { + const hasZeroTime = + value.getHours() === 0 && + value.getMinutes() === 0 && + value.getSeconds() === 0; + const format = hasZeroTime ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss'; + text = this.$filter('date')(value, format); + } else + text = value; + break; + default: + text = value; + } + } + + const el = this.element; + el.textContent = text; + el.title = type == 'string' && value.length > maxStrLen ? value : ''; + + cssClass = `json-${cssClass}`; + if (wasEmpty) + el.classList.add(cssClass); + else + el.classList.replace(this.className, cssClass); + } +} + +ngModule.vnComponent('vnJsonValue', { + controller: Controller, + bindings: { + value: ' { + let controller; + let $scope; + let $element; + let el; + + beforeEach(ngModule('vnCore')); + + beforeEach(inject(($componentController, $rootScope) => { + $scope = $rootScope.$new(); + $element = angular.element(''); + controller = $componentController('vnJsonValue', {$element, $scope}); + el = controller.element; + })); + + describe('set value()', () => { + it('should display null symbol when value is null equivalent', () => { + controller.value = null; + + expect(el.textContent).toEqual('∅'); + expect(el.className).toContain('json-null'); + }); + + it('should display ballot when value is false', () => { + controller.value = false; + + expect(el.textContent).toEqual('✗'); + expect(el.className).toContain('json-false'); + }); + + it('should display check when value is true', () => { + controller.value = true; + + expect(el.textContent).toEqual('✓'); + expect(el.className).toContain('json-true'); + }); + + it('should display string when value is an string', () => { + controller.value = 'Foo'; + + expect(el.textContent).toEqual('Foo'); + expect(el.className).toContain('json-string'); + }); + + it('should display only date when value is date with time set to zero', () => { + const date = Date.vnNew(); + date.setHours(0, 0, 0, 0); + controller.value = date; + + expect(el.textContent).toEqual('01/01/2001'); + expect(el.className).toContain('json-object'); + }); + + it('should display full date without time when value is date with time', () => { + const date = Date.vnNew(); + date.setHours(15, 45); + controller.value = date; + + expect(el.textContent).toEqual('01/01/2001 15:45:00'); + expect(el.className).toContain('json-object'); + }); + + it('should display object when value is an object', () => { + controller.value = {foo: 'bar'}; + + expect(el.textContent).toEqual('[object Object]'); + expect(el.className).toContain('json-object'); + }); + + it('should display number when value is a number', () => { + controller.value = 2050; + + expect(el.textContent).toEqual('2050'); + expect(el.className).toContain('json-number'); + }); + + it('should display number when value is decimal', () => { + controller.value = 10.1; + + expect(el.textContent).toEqual('10.1'); + expect(el.className).toContain('json-number'); + }); + + it('should display rounded number when value is decimal with lot of decimals', () => { + controller.value = 10.124323234; + + expect(el.textContent).toEqual('10.124'); + expect(el.className).toContain('json-number'); + }); + }); +}); diff --git a/front/core/components/json-value/style.scss b/front/core/components/json-value/style.scss new file mode 100644 index 000000000..009a13d40 --- /dev/null +++ b/front/core/components/json-value/style.scss @@ -0,0 +1,23 @@ +vn-json-value { + display: inline; + + &.json-string { + color: #d172cc; + } + &.json-object { + color: #d1a572; + } + &.json-number { + color: #85d0ff; + } + &.json-true { + color: #7dc489; + } + &.json-false { + color: #c74949; + } + &.json-null { + color: #cd7c7c; + font-style: italic; + } +} diff --git a/front/core/components/multi-check/locale/es.yml b/front/core/components/multi-check/locale/es.yml index 5365c3392..25cde3df0 100644 --- a/front/core/components/multi-check/locale/es.yml +++ b/front/core/components/multi-check/locale/es.yml @@ -1,3 +1,3 @@ SelectAllRows: Seleccionar las {{rows}} fila(s) -All: Se han seleccionado -row(s) have been selected.: fila(s). \ No newline at end of file +Have been selected: Se han seleccionado +row(s) have been selected.: fila(s). diff --git a/front/core/components/popover/index.spec.js b/front/core/components/popover/index.spec.js index dc6e3b23f..4590a8e24 100644 --- a/front/core/components/popover/index.spec.js +++ b/front/core/components/popover/index.spec.js @@ -36,30 +36,6 @@ describe('Component vnPopover', () => { expect(controller.emit).not.toHaveBeenCalledWith('open'); }); - - // #1615 migrar karma a jest (this doesn't work anymore, needs fixing) - xit(`should check that popover is visible into the screen`, () => { - $parent.css({ - backgroundColor: 'red', - position: 'absolute', - width: '50px', - height: '50px', - top: '0', - left: '100px' - }); - controller.show($parent[0]); - - let rect = controller.popover.getBoundingClientRect(); - let style = controller.window.getComputedStyle(controller.element); - - expect(style.visibility).toEqual('visible'); - expect(style.display).not.toEqual('none'); - - expect(0).toBeLessThanOrEqual(rect.top); - expect(0).toBeLessThanOrEqual(rect.left); - expect(controller.window.innerHeight).toBeGreaterThan(rect.bottom); - expect(controller.window.innerWidth).toBeGreaterThan(rect.right); - }); }); describe('hide()', () => { diff --git a/front/core/components/table/style.scss b/front/core/components/table/style.scss index 557268661..2e5d225fd 100644 --- a/front/core/components/table/style.scss +++ b/front/core/components/table/style.scss @@ -41,10 +41,15 @@ vn-table { display: table-row; height: 48px; } - vn-thead, .vn-thead, - vn-tbody, .vn-tbody, - vn-tfoot, .vn-tfoot, - thead, tbody, tfoot { + & > thead, + & > tbody, + & > tfoot, + & > vn-thead, + & > vn-tbody, + & > vn-tfoot, + & > .vn-thead, + & > .vn-tbody, + & > .vn-tfoot { & > * { display: table-row; @@ -111,14 +116,14 @@ vn-table { color: inherit; } } - a.vn-tbody { + & > a.vn-tbody { &.clickable { @extend %clickable; } } - vn-tbody > *, - .vn-tbody > *, - tbody > * { + & > vn-tbody > *, + & > .vn-tbody > *, + & > tbody > * { border-bottom: $border-thin; &:last-child { diff --git a/front/core/components/th/index.js b/front/core/components/th/index.js index 341558fb1..9f1e11903 100644 --- a/front/core/components/th/index.js +++ b/front/core/components/th/index.js @@ -8,18 +8,8 @@ export default class Th { $element.on('click', () => this.onToggleOrder()); } - /** - * Changes the order if the cell has a field and defaultOrder property - */ $onInit() { if (!this.field) return; - - if (this.defaultOrder) { - this.order = this.defaultOrder; - this.table.applyOrder(this.field, this.order); - this.updateArrow(); - } - this.updateArrow(); } @@ -82,9 +72,6 @@ ngModule.vnComponent('vnTh', { template: require('./index.html'), transclude: true, controller: Th, - bindings: { - defaultOrder: '@?' - }, require: { table: '^^vnTable' } diff --git a/front/core/components/th/index.spec.js b/front/core/components/th/index.spec.js index a00f73cc9..a3bf19898 100644 --- a/front/core/components/th/index.spec.js +++ b/front/core/components/th/index.spec.js @@ -17,17 +17,6 @@ describe('Component vnTh', () => { controller.column.setAttribute('field', 'MyField'); })); - describe('onInit()', () => { - it(`should define controllers order as per defaultOrder then call setOrder()`, () => { - controller.defaultOrder = 'DESC'; - jest.spyOn(controller.table, 'setOrder'); - controller.$onInit(); - - expect(controller.order).toEqual('DESC'); - expect(controller.table.setOrder).toHaveBeenCalledWith('MyField', 'DESC'); - }); - }); - describe('toggleOrder()', () => { it(`should change the ordenation to DESC (descendant) if it was ASC (ascendant)`, () => { controller.order = 'ASC'; @@ -61,7 +50,7 @@ describe('Component vnTh', () => { expect(controller.updateArrow).not.toHaveBeenCalledWith(); }); - it(`should call toggleOrder() method if field property and + it(`should call toggleOrder() method if field property and table field property equals and then call updateArrow()`, () => { controller.table.field = 'MyField'; jest.spyOn(controller, 'toggleOrder'); @@ -73,7 +62,7 @@ describe('Component vnTh', () => { expect(controller.updateArrow).toHaveBeenCalledWith(); }); - it(`should call setOrder() method if field property and + it(`should call setOrder() method if field property and table field property doesn't equals and then call updateArrow()`, () => { controller.table.field = 'MyField2'; jest.spyOn(controller.table, 'setOrder'); diff --git a/front/core/directives/specs/acl.spec.js b/front/core/directives/specs/acl.spec.js index 94000d543..751afe457 100644 --- a/front/core/directives/specs/acl.spec.js +++ b/front/core/directives/specs/acl.spec.js @@ -7,7 +7,7 @@ describe('Directive acl', () => { beforeEach(ngModule('vnCore')); beforeEach(inject(($httpBackend, aclService) => { - $httpBackend.whenGET('Accounts/acl') + $httpBackend.whenGET('VnUsers/acl') .respond({ user: {id: 1, name: 'myUser'}, roles: [ diff --git a/front/core/lib/specs/acl-service.spec.js b/front/core/lib/specs/acl-service.spec.js index 3a1460241..eda3ae823 100644 --- a/front/core/lib/specs/acl-service.spec.js +++ b/front/core/lib/specs/acl-service.spec.js @@ -4,7 +4,7 @@ describe('Service acl', () => { beforeEach(ngModule('vnCore')); beforeEach(inject((_aclService_, $httpBackend) => { - $httpBackend.when('GET', `Accounts/acl`).respond({ + $httpBackend.when('GET', `VnUsers/acl`).respond({ roles: [ {role: {name: 'foo'}}, {role: {name: 'bar'}}, diff --git a/front/core/lib/string.js b/front/core/lib/string.js index 50bee9873..9f68ef8bb 100644 --- a/front/core/lib/string.js +++ b/front/core/lib/string.js @@ -30,3 +30,39 @@ export function camelToKebab(str) { export function firstUpper(str) { return str.charAt(0).toUpperCase() + str.substr(1); } + +export function djb2a(string) { + let hash = 5381; + for (let i = 0; i < string.length; i++) + hash = ((hash << 5) + hash) ^ string.charCodeAt(i); + return hash >>> 0; +} + +export function hashToColor(value) { + return '#' + colors[djb2a(value || '') % colors.length]; +} + +const colors = [ + 'b5b941', // Yellow + 'ae9681', // Peach + 'd78767', // Salmon + 'cc7000', // Orange bright + 'e2553d', // Coral + '8B0000', // Red dark + 'de4362', // Red crimson + 'FF1493', // Ping intense + 'be39a2', // Pink light + 'b754cf', // Purple middle + 'a87ba8', // Pink + '8a69cd', // Blue lavender + 'ab20ab', // Purple dark + '00b5b8', // Turquoise + '1fa8a1', // Green ocean + '5681cf', // Blue steel + '3399fe', // Blue sky + '6d9c3e', // Green chartreuse + '51bb51', // Green lime + '518b8b', // Gray board + '7e7e7e', // Gray + '5d5d5d', // Gray dark +]; diff --git a/front/core/services/acl-service.js b/front/core/services/acl-service.js index ee4404d34..aa2e3d917 100644 --- a/front/core/services/acl-service.js +++ b/front/core/services/acl-service.js @@ -11,7 +11,7 @@ class AclService { } load() { - return this.$http.get('Accounts/acl').then(res => { + return this.$http.get('VnUsers/acl').then(res => { this.user = res.data.user; this.roles = {}; diff --git a/front/core/services/auth.js b/front/core/services/auth.js index c15a34d94..0b89a8e88 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -59,7 +59,7 @@ export default class Auth { password: password || undefined }; - return this.$http.post('Accounts/login', params).then( + return this.$http.post('VnUsers/signIn', params).then( json => this.onLoginOk(json, remember)); } @@ -76,7 +76,7 @@ export default class Auth { } logout() { - let promise = this.$http.post('Accounts/logout', null, { + let promise = this.$http.post('VnUsers/logout', null, { headers: {Authorization: this.vnToken.token} }).catch(() => {}); diff --git a/front/core/styles/text.scss b/front/core/styles/text.scss index 701a84d05..190eff55d 100644 --- a/front/core/styles/text.scss +++ b/front/core/styles/text.scss @@ -1,70 +1,73 @@ -@import "./variables"; - -/* Headings */ - -.text-h1, h1 { - font-size: 2.3rem; -} -.text-h2, h2 { - font-size: 2.25rem; -} -.text-h3, h3 { - font-size: 2rem; -} -.text-h4, h4 { - font-size: 1.6rem; -} -.text-h5, h5 { - font-size: 1.3rem; -} -.text-h6, h6 { - font-size: 1.125rem; -} -.text-subtitle1 { - font-size: 1.06rem; -} -.text-subtitle2 { - font-size: 1rem; -} -.text-body1 { - font-size: .875rem; -} -.text-body2 { - font-size: .875rem; -} -.text-caption { - font-size: .875rem; -} -.text-overline { - font-size: .8rem; -} - -h1, h2, h3, h4, h5, h6 { - padding: 0; - margin-top: 0; - margin-bottom: 4px; -} - -/* Colors */ - -.text-primary { - color: $color-main; -} -.text-secondary { - color: $color-font-light; -} - -/* Helpers */ - -.text-uppercase { - text-transform: uppercase; -} -.text-center { - text-align: center; -} -.text-right { - text-align: right; -} -.text-left { - text-align: left; -} +@import "./variables"; + +/* Headings */ + +.text-h1, h1 { + font-size: 2.3rem; +} +.text-h2, h2 { + font-size: 2.25rem; +} +.text-h3, h3 { + font-size: 2rem; +} +.text-h4, h4 { + font-size: 1.6rem; +} +.text-h5, h5 { + font-size: 1.3rem; +} +.text-h6, h6 { + font-size: 1.125rem; +} +.text-subtitle1 { + font-size: 1.06rem; +} +.text-subtitle2 { + font-size: 1rem; +} +.text-body1 { + font-size: .875rem; +} +.text-body2 { + font-size: .875rem; +} +.text-caption { + font-size: .875rem; +} +.text-overline { + font-size: .8rem; +} +.text-capitalize { + text-transform: capitalize; +} + +h1, h2, h3, h4, h5, h6 { + padding: 0; + margin-top: 0; + margin-bottom: 4px; +} + +/* Colors */ + +.text-primary { + color: $color-main; +} +.text-secondary { + color: $color-font-light; +} + +/* Helpers */ + +.text-uppercase { + text-transform: uppercase; +} +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} +.text-left { + text-align: left; +} diff --git a/front/core/styles/variables.scss b/front/core/styles/variables.scss index c280838ca..bcc9fab66 100644 --- a/front/core/styles/variables.scss +++ b/front/core/styles/variables.scss @@ -2,7 +2,6 @@ $font-size: 11pt; $menu-width: 256px; -$right-menu-width: 318px; $topbar-height: 56px; $mobile-width: 800px; $float-spacing: 20px; diff --git a/front/salix/components/layout/index.js b/front/salix/components/layout/index.js index 372e8e828..48f50f404 100644 --- a/front/salix/components/layout/index.js +++ b/front/salix/components/layout/index.js @@ -13,7 +13,7 @@ export class Layout extends Component { } getUserData() { - this.$http.get('Accounts/getCurrentUserData').then(json => { + this.$http.get('VnUsers/getCurrentUserData').then(json => { this.$.$root.user = json.data; window.localStorage.currentUserWorkerId = json.data.id; }); diff --git a/front/salix/components/layout/index.spec.js b/front/salix/components/layout/index.spec.js index 71dbb9192..0d70c4806 100644 --- a/front/salix/components/layout/index.spec.js +++ b/front/salix/components/layout/index.spec.js @@ -15,7 +15,7 @@ describe('Component vnLayout', () => { describe('getUserData()', () => { it(`should set the user name property in the controller`, () => { - $httpBackend.expect('GET', `Accounts/getCurrentUserData`).respond({name: 'batman'}); + $httpBackend.expect('GET', `VnUsers/getCurrentUserData`).respond({name: 'batman'}); controller.getUserData(); $httpBackend.flush(); diff --git a/front/salix/components/layout/style.scss b/front/salix/components/layout/style.scss index 6697bb1b0..612366228 100644 --- a/front/salix/components/layout/style.scss +++ b/front/salix/components/layout/style.scss @@ -88,13 +88,13 @@ vn-layout { } &.right-menu { & > vn-topbar > .end { - width: 80px + $right-menu-width; + width: 80px + $menu-width; } & > .main-view { - padding-right: $right-menu-width; + padding-right: $menu-width; } [fixed-bottom-right] { - right: $right-menu-width; + right: $menu-width; } } & > .main-view { diff --git a/front/salix/components/log/index.html b/front/salix/components/log/index.html index 05abe84c0..d5675975b 100644 --- a/front/salix/components/log/index.html +++ b/front/salix/components/log/index.html @@ -3,70 +3,211 @@ url="{{$ctrl.url}}" filter="$ctrl.filter" link="{originFk: $ctrl.originId}" - where="{changedModel: $ctrl.changedModel, - changedModelId: $ctrl.changedModelId}" + where="{changedModel: $ctrl.changedModel, changedModelId: $ctrl.changedModelId}" data="$ctrl.logs" - limit="20" + order="creationDate DESC, id DESC" + limit="20"> + + - - - - - - Date - User - Model - Action - Name - Changes - - - - - - {{::log.creationDate | date:'dd/MM/yyyy HH:mm'}} - - - {{::log.user.name || 'System' | translate}} + +
+
+ + + + +
+
+
+ +
+
+ + + {{::$ctrl.relativeDate(log.creationDate)}} +
+
+ + {{::log.changedModelI18n}} + +
+
+
+ #{{::log.changedModelId}} + {{::log.changedModelValue}} +
+
+ + + + + + {{::prop.nameI18n}}: - - - {{::log.changedModel}} - - - {{::$ctrl.actionsText[log.action]}} - - - {{::log.changedModelValue}} - - - - - - - - - - - - - - - - - -
FieldBeforeAfter
{{prop.name}}{{prop.old}}{{prop.new}}
-
- {{::log.description}} + , + +
+
+ + {{::prop.nameI18n}}: + + + + ← +
- - - - - +
+ + + {{::log.description}} + + +
+
+ +
+ + + + + + + + + + +
+ + + + +
+
{{::nickname}}
+
{{::name}}
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/front/salix/components/log/index.js b/front/salix/components/log/index.js index 1c54aa9b8..7452c6636 100644 --- a/front/salix/components/log/index.js +++ b/front/salix/components/log/index.js @@ -1,5 +1,6 @@ import ngModule from '../../module'; import Section from '../section'; +import {hashToColor} from 'core/lib/string'; import './style.scss'; const validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/; @@ -7,17 +8,30 @@ const validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[ export default class Controller extends Section { constructor($element, $) { super($element, $); + this.hashToColor = hashToColor; this.actionsText = { insert: 'Creates', - update: 'Updates', + update: 'Edits', delete: 'Deletes', - select: 'Views' + select: 'Accesses' + }; + this.actionsClass = { + insert: 'success', + update: 'warning', + delete: 'alert', + select: 'notice' + }; + this.actionsIcon = { + insert: 'add', + update: 'edit', + delete: 'remove', + select: 'visibility' }; this.filter = { include: [{ relation: 'user', scope: { - fields: ['name'], + fields: ['nickname', 'name', 'image'], include: { relation: 'worker', scope: { @@ -27,6 +41,20 @@ export default class Controller extends Section { }, }], }; + + this.dateFilter = this.$filter('date'); + this.lang = this.$translate.use(); + this.today = Date.vnNew(); + this.today.setHours(0, 0, 0, 0); + } + + $postLink() { + this.resetFilter(); + this.$.$watch( + () => this.$.filter, + () => this.applyFilter(), + true + ); } get logs() { @@ -35,13 +63,14 @@ export default class Controller extends Section { set logs(value) { this._logs = value; - if (!this.logs) return; + if (!value) return; const empty = {}; const validations = window.validations; for (const log of value) { const oldValues = log.oldInstance || empty; const newValues = log.newInstance || empty; const locale = validations[log.changedModel]?.locale || empty; + log.changedModelI18n = firstUpper(locale.name) || log.changedModel; let props = Object.keys(oldValues).concat(Object.keys(newValues)); props = [...new Set(props)]; @@ -49,11 +78,28 @@ export default class Controller extends Section { log.props = []; for (const prop of props) { log.props.push({ - name: locale[prop] || prop, - old: this.formatValue(oldValues[prop]), - new: this.formatValue(newValues[prop]) + name: prop, + nameI18n: firstUpper(locale.columns?.[prop]) || prop, + old: this.castJsonValue(oldValues[prop]), + new: this.castJsonValue(newValues[prop]) }); } + log.props.sort( + (a, b) => a.nameI18n.localeCompare(b.nameI18n)); + } + } + + get models() { + return this._models; + } + + set models(value) { + this._models = value; + if (!value) return; + for (const model of value) { + const name = model.changedModel; + model.changedModelI18n = + firstUpper(window.validations[name]?.locale?.name) || name; } } @@ -61,39 +107,126 @@ export default class Controller extends Section { return !(this.changedModel && this.changedModelId); } - formatValue(value) { - let type = typeof value; + castJsonValue(value) { + return typeof value === 'string' && validDate.test(value) + ? new Date(value) + : value; + } - if (type === 'string' && validDate.test(value)) { - value = new Date(value); - type = typeof value; - } + mainVal(prop, action) { + return action == 'delete' ? prop.old : prop.new; + } - switch (type) { - case 'boolean': - return value ? '✓' : '✗'; - case 'object': - if (value instanceof Date) { - const hasZeroTime = - value.getHours() === 0 && - value.getMinutes() === 0 && - value.getSeconds() === 0; - const format = hasZeroTime ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss'; - return this.$filter('date')(value, format); + relativeDate(dateVal) { + if (dateVal == null) return ''; + const date = new Date(dateVal); + const dateZeroTime = new Date(dateVal); + dateZeroTime.setHours(0, 0, 0, 0); + const diff = Math.trunc((this.today.getTime() - dateZeroTime.getTime()) / (1000 * 3600 * 24)); + + let format; + if (diff == 0) + format = `'${this.$t('today')}'`; + else if (diff == 1) + format = `'${this.$t('yesterday')}'`; + else if (diff > 1 && diff < 7) + format = `'${date.toLocaleDateString(this.lang, {weekday: 'short'})}'`; + else if (this.today.getFullYear() == date.getFullYear()) + format = `d '${date.toLocaleDateString(this.lang, {month: 'short'})}'`; + else + format = `dd/MM/yyyy`; + + return this.dateFilter(date, `${format} HH:mm`); + } + + resetFilter() { + this.$.filter = {who: 'all'}; + } + + applyFilter() { + const filter = this.$.filter; + + function getParam(prop, value) { + if (value == null || value == '') return null; + switch (prop) { + case 'search': + const or = [{changedModelId: value}]; + if (!/^[0-9]+$/.test(value)) + or.push({changedModelValue: {like: `%${value}%`}}); + return {or}; + case 'changes': + return {or: [ + {oldInstance: {like: `%${value}%`}}, + {newInstance: {like: `%${value}%`}}, + {description: {like: `%${value}%`}} + ]}; + case 'who': + switch (value) { + case 'all': + return null; + case 'user': + return {userFk: {neq: null}}; + case 'system': + return {userFk: null}; + } + case 'actions': + const inq = []; + for (const action in value) { + if (value[action]) + inq.push(action); + } + return inq.length ? {action: {inq}} : null; + case 'from': + if (filter.to) { + return {creationDate: {gte: value}}; + } else { + const to = new Date(value); + to.setHours(23, 59, 59, 999); + return {creationDate: {between: [value, to]}}; + } + case 'to': + const to = new Date(value); + to.setHours(23, 59, 59, 999); + return {creationDate: {lte: to}}; + case 'userFk': + return filter.who != 'system' + ? {[prop]: value} : null; + default: + return {[prop]: value}; } - else - return value; - default: - return value; + } + + const and = []; + for (const prop in filter) { + const param = getParam(prop, filter[prop]); + if (param) and.push(param); + } + + const lbFilter = and.length ? {where: {and}} : null; + return this.$.model.applyFilter(lbFilter); + } + + searchUser(search) { + if (/^[0-9]+$/.test(search)) { + return {id: search}; + } else { + return {or: [ + {name: search}, + {nickname: {like: `%${search}%`}} + ]} } } - showWorkerDescriptor(event, workerId) { - if (!workerId) return; - this.$.workerDescriptor.show(event.target, workerId); + showWorkerDescriptor(event, log) { + if (log.user?.worker) + this.$.workerDescriptor.show(event.target, log.userFk); } } +function firstUpper(str) { + return str && str.charAt(0).toUpperCase() + str.substr(1); +} + ngModule.vnComponent('vnLog', { controller: Controller, template: require('./index.html'), diff --git a/front/salix/components/log/index.spec.js b/front/salix/components/log/index.spec.js new file mode 100644 index 000000000..d01a08967 --- /dev/null +++ b/front/salix/components/log/index.spec.js @@ -0,0 +1,97 @@ +import './index'; + +describe('Salix Component vnLog', () => { + let controller; + let $scope; + let $element; + + beforeEach(ngModule('salix')); + + beforeEach(inject(($componentController, $rootScope) => { + $scope = $rootScope.$new(); + $element = angular.element(''); + controller = $componentController('vnLog', {$element, $scope}); + })); + + describe('relativeDate()', () => { + let date; + + beforeEach(() => { + date = Date.vnNew(); + }); + + it('should return empty string when date is null', () => { + const ret = controller.relativeDate(null); + + expect(ret).toEqual(''); + }); + + it('should return empty string when date is undefined', () => { + const ret = controller.relativeDate(undefined); + + expect(ret).toEqual(''); + }); + + it('should return today and time when date is today', () => { + const ret = controller.relativeDate(date); + + expect(ret).toEqual('today 12:00'); + }); + + it('should return yesterday and time when date is yesterday', () => { + date.setDate(date.getDate() - 1); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('yesterday 12:00'); + }); + + it('should return abreviated weekday name and time when date is on past week', () => { + date.setDate(date.getDate() - 3); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('Fri 12:00'); + }); + + it('should return abreviated month name, day number and time when date is on this year', () => { + date.setDate(date.getDate() + 20); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('21 Jan 12:00'); + }); + + it('should return abreviated month name, day number, year and time when date is on different year', () => { + date.setDate(date.getDate() - 20); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('12/12/2000 12:00'); + }); + + it('should convert to date and return string when date is not a Date class instance', () => { + const ret = controller.relativeDate(date.toJSON()); + + expect(ret).toEqual('today 12:00'); + }); + }); + + describe('castJsonValue()', () => { + it('should return date when string has valid JSON date format', () => { + const now = Date.vnNew(); + + const ret = controller.castJsonValue(now.toJSON()); + + expect(ret).toBeInstanceOf(Date); + }); + + it('should return same value when is string with invalid JSON date format', () => { + const ret = controller.castJsonValue('Foo'); + + expect(ret).toEqual('Foo'); + }); + + it('should return same value when is not an string', () => { + const ret = controller.castJsonValue(1001); + + expect(ret).toEqual(1001); + }); + }); +}); diff --git a/front/salix/components/log/locale/es.yml b/front/salix/components/log/locale/es.yml index d341095d8..95d930716 100644 --- a/front/salix/components/log/locale/es.yml +++ b/front/salix/components/log/locale/es.yml @@ -1,5 +1,8 @@ Date: Fecha -Model: Modelo +Concept: Concepto +Search: Buscar +Search by id or concept: Buscar por identificador o concepto +Entity: Entidad Action: Acción Author: Autor Before: Antes @@ -7,9 +10,12 @@ After: Despues History: Historial Name: Nombre Creates: Crea -Updates: Actualiza +Edits: Modifica Deletes: Elimina -Views: Visualiza +Accesses: Accede System: Sistema +Details: Detalles note: nota Changes: Cambios +today: hoy +yesterday: ayer diff --git a/front/salix/components/log/style.scss b/front/salix/components/log/style.scss index 68cd5a047..7a5e18049 100644 --- a/front/salix/components/log/style.scss +++ b/front/salix/components/log/style.scss @@ -1,66 +1,146 @@ @import "variables"; +@import "effects"; vn-log { - vn-td { - vertical-align: initial !important; - } - .changes { - display: none; - } - .label { - color: $color-font-secondary; - } - .value { - color: $color-font; - } + .change { + display: flex; - @media screen and (max-width: 1570px) { - vn-table .expendable { + & > .left { + position: relative; + padding-right: 10px; + + & > vn-avatar { + cursor: pointer; + + &.system { + background-color: $color-main !important; + } + } + & > .arrow { + height: 8px; + width: 8px; + position: absolute; + transform: rotateY(0deg) rotate(45deg); + top: 18px; + right: -4px; + z-index: 1; + } + & > .line { + position: absolute; + background-color: $color-main; + width: 2px; + left: 17px; + z-index: -1; + top: 44px; + bottom: -8px; + } + } + &:last-child > .left > .line { display: none; } - .changes { - padding-top: 10px; - display: block; - } - } - .attributes { - width: 100%; + .detail { + position: relative; + flex-grow: 1; + width: 100%; + border-radius: 2px; + overflow: hidden; - tr { - height: 10px; + & > .header { + display: flex; + justify-content: space-between; + align-items: center; + overflow: hidden; - & > td { - padding: 2px; + & > .action-model { + display: inline-flex; + overflow: hidden; + + & > .model-name { + display: inline-block; + padding: 2px 5px; + color: $color-font-dark; + border-radius: 8px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + & > .action-date { + white-space: nowrap; + + & > .action { + display: inline-flex; + align-items: center; + justify-content: center; + color: $color-font-bg; + vertical-align: middle; + border-radius: 50%; + width: 24px; + height: 24px; + font-size: 1.4em; + + &.notice { + background-color: $color-notice-medium + } + &.success { + background-color: $color-success-medium; + } + &.warning { + background-color: $color-main-medium; + } + &.alert { + background-color: lighten($color-alert, 5%); + } + } + } } - & > td.field, - & > th.field { - width: 20%; - color: gray; - } - & > td.before, - & > th.before, - & > td.after, - & > th.after { - width: 40%; - white-space: pre-line; + & > .model { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + & > .model-value { + font-style: italic; + } + & > .model-id { + color: $color-font-secondary; + font-size: .9rem; + } } } } -} -.ellipsis { - white-space: nowrap; - overflow: hidden; - max-width: 400px; - text-overflow: ellipsis; - display: inline-block; -} -.no-ellipsize, -[no-ellipsize] { - text-overflow: ''; - white-space: normal; - overflow: auto; -} -.alignSpan { - overflow: hidden; - display: inline-block; + .changes { + overflow: hidden; + background-color: rgba(255, 255, 255, .05); + color: $color-font-light; + position: relative; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-height: 34px; + box-sizing: border-box; + + & > vn-icon { + @extend %clickable; + float: right; + position: relative; + transition-property: transform, background-color; + transition-duration: 150ms; + margin: -5px; + margin-left: 4px; + padding: 1px; + border-radius: 50%; + } + &.expanded { + text-overflow: initial; + white-space: initial; + + & > vn-icon { + transform: rotate(180deg); + } + } + & > .no-changes { + font-style: italic; + } + } } diff --git a/front/salix/components/recover-password/index.js b/front/salix/components/recover-password/index.js index a3f26ec64..e91169588 100644 --- a/front/salix/components/recover-password/index.js +++ b/front/salix/components/recover-password/index.js @@ -23,7 +23,7 @@ export default class Controller { user: this.user }; - this.$http.post('Accounts/recoverPassword', params) + this.$http.post('VnUsers/recoverPassword', params) .then(() => { this.goToLogin(); }); diff --git a/front/salix/components/reset-password/index.js b/front/salix/components/reset-password/index.js index 20c6c34fe..a3ca03237 100644 --- a/front/salix/components/reset-password/index.js +++ b/front/salix/components/reset-password/index.js @@ -33,7 +33,7 @@ export default class Controller { const newPassword = this.newPassword; - this.$http.post('users/reset-password', {newPassword}, {headers}) + this.$http.post('VnUsers/reset-password', {newPassword}, {headers}) .then(() => { this.vnApp.showSuccess(this.$translate.instant('Password changed!')); this.$state.go('login'); diff --git a/loopback/common/methods/log/editors.js b/loopback/common/methods/log/editors.js new file mode 100644 index 000000000..4c0b6d2d5 --- /dev/null +++ b/loopback/common/methods/log/editors.js @@ -0,0 +1,40 @@ +const mergeFilters = require('vn-loopback/util/filter').mergeFilters; + +module.exports = Self => { + Self.remoteMethod('editors', { + description: 'Get the list of entity editors', + accepts: [ + { + arg: 'id', + type: 'integer', + description: 'The model id', + required: true + }, { + arg: 'filter', + type: 'Object', + description: 'The user filter object' + } + ], + returns: { + type: [Self], + root: true + }, + http: { + path: `/:id/editors`, + verb: 'GET' + } + }); + + Self.editors = async(id, filter) => { + const res = await Self.find({ + fields: ['userFk'], + where: {originFk: id} + }); + const userIds = new Set(res.map(x => x.userFk)); + + filter = mergeFilters(filter, { + where: {id: {inq: [...userIds]}} + }); + return await Self.app.models.VnUser.find(filter); + }; +}; diff --git a/loopback/common/methods/log/models.js b/loopback/common/methods/log/models.js new file mode 100644 index 000000000..ec3eac1ad --- /dev/null +++ b/loopback/common/methods/log/models.js @@ -0,0 +1,44 @@ +const mergeFilters = require('vn-loopback/util/filter').mergeFilters; + +module.exports = Self => { + Self.remoteMethod('models', { + description: 'Get the list of entity models', + accepts: [ + { + arg: 'id', + type: 'integer', + description: 'The model id', + required: true + }, { + arg: 'filter', + type: 'Object', + description: 'The filter object' + } + ], + returns: { + type: [Self], + root: true + }, + http: { + path: `/:id/models`, + verb: 'GET' + } + }); + + Self.models = async(id, filter) => { + filter = mergeFilters(filter, { + fields: ['changedModel'], + where: { + originFk: id, + changedModel: {neq: null} + } + }); + const res = await Self.find(filter); + + const set = new Set(); + return res.filter(x => set.has(x.changedModel) + ? false + : set.add(x.changedModel) + ); + }; +}; diff --git a/loopback/common/methods/vn-model/specs/crud.spec.js b/loopback/common/methods/vn-model/specs/crud.spec.js index 4aa35c14d..56af72bd9 100644 --- a/loopback/common/methods/vn-model/specs/crud.spec.js +++ b/loopback/common/methods/vn-model/specs/crud.spec.js @@ -1,6 +1,20 @@ const app = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); describe('Model crud()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); let insertId; const barcodeModel = app.models.ItemBarcode; diff --git a/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js b/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js index 1c4d53266..a3dba14d7 100644 --- a/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js +++ b/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('Model rewriteDbError()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should extend rewriteDbError properties to any model passed', () => { const exampleModel = models.ItemTag; diff --git a/loopback/common/models/log.js b/loopback/common/models/log.js new file mode 100644 index 000000000..0622431a6 --- /dev/null +++ b/loopback/common/models/log.js @@ -0,0 +1,10 @@ + +module.exports = function(Self) { + Object.assign(Self, { + setup() { + Self.super_.setup.call(this); + require('../methods/log/editors')(this); + require('../methods/log/models')(this); + } + }); +}; diff --git a/loopback/common/models/log.json b/loopback/common/models/log.json new file mode 100644 index 000000000..54046f072 --- /dev/null +++ b/loopback/common/models/log.json @@ -0,0 +1,4 @@ +{ + "name": "Log", + "base": "VnModel" +} diff --git a/loopback/common/models/vn-model.js b/loopback/common/models/vn-model.js index 5b5cb7d21..f469e893a 100644 --- a/loopback/common/models/vn-model.js +++ b/loopback/common/models/vn-model.js @@ -28,12 +28,14 @@ module.exports = function(Self) { }); // Register field ACL validation - /* this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx)); + /* + this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx)); this.beforeRemote('updateAll', ctx => this.checkUpdateAcls(ctx)); this.beforeRemote('patchOrCreate', ctx => this.checkInsertAcls(ctx)); this.beforeRemote('create', ctx => this.checkInsertAcls(ctx)); this.beforeRemote('replaceById', ctx => this.checkInsertAcls(ctx)); - this.beforeRemote('replaceOrCreate', ctx => this.checkInsertAcls(ctx)); */ + this.beforeRemote('replaceOrCreate', ctx => this.checkInsertAcls(ctx)); + */ this.remoteMethod('crud', { description: `Create, update or/and delete instances from model with a single request`, @@ -229,7 +231,7 @@ module.exports = function(Self) { async checkAcls(ctx, actionType) { let userId = ctx.req.accessToken.userId; let models = this.app.models; - let userRoles = await models.Account.getRoles(userId); + let userRoles = await models.VnUser.getRoles(userId); let data = ctx.args.data; let modelAcls; diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 5767632ee..e950b981b 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -156,18 +156,20 @@ "Component cost not set": "Componente coste no está estabecido", "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2", "Description cannot be blank": "Description cannot be blank", - "company": "Company", - "country": "Country", - "clientId": "Id client", - "clientSocialName": "Client", - "amount": "Amount", - "taxableBase": "Taxable base", - "ticketFk": "Id ticket", - "isActive": "Active", - "hasToInvoice": "Invoice", - "isTaxDataChecked": "Data checked", - "comercialId": "Id Comercial", - "comercialName": "Comercial", + "company": "Company", + "country": "Country", + "clientId": "Id client", + "clientSocialName": "Client", + "amount": "Amount", + "taxableBase": "Taxable base", + "ticketFk": "Id ticket", + "isActive": "Active", + "hasToInvoice": "Invoice", + "isTaxDataChecked": "Data checked", + "comercialId": "Id Comercial", + "comercialName": "Comercial", "Added observation": "Added observation", - "Comment added to client": "Comment added to client" + "Comment added to client": "Comment added to client", + "This ticket is already a refund": "This ticket is already a refund", + "A claim with that sale already exists": "A claim with that sale already exists" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 3ef3c4a22..45993bdd5 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -279,15 +279,16 @@ "Comment added to client": "Observación añadida al cliente {{clientFk}}", "Cannot create a new claimBeginning from a different ticket": "No se puede crear una línea de reclamación de un ticket diferente al origen", "company": "Compañía", - "country": "País", - "clientId": "Id cliente", - "clientSocialName": "Cliente", - "amount": "Importe", - "taxableBase": "Base", - "ticketFk": "Id ticket", - "isActive": "Activo", - "hasToInvoice": "Facturar", - "isTaxDataChecked": "Datos comprobados", - "comercialId": "Id comercial", - "comercialName": "Comercial" -} + "country": "País", + "clientId": "Id cliente", + "clientSocialName": "Cliente", + "amount": "Importe", + "taxableBase": "Base", + "ticketFk": "Id ticket", + "isActive": "Activo", + "hasToInvoice": "Facturar", + "isTaxDataChecked": "Datos comprobados", + "comercialId": "Id comercial", + "comercialName": "Comercial", + "Invalid NIF for VIES": "Invalid NIF for VIES" +} \ No newline at end of file diff --git a/loopback/server/connectors/vn-mysql.js b/loopback/server/connectors/vn-mysql.js index a6fd3351a..40ad78bde 100644 --- a/loopback/server/connectors/vn-mysql.js +++ b/loopback/server/connectors/vn-mysql.js @@ -1,41 +1,9 @@ const mysql = require('mysql'); const MySQL = require('loopback-connector-mysql').MySQL; const EnumFactory = require('loopback-connector-mysql').EnumFactory; -const { Transaction, SQLConnector, ParameterizedSQL } = require('loopback-connector'); +const {Transaction, SQLConnector, ParameterizedSQL} = require('loopback-connector'); const fs = require('fs'); -const limitSet = new Set([ - 'save', - 'updateOrCreate', - 'replaceOrCreate', - 'replaceById', - 'update' -]); - -const opOpts = { - update: [ - 'update', - 'replaceById', - // |insert - 'save', - 'updateOrCreate', - 'replaceOrCreate' - ], - delete: [ - 'destroy', - 'destroyAll' - ], - insert: [ - 'create' - ] -}; - -const opMap = new Map(); -for (const op in opOpts) { - for (const met of opOpts[op]) - opMap.set(met, op); -} - class VnMySQL extends MySQL { /** * Promisified version of execute(). @@ -253,49 +221,49 @@ class VnMySQL extends MySQL { } create(model, data, opts, cb) { - const ctx = { data }; + const ctx = {data}; this.invokeMethod('create', arguments, model, ctx, opts, cb); } createAll(model, data, opts, cb) { - const ctx = { data }; + const ctx = {data}; this.invokeMethod('createAll', arguments, model, ctx, opts, cb); } save(model, data, opts, cb) { - const ctx = { data }; + const ctx = {data}; this.invokeMethod('save', arguments, model, ctx, opts, cb); } updateOrCreate(model, data, opts, cb) { - const ctx = { data }; + const ctx = {data}; this.invokeMethod('updateOrCreate', arguments, model, ctx, opts, cb); } replaceOrCreate(model, data, opts, cb) { - const ctx = { data }; + const ctx = {data}; this.invokeMethod('replaceOrCreate', arguments, model, ctx, opts, cb); } destroyAll(model, where, opts, cb) { - const ctx = { where }; + const ctx = {where}; this.invokeMethod('destroyAll', arguments, model, ctx, opts, cb); } update(model, where, data, opts, cb) { - const ctx = { where, data }; + const ctx = {where, data}; this.invokeMethod('update', arguments, model, ctx, opts, cb); } replaceById(model, id, data, opts, cb) { - const ctx = { id, data }; + const ctx = {id, data}; this.invokeMethod('replaceById', arguments, model, ctx, opts, cb); } @@ -316,45 +284,17 @@ class VnMySQL extends MySQL { async invokeMethodP(method, args, model, ctx, opts) { const Model = this.getModelDefinition(model).model; - const settings = Model.definition.settings; let tx; if (!opts.transaction) { tx = await Transaction.begin(this, {}); - opts = Object.assign({ transaction: tx, httpCtx: opts.httpCtx }, opts); + opts = Object.assign({transaction: tx, httpCtx: opts.httpCtx}, opts); } try { - // Fetch old values (update|delete) or login - let where, id, data, idName, limit, op, oldInstances, newInstances; - const hasGrabUser = settings.log && settings.log.grabUser; - if (hasGrabUser) { - const userId = opts.httpCtx && opts.httpCtx.active.accessToken.userId; - const user = await Model.app.models.Account.findById(userId, { fields: ['name'] }, opts); + const userId = opts.httpCtx && opts.httpCtx.active.accessToken.userId; + if (userId) { + const user = await Model.app.models.VnUser.findById(userId, {fields: ['name']}, opts); await this.executeP(`CALL account.myUser_loginWithName(?)`, [user.name], opts); - } else { - where = ctx.where; - id = ctx.id; - data = ctx.data; - idName = this.idName(model); - - limit = limitSet.has(method); - - op = opMap.get(method); - - if (!where) { - if (id) where = { [idName]: id }; - else where = { [idName]: data[idName] }; - } - - // Fetch old values - switch (op) { - case 'update': - case 'delete': - // Single entity operation - const stmt = this.buildSelectStmt(op, data, idName, model, where, limit); - stmt.merge(`FOR UPDATE`); - oldInstances = await this.executeStmt(stmt, opts); - } } const res = await new Promise((resolve, reject) => { @@ -366,38 +306,7 @@ class VnMySQL extends MySQL { super[method].apply(this, fnArgs); }); - if (hasGrabUser) - await this.executeP(`CALL account.myUser_logout()`, null, opts); - else { - // Fetch new values - const ids = []; - - switch (op) { - case 'insert': - case 'update': { - switch (method) { - case 'createAll': - for (const row of res[0]) - ids.push(row[idName]); - break; - case 'create': - ids.push(res[0]); - break; - case 'update': - if (data[idName] != null) - ids.push(data[idName]); - break; - } - - const newWhere = ids.length ? {[idName]: {inq: ids}} : where; - - const stmt = this.buildSelectStmt(op, data, idName, model, newWhere, limit); - newInstances = await this.executeStmt(stmt, opts); - } - } - - await this.createLogRecord(oldInstances, newInstances, model, opts); - } + if (userId) await this.executeP(`CALL account.myUser_logout()`, null, opts); if (tx) await tx.commit(); return res; } catch (err) { @@ -405,125 +314,6 @@ class VnMySQL extends MySQL { throw err; } } - - buildSelectStmt(op, data, idName, model, where, limit) { - const Model = this.getModelDefinition(model).model; - const properties = Object.keys(Model.definition.properties); - - const fields = data ? Object.keys(data) : []; - if (op == 'delete') - properties.forEach(property => fields.push(property)); - else { - const log = Model.definition.settings.log; - fields.push(idName); - if (log.relation) fields.push(Model.relations[log.relation].keyFrom); - if (log.showField) fields.push(log.showField); - else { - const showFieldNames = ['name', 'description', 'code', 'nickname']; - for (const field of showFieldNames) { - if (properties.includes(field)) { - log.showField = field; - fields.push(field); - break; - } - } - } - } - - const stmt = new ParameterizedSQL( - 'SELECT ' + - this.buildColumnNames(model, { fields }) + - ' FROM ' + - this.tableEscaped(model) - ); - stmt.merge(this.buildWhere(model, where)); - if (limit) stmt.merge(`LIMIT 1`); - - return stmt; - } - - async createLogRecord(oldInstances, newInstances, model, opts) { - function setActionType() { - if (oldInstances && newInstances) - return 'update'; - else if (!oldInstances && newInstances) - return 'insert'; - return 'delete'; - } - - const action = setActionType(); - if (!newInstances && action != 'delete') return; - - const Model = this.getModelDefinition(model).model; - const models = Model.app.models; - const definition = Model.definition; - const log = definition.settings.log; - - const primaryKey = this.idName(model); - const originRelation = log.relation; - const originFkField = originRelation - ? Model.relations[originRelation].keyFrom - : primaryKey; - - // Prevent adding logs when deleting a principal entity (Client, Zone...) - if (action == 'delete' && !originRelation) return; - - function map(instances) { - const map = new Map(); - if (!instances) return; - for (const instance of instances) - map.set(instance[primaryKey], instance); - return map; - } - - const changedModel = definition.name; - const userFk = opts.httpCtx && opts.httpCtx.active.accessToken.userId; - const oldMap = map(oldInstances); - const newMap = map(newInstances); - const ids = (oldMap || newMap).keys(); - - const logEntries = []; - - function insertValuesLogEntry(logEntry, instance) { - logEntry.originFk = instance[originFkField]; - logEntry.changedModelId = instance[primaryKey]; - if (log.showField) logEntry.changedModelValue = instance[log.showField]; - } - - for (const id of ids) { - const oldI = oldMap && oldMap.get(id); - const newI = newMap && newMap.get(id); - - const logEntry = { - action, - userFk, - changedModel, - }; - - if (newI) { - insertValuesLogEntry(logEntry, newI); - // Delete unchanged properties - if (oldI) { - Object.keys(oldI).forEach(prop => { - const hasChanges = oldI[prop] instanceof Date ? - oldI[prop]?.getTime() != newI[prop]?.getTime() : - oldI[prop] != newI[prop]; - - if (!hasChanges) { - delete oldI[prop]; - delete newI[prop]; - } - }); - } - } else - insertValuesLogEntry(logEntry, oldI); - - logEntry.oldInstance = oldI; - logEntry.newInstance = newI; - logEntries.push(logEntry); - } - await models[log.model].create(logEntries, opts); - } } exports.VnMySQL = VnMySQL; @@ -544,7 +334,7 @@ exports.initialize = function initialize(dataSource, callback) { if (callback) { if (dataSource.settings.lazyConnect) { - process.nextTick(function () { + process.nextTick(function() { callback(); }); } else @@ -552,13 +342,13 @@ exports.initialize = function initialize(dataSource, callback) { } }; -MySQL.prototype.connect = function (callback) { +MySQL.prototype.connect = function(callback) { const self = this; const options = generateOptions(this.settings); if (this.client) { if (callback) { - process.nextTick(function () { + process.nextTick(function() { callback(null, self.client); }); } @@ -567,7 +357,7 @@ MySQL.prototype.connect = function (callback) { function connectionHandler(options, callback) { const client = mysql.createPool(options); - client.getConnection(function (err, connection) { + client.getConnection(function(err, connection) { const conn = connection; if (!err) { if (self.debug) @@ -647,30 +437,27 @@ function generateOptions(settings) { return options; } - SQLConnector.prototype.all = function find(model, filter, options, cb) { const self = this; // Order by id if no order is specified filter = filter || {}; const stmt = this.buildSelect(model, filter, options); - this.execute(stmt.sql, stmt.params, options, function (err, data) { - if (err) { + this.execute(stmt.sql, stmt.params, options, function(err, data) { + if (err) return cb(err, []); - } try { - const objs = data.map(function (obj) { + const objs = data.map(function(obj) { return self.fromRow(model, obj); }); if (filter && filter.include) { self.getModelDefinition(model).model.include( objs, filter.include, options, cb, ); - } else { + } else cb(null, objs); - } } catch (error) { - cb(error, []) + cb(error, []); } }); }; diff --git a/loopback/server/datasources.json b/loopback/server/datasources.json index f5f277ffc..aadee048c 100644 --- a/loopback/server/datasources.json +++ b/loopback/server/datasources.json @@ -15,7 +15,7 @@ "legacyUtcDateProcessing": false, "timezone": "local", "connectTimeout": 40000, - "acquireTimeout": 60000, + "acquireTimeout": 90000, "waitForConnections": true }, "osticket": { diff --git a/loopback/server/middleware.json b/loopback/server/middleware.json index d65b8b34a..31a2f113b 100644 --- a/loopback/server/middleware.json +++ b/loopback/server/middleware.json @@ -28,7 +28,11 @@ }, "session": {}, "auth": { - "loopback#token": {} + "loopback#token": { + "params": { + "currentUserLiteral": "me" + } + } }, "auth:after": { "./middleware/current-user": {}, diff --git a/loopback/server/model-config.json b/loopback/server/model-config.json index ff1a2daa2..52b539f60 100644 --- a/loopback/server/model-config.json +++ b/loopback/server/model-config.json @@ -9,7 +9,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "user", + "model": "VnUser", "foreignKey": "userId" } } @@ -41,9 +41,6 @@ } } }, - "user": { - "dataSource": "vn" - }, "Schema": { "dataSource": "vn" }, diff --git a/modules/account/back/locale/mail-forward/en.yml b/modules/account/back/locale/mail-forward/en.yml new file mode 100644 index 000000000..2e136e664 --- /dev/null +++ b/modules/account/back/locale/mail-forward/en.yml @@ -0,0 +1,4 @@ +name: mail forward +columns: + account: account + forwardTo: forward to diff --git a/modules/account/back/locale/mail-forward/es.yml b/modules/account/back/locale/mail-forward/es.yml new file mode 100644 index 000000000..3e81f833e --- /dev/null +++ b/modules/account/back/locale/mail-forward/es.yml @@ -0,0 +1,4 @@ +name: reenvio de correo +columns: + account: cuenta + forwardTo: reenviar a diff --git a/modules/account/back/locale/mail/en.yml b/modules/account/back/locale/mail/en.yml new file mode 100644 index 000000000..b492ea640 --- /dev/null +++ b/modules/account/back/locale/mail/en.yml @@ -0,0 +1,7 @@ +name: mail +columns: + id: id + receiver: receiver + replyTo: reply to + subject: subject + body: body diff --git a/modules/account/back/locale/mail/es.yml b/modules/account/back/locale/mail/es.yml new file mode 100644 index 000000000..340f7ec50 --- /dev/null +++ b/modules/account/back/locale/mail/es.yml @@ -0,0 +1,7 @@ +name: correo electrónico +columns: + id: id + receiver: receptor + replyTo: responder a + subject: asunto + body: cuerpo diff --git a/modules/account/back/locale/role-inherit/en.yml b/modules/account/back/locale/role-inherit/en.yml new file mode 100644 index 000000000..760881325 --- /dev/null +++ b/modules/account/back/locale/role-inherit/en.yml @@ -0,0 +1,4 @@ +name: subrole +columns: + role: rol + inheritsFrom: inherits diff --git a/modules/account/back/locale/role-inherit/es.yml b/modules/account/back/locale/role-inherit/es.yml new file mode 100644 index 000000000..c352c6ff2 --- /dev/null +++ b/modules/account/back/locale/role-inherit/es.yml @@ -0,0 +1,4 @@ +name: subrol +columns: + role: rol + inheritsFrom: hereda diff --git a/modules/account/back/locale/role/en.yml b/modules/account/back/locale/role/en.yml new file mode 100644 index 000000000..69199dfce --- /dev/null +++ b/modules/account/back/locale/role/en.yml @@ -0,0 +1,5 @@ +name: role +columns: + id: id + name: name + description: description diff --git a/modules/account/back/locale/role/es.yml b/modules/account/back/locale/role/es.yml new file mode 100644 index 000000000..ee025be0f --- /dev/null +++ b/modules/account/back/locale/role/es.yml @@ -0,0 +1,5 @@ +name: rol +columns: + id: id + name: nombre + description: descripción diff --git a/modules/account/back/locale/vn-user/en.yml b/modules/account/back/locale/vn-user/en.yml new file mode 100644 index 000000000..135cf75b4 --- /dev/null +++ b/modules/account/back/locale/vn-user/en.yml @@ -0,0 +1,17 @@ +name: user +columns: + id: id + name: name + roleFk: role + nickname: nickname + lang: lang + password: password + bcryptPassword: BCRYPT password + active: active + email: email + emailVerified: email verified + created: created + updated: updated + image: image + hasGrant: has grant + userFk: user diff --git a/modules/account/back/locale/vn-user/es.yml b/modules/account/back/locale/vn-user/es.yml new file mode 100644 index 000000000..53086ae2d --- /dev/null +++ b/modules/account/back/locale/vn-user/es.yml @@ -0,0 +1,17 @@ +name: usuario +columns: + id: id + name: nombre + roleFk: rol + nickname: apodo + lang: idioma + password: contraseña + bcryptPassword: contraseña BCRYPT + active: activo + email: correo electrónico + emailVerified: correo verificado + created: creado + updated: actualizado + image: imagen + hasGrant: puede delegar + userFk: usuario diff --git a/back/methods/account/change-password.js b/modules/account/back/methods/account/change-password.js similarity index 93% rename from back/methods/account/change-password.js rename to modules/account/back/methods/account/change-password.js index b8f9de341..549508ffa 100644 --- a/back/methods/account/change-password.js +++ b/modules/account/back/methods/account/change-password.js @@ -30,6 +30,6 @@ module.exports = Self => { Self.changePassword = async function(id, oldPassword, newPassword) { await Self.rawSql(`CALL account.user_changePassword(?, ?, ?)`, [id, oldPassword, newPassword]); - await Self.app.models.UserAccount.syncById(id, newPassword); + await Self.app.models.Account.syncById(id, newPassword); }; }; diff --git a/modules/account/back/methods/account/login.js b/modules/account/back/methods/account/login.js new file mode 100644 index 000000000..c3218172c --- /dev/null +++ b/modules/account/back/methods/account/login.js @@ -0,0 +1,27 @@ +module.exports = Self => { + Self.remoteMethod('login', { + description: 'Login a user with username/email and password', + accepts: [ + { + arg: 'user', + type: 'String', + description: 'The user name or email', + required: true + }, { + arg: 'password', + type: 'String', + description: 'The password' + } + ], + returns: { + type: 'object', + root: true + }, + http: { + path: `/login`, + verb: 'POST' + } + }); + + Self.login = async(user, password) => Self.app.models.VnUser.signIn(user, password); +}; diff --git a/back/methods/account/logout.js b/modules/account/back/methods/account/logout.js similarity index 76% rename from back/methods/account/logout.js rename to modules/account/back/methods/account/logout.js index 515855267..5db3efa33 100644 --- a/back/methods/account/logout.js +++ b/modules/account/back/methods/account/logout.js @@ -18,8 +18,5 @@ module.exports = Self => { } }); - Self.logout = async function(ctx) { - await Self.app.models.User.logout(ctx.req.accessToken.id); - return true; - }; + Self.logout = async ctx => Self.app.models.VnUser.logout(ctx.req.accessToken.id); }; diff --git a/back/methods/account/set-password.js b/modules/account/back/methods/account/set-password.js similarity index 91% rename from back/methods/account/set-password.js rename to modules/account/back/methods/account/set-password.js index 093935948..b4204d103 100644 --- a/back/methods/account/set-password.js +++ b/modules/account/back/methods/account/set-password.js @@ -24,6 +24,6 @@ module.exports = Self => { Self.setPassword = async function(id, newPassword) { await Self.rawSql(`CALL account.user_setPassword(?, ?)`, [id, newPassword]); - await Self.app.models.UserAccount.syncById(id, newPassword); + await Self.app.models.Account.syncById(id, newPassword); }; }; diff --git a/back/methods/account/specs/change-password.spec.js b/modules/account/back/methods/account/specs/change-password.spec.js similarity index 100% rename from back/methods/account/specs/change-password.spec.js rename to modules/account/back/methods/account/specs/change-password.spec.js diff --git a/back/methods/account/specs/set-password.spec.js b/modules/account/back/methods/account/specs/set-password.spec.js similarity index 54% rename from back/methods/account/specs/set-password.spec.js rename to modules/account/back/methods/account/specs/set-password.spec.js index fe71873de..5de2a7bad 100644 --- a/back/methods/account/specs/set-password.spec.js +++ b/modules/account/back/methods/account/specs/set-password.spec.js @@ -1,14 +1,14 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); -describe('account setPassword()', () => { +describe('Account setPassword()', () => { it('should throw an error when password does not meet requirements', async() => { - let req = app.models.Account.setPassword(1, 'insecurePass'); + let req = models.Account.setPassword(1, 'insecurePass'); await expectAsync(req).toBeRejected(); }); it('should update password when it passes requirements', async() => { - let req = app.models.Account.setPassword(1, 'Very$ecurePa22.'); + let req = models.Account.setPassword(1, 'Very$ecurePa22.'); await expectAsync(req).toBeResolved(); }); diff --git a/modules/account/back/methods/user-account/sync-all.js b/modules/account/back/methods/account/sync-all.js similarity index 100% rename from modules/account/back/methods/user-account/sync-all.js rename to modules/account/back/methods/account/sync-all.js diff --git a/modules/account/back/methods/user-account/sync-by-id.js b/modules/account/back/methods/account/sync-by-id.js similarity index 90% rename from modules/account/back/methods/user-account/sync-by-id.js rename to modules/account/back/methods/account/sync-by-id.js index b08c9d9fc..538bc09bd 100644 --- a/modules/account/back/methods/user-account/sync-by-id.js +++ b/modules/account/back/methods/account/sync-by-id.js @@ -25,7 +25,7 @@ module.exports = Self => { }); Self.syncById = async function(id, password, force) { - let user = await Self.app.models.Account.findById(id, {fields: ['name']}); + let user = await Self.app.models.VnUser.findById(id, {fields: ['name']}); await Self.sync(user.name, password, force); }; }; diff --git a/modules/account/back/methods/user-account/sync.js b/modules/account/back/methods/account/sync.js similarity index 76% rename from modules/account/back/methods/user-account/sync.js rename to modules/account/back/methods/account/sync.js index 86491d72e..8668be343 100644 --- a/modules/account/back/methods/user-account/sync.js +++ b/modules/account/back/methods/account/sync.js @@ -25,16 +25,16 @@ module.exports = Self => { }); Self.sync = async function(userName, password, force) { - let $ = Self.app.models; - let user = await $.Account.findOne({ + const models = Self.app.models; + const user = await models.VnUser.findOne({ fields: ['id'], where: {name: userName} }); - let isSync = !await $.UserSync.exists(userName); + const isSync = !await models.UserSync.exists(userName); if (!force && isSync && user) return; - await $.AccountConfig.syncUser(userName, password); - await $.UserSync.destroyById(userName); + await models.AccountConfig.syncUser(userName, password); + await models.UserSync.destroyById(userName); }; }; diff --git a/modules/account/back/model-config.json b/modules/account/back/model-config.json index c697bd3b9..a4eb9fa57 100644 --- a/modules/account/back/model-config.json +++ b/modules/account/back/model-config.json @@ -23,6 +23,9 @@ "RoleConfig": { "dataSource": "vn" }, + "RoleLog": { + "dataSource": "vn" + }, "RoleInherit": { "dataSource": "vn" }, @@ -38,7 +41,10 @@ "SipConfig": { "dataSource": "vn" }, - "UserAccount": { + "Account": { + "dataSource": "vn" + }, + "UserLog": { "dataSource": "vn" }, "UserPassword": { @@ -47,4 +53,4 @@ "UserSync": { "dataSource": "vn" } -} \ No newline at end of file +} diff --git a/modules/account/back/models/account-config.js b/modules/account/back/models/account-config.js index 49e120a08..5c9d92f1e 100644 --- a/modules/account/back/models/account-config.js +++ b/modules/account/back/models/account-config.js @@ -100,7 +100,7 @@ module.exports = Self => { if (['administrator', 'root'].indexOf(userName) >= 0) return; - let user = await $.Account.findOne({ + let user = await $.VnUser.findOne({ where: {name: userName}, fields: [ 'id', @@ -138,7 +138,7 @@ module.exports = Self => { }; if (user) { - let exists = await $.UserAccount.exists(user.id); + let exists = await $.Account.exists(user.id); Object.assign(info, { hasAccount: user.active && exists, corporateMail: `${userName}@${this.domain}`, @@ -177,11 +177,11 @@ module.exports = Self => { async syncUser(userName, info, password) { if (info.user && password) - await app.models.user.setPassword(info.user.id, password); + await app.models.VnUser.setPassword(info.user.id, password); }, async getUsers(usersToSync) { - let accounts = await app.models.UserAccount.find({ + let accounts = await app.models.Account.find({ fields: ['id'], include: { relation: 'user', diff --git a/modules/account/back/models/account.js b/modules/account/back/models/account.js new file mode 100644 index 000000000..5021a5d94 --- /dev/null +++ b/modules/account/back/models/account.js @@ -0,0 +1,10 @@ + +module.exports = Self => { + require('../methods/account/sync')(Self); + require('../methods/account/sync-by-id')(Self); + require('../methods/account/sync-all')(Self); + require('../methods/account/login')(Self); + require('../methods/account/logout')(Self); + require('../methods/account/change-password')(Self); + require('../methods/account/set-password')(Self); +}; diff --git a/modules/account/back/models/account.json b/modules/account/back/models/account.json new file mode 100644 index 000000000..8fe3e88f9 --- /dev/null +++ b/modules/account/back/models/account.json @@ -0,0 +1,42 @@ +{ + "name": "Account", + "base": "VnModel", + "options": { + "mysql": { + "table": "account.account" + } + }, + "properties": { + "id": { + "id": true + } + }, + "relations": { + "user": { + "type": "belongsTo", + "model": "VnUser", + "foreignKey": "id" + }, + "aliases": { + "type": "hasMany", + "model": "MailAliasAccount", + "foreignKey": "account" + } + }, + "acls": [ + { + "property": "login", + "accessType": "EXECUTE", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }, + { + "property": "logout", + "accessType": "EXECUTE", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + } + ] +} diff --git a/modules/account/back/models/ldap-config.js b/modules/account/back/models/ldap-config.js index a2a2684a9..f9ae7562b 100644 --- a/modules/account/back/models/ldap-config.js +++ b/modules/account/back/models/ldap-config.js @@ -5,7 +5,7 @@ const crypto = require('crypto'); const nthash = require('smbhash').nthash; module.exports = Self => { - const shouldSync = process.env.NODE_ENV !== 'test'; + const shouldSync = process.env.NODE_ENV === 'production'; Self.getSynchronizer = async function() { return await Self.findOne({ @@ -32,7 +32,6 @@ module.exports = Self => { }, async syncUser(userName, info, password) { - let { client, accountConfig @@ -212,7 +211,7 @@ module.exports = Self => { } } } - + await applyOperations(deleteGroups, 'delete'); await applyOperations(addGroups, 'add'); }, @@ -248,7 +247,7 @@ module.exports = Self => { return {key: e.inheritsFrom, val: e.role}; }); - let accounts = await $.UserAccount.find({ + let accounts = await $.Account.find({ fields: ['id'], include: { relation: 'user', diff --git a/modules/account/back/models/mail-alias-account.json b/modules/account/back/models/mail-alias-account.json index 114d401e0..416c2acd8 100644 --- a/modules/account/back/models/mail-alias-account.json +++ b/modules/account/back/models/mail-alias-account.json @@ -20,7 +20,7 @@ }, "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "account" } } diff --git a/modules/account/back/models/mail-forward.json b/modules/account/back/models/mail-forward.json index a3e0eafd9..edef1bf08 100644 --- a/modules/account/back/models/mail-forward.json +++ b/modules/account/back/models/mail-forward.json @@ -18,7 +18,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "account" } } diff --git a/modules/account/back/models/role-log.json b/modules/account/back/models/role-log.json new file mode 100644 index 000000000..510e98b68 --- /dev/null +++ b/modules/account/back/models/role-log.json @@ -0,0 +1,58 @@ +{ + "name": "RoleLog", + "base": "Log", + "options": { + "mysql": { + "table": "account.roleLog" + } + }, + "properties": { + "id": { + "id": true, + "type": "number", + "forceId": false + }, + "originFk": { + "type": "number", + "required": true + }, + "userFk": { + "type": "number" + }, + "action": { + "type": "string", + "required": true + }, + "changedModel": { + "type": "string" + }, + "oldInstance": { + "type": "object" + }, + "newInstance": { + "type": "object" + }, + "creationDate": { + "type": "date" + }, + "changedModelId": { + "type": "number" + }, + "changedModelValue": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "relations": { + "user": { + "type": "belongsTo", + "model": "Account", + "foreignKey": "userFk" + } + }, + "scope": { + "order": ["creationDate DESC", "id DESC"] + } +} diff --git a/modules/account/back/models/sip-config.js b/modules/account/back/models/sip-config.js index 78213039b..3b5cb2dbb 100644 --- a/modules/account/back/models/sip-config.js +++ b/modules/account/back/models/sip-config.js @@ -10,7 +10,7 @@ module.exports = Self => { async syncUser(userName, info, password) { if (!info.hasAccount || !password) return; - await app.models.Account.rawSql('CALL pbx.sip_setPassword(?, ?)', + await app.models.VnUser.rawSql('CALL pbx.sip_setPassword(?, ?)', [info.user.id, password] ); } diff --git a/modules/account/back/models/sip.json b/modules/account/back/models/sip.json index 21671f4bf..f2e2221b5 100644 --- a/modules/account/back/models/sip.json +++ b/modules/account/back/models/sip.json @@ -23,7 +23,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "user_id" } } diff --git a/modules/account/back/models/user-account.js b/modules/account/back/models/user-account.js deleted file mode 100644 index b3782c27e..000000000 --- a/modules/account/back/models/user-account.js +++ /dev/null @@ -1,6 +0,0 @@ - -module.exports = Self => { - require('../methods/user-account/sync')(Self); - require('../methods/user-account/sync-by-id')(Self); - require('../methods/user-account/sync-all')(Self); -}; diff --git a/modules/account/back/models/user-account.json b/modules/account/back/models/user-account.json deleted file mode 100644 index fc0526388..000000000 --- a/modules/account/back/models/user-account.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "UserAccount", - "base": "VnModel", - "options": { - "mysql": { - "table": "account.account" - } - }, - "properties": { - "id": { - "id": true - } - }, - "relations": { - "user": { - "type": "belongsTo", - "model": "Account", - "foreignKey": "id" - }, - "aliases": { - "type": "hasMany", - "model": "MailAliasAccount", - "foreignKey": "account" - } - } -} diff --git a/back/models/user-log.json b/modules/account/back/models/user-log.json similarity index 89% rename from back/models/user-log.json rename to modules/account/back/models/user-log.json index 43ccbfa43..c5aa08e05 100644 --- a/back/models/user-log.json +++ b/modules/account/back/models/user-log.json @@ -1,9 +1,9 @@ { "name": "UserLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { - "table": "userLog" + "table": "account.userLog" } }, "properties": { @@ -16,7 +16,7 @@ "type": "number", "required": true }, - "userFk": { + "userFk": { "type": "number" }, "action": { @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/account/front/accounts/index.js b/modules/account/front/accounts/index.js index 4c7ea53b6..7a341b0b0 100644 --- a/modules/account/front/accounts/index.js +++ b/modules/account/front/accounts/index.js @@ -5,7 +5,7 @@ import UserError from 'core/lib/user-error'; export default class Controller extends Section { onSynchronizeAll() { this.vnApp.showSuccess(this.$t('Synchronizing in the background')); - this.$http.patch(`UserAccounts/syncAll`) + this.$http.patch(`Accounts/syncAll`) .then(() => this.vnApp.showSuccess(this.$t('Users synchronized!'))); } @@ -17,7 +17,7 @@ export default class Controller extends Section { password: this.syncPassword, force: true }; - return this.$http.patch(`UserAccounts/${this.syncUser}/sync`, params) + return this.$http.patch(`Accounts/${this.syncUser}/sync`, params) .then(() => this.vnApp.showSuccess(this.$t('User synchronized!'))); } diff --git a/modules/account/front/basic-data/index.html b/modules/account/front/basic-data/index.html index 91df3bffd..6f757753e 100644 --- a/modules/account/front/basic-data/index.html +++ b/modules/account/front/basic-data/index.html @@ -1,6 +1,6 @@ @@ -14,25 +14,25 @@ + rule="VnUser"> + rule="VnUser"> + rule="VnUser">
diff --git a/modules/account/front/card/index.js b/modules/account/front/card/index.js index 5266592f3..e06f991bb 100644 --- a/modules/account/front/card/index.js +++ b/modules/account/front/card/index.js @@ -14,9 +14,9 @@ class Controller extends ModuleCard { }; return Promise.all([ - this.$http.get(`Accounts/${this.$params.id}`, {filter}) + this.$http.get(`VnUsers/${this.$params.id}`, {filter}) .then(res => this.user = res.data), - this.$http.get(`UserAccounts/${this.$params.id}/exists`) + this.$http.get(`Accounts/${this.$params.id}/exists`) .then(res => this.hasAccount = res.data.exists) ]); } diff --git a/modules/account/front/card/index.spec.js b/modules/account/front/card/index.spec.js index cd28c458a..204b897e4 100644 --- a/modules/account/front/card/index.spec.js +++ b/modules/account/front/card/index.spec.js @@ -15,8 +15,8 @@ describe('component vnUserCard', () => { it('should reload the controller data', () => { controller.$params.id = 1; - $httpBackend.expectGET('Accounts/1').respond('foo'); - $httpBackend.expectGET('UserAccounts/1/exists').respond({exists: true}); + $httpBackend.expectGET('VnUsers/1').respond('foo'); + $httpBackend.expectGET('Accounts/1/exists').respond({exists: true}); controller.reload(); $httpBackend.flush(); diff --git a/modules/account/front/create/index.html b/modules/account/front/create/index.html index ca4a2f840..ee2de926a 100644 --- a/modules/account/front/create/index.html +++ b/modules/account/front/create/index.html @@ -1,6 +1,6 @@ @@ -14,24 +14,24 @@ + rule="VnUser"> + rule="VnUser"> + rule="VnUser"> this.hasAccount = res.data.exists); } onDelete() { - return this.$http.delete(`Accounts/${this.id}`) + return this.$http.delete(`VnUsers/${this.id}`) .then(() => this.$state.go('account.index')) .then(() => this.vnApp.showSuccess(this.$t('User removed'))); } @@ -69,12 +69,12 @@ class Controller extends Descriptor { } onEnableAccount() { - return this.$http.post(`UserAccounts`, {id: this.id}) + return this.$http.post(`Accounts`, {id: this.id}) .then(() => this.onSwitchAccount(true)); } onDisableAccount() { - return this.$http.delete(`UserAccounts/${this.id}`) + return this.$http.delete(`Accounts/${this.id}`) .then(() => this.onSwitchAccount(false)); } @@ -88,7 +88,7 @@ class Controller extends Descriptor { } onSetActive(active) { - return this.$http.patch(`Accounts/${this.id}`, {active}) + return this.$http.patch(`VnUsers/${this.id}`, {active}) .then(() => { this.user.active = active; const message = active diff --git a/modules/account/front/descriptor/index.spec.js b/modules/account/front/descriptor/index.spec.js index f5e7aa7d4..46c7e376c 100644 --- a/modules/account/front/descriptor/index.spec.js +++ b/modules/account/front/descriptor/index.spec.js @@ -10,7 +10,7 @@ describe('component vnUserDescriptor', () => { beforeEach(inject(($componentController, _$httpBackend_) => { $httpBackend = _$httpBackend_; - $httpBackend.whenGET('UserAccounts/1/exists').respond({exists: true}); + $httpBackend.whenGET('Accounts/1/exists').respond({exists: true}); controller = $componentController('vnUserDescriptor', {$element: null}, {user}); jest.spyOn(controller, 'emit'); @@ -21,7 +21,7 @@ describe('component vnUserDescriptor', () => { it('should delete entity and go to index', () => { controller.$state.go = jest.fn(); - $httpBackend.expectDELETE('Accounts/1').respond(); + $httpBackend.expectDELETE('VnUsers/1').respond(); controller.onDelete(); $httpBackend.flush(); @@ -61,7 +61,7 @@ describe('component vnUserDescriptor', () => { describe('onEnableAccount()', () => { it('should make request to enable account', () => { - $httpBackend.expectPOST('UserAccounts', {id: 1}).respond(); + $httpBackend.expectPOST('Accounts', {id: 1}).respond(); controller.onEnableAccount(); $httpBackend.flush(); @@ -73,7 +73,7 @@ describe('component vnUserDescriptor', () => { describe('onDisableAccount()', () => { it('should make request to disable account', () => { - $httpBackend.expectDELETE('UserAccounts/1').respond(); + $httpBackend.expectDELETE('Accounts/1').respond(); controller.onDisableAccount(); $httpBackend.flush(); @@ -85,7 +85,7 @@ describe('component vnUserDescriptor', () => { describe('onSetActive()', () => { it('should make request to activate/deactivate the user', () => { - $httpBackend.expectPATCH('Accounts/1', {active: true}).respond(); + $httpBackend.expectPATCH('VnUsers/1', {active: true}).respond(); controller.onSetActive(true); $httpBackend.flush(); diff --git a/modules/account/front/index.js b/modules/account/front/index.js index 0cd0c4955..695f36967 100644 --- a/modules/account/front/index.js +++ b/modules/account/front/index.js @@ -19,3 +19,5 @@ import './ldap'; import './samba'; import './accounts'; import './privileges'; +import './user-log'; +import './role-log'; diff --git a/modules/account/front/locale/es.yml b/modules/account/front/locale/es.yml index 18e2c06a1..7988cbda6 100644 --- a/modules/account/front/locale/es.yml +++ b/modules/account/front/locale/es.yml @@ -8,4 +8,5 @@ Role: Rol Mail aliases: Alias de correo Account not enabled: Cuenta no habilitada Inherited roles: Roles heredados -Go to the user: Ir al usuario \ No newline at end of file +Go to the user: Ir al usuario +Log: Histórico diff --git a/modules/account/front/main/index.html b/modules/account/front/main/index.html index 5736b3a3b..5872a328d 100644 --- a/modules/account/front/main/index.html +++ b/modules/account/front/main/index.html @@ -1,11 +1,12 @@ - \ No newline at end of file + diff --git a/modules/account/front/privileges/index.html b/modules/account/front/privileges/index.html index e3e44898a..8e33b708e 100644 --- a/modules/account/front/privileges/index.html +++ b/modules/account/front/privileges/index.html @@ -1,7 +1,7 @@ - + diff --git a/modules/account/front/role-log/index.js b/modules/account/front/role-log/index.js new file mode 100644 index 000000000..02448ccaa --- /dev/null +++ b/modules/account/front/role-log/index.js @@ -0,0 +1,7 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; + +ngModule.vnComponent('vnRoleLog', { + template: require('./index.html'), + controller: Section, +}); diff --git a/modules/account/front/routes.json b/modules/account/front/routes.json index a6f2f5d3f..cc66df103 100644 --- a/modules/account/front/routes.json +++ b/modules/account/front/routes.json @@ -20,12 +20,14 @@ {"state": "account.card.roles", "icon": "group"}, {"state": "account.card.mailForwarding", "icon": "forward"}, {"state": "account.card.aliases", "icon": "email"}, - {"state": "account.card.privileges", "icon": "badge"} + {"state": "account.card.privileges", "icon": "badge"}, + {"state": "account.card.log", "icon": "history"} ], "role": [ {"state": "account.role.card.basicData", "icon": "settings"}, {"state": "account.role.card.subroles", "icon": "groups"}, - {"state": "account.role.card.inherited", "icon": "account_tree"} + {"state": "account.role.card.inherited", "icon": "account_tree"}, + {"state": "account.role.card.log", "icon": "history"} ], "alias": [ {"state": "account.alias.card.basicData", "icon": "settings"}, @@ -80,6 +82,18 @@ "description": "Basic data", "acl": ["hr"] }, + { + "url" : "/log", + "state": "account.card.log", + "component": "vn-user-log", + "description": "Log" + }, + { + "url" : "/log", + "state": "account.role.card.log", + "component": "vn-role-log", + "description": "Log" + }, { "url": "/roles", "state": "account.card.roles", diff --git a/modules/account/front/summary/index.js b/modules/account/front/summary/index.js index 8ed025b61..8d30070e9 100644 --- a/modules/account/front/summary/index.js +++ b/modules/account/front/summary/index.js @@ -15,7 +15,7 @@ class Controller extends Summary { } } }; - this.$http.get(`Accounts/${value.id}`, {filter}) + this.$http.get(`VnUsers/${value.id}`, {filter}) .then(res => this.$.summary = res.data); } get isHr() { diff --git a/modules/account/front/user-log/index.html b/modules/account/front/user-log/index.html new file mode 100644 index 000000000..5a77ed7b9 --- /dev/null +++ b/modules/account/front/user-log/index.html @@ -0,0 +1 @@ + diff --git a/modules/account/front/user-log/index.js b/modules/account/front/user-log/index.js new file mode 100644 index 000000000..7cd0bb378 --- /dev/null +++ b/modules/account/front/user-log/index.js @@ -0,0 +1,7 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; + +ngModule.vnComponent('vnUserLog', { + template: require('./index.html'), + controller: Section, +}); diff --git a/modules/claim/back/locale/claim-beginning/en.yml b/modules/claim/back/locale/claim-beginning/en.yml new file mode 100644 index 000000000..4c1520704 --- /dev/null +++ b/modules/claim/back/locale/claim-beginning/en.yml @@ -0,0 +1,6 @@ +name: beginning +columns: + id: id + quantity: quantity + claimFk: claim + saleFk: sale diff --git a/modules/claim/back/locale/claim-beginning/es.yml b/modules/claim/back/locale/claim-beginning/es.yml new file mode 100644 index 000000000..20110cb52 --- /dev/null +++ b/modules/claim/back/locale/claim-beginning/es.yml @@ -0,0 +1,6 @@ +name: comienzo +columns: + id: id + quantity: cantidad + claimFk: reclamación + saleFk: línea diff --git a/modules/claim/back/locale/claim-development/en.yml b/modules/claim/back/locale/claim-development/en.yml new file mode 100644 index 000000000..875cbf121 --- /dev/null +++ b/modules/claim/back/locale/claim-development/en.yml @@ -0,0 +1,9 @@ +name: development +columns: + id: id + claimFk: claim + claimResponsibleFk: responsible + claimReasonFk: reason + claimResultFk: result + claimRedeliveryFk: redelivery + workerFk: worker diff --git a/modules/claim/back/locale/claim-development/es.yml b/modules/claim/back/locale/claim-development/es.yml new file mode 100644 index 000000000..c95a1c0e7 --- /dev/null +++ b/modules/claim/back/locale/claim-development/es.yml @@ -0,0 +1,9 @@ +name: desarrollo +columns: + id: id + claimFk: reclamación + claimResponsibleFk: responsable + claimReasonFk: motivo + claimResultFk: resultado + claimRedeliveryFk: reenvío + workerFk: trabajador diff --git a/modules/claim/back/locale/claim-dms/en.yml b/modules/claim/back/locale/claim-dms/en.yml new file mode 100644 index 000000000..4b54ca19b --- /dev/null +++ b/modules/claim/back/locale/claim-dms/en.yml @@ -0,0 +1,4 @@ +name: document +columns: + dmsFk: dms + claimFk: claim diff --git a/modules/claim/back/locale/claim-dms/es.yml b/modules/claim/back/locale/claim-dms/es.yml new file mode 100644 index 000000000..d471b1ff6 --- /dev/null +++ b/modules/claim/back/locale/claim-dms/es.yml @@ -0,0 +1,4 @@ +name: documento +columns: + dmsFk: dms + claimFk: reclamación diff --git a/modules/claim/back/locale/claim-end/en.yml b/modules/claim/back/locale/claim-end/en.yml new file mode 100644 index 000000000..4565cd579 --- /dev/null +++ b/modules/claim/back/locale/claim-end/en.yml @@ -0,0 +1,7 @@ +name: end +columns: + id: id + claimFk: claim + saleFk: sale + workerFk: worker + claimDestinationFk: destination diff --git a/modules/claim/back/locale/claim-end/es.yml b/modules/claim/back/locale/claim-end/es.yml new file mode 100644 index 000000000..e5511c166 --- /dev/null +++ b/modules/claim/back/locale/claim-end/es.yml @@ -0,0 +1,7 @@ +name: finalización +columns: + id: id + claimFk: reclamación + saleFk: línea + workerFk: trabajador + claimDestinationFk: destino diff --git a/modules/claim/back/locale/claim-observation/en.yml b/modules/claim/back/locale/claim-observation/en.yml new file mode 100644 index 000000000..a0ba2c449 --- /dev/null +++ b/modules/claim/back/locale/claim-observation/en.yml @@ -0,0 +1,7 @@ +name: observation +columns: + id: id + claimFk: claim + text: text + created: created + workerFk: worker diff --git a/modules/claim/back/locale/claim-observation/es.yml b/modules/claim/back/locale/claim-observation/es.yml new file mode 100644 index 000000000..9ea5e275c --- /dev/null +++ b/modules/claim/back/locale/claim-observation/es.yml @@ -0,0 +1,7 @@ +name: observación +columns: + id: id + claimFk: reclamación + text: texto + created: creado + workerFk: tabajador diff --git a/modules/claim/back/locale/claim/en.yml b/modules/claim/back/locale/claim/en.yml new file mode 100644 index 000000000..7c3ee7555 --- /dev/null +++ b/modules/claim/back/locale/claim/en.yml @@ -0,0 +1,16 @@ +name: claim +columns: + id: id + observation: observation + ticketCreated: ticket created + isChargedToMana: charged to mana + created: created + responsibility: responsibility + hasToPickUp: has to pickUp + ticketFk: ticket + claimStateFk: claim state + workerFk: worker + packages: packages + rma: rma + clientFk: client + claimFk: claim diff --git a/modules/claim/back/locale/claim/es.yml b/modules/claim/back/locale/claim/es.yml new file mode 100644 index 000000000..27fd76ceb --- /dev/null +++ b/modules/claim/back/locale/claim/es.yml @@ -0,0 +1,16 @@ +name: reclamación +columns: + id: id + observation: observación + ticketCreated: ticket creado + isChargedToMana: cargado al maná + created: creado + responsibility: responsabilidad + hasToPickUp: es recogida + ticketFk: ticket + claimStateFk: estado reclamación + workerFk: trabajador + packages: paquetes + rma: rma + clientFk: cliente + claimFk: reclamación diff --git a/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js b/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js index f0686ffa6..83043f012 100644 --- a/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js +++ b/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js @@ -109,6 +109,11 @@ module.exports = Self => { zoneFk: zone.id }, myOptions); + await models.TicketRefund.create({ + refundTicketFk: newRefundTicket.id, + originalTicketFk: claim.ticket().id + }, myOptions); + await saveObservation({ description: `Reclama ticket: ${claim.ticketFk}`, ticketFk: newRefundTicket.id, diff --git a/modules/claim/back/methods/claim-state/isEditable.js b/modules/claim/back/methods/claim-state/isEditable.js index ad51d543a..641bc3b42 100644 --- a/modules/claim/back/methods/claim-state/isEditable.js +++ b/modules/claim/back/methods/claim-state/isEditable.js @@ -33,6 +33,6 @@ module.exports = Self => { } }, myOptions); const roleWithGrants = state && state.writeRole().name; - return await models.Account.hasRole(userId, roleWithGrants, myOptions); + return await models.VnUser.hasRole(userId, roleWithGrants, myOptions); }; }; diff --git a/modules/claim/back/methods/claim/createFromSales.js b/modules/claim/back/methods/claim/createFromSales.js index 2ce3bc44b..10d0b9b28 100644 --- a/modules/claim/back/methods/claim/createFromSales.js +++ b/modules/claim/back/methods/claim/createFromSales.js @@ -59,7 +59,7 @@ module.exports = Self => { const landedPlusWeek = new Date(ticket.landed); landedPlusWeek.setDate(landedPlusWeek.getDate() + 7); - const hasClaimManagerRole = await models.Account.hasRole(userId, 'claimManager', myOptions); + const hasClaimManagerRole = await models.VnUser.hasRole(userId, 'claimManager', myOptions); const isClaimable = landedPlusWeek >= Date.vnNew(); if (ticket.isDeleted) diff --git a/modules/claim/back/methods/claim/specs/updateClaim.spec.js b/modules/claim/back/methods/claim/specs/updateClaim.spec.js index 113df35c9..d367fb89f 100644 --- a/modules/claim/back/methods/claim/specs/updateClaim.spec.js +++ b/modules/claim/back/methods/claim/specs/updateClaim.spec.js @@ -1,6 +1,20 @@ const app = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); describe('Update Claim', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); const newDate = Date.vnNew(); const originalData = { ticketFk: 3, diff --git a/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js b/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js index 12ab45fac..2f16d002c 100644 --- a/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js +++ b/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js @@ -1,6 +1,20 @@ const app = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); describe('Update Claim', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); const newDate = Date.vnNew(); const original = { ticketFk: 3, diff --git a/modules/claim/back/methods/claim/updateClaim.js b/modules/claim/back/methods/claim/updateClaim.js index 5271136d6..f10c68b21 100644 --- a/modules/claim/back/methods/claim/updateClaim.js +++ b/modules/claim/back/methods/claim/updateClaim.js @@ -81,7 +81,7 @@ module.exports = Self => { if (args.claimStateFk) { const canEditOldState = await models.ClaimState.isEditable(ctx, claim.claimStateFk, myOptions); const canEditNewState = await models.ClaimState.isEditable(ctx, args.claimStateFk, myOptions); - const isClaimManager = await models.Account.hasRole(userId, 'claimManager', myOptions); + const isClaimManager = await models.VnUser.hasRole(userId, 'claimManager', myOptions); if (!canEditOldState || !canEditNewState || changedHasToPickUp && !isClaimManager) throw new UserError(`You don't have enough privileges to change that field`); diff --git a/modules/claim/back/models/claim-beginning.json b/modules/claim/back/models/claim-beginning.json index afa21f817..d355881e8 100644 --- a/modules/claim/back/models/claim-beginning.json +++ b/modules/claim/back/models/claim-beginning.json @@ -1,11 +1,6 @@ { "name": "ClaimBeginning", "base": "Loggable", - "log": { - "model": "ClaimLog", - "relation": "claim", - "showField": "quantity" - }, "options": { "mysql": { "table": "claimBeginning" diff --git a/modules/claim/back/models/claim-development.json b/modules/claim/back/models/claim-development.json index 02061fab7..b0f352f50 100644 --- a/modules/claim/back/models/claim-development.json +++ b/modules/claim/back/models/claim-development.json @@ -1,10 +1,6 @@ { "name": "ClaimDevelopment", "base": "Loggable", - "log": { - "model": "ClaimLog", - "relation": "claim" - }, "options": { "mysql": { "table": "claimDevelopment" diff --git a/modules/claim/back/models/claim-dms.json b/modules/claim/back/models/claim-dms.json index a215b6bb7..26c90fd69 100644 --- a/modules/claim/back/models/claim-dms.json +++ b/modules/claim/back/models/claim-dms.json @@ -1,18 +1,14 @@ { "name": "ClaimDms", "base": "Loggable", - "log": { - "model": "ClaimLog", - "relation": "claim" - }, "options": { "mysql": { "table": "claimDms" } }, "allowedContentTypes": [ - "image/png", - "image/jpeg", + "image/png", + "image/jpeg", "image/jpg" ], "properties": { @@ -34,4 +30,4 @@ "foreignKey": "dmsFk" } } -} \ No newline at end of file +} diff --git a/modules/claim/back/models/claim-end.json b/modules/claim/back/models/claim-end.json index 12d79f71b..9f12ff93a 100644 --- a/modules/claim/back/models/claim-end.json +++ b/modules/claim/back/models/claim-end.json @@ -1,10 +1,6 @@ { "name": "ClaimEnd", "base": "Loggable", - "log": { - "model": "ClaimLog", - "relation": "claim" - }, "options": { "mysql": { "table": "claimEnd" diff --git a/modules/claim/back/models/claim-log.json b/modules/claim/back/models/claim-log.json index 519cfe1ea..9f28af63e 100644 --- a/modules/claim/back/models/claim-log.json +++ b/modules/claim/back/models/claim-log.json @@ -1,6 +1,6 @@ { "name": "ClaimLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "claimLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/claim/back/models/claim-observation.json b/modules/claim/back/models/claim-observation.json index e882ad09d..2d418b76e 100644 --- a/modules/claim/back/models/claim-observation.json +++ b/modules/claim/back/models/claim-observation.json @@ -1,10 +1,6 @@ { "name": "ClaimObservation", "base": "Loggable", - "log": { - "model": "ClaimLog", - "relation": "claim" - }, "options": { "mysql": { "table": "claimObservation" @@ -40,4 +36,4 @@ "foreignKey": "claimFk" } } -} \ No newline at end of file +} diff --git a/modules/claim/back/models/claim-state.json b/modules/claim/back/models/claim-state.json index 2fd6d4845..f5bde4168 100644 --- a/modules/claim/back/models/claim-state.json +++ b/modules/claim/back/models/claim-state.json @@ -1,11 +1,6 @@ { "name": "ClaimState", "base": "Loggable", - "log": { - "model": "ClaimLog", - "relation": "claim", - "showField": "description" - }, "options": { "mysql": { "table": "claimState" diff --git a/modules/claim/back/models/claim.json b/modules/claim/back/models/claim.json index 4b26720e5..a7db1f3e1 100644 --- a/modules/claim/back/models/claim.json +++ b/modules/claim/back/models/claim.json @@ -1,10 +1,6 @@ { "name": "Claim", "base": "Loggable", - "log": { - "model": "ClaimLog", - "showField": "id" - }, "options": { "mysql": { "table": "claim" diff --git a/modules/claim/front/action/index.html b/modules/claim/front/action/index.html index 81b14d3a7..9da51b8de 100644 --- a/modules/claim/front/action/index.html +++ b/modules/claim/front/action/index.html @@ -16,7 +16,7 @@ value="{{$ctrl.claimedTotal | currency: 'EUR':2}}"> - + - + label="Change destination" + disabled="$ctrl.checked.length == 0" + ng-click="changeDestination.show()"> + + + - - - + diff --git a/modules/claim/front/descriptor/index.js b/modules/claim/front/descriptor/index.js index 0dddadbe1..5e9ea5140 100644 --- a/modules/claim/front/descriptor/index.js +++ b/modules/claim/front/descriptor/index.js @@ -17,6 +17,10 @@ class Controller extends Descriptor { } sendPickupOrder() { + if (!this.claim.client.email) { + this.vnApp.showError(this.$t('The client does not have an email')); + return; + } return this.vnEmail.send(`Claims/${this.claim.id}/claim-pickup-email`, { recipient: this.claim.client.email, recipientId: this.claim.clientFk diff --git a/modules/claim/front/locale/es.yml b/modules/claim/front/locale/es.yml index 419e62f56..f6dac2b83 100644 --- a/modules/claim/front/locale/es.yml +++ b/modules/claim/front/locale/es.yml @@ -20,3 +20,4 @@ Photos: Fotos Go to the claim: Ir a la reclamación Sale tracking: Líneas preparadas Ticket tracking: Estados del ticket +The client does not have an email: El cliente no tiene email diff --git a/modules/claim/front/photos/index.html b/modules/claim/front/photos/index.html index 9e00ee02f..8b1378917 100644 --- a/modules/claim/front/photos/index.html +++ b/modules/claim/front/photos/index.html @@ -1,48 +1 @@ - - - -
-
-
Drag & Drop photos here...
-
-
-
-
- -
- - -
-
-
- - - - + diff --git a/modules/claim/front/photos/index.js b/modules/claim/front/photos/index.js index 62e439a91..c9fada9a4 100644 --- a/modules/claim/front/photos/index.js +++ b/modules/claim/front/photos/index.js @@ -1,105 +1,17 @@ import ngModule from '../module'; import Section from 'salix/components/section'; -import './style.scss'; class Controller extends Section { - constructor($element, $, vnFile) { + constructor($element, $) { super($element, $); - this.vnFile = vnFile; - this.filter = { - include: [ - { - relation: 'dms' - } - ] - }; } - deleteDms(index) { - const dmsFk = this.photos[index].dmsFk; - return this.$http.post(`ClaimDms/${dmsFk}/removeFile`) - .then(() => { - this.$.model.remove(index); - this.vnApp.showSuccess(this.$t('File deleted')); - }); - } - - onDrop($event) { - const files = $event.dataTransfer.files; - this.setDefaultParams().then(() => { - this.dms.files = files; - this.create(); - }); - } - - setDefaultParams() { - const filter = { - where: {code: 'claim'} - }; - return this.$http.get('DmsTypes/findOne', {filter}).then(res => { - const dmsTypeId = res.data && res.data.id; - const companyId = this.vnConfig.companyFk; - const warehouseId = this.vnConfig.warehouseFk; - this.dms = { - hasFile: false, - hasFileAttached: false, - reference: this.claim.id, - warehouseId: warehouseId, - companyId: companyId, - dmsTypeId: dmsTypeId, - description: this.$t('FileDescription', { - claimId: this.claim.id, - clientId: this.claim.client.id, - clientName: this.claim.client.name - }).toUpperCase() - }; - }); - } - - openUploadDialog() { - const element = document.createElement('input'); - element.setAttribute('type', 'file'); - element.setAttribute('multiple', true); - element.click(); - - element.addEventListener('change', () => - this.setDefaultParams().then(() => { - this.dms.files = element.files; - this.create(); - }) - ); - } - - create() { - const query = `claims/${this.claim.id}/uploadFile`; - const options = { - method: 'POST', - url: query, - params: this.dms, - headers: {'Content-Type': undefined}, - transformRequest: files => { - const formData = new FormData(); - - for (let i = 0; i < files.length; i++) - formData.append(files[i].name, files[i]); - - return formData; - }, - data: this.dms.files - }; - this.$http(options).then(() => { - this.vnApp.showSuccess(this.$t('File uploaded!')); - this.$.model.refresh(); - }); - } - - getImagePath(dmsId) { - return this.vnFile.getPath(`/api/Claims/${dmsId}/downloadFile`); + async $onInit() { + const url = await this.vnApp.getUrl(`claim/${this.$params.id}/photos`); + window.location.href = url; } } -Controller.$inject = ['$element', '$scope', 'vnFile']; - ngModule.vnComponent('vnClaimPhotos', { template: require('./index.html'), controller: Controller, diff --git a/modules/claim/front/photos/index.spec.js b/modules/claim/front/photos/index.spec.js deleted file mode 100644 index 84df48b44..000000000 --- a/modules/claim/front/photos/index.spec.js +++ /dev/null @@ -1,70 +0,0 @@ -import './index'; -import crudModel from 'core/mocks/crud-model'; - -describe('Claim', () => { - describe('Component vnClaimPhotos', () => { - let $scope; - let $httpBackend; - let controller; - - beforeEach(ngModule('claim')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - controller = $componentController('vnClaimPhotos', {$element: null, $scope}); - controller.$.model = crudModel; - controller.claim = { - id: 1, - client: {id: 1101, name: 'Bruce Wayne'} - }; - })); - - describe('deleteDms()', () => { - it('should make an HTTP Post query', () => { - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller.$.model, 'remove'); - - const dmsId = 1; - const dmsIndex = 0; - controller.photos = [{dmsFk: 1}]; - - $httpBackend.expectPOST(`ClaimDms/${dmsId}/removeFile`).respond(); - controller.deleteDms(dmsIndex); - $httpBackend.flush(); - - expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex); - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - - describe('setDefaultParams()', () => { - it('should make an HTTP GET query, then set all dms properties', () => { - $httpBackend.expectRoute('GET', `DmsTypes/findOne`).respond({}); - controller.setDefaultParams(); - $httpBackend.flush(); - - expect(controller.dms).toBeDefined(); - }); - }); - - describe('create()', () => { - it('should make an HTTP Post query, then refresh the model data', () => { - const claimId = 1; - const dmsIndex = 0; - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller.$.model, 'refresh'); - controller.photos = [{dmsFk: 1}]; - controller.dmsIndex = dmsIndex; - controller.dms = {files: []}; - - $httpBackend.expectPOST(`claims/${claimId}/uploadFile`).respond({}); - controller.create(); - $httpBackend.flush(); - - expect(controller.$.model.refresh).toHaveBeenCalled(); - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/modules/claim/front/photos/locale/es.yml b/modules/claim/front/photos/locale/es.yml deleted file mode 100644 index d2ee9ffbd..000000000 --- a/modules/claim/front/photos/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -Are you sure you want to continue?: ¿Seguro que quieres continuar? -Drag & Drop photos here...: Arrastra y suelta fotos aquí... -File deleted: Archivo eliminado -File uploaded!: Archivo subido! -Select file: Seleccionar fichero \ No newline at end of file diff --git a/modules/claim/front/photos/style.scss b/modules/claim/front/photos/style.scss deleted file mode 100644 index 101cb0da2..000000000 --- a/modules/claim/front/photos/style.scss +++ /dev/null @@ -1,47 +0,0 @@ -@import "./variables"; - -vn-claim-photos { - height: 100%; - - .drop-zone { - color: $color-font-secondary; - box-sizing: border-box; - border-radius: 8px; - text-align: center; - min-height: 100%; - - .empty-rows { - padding: 80px $spacing-md; - font-size: 1.375rem - } - - vn-icon { - font-size: 3rem - } - } - - .photo-list { - padding: $spacing-md; - min-height: 100%; - - .photo { - width: 512px; - height: 288px; - } - } - - .video { - width: 100%; - height: 100%; - object-fit: cover; - cursor: pointer; - box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), - 0 3px 1px -2px rgba(0,0,0,.2), - 0 1px 5px 0 rgba(0,0,0,.12); - border: 2px solid transparent; - - } - .video:hover { - border: 2px solid $color-primary - } -} diff --git a/modules/client/back/locale/address/en.yml b/modules/client/back/locale/address/en.yml new file mode 100644 index 000000000..00f3b15f5 --- /dev/null +++ b/modules/client/back/locale/address/en.yml @@ -0,0 +1,21 @@ +name: address +columns: + id: id + nickname: nickname + street: street + city: city + postalCode: postal code + phone: phone + mobile: mobile + isActive: active + longitude: longitude + latitude: latitude + isEqualizated: equalizated + isLogifloraAllowed: logiflora allowed + provinceFk: province + clientFk: client + agencyModeFk: agency + addressFk: address + incotermsFk: incoterms + customsAgentFk: customs agent + isDefaultAddress: default diff --git a/modules/client/back/locale/address/es.yml b/modules/client/back/locale/address/es.yml new file mode 100644 index 000000000..f2b954124 --- /dev/null +++ b/modules/client/back/locale/address/es.yml @@ -0,0 +1,21 @@ +name: dirección +columns: + id: id + nickname: apodo + street: calle + city: ciudad + postalCode: código postal + phone: teléfono + mobile: móvil + isActive: activo + longitude: longitud + latitude: latitud + isEqualizated: igualado + isLogifloraAllowed: logiflora permitido + provinceFk: provincia + clientFk: cliente + agencyModeFk: agencia + addressFk: dirección + incotermsFk: incoterms + customsAgentFk: agente adunanas + isDefaultAddress: predeterminada diff --git a/modules/client/back/locale/client-contact/en.yml b/modules/client/back/locale/client-contact/en.yml new file mode 100644 index 000000000..2b47f5b4b --- /dev/null +++ b/modules/client/back/locale/client-contact/en.yml @@ -0,0 +1,6 @@ +name: contact +columns: + id: id + name: name + phone: phone + clientFk: client diff --git a/modules/client/back/locale/client-contact/es.yml b/modules/client/back/locale/client-contact/es.yml new file mode 100644 index 000000000..0116a537a --- /dev/null +++ b/modules/client/back/locale/client-contact/es.yml @@ -0,0 +1,6 @@ +name: contacto +columns: + id: id + name: nombre + phone: teléfono + clientFk: cliente diff --git a/modules/client/back/locale/client-dms/en.yml b/modules/client/back/locale/client-dms/en.yml new file mode 100644 index 000000000..de4d6c434 --- /dev/null +++ b/modules/client/back/locale/client-dms/en.yml @@ -0,0 +1,4 @@ +name: document +columns: + dmsFk: dms + clientFk: client diff --git a/modules/client/back/locale/client-dms/es.yml b/modules/client/back/locale/client-dms/es.yml new file mode 100644 index 000000000..e1744b019 --- /dev/null +++ b/modules/client/back/locale/client-dms/es.yml @@ -0,0 +1,4 @@ +name: documento +columns: + dmsFk: dms + clientFk: client diff --git a/modules/client/back/locale/client-observation/en.yml b/modules/client/back/locale/client-observation/en.yml new file mode 100644 index 000000000..0cf5e0dc1 --- /dev/null +++ b/modules/client/back/locale/client-observation/en.yml @@ -0,0 +1,7 @@ +name: observation +columns: + id: id + clientFk: client + text: text + created: created + workerFk: worker diff --git a/modules/client/back/locale/client-observation/es.yml b/modules/client/back/locale/client-observation/es.yml new file mode 100644 index 000000000..b04ae63d9 --- /dev/null +++ b/modules/client/back/locale/client-observation/es.yml @@ -0,0 +1,7 @@ +name: observación +columns: + id: id + clientFk: cliente + text: texto + created: creado + workerFk: trabajador diff --git a/modules/client/back/locale/client-sample/en.yml b/modules/client/back/locale/client-sample/en.yml new file mode 100644 index 000000000..4c355ab7f --- /dev/null +++ b/modules/client/back/locale/client-sample/en.yml @@ -0,0 +1,10 @@ +name: sample +columns: + id: id + created: created + clientFk: client + typeFk: type + userFk: user + companyFk: company + workerFk: worker + balance: balance diff --git a/modules/client/back/locale/client-sample/es.yml b/modules/client/back/locale/client-sample/es.yml new file mode 100644 index 000000000..5293adaa8 --- /dev/null +++ b/modules/client/back/locale/client-sample/es.yml @@ -0,0 +1,10 @@ +name: muestra +columns: + id: id + created: creado + clientFk: cliente + typeFk: tipo + userFk: usuario + companyFk: compañia + workerFk: trabajador + balance: balance diff --git a/modules/client/back/locale/client/en.yml b/modules/client/back/locale/client/en.yml new file mode 100644 index 000000000..74384461c --- /dev/null +++ b/modules/client/back/locale/client/en.yml @@ -0,0 +1,55 @@ +name: client +columns: + id: id + name: name + fi: tax identifier + socialName: socialName + contact: contact + street: street + city: city + postcode: postcode + email: email + phone: phone + mobile: mobile + isActive: active + credit: credit + creditInsurance: credit insurance + iban: IBAN + dueDay: due day + isEqualizated: equalizated + isFreezed: freezed + hasToInvoiceByAddress: invoice by address + hasToInvoice: has to invoice + isToBeMailed: mailed + hasSepaVnl: sepa VNL + hasLcr: LCR + hasCoreVnl: core VNL + hasCoreVnh: core VNH + hasIncoterms: incoterms + isTaxDataChecked: tax data checked + eypbc: EYPBC + quality: quality + isVies: VIES + isRelevant: relevant + accountingAccount: accounting account + created: created + sageTaxTypeFk: sage tax type + sageTransactionTypeFk: sage transaction type + businessTypeFk: business type + salesPersonFk: sales person + hasElectronicInvoice: electronic invoice + payMethodFk: pay method + provinceFk: province + countryFk: country + contactChannelFk: contact channel + clientTypeFk: client type + clientFk: client + defaultAddressFk: default address + bankEntityFk: bank entity + transferorFk: transferor + riskCalculated: risk calculated + isCreatedAsServed: created as served + hasInvoiceSimplified: simplified invoice + typeFk: type + lastSalesPersonFk: last salesperson + diff --git a/modules/client/back/locale/client/es.yml b/modules/client/back/locale/client/es.yml new file mode 100644 index 000000000..47bf896d9 --- /dev/null +++ b/modules/client/back/locale/client/es.yml @@ -0,0 +1,55 @@ +name: cliente +columns: + id: id + name: nombre + fi: identificador fiscal + socialName: nombre social + contact: contacto + street: calle + city: ciudad + postcode: código postal + email: email + phone: teléfono + mobile: móvil + isActive: activo + credit: crédito + creditInsurance: seguro crédito + iban: IBAN + dueDay: día vencimiento + isEqualizated: igualado + isFreezed: congelado + hasToInvoiceByAddress: factura por dirección + hasToInvoice: tiene que facturar + isToBeMailed: envío por email + hasSepaVnl: sepa VNL + hasLcr: LCR + hasCoreVnl: centro VNL + hasCoreVnh: centro VNH + hasIncoterms: incoterms + isTaxDataChecked: datos fiscales comprobados + eypbc: EYPBC + quality: calidad + isVies: VIES + isRelevant: importante + accountingAccount: cuenta contable + created: creado + sageTaxTypeFk: tipo impuesto sage + sageTransactionTypeFk: tipo transacción Sage + businessTypeFk: tipo negocio + salesPersonFk: comercial + hasElectronicInvoice: factura electrónica + payMethodFk: método pago + provinceFk: provincia + countryFk: país + contactChannelFk: canal de contacto + clientTypeFk: tipo de cliente + clientFk: cliente + defaultAddressFk: dirección predeterminada + bankEntityFk: entidad bancaria + transferorFk: cedente + riskCalculated: riesgo calculado + isCreatedAsServed: creado como servido + hasInvoiceSimplified: factura simple + typeFk: tipo + lastSalesPersonFk: último comercial + diff --git a/modules/client/back/locale/greuge/en.yml b/modules/client/back/locale/greuge/en.yml new file mode 100644 index 000000000..5c84ef4ee --- /dev/null +++ b/modules/client/back/locale/greuge/en.yml @@ -0,0 +1,11 @@ +name: greuge +columns: + id: id + description: description + amount: amount + shipped: shipped + created: created + greugeTypeFk: greuge type + clientFk: client + ticketFk: ticket + userFk: user diff --git a/modules/client/back/locale/greuge/es.yml b/modules/client/back/locale/greuge/es.yml new file mode 100644 index 000000000..ffb29eb61 --- /dev/null +++ b/modules/client/back/locale/greuge/es.yml @@ -0,0 +1,11 @@ +name: greuge +columns: + id: id + description: descripción + amount: cantidad + shipped: enviado + created: creado + greugeTypeFk: tipo de greuge + clientFk: cliente + ticketFk: ticket + userFk: usuario diff --git a/modules/client/back/locale/recovery/en.yml b/modules/client/back/locale/recovery/en.yml new file mode 100644 index 000000000..ba02df7c2 --- /dev/null +++ b/modules/client/back/locale/recovery/en.yml @@ -0,0 +1,8 @@ +name: recovery +columns: + id: id + started: started + finished: finished + amount: amount + period: period + clientFk: client diff --git a/modules/client/back/locale/recovery/es.yml b/modules/client/back/locale/recovery/es.yml new file mode 100644 index 000000000..6d84b00da --- /dev/null +++ b/modules/client/back/locale/recovery/es.yml @@ -0,0 +1,8 @@ +name: recuperación +columns: + id: id + started: comenzado + finished: terminado + amount: cantidad + period: período + clientFk: cliente diff --git a/modules/client/back/locale/tpv-transaction/en.yml b/modules/client/back/locale/tpv-transaction/en.yml new file mode 100644 index 000000000..c70914495 --- /dev/null +++ b/modules/client/back/locale/tpv-transaction/en.yml @@ -0,0 +1,15 @@ +name: TPV transaction +columns: + id: id + merchantFk: merchant + clientFk: client + receiptFk: receipt + amount: amount + response: response + errorCode: error code + status: status + created: created + merchantParameters: merchant parameters + signature: signature + signatureVersion: signature version + responseError: response error diff --git a/modules/client/back/locale/tpv-transaction/es.yml b/modules/client/back/locale/tpv-transaction/es.yml new file mode 100644 index 000000000..7d412ba66 --- /dev/null +++ b/modules/client/back/locale/tpv-transaction/es.yml @@ -0,0 +1,15 @@ +name: transacción TPV +columns: + id: id + merchantFk: comerciante + clientFk: cliente + receiptFk: recibo + amount: cantidad + response: respuesta + errorCode: código error + status: estado + created: creado + merchantParameters: parámetros comerciante + signature: firma + signatureVersion: versión firma + responseError: error de respuesta diff --git a/modules/client/back/methods/client/createWithUser.js b/modules/client/back/methods/client/createWithUser.js index cb97d5d59..8e0d56f49 100644 --- a/modules/client/back/methods/client/createWithUser.js +++ b/modules/client/back/methods/client/createWithUser.js @@ -33,11 +33,11 @@ module.exports = function(Self) { const user = { name: data.userName, email: firstEmail, - password: parseInt(Math.random() * 100000000000000) + password: String(Math.random() * 100000000000000) }; try { - const account = await models.Account.create(user, myOptions); + const account = await models.VnUser.create(user, myOptions); const client = await Self.create({ id: account.id, name: data.name, diff --git a/modules/client/back/methods/client/getCard.js b/modules/client/back/methods/client/getCard.js index a2365ee25..414cbe058 100644 --- a/modules/client/back/methods/client/getCard.js +++ b/modules/client/back/methods/client/getCard.js @@ -76,7 +76,7 @@ module.exports = function(Self) { const date = Date.vnNew(); date.setHours(0, 0, 0, 0); - const query = `SELECT vn.clientGetDebt(?, ?) AS debt`; + const query = `SELECT vn.client_getDebt(?, ?) AS debt`; const data = await Self.rawSql(query, [id, date], myOptions); client.debt = data[0].debt; diff --git a/modules/client/back/methods/client/getDebt.js b/modules/client/back/methods/client/getDebt.js index 5f8a8c569..859746083 100644 --- a/modules/client/back/methods/client/getDebt.js +++ b/modules/client/back/methods/client/getDebt.js @@ -27,7 +27,7 @@ module.exports = Self => { const date = Date.vnNew(); date.setHours(0, 0, 0, 0); - const query = `SELECT vn.clientGetDebt(?, ?) AS debt`; + const query = `SELECT vn.client_getDebt(?, ?) AS debt`; const [debt] = await Self.rawSql(query, [clientFk, date], myOptions); return debt; diff --git a/modules/client/back/methods/client/setPassword.js b/modules/client/back/methods/client/setPassword.js index e3fc9bbf8..e5b8949e7 100644 --- a/modules/client/back/methods/client/setPassword.js +++ b/modules/client/back/methods/client/setPassword.js @@ -1,6 +1,6 @@ const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { - Self.remoteMethodCtx('setPassword', { + Self.remoteMethod('setPassword', { description: 'Sets the password of a non-worker client', accepts: [ { @@ -21,13 +21,13 @@ module.exports = Self => { } }); - Self.setPassword = async function(ctx, id, newPassword) { + Self.setPassword = async function(id, newPassword) { const models = Self.app.models; - const isClient = await models.Client.findById(id, null); - const isUserAccount = await models.UserAccount.findById(id, null); + const isClient = await models.Client.findById(id); + const isAccount = await models.Account.findById(id); - if (isClient && !isUserAccount) + if (isClient && !isAccount) await models.Account.setPassword(id, newPassword); else throw new UserError(`Modifiable password only via recovery or by an administrator`); diff --git a/modules/client/back/methods/client/setRating.js b/modules/client/back/methods/client/setRating.js new file mode 100644 index 000000000..21ac0c914 --- /dev/null +++ b/modules/client/back/methods/client/setRating.js @@ -0,0 +1,55 @@ +module.exports = Self => { + Self.remoteMethodCtx('setRating', { + description: 'Change rating and recommendedCredit of a client', + accessType: 'WRITE', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The user id', + http: {source: 'path'} + }, + { + arg: 'rating', + type: 'number' + }, + { + arg: 'recommendedCredit', + type: 'number' + } + ], + http: { + path: `/:id/setRating`, + verb: 'POST' + } + }); + + Self.setRating = async function(ctx, id, rating, recommendedCredit, options) { + let tx; + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const client = await Self.findById(id, null, myOptions); + const clientUpdated = await client.updateAttributes({ + rating: rating, + recommendedCredit: recommendedCredit + }, myOptions); + + if (tx) await tx.commit(); + + return clientUpdated; + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/client/back/methods/client/specs/createWithUser.spec.js b/modules/client/back/methods/client/specs/createWithUser.spec.js index 4cc51c93c..69440c1d1 100644 --- a/modules/client/back/methods/client/specs/createWithUser.spec.js +++ b/modules/client/back/methods/client/specs/createWithUser.spec.js @@ -35,7 +35,7 @@ describe('Client Create', () => { try { const options = {transaction: tx}; - const account = await models.Account.findOne({where: {name: newAccount.userName}}, options); + const account = await models.VnUser.findOne({where: {name: newAccount.userName}}, options); const client = await models.Client.findOne({where: {name: newAccount.name}}, options); expect(account).toEqual(null); @@ -55,7 +55,7 @@ describe('Client Create', () => { const options = {transaction: tx}; const client = await models.Client.createWithUser(newAccount, options); - const account = await models.Account.findOne({where: {name: newAccount.userName}}, options); + const account = await models.VnUser.findOne({where: {name: newAccount.userName}}, options); expect(account.name).toEqual(newAccount.userName); expect(client.id).toEqual(account.id); diff --git a/modules/client/back/methods/client/specs/setPassword.spec.js b/modules/client/back/methods/client/specs/setPassword.spec.js index 03334918b..590172a02 100644 --- a/modules/client/back/methods/client/specs/setPassword.spec.js +++ b/modules/client/back/methods/client/specs/setPassword.spec.js @@ -1,16 +1,11 @@ const models = require('vn-loopback/server/server').models; describe('Client setPassword', () => { - const salesPersonId = 19; - const ctx = { - req: {accessToken: {userId: salesPersonId}} - }; - it('should throw an error the setPassword target is not just a client but a worker', async() => { let error; try { - await models.Client.setPassword(ctx, 1, 't0pl3v3l.p455w0rd!'); + await models.Client.setPassword(1, 't0pl3v3l.p455w0rd!'); } catch (e) { error = e; } @@ -22,7 +17,7 @@ describe('Client setPassword', () => { let error; try { - await models.Client.setPassword(ctx, 1101, 't0pl3v3l.p455w0rd!'); + await models.Client.setPassword(1101, 't0pl3v3l.p455w0rd!'); } catch (e) { error = e; } diff --git a/modules/client/back/methods/client/specs/setRating.spec.js b/modules/client/back/methods/client/specs/setRating.spec.js new file mode 100644 index 000000000..a7d0fb03a --- /dev/null +++ b/modules/client/back/methods/client/specs/setRating.spec.js @@ -0,0 +1,43 @@ +const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); + +describe('Client setRating()', () => { + const financialId = 73; + const activeCtx = { + accessToken: {userId: financialId}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + const ctx = {req: activeCtx}; + + beforeAll(async() => { + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + + it('should change rating and recommendedCredit', async() => { + const tx = await models.Ticket.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const clientId = 1101; + const newRating = 10; + const newRecommendedCredit = 20; + + const updatedClient = await models.Client.setRating(ctx, clientId, newRating, newRecommendedCredit, options); + + expect(updatedClient.rating).toEqual(newRating); + expect(updatedClient.recommendedCredit).toEqual(newRecommendedCredit); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/client/back/methods/client/specs/updateUser.spec.js b/modules/client/back/methods/client/specs/updateUser.spec.js index 2d7f7dce0..b51686ae0 100644 --- a/modules/client/back/methods/client/specs/updateUser.spec.js +++ b/modules/client/back/methods/client/specs/updateUser.spec.js @@ -61,7 +61,7 @@ describe('Client updateUser', () => { const clientID = 1105; await models.Client.updateUser(ctx, clientID, options); - const client = await models.Account.findById(clientID, null, options); + const client = await models.VnUser.findById(clientID, null, options); expect(client.name).toEqual('test'); diff --git a/modules/client/back/methods/client/summary.js b/modules/client/back/methods/client/summary.js index caa3d8033..7dab1f68b 100644 --- a/modules/client/back/methods/client/summary.js +++ b/modules/client/back/methods/client/summary.js @@ -27,7 +27,6 @@ module.exports = Self => { Object.assign(myOptions, options); const summaryObj = await getSummary(models.Client, clientFk, myOptions); - summaryObj.mana = await models.Client.getMana(clientFk, myOptions); summaryObj.debt = await models.Client.getDebt(clientFk, myOptions); summaryObj.averageInvoiced = await models.Client.getAverageInvoiced(clientFk, myOptions); @@ -115,6 +114,12 @@ module.exports = Self => { fields: ['claimingRate', 'priceIncreasing'], limit: 1 } + }, + { + relation: 'businessType', + scope: { + fields: ['description'] + } } ], where: {id: clientId} diff --git a/modules/client/back/methods/client/updateAddress.js b/modules/client/back/methods/client/updateAddress.js index cae797f6b..e521870fd 100644 --- a/modules/client/back/methods/client/updateAddress.js +++ b/modules/client/back/methods/client/updateAddress.js @@ -93,7 +93,7 @@ module.exports = function(Self) { if (typeof options == 'object') Object.assign(myOptions, options); - const isSalesAssistant = await models.Account.hasRole(userId, 'salesAssistant', myOptions); + const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', myOptions); if (args.isLogifloraAllowed && !isSalesAssistant) throw new UserError(`You don't have enough privileges`); diff --git a/modules/client/back/methods/client/updateFiscalData.js b/modules/client/back/methods/client/updateFiscalData.js index fdd8c4c15..c63dc3991 100644 --- a/modules/client/back/methods/client/updateFiscalData.js +++ b/modules/client/back/methods/client/updateFiscalData.js @@ -131,7 +131,7 @@ module.exports = Self => { myOptions.transaction = tx; } try { - const isSalesAssistant = await models.Account.hasRole(userId, 'salesAssistant', myOptions); + const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', myOptions); const client = await models.Client.findById(clientId, null, myOptions); if (!isSalesAssistant && client.isTaxDataChecked) throw new UserError(`Not enough privileges to edit a client with verified data`); diff --git a/modules/client/back/methods/client/updateUser.js b/modules/client/back/methods/client/updateUser.js index 1db8cd6b6..479b4da47 100644 --- a/modules/client/back/methods/client/updateUser.js +++ b/modules/client/back/methods/client/updateUser.js @@ -40,21 +40,21 @@ module.exports = Self => { Object.assign(myOptions, options); if (!myOptions.transaction) { - tx = await models.Account.beginTransaction({}); + tx = await models.VnUser.beginTransaction({}); myOptions.transaction = tx; } try { - const isSalesPerson = await models.Account.hasRole(userId, 'salesPerson', myOptions); + const isSalesPerson = await models.VnUser.hasRole(userId, 'salesPerson', myOptions); if (!isSalesPerson) throw new UserError(`Not enough privileges to edit a client`); const isClient = await models.Client.findById(id, null, myOptions); - const isUserAccount = await models.UserAccount.findById(id, null, myOptions); + const isAccount = await models.Account.findById(id, null, myOptions); - if (isClient && !isUserAccount) { - const user = await models.Account.findById(id, null, myOptions); + if (isClient && !isAccount) { + const user = await models.VnUser.findById(id, null, myOptions); await user.updateAttributes(ctx.args, myOptions); } else throw new UserError(`Modifiable user details only by an administrator`); diff --git a/modules/client/back/methods/defaulter/observationEmail.js b/modules/client/back/methods/defaulter/observationEmail.js index c3c96010e..5ac00b4ee 100644 --- a/modules/client/back/methods/defaulter/observationEmail.js +++ b/modules/client/back/methods/defaulter/observationEmail.js @@ -34,7 +34,7 @@ module.exports = Self => { Object.assign(myOptions, options); for (const defaulter of defaulters) { - const user = await models.Account.findById(userId, {fields: ['name']}, myOptions); + const user = await models.VnUser.findById(userId, {fields: ['name']}, myOptions); const body = $t('Added observation', { user: user.name, diff --git a/modules/client/back/methods/receipt/receiptEmail.js b/modules/client/back/methods/receipt/receiptEmail.js new file mode 100644 index 000000000..cd529eece --- /dev/null +++ b/modules/client/back/methods/receipt/receiptEmail.js @@ -0,0 +1,57 @@ +const {Email} = require('vn-print'); + +module.exports = Self => { + Self.remoteMethodCtx('receiptEmail', { + description: 'Returns the receipt pdf', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The claim id', + http: {source: 'path'} + }, + { + arg: 'recipient', + type: 'string', + description: 'The recipient email', + required: true, + } + ], + returns: [ + { + arg: 'body', + type: 'file', + root: true + }, { + arg: 'Content-Type', + type: 'String', + http: {target: 'header'} + }, { + arg: 'Content-Disposition', + type: 'String', + http: {target: 'header'} + } + ], + http: { + path: '/:id/receipt-email', + verb: 'POST' + } + }); + + Self.receiptEmail = async(ctx, id) => { + const args = Object.assign({}, ctx.args); + const params = { + recipient: args.recipient, + lang: ctx.req.getLocale() + }; + + delete args.ctx; + for (const param in args) + params[param] = args[param]; + + const email = new Email('receipt', params); + + return email.send(); + }; +}; diff --git a/modules/client/back/methods/receipt/receiptPdf.js b/modules/client/back/methods/receipt/receiptPdf.js index 433f386db..6e49de22a 100644 --- a/modules/client/back/methods/receipt/receiptPdf.js +++ b/modules/client/back/methods/receipt/receiptPdf.js @@ -1,12 +1,12 @@ module.exports = Self => { Self.remoteMethodCtx('receiptPdf', { - description: 'Returns the receipt pdf', + description: 'Send the receipt pdf to client', accepts: [ { arg: 'id', type: 'number', required: true, - description: 'The claim id', + description: 'The receipt id', http: {source: 'path'} }, { diff --git a/modules/client/back/model-config.json b/modules/client/back/model-config.json index b466aa5a1..1e06ea1c0 100644 --- a/modules/client/back/model-config.json +++ b/modules/client/back/model-config.json @@ -32,6 +32,9 @@ "ClientConsumptionQueue": { "dataSource": "vn" }, + "ClientInforma": { + "dataSource": "vn" + }, "ClientLog": { "dataSource": "vn" }, diff --git a/modules/client/back/models/address.json b/modules/client/back/models/address.json index 0dcbbf7fe..5f962677d 100644 --- a/modules/client/back/models/address.json +++ b/modules/client/back/models/address.json @@ -2,11 +2,6 @@ "name": "Address", "description": "Client addresses", "base": "Loggable", - "log": { - "model": "ClientLog", - "relation": "client", - "showField": "nickname" - }, "options": { "mysql": { "table": "address" @@ -88,4 +83,4 @@ "foreignKey": "customsAgentFk" } } -} \ No newline at end of file +} diff --git a/modules/client/back/models/client-contact.json b/modules/client/back/models/client-contact.json index 514ebbf5e..3f71ab79e 100644 --- a/modules/client/back/models/client-contact.json +++ b/modules/client/back/models/client-contact.json @@ -2,11 +2,6 @@ "name": "ClientContact", "description": "Client phone contacts", "base": "Loggable", - "log": { - "model": "ClientLog", - "relation": "client", - "showField": "name" - }, "options": { "mysql": { "table": "clientContact" @@ -33,4 +28,4 @@ "foreignKey": "clientFk" } } -} \ No newline at end of file +} diff --git a/modules/client/back/models/client-dms.json b/modules/client/back/models/client-dms.json index 88b4349df..14b19498e 100644 --- a/modules/client/back/models/client-dms.json +++ b/modules/client/back/models/client-dms.json @@ -1,11 +1,6 @@ { "name": "ClientDms", "base": "Loggable", - "log": { - "model":"ClientLog", - "relation": "client", - "showField": "dmsFk" - }, "options": { "mysql": { "table": "clientDms" diff --git a/modules/client/back/models/client-informa.json b/modules/client/back/models/client-informa.json new file mode 100644 index 000000000..0c652484e --- /dev/null +++ b/modules/client/back/models/client-informa.json @@ -0,0 +1,42 @@ +{ + "name": "ClientInforma", + "base": "Loggable", + "log": { + "model":"ClientLog", + "relation": "client", + "showField": "clientFk" + }, + "options": { + "mysql": { + "table": "clientInforma" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "rating": { + "type": "number" + }, + "recommendedCredit": { + "type": "number" + }, + "created": { + "type": "date" + } + }, + "relations": { + "worker": { + "type": "belongsTo", + "model": "Worker", + "foreignKey": "workerFk" + }, + "client": { + "type": "belongsTo", + "model": "Client", + "foreignKey": "clientFk" + } + } +} diff --git a/modules/client/back/models/client-log.json b/modules/client/back/models/client-log.json index 9c0933c0c..316dbe972 100644 --- a/modules/client/back/models/client-log.json +++ b/modules/client/back/models/client-log.json @@ -1,6 +1,6 @@ { "name": "ClientLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "clientLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/client/back/models/client-methods.js b/modules/client/back/models/client-methods.js index 3538dbeb8..3b1a588ac 100644 --- a/modules/client/back/models/client-methods.js +++ b/modules/client/back/models/client-methods.js @@ -47,4 +47,5 @@ module.exports = Self => { require('../methods/client/consumptionSendQueued')(Self); require('../methods/client/filter')(Self); require('../methods/client/getClientOrSupplierReference')(Self); + require('../methods/client/setRating')(Self); }; diff --git a/modules/client/back/models/client-observation.json b/modules/client/back/models/client-observation.json index d3059377d..b8852b186 100644 --- a/modules/client/back/models/client-observation.json +++ b/modules/client/back/models/client-observation.json @@ -2,10 +2,6 @@ "name": "ClientObservation", "description": "Client notes", "base": "Loggable", - "log": { - "model": "ClientLog", - "relation": "client" - }, "options": { "mysql": { "table": "clientObservation" diff --git a/modules/client/back/models/client-sample.json b/modules/client/back/models/client-sample.json index fc64cd949..a32f308ab 100644 --- a/modules/client/back/models/client-sample.json +++ b/modules/client/back/models/client-sample.json @@ -1,11 +1,6 @@ { "name": "ClientSample", "base": "Loggable", - "log": { - "model": "ClientLog", - "relation": "client", - "showField": "type" - }, "options": { "mysql": { "table": "clientSample" @@ -34,12 +29,12 @@ }, "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" }, "account": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" }, "company": { diff --git a/modules/client/back/models/client.js b/modules/client/back/models/client.js index c41085b79..56adc8b03 100644 --- a/modules/client/back/models/client.js +++ b/modules/client/back/models/client.js @@ -14,7 +14,7 @@ module.exports = Self => { Self.validatesPresenceOf('street', { message: 'Street cannot be empty' }); - + Self.validatesPresenceOf('city', { message: 'City cannot be empty' }); @@ -89,8 +89,9 @@ module.exports = Self => { }; const country = await Self.app.models.Country.findOne(filter); const code = country ? country.code.toLowerCase() : null; + const countryCode = this.fi.toLowerCase().substring(0, 2); - if (!this.fi || !validateTin(this.fi, code)) + if (!this.fi || !validateTin(this.fi, code) || (this.isVies && countryCode == code)) err(); done(); } @@ -194,7 +195,7 @@ module.exports = Self => { let invalidBusinessType = false; if (!ctx.isNewInstance) { - const isWorker = await Self.app.models.UserAccount.findById(orgData.id); + const isWorker = await Self.app.models.Account.findById(orgData.id); const changedFields = Object.keys(changes); const hasChangedOtherFields = changedFields.some(key => key !== 'businessTypeFk'); @@ -219,7 +220,7 @@ module.exports = Self => { const loopBackContext = LoopBackContext.getCurrentContext(); const userId = loopBackContext.active.accessToken.userId; - const isSalesAssistant = await models.Account.hasRole(userId, 'salesAssistant', ctx.options); + const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', ctx.options); const hasChanges = orgData && changes; const isTaxDataChecked = hasChanges && (changes.isTaxDataChecked || orgData.isTaxDataChecked); @@ -280,6 +281,10 @@ module.exports = Self => { if (changes.credit !== undefined) await Self.changeCredit(ctx, finalState, changes); + // Credit management changes + if (orgData?.rating != changes.rating || orgData?.recommendedCredit != changes.recommendedCredit) + await Self.changeCreditManagement(ctx, finalState, changes); + const oldInstance = {}; if (!ctx.isNewInstance) { const newProps = Object.keys(changes); @@ -397,7 +402,7 @@ module.exports = Self => { const models = Self.app.models; const userId = ctx.options.accessToken.userId; - const isFinancialBoss = await models.Account.hasRole(userId, 'financialBoss', ctx.options); + const isFinancialBoss = await models.VnUser.hasRole(userId, 'financialBoss', ctx.options); if (!isFinancialBoss) { const lastCredit = await models.ClientCredit.findOne({ where: { @@ -408,7 +413,7 @@ module.exports = Self => { const lastAmount = lastCredit && lastCredit.amount; const lastWorkerId = lastCredit && lastCredit.workerFk; - const lastWorkerIsFinancialBoss = await models.Account.hasRole(lastWorkerId, 'financialBoss', ctx.options); + const lastWorkerIsFinancialBoss = await models.VnUser.hasRole(lastWorkerId, 'financialBoss', ctx.options); if (lastAmount == 0 && lastWorkerIsFinancialBoss) throw new UserError(`You can't change the credit set to zero from a financialBoss`); @@ -441,17 +446,30 @@ module.exports = Self => { }, ctx.options); }; + Self.changeCreditManagement = async function changeCreditManagement(ctx, finalState, changes) { + const models = Self.app.models; + const loopBackContext = LoopBackContext.getCurrentContext(); + const userId = loopBackContext.active.accessToken.userId; + + await models.ClientInforma.create({ + clientFk: finalState.id, + rating: changes.rating, + recommendedCredit: changes.recommendedCredit, + workerFk: userId + }, ctx.options); + }; + const app = require('vn-loopback/server/server'); app.on('started', function() { - const account = app.models.Account; + const VnUser = app.models.VnUser; - account.observe('before save', async ctx => { + VnUser.observe('before save', async ctx => { if (ctx.isNewInstance) return; if (ctx.currentInstance) ctx.hookState.oldInstance = JSON.parse(JSON.stringify(ctx.currentInstance)); }); - account.observe('after save', async ctx => { + VnUser.observe('after save', async ctx => { const changes = ctx.data || ctx.instance; if (!ctx.isNewInstance && changes) { const oldData = ctx.hookState.oldInstance; @@ -470,7 +488,7 @@ module.exports = Self => { originFk: oldData.id, userFk: userId, action: 'update', - changedModel: 'Account', + changedModel: 'VnUser', oldInstance: {name: oldData.name, active: oldData.active}, newInstance: {name: changes.name, active: changes.active} }; diff --git a/modules/client/back/models/client.json b/modules/client/back/models/client.json index 21db28eaf..5f56a1ed2 100644 --- a/modules/client/back/models/client.json +++ b/modules/client/back/models/client.json @@ -1,10 +1,6 @@ { "name": "Client", "base": "Loggable", - "log": { - "model":"ClientLog", - "showField": "id" - }, "options": { "mysql": { "table": "client" @@ -145,13 +141,19 @@ }, "hasElectronicInvoice": { "type": "boolean" + }, + "rating": { + "type": "number" + }, + "recommendedCredit": { + "type": "number" } }, "relations": { "account": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "id" }, "user": { @@ -166,7 +168,7 @@ }, "salesPersonUser": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "salesPersonFk" }, "province": { @@ -260,4 +262,4 @@ } } } -} \ No newline at end of file +} diff --git a/modules/client/back/models/greuge.json b/modules/client/back/models/greuge.json index 625bf4e28..884cbd34e 100644 --- a/modules/client/back/models/greuge.json +++ b/modules/client/back/models/greuge.json @@ -1,11 +1,6 @@ { "name": "Greuge", "base": "Loggable", - "log": { - "model": "ClientLog", - "relation": "client", - "showField": "description" - }, "options": { "mysql": { "table": "greuge" @@ -54,8 +49,8 @@ }, "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } } -} \ No newline at end of file +} diff --git a/modules/client/back/models/receipt.js b/modules/client/back/models/receipt.js index 3118cc239..feb8ca053 100644 --- a/modules/client/back/models/receipt.js +++ b/modules/client/back/models/receipt.js @@ -5,6 +5,7 @@ module.exports = function(Self) { require('../methods/receipt/balanceCompensationEmail')(Self); require('../methods/receipt/balanceCompensationPdf')(Self); require('../methods/receipt/receiptPdf')(Self); + require('../methods/receipt/receiptEmail')(Self); Self.validateBinded('amountPaid', isNotZero, { message: 'Amount cannot be zero', diff --git a/modules/client/back/models/recovery.json b/modules/client/back/models/recovery.json index de4183924..5ea89197d 100644 --- a/modules/client/back/models/recovery.json +++ b/modules/client/back/models/recovery.json @@ -1,10 +1,6 @@ { "name": "Recovery", "base": "Loggable", - "log": { - "model": "ClientLog", - "relation": "client" - }, "options": { "mysql": { "table": "recovery" @@ -38,4 +34,4 @@ "foreignKey": "clientFk" } } -} \ No newline at end of file +} diff --git a/modules/client/back/models/sms.json b/modules/client/back/models/sms.json index 29438fc67..4639131ef 100644 --- a/modules/client/back/models/sms.json +++ b/modules/client/back/models/sms.json @@ -38,7 +38,7 @@ "relations": { "sender": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "senderFk" } } diff --git a/modules/client/back/models/specs/client.spec.js b/modules/client/back/models/specs/client.spec.js index 1f7e56cdb..45debc08a 100644 --- a/modules/client/back/models/specs/client.spec.js +++ b/modules/client/back/models/specs/client.spec.js @@ -63,14 +63,14 @@ describe('Client Model', () => { const context = {options}; // Set credit to zero by a financialBoss - const financialBoss = await models.Account.findOne({ + const financialBoss = await models.VnUser.findOne({ where: {name: 'financialBoss'} }, options); context.options.accessToken = {userId: financialBoss.id}; await models.Client.changeCredit(context, instance, {credit: 0}); - const salesAssistant = await models.Account.findOne({ + const salesAssistant = await models.VnUser.findOne({ where: {name: 'salesAssistant'} }, options); context.options.accessToken = {userId: salesAssistant.id}; @@ -95,7 +95,7 @@ describe('Client Model', () => { const options = {transaction: tx}; const context = {options}; - const salesAssistant = await models.Account.findOne({ + const salesAssistant = await models.VnUser.findOne({ where: {name: 'salesAssistant'} }, options); context.options.accessToken = {userId: salesAssistant.id}; diff --git a/modules/client/back/models/specs/clientCredit.spec.js b/modules/client/back/models/specs/clientCredit.spec.js index fcd86c979..65d40404c 100644 --- a/modules/client/back/models/specs/clientCredit.spec.js +++ b/modules/client/back/models/specs/clientCredit.spec.js @@ -15,7 +15,7 @@ describe('Client Credit', () => { try { const options = {transaction: tx}; - const salesAssistant = await models.Account.findOne({ + const salesAssistant = await models.VnUser.findOne({ where: {name: 'salesAssistant'} }, options); diff --git a/modules/client/back/models/till.json b/modules/client/back/models/till.json index 06f021daf..4b86e50e2 100644 --- a/modules/client/back/models/till.json +++ b/modules/client/back/models/till.json @@ -51,7 +51,7 @@ }, "worker": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "workerFk" }, "company": { diff --git a/modules/client/front/balance/create/index.html b/modules/client/front/balance/create/index.html index b76c09356..27b182c9a 100644 --- a/modules/client/front/balance/create/index.html +++ b/modules/client/front/balance/create/index.html @@ -13,6 +13,7 @@ @@ -33,6 +35,7 @@ fields="['accountingTypeFk']" include="{relation: 'accountingType'}" ng-model="$ctrl.bankFk" + vn-name="bank" search-function="$ctrl.bankSearchFunc($search)" selection="$ctrl.bankSelection" order="id" @@ -43,6 +46,7 @@ vn-focus label="Amount" ng-model="$ctrl.amountPaid" + vn-name="amountPaid" step="0.01" required="true" max="$ctrl.maxAmount"> @@ -52,6 +56,7 @@
Compensation
@@ -60,6 +65,7 @@ @@ -70,19 +76,27 @@ + step="0.01" + vn-name="deliveredAmount"> + label="Amount to return" + vn-name="amountToReturn"> + ng-model="$ctrl.viewReceipt" + vn-name="viewReceipt"> + + diff --git a/modules/client/front/balance/create/index.js b/modules/client/front/balance/create/index.js index cc9e1ab5a..9113d7605 100644 --- a/modules/client/front/balance/create/index.js +++ b/modules/client/front/balance/create/index.js @@ -2,9 +2,10 @@ import ngModule from '../../module'; import Dialog from 'core/components/dialog'; class Controller extends Dialog { - constructor($element, $, $transclude, vnReport) { + constructor($element, $, $transclude, vnReport, vnEmail) { super($element, $, $transclude); this.vnReport = vnReport; + this.vnEmail = vnEmail; this.receipt = {}; } @@ -23,6 +24,18 @@ class Controller extends Dialog { set clientFk(value) { this.receipt.clientFk = value; + + const filter = { + fields: ['email'], + where: { + id: value + } + }; + + this.$http.get(`Clients/findOne`, {filter}) + .then(res => { + this.receipt.email = res.data.email; + }); } get clientFk() { @@ -154,10 +167,13 @@ class Controller extends Dialog { return super.responseHandler(response); const exceededAmount = this.receipt.amountPaid > this.maxAmount; - - if (this.bankSelection.accountingType.code == 'cash' && exceededAmount) + const isCash = this.bankSelection.accountingType.code == 'cash'; + if (isCash && exceededAmount) return this.vnApp.showError(this.$t('Amount exceeded', {maxAmount: this.maxAmount})); + if (isCash && this.sendEmail && !this.receipt.email) + return this.vnApp.showError(this.$t('There is no assigned email for this client')); + let receiptId; return this.$http.post(`Clients/${this.clientFk}/createReceipt`, this.receipt) .then(res => { @@ -165,6 +181,13 @@ class Controller extends Dialog { super.responseHandler(response); }) .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))) + .then(() => { + if (!this.sendEmail || !isCash) return; + const params = { + recipient: this.receipt.email + }; + this.vnEmail.send(`Receipts/${receiptId}/receipt-email`, params); + }) .then(() => { if (this.viewReceipt) this.vnReport.show(`Receipts/${receiptId}/receipt-pdf`); @@ -178,7 +201,7 @@ class Controller extends Dialog { } } -Controller.$inject = ['$element', '$scope', '$transclude', 'vnReport']; +Controller.$inject = ['$element', '$scope', '$transclude', 'vnReport', 'vnEmail']; ngModule.vnComponent('vnClientBalanceCreate', { slotTemplate: require('./index.html'), diff --git a/modules/client/front/billing-data/index.html b/modules/client/front/billing-data/index.html index 410681930..bd4f86d1c 100644 --- a/modules/client/front/billing-data/index.html +++ b/modules/client/front/billing-data/index.html @@ -14,7 +14,6 @@ - {{bic}} {{name}} + +
{{::bic}}
+
{{::name}}
+
@@ -100,9 +96,7 @@ - - - \ No newline at end of file + diff --git a/modules/client/front/credit-management/index.html b/modules/client/front/credit-management/index.html new file mode 100644 index 000000000..d7456fd06 --- /dev/null +++ b/modules/client/front/credit-management/index.html @@ -0,0 +1,79 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + Since + Employee + Rating + Recommended credit + + + + + {{::clientInforma.created | date:'dd/MM/yyyy HH:mm'}} + + + {{::clientInforma.worker.user.nickname}} + + + {{::clientInforma.rating}} + {{::clientInforma.recommendedCredit}} + + + + + + + diff --git a/modules/client/front/credit-management/index.js b/modules/client/front/credit-management/index.js new file mode 100644 index 000000000..856acd27b --- /dev/null +++ b/modules/client/front/credit-management/index.js @@ -0,0 +1,32 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; + +export default class Controller extends Section { + constructor($element, $) { + super($element, $); + + this.filter = { + include: [{ + relation: 'worker', + scope: { + fields: ['userFk'], + include: { + relation: 'user', + scope: { + fields: ['nickname'] + } + } + } + }], + }; + } + onSubmit() { + this.$.watcher.submit() + .then(() => this.$state.reload()); + } +} + +ngModule.vnComponent('vnClientCreditManagement', { + template: require('./index.html'), + controller: Controller +}); diff --git a/modules/client/front/credit-management/locale/es.yml b/modules/client/front/credit-management/locale/es.yml new file mode 100644 index 000000000..8743a1fb9 --- /dev/null +++ b/modules/client/front/credit-management/locale/es.yml @@ -0,0 +1,2 @@ +Recommended credit: Crédito recomendado +Rating: Clasificación diff --git a/modules/client/front/fiscal-data/index.html b/modules/client/front/fiscal-data/index.html index 88586cff7..d232d6dab 100644 --- a/modules/client/front/fiscal-data/index.html +++ b/modules/client/front/fiscal-data/index.html @@ -1,52 +1,111 @@ - + - + - + - +
- + - + - + - + - + vn-acl="salesAssistant" + order="transaction" + rule> {{id}}: {{transaction}} - + {{code}} - {{town.name}} ({{town.province.name}}, {{town.province.country.country}}) - + - + {{name}}, {{province.name}} ({{province.country.country}}) @@ -54,46 +113,83 @@ - + {{name}} ({{country.country}}) - + - + - + - + - + - + - + - - + - - @@ -101,17 +197,26 @@ - - + - - - - \ No newline at end of file + + diff --git a/modules/client/front/fiscal-data/locale/es.yml b/modules/client/front/fiscal-data/locale/es.yml index 7624c86bd..61a91828f 100644 --- a/modules/client/front/fiscal-data/locale/es.yml +++ b/modules/client/front/fiscal-data/locale/es.yml @@ -12,3 +12,5 @@ Previous client: Cliente anterior In case of a company succession, specify the grantor company: En el caso de que haya habido una sucesión de empresa, indicar la empresa cedente Incoterms authorization: Autorización incoterms Electronic invoice: Factura electrónica +When activating it, do not enter the country code in the IF.: Al activarlo, no informar el código del país en el campo IF +The first two values are letters: Los dos primeros valores son letras \ No newline at end of file diff --git a/modules/client/front/greuge/index/index.html b/modules/client/front/greuge/index/index.html index 459d92fc7..014246b31 100644 --- a/modules/client/front/greuge/index/index.html +++ b/modules/client/front/greuge/index/index.html @@ -7,8 +7,8 @@ data="greuges" auto-load="true">
-
@@ -28,7 +28,7 @@ - Date + Date Created by Comment Type @@ -53,11 +53,11 @@ - \ No newline at end of file + diff --git a/modules/client/front/greuge/index/index.js b/modules/client/front/greuge/index/index.js index 7a5ccc531..4f1b77b4b 100644 --- a/modules/client/front/greuge/index/index.js +++ b/modules/client/front/greuge/index/index.js @@ -11,8 +11,7 @@ class Controller extends Section { scope: { fields: ['id', 'name'] }, - }, - { + }, { relation: 'user', scope: { fields: ['id', 'name'] @@ -24,8 +23,6 @@ class Controller extends Section { } } -Controller.$inject = ['$element', '$scope']; - ngModule.vnComponent('vnClientGreugeIndex', { template: require('./index.html'), controller: Controller diff --git a/modules/client/front/index.js b/modules/client/front/index.js index ff767bc9e..c7e39ea5d 100644 --- a/modules/client/front/index.js +++ b/modules/client/front/index.js @@ -47,3 +47,5 @@ import './defaulter'; import './notification'; import './unpaid'; import './extended-list'; +import './credit-management'; + diff --git a/modules/client/front/locale/es.yml b/modules/client/front/locale/es.yml index adbca8dbf..0c44a17bc 100644 --- a/modules/client/front/locale/es.yml +++ b/modules/client/front/locale/es.yml @@ -64,3 +64,6 @@ Compensation Account: Cuenta para compensar Amount to return: Cantidad a devolver Delivered amount: Cantidad entregada Unpaid: Impagado +Credit management: Gestión de crédito +Credit opinion: Opinión de crédito +There is no zona: No hay zona diff --git a/modules/client/front/postcode/locale/es.yml b/modules/client/front/postcode/locale/es.yml index 782690e88..29d0d7af9 100644 --- a/modules/client/front/postcode/locale/es.yml +++ b/modules/client/front/postcode/locale/es.yml @@ -8,4 +8,5 @@ The province can't be empty: La provincia no puede quedar vacía The country can't be empty: El país no puede quedar vacío The postcode has been created. You can save the data now: Se ha creado el código postal. Ahora puedes guardar los datos The city has been created: Se ha creado la ciudad -The province has been created: Se ha creado la provincia \ No newline at end of file +The province has been created: Se ha creado la provincia +Autonomy: Autonomia \ No newline at end of file diff --git a/modules/client/front/routes.json b/modules/client/front/routes.json index 406ca07d7..01d1b53bf 100644 --- a/modules/client/front/routes.json +++ b/modules/client/front/routes.json @@ -23,6 +23,14 @@ {"state": "client.card.recovery.index", "icon": "icon-recovery"}, {"state": "client.card.webAccess", "icon": "cloud"}, {"state": "client.card.log", "icon": "history"}, + { + "description": "Credit management", + "icon": "monetization_on", + "childs": [ + {"state": "client.card.creditInsurance.index", "icon": "icon-solunion"}, + {"state": "client.card.creditManagement", "icon": "contact_support"} + ] + }, { "description": "Others", "icon": "more", @@ -30,7 +38,6 @@ {"state": "client.card.sample.index", "icon": "mail"}, {"state": "client.card.consumption", "icon": "show_chart"}, {"state": "client.card.mandate", "icon": "pan_tool"}, - {"state": "client.card.creditInsurance.index", "icon": "icon-solunion"}, {"state": "client.card.contact", "icon": "contact_phone"}, {"state": "client.card.webPayment", "icon": "icon-onlinepayment"}, {"state": "client.card.dms.index", "icon": "cloud_upload"}, @@ -416,7 +423,8 @@ "state": "client.notification", "component": "vn-client-notification", "description": "Notifications" - }, { + }, + { "url": "/unpaid", "state": "client.card.unpaid", "component": "vn-client-unpaid", @@ -428,6 +436,13 @@ "state": "client.extendedList", "component": "vn-client-extended-list", "description": "Extended list" + }, + { + "url": "/credit-management", + "state": "client.card.creditManagement", + "component": "vn-client-credit-management", + "acl": ["financial"], + "description": "Credit opinion" } ] } diff --git a/modules/client/front/summary/index.html b/modules/client/front/summary/index.html index ed4b89ee4..a0d4b918a 100644 --- a/modules/client/front/summary/index.html +++ b/modules/client/front/summary/index.html @@ -1,3 +1,6 @@ + + +

- Basic data

-

Basic data

- - - - - - {{$ctrl.summary.salesPersonUser.name}} - + +

- Fiscal address

-

Fiscal address

- - - - - -

- Fiscal data

-

Fiscal data

- Billing data

-

Billing data

- - -

- Address @@ -201,10 +207,10 @@ ng-show="!$ctrl.isEmployee"> Address

- -

- Web access

-

Web access

- @@ -236,52 +242,60 @@

Business data

- - - - -
-

Financial information

- + + Billing data + + + + info="Invoices minus payments plus orders not yet invoiced"> - - - - - + +
@@ -341,7 +355,7 @@ class="link"> {{::ticket.refFk}} - {{::ticket.ticketState.state.name}} @@ -355,8 +369,8 @@ - - @@ -397,4 +411,4 @@ ticket="$ctrl.selectedTicket" model="model"> - \ No newline at end of file + diff --git a/modules/client/front/summary/locale/es.yml b/modules/client/front/summary/locale/es.yml index b6233d4b3..c1fde0c17 100644 --- a/modules/client/front/summary/locale/es.yml +++ b/modules/client/front/summary/locale/es.yml @@ -20,3 +20,7 @@ Invoices minus payments: Facturas menos recibos Deviated invoices minus payments: Facturas fuera de plazo menos recibos Go to the client: Ir al cliente Latest tickets: Últimos tickets +Rating: Clasificación +Value from 1 to 20. The higher the better value: Valor del 1 al 20. Cuanto más alto mejor valoración +Go to grafana: Ir a grafana +Business type: Tipo de negocio \ No newline at end of file diff --git a/modules/client/front/summary/style.scss b/modules/client/front/summary/style.scss index 79708b361..77fc020ef 100644 --- a/modules/client/front/summary/style.scss +++ b/modules/client/front/summary/style.scss @@ -2,8 +2,13 @@ vn-client-summary .summary { max-width: $width-lg; - + .alert span { color: $color-alert !important } -} \ No newline at end of file + + vn-horizontal h4 .grafana:after { + content: 'contact_support'; + font-size: 17px; + } +} diff --git a/modules/client/front/web-access/index.html b/modules/client/front/web-access/index.html index b776fa577..15dc5ed58 100644 --- a/modules/client/front/web-access/index.html +++ b/modules/client/front/web-access/index.html @@ -1,6 +1,6 @@ @@ -30,7 +30,7 @@ vn-one label="User" ng-model="$ctrl.account.name" - rule> + rule="VnUser.name"> @@ -41,7 +41,7 @@ label="Recovery email" ng-model="$ctrl.account.email" info="This email is used for user to regain access their account." - rule> + rule="VnUser.name"> diff --git a/modules/entry/back/locale/buy/en.yml b/modules/entry/back/locale/buy/en.yml new file mode 100644 index 000000000..2db7c7be5 --- /dev/null +++ b/modules/entry/back/locale/buy/en.yml @@ -0,0 +1,18 @@ +name: buy +columns: + id: id + quantity: quantity + buyingValue: buying value + freightValue: freight value + packing: packing + grouping: grouping + stickers: stickers + groupingMode: grouping mode + comissionValue: comission value + packageValue: package value + price2: price2 + price3: price3 + weight: weight + entryFk: entry + itemFk: item + packageFk: package diff --git a/modules/entry/back/locale/buy/es.yml b/modules/entry/back/locale/buy/es.yml new file mode 100644 index 000000000..666bf7640 --- /dev/null +++ b/modules/entry/back/locale/buy/es.yml @@ -0,0 +1,18 @@ +name: compra +columns: + id: id + quantity: cantidad + buyingValue: valor compra + freightValue: valor flete + packing: embalaje + grouping: agrupación + stickers: pegatinas + groupingMode: modo agrupación + comissionValue: valor comisión + packageValue: valor paquete + price2: precio2 + price3: precio3 + weight: peso + entryFk: entrada + itemFk: artículo + packageFk: paquete diff --git a/modules/entry/back/locale/entry-observation/en.yml b/modules/entry/back/locale/entry-observation/en.yml new file mode 100644 index 000000000..379683303 --- /dev/null +++ b/modules/entry/back/locale/entry-observation/en.yml @@ -0,0 +1,6 @@ +name: observation +columns: + id: id + description: description + entryFk: entry + observationTypeFk: observation type diff --git a/modules/entry/back/locale/entry-observation/es.yml b/modules/entry/back/locale/entry-observation/es.yml new file mode 100644 index 000000000..8879f1e1b --- /dev/null +++ b/modules/entry/back/locale/entry-observation/es.yml @@ -0,0 +1,6 @@ +name: observación +columns: + id: id + description: descripción + entryFk: entrada + observationTypeFk: tipo observación diff --git a/modules/entry/back/locale/entry/en.yml b/modules/entry/back/locale/entry/en.yml new file mode 100644 index 000000000..6bc2333e6 --- /dev/null +++ b/modules/entry/back/locale/entry/en.yml @@ -0,0 +1,23 @@ +name: entry +columns: + id: id + dated: dated + reference: reference + invoiceNumber: invoice number + isBooked: booked + isExcludedFromAvailable: excluded from available + notes: notes + isConfirmed: confirmed + isVirtual: virtual + isRaid: raid + commission: commission + isOrdered: price3 + created: created + observation: observation + isBlocked: blocked + loadPriority: load priority + supplierFk: supplier + travelFk: travel + companyFk: company + observationEditorFk: observation editor + currencyFk: currency diff --git a/modules/entry/back/locale/entry/es.yml b/modules/entry/back/locale/entry/es.yml new file mode 100644 index 000000000..3a0c3d9c1 --- /dev/null +++ b/modules/entry/back/locale/entry/es.yml @@ -0,0 +1,23 @@ +name: entrada +columns: + id: id + dated: fecha + reference: referencia + invoiceNumber: número factura + isBooked: reservado + isExcludedFromAvailable: excluido del disponible + notes: notas + isConfirmed: confirmado + isVirtual: virtual + isRaid: incursión + commission: comisión + isOrdered: precio3 + created: creado + observation: observación + isBlocked: bloqueado + loadPriority: prioridad de carga + supplierFk: proveedor + travelFk: envío + companyFk: empresa + observationEditorFk: editor observación + currencyFk: moneda diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index e90043074..1cd12b737 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -158,7 +158,6 @@ module.exports = Self => { e.invoiceNumber, e.isBooked, e.isExcludedFromAvailable, - e.notes, e.evaNotes AS observation, e.isConfirmed, e.isOrdered, diff --git a/modules/entry/back/models/buy.json b/modules/entry/back/models/buy.json index de2ddffd6..379e55427 100644 --- a/modules/entry/back/models/buy.json +++ b/modules/entry/back/models/buy.json @@ -1,11 +1,6 @@ { "name": "Buy", "base": "Loggable", - "log": { - "model": "EntryLog", - "relation": "entry", - "grabUser": true - }, "options": { "mysql": { "table": "buy" diff --git a/modules/entry/back/models/entry-log.json b/modules/entry/back/models/entry-log.json index 6f8edaf25..b4370e3bc 100644 --- a/modules/entry/back/models/entry-log.json +++ b/modules/entry/back/models/entry-log.json @@ -1,6 +1,6 @@ { "name": "EntryLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "entryLog" @@ -48,11 +48,11 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } }, "scope": { "order": ["creationDate DESC", "id DESC"] } -} \ No newline at end of file +} diff --git a/modules/entry/back/models/entry-observation.json b/modules/entry/back/models/entry-observation.json index 0c63dd663..cdf0c5e6e 100644 --- a/modules/entry/back/models/entry-observation.json +++ b/modules/entry/back/models/entry-observation.json @@ -1,10 +1,6 @@ { "name": "EntryObservation", "base": "Loggable", - "log": { - "model": "EntryLog", - "relation": "entry" - }, "options": { "mysql": { "table": "entryObservation" diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json index 5aa175758..a7508b4e8 100644 --- a/modules/entry/back/models/entry.json +++ b/modules/entry/back/models/entry.json @@ -1,10 +1,6 @@ { "name": "Entry", "base": "Loggable", - "log": { - "model":"EntryLog", - "grabUser": true - }, "options": { "mysql": { "table": "entry" @@ -31,9 +27,6 @@ "isExcludedFromAvailable": { "type": "boolean" }, - "notes": { - "type": "string" - }, "isConfirmed": { "type": "boolean" }, diff --git a/modules/entry/front/basic-data/index.html b/modules/entry/front/basic-data/index.html index 68a65e890..0b3537fac 100644 --- a/modules/entry/front/basic-data/index.html +++ b/modules/entry/front/basic-data/index.html @@ -8,7 +8,7 @@
- - {{::id}} - {{::nickname}} +
#{{::nickname}}
+
#{{::id}}
- {{::agencyModeName}} - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) → - {{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}}) +
+ {{::agencyModeName}} - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) → + {{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}}) +
+
#{{::id}}
- -
@@ -166,11 +164,11 @@ value-field="id"> @@ -181,7 +179,7 @@ - \ No newline at end of file + diff --git a/modules/entry/front/buy/index/index.html b/modules/entry/front/buy/index/index.html index de784198c..e6d1a0b76 100644 --- a/modules/entry/front/buy/index/index.html +++ b/modules/entry/front/buy/index/index.html @@ -16,7 +16,7 @@
-
@@ -174,7 +175,7 @@ - - - - + + + + - - - + + + diff --git a/modules/entry/front/routes.json b/modules/entry/front/routes.json index 37dda7584..3934a96ee 100644 --- a/modules/entry/front/routes.json +++ b/modules/entry/front/routes.json @@ -74,15 +74,15 @@ }, "acl": ["buyer", "administrative"] }, - { - "url": "/observation", - "state": "entry.card.observation", - "component": "vn-entry-observation", - "description": "Notes", - "params": { - "entry": "$ctrl.entry" - }, - "acl": ["buyer", "administrative"] + { + "url": "/observation", + "state": "entry.card.observation", + "component": "vn-entry-observation", + "description": "Notes", + "params": { + "entry": "$ctrl.entry" + }, + "acl": ["buyer", "administrative"] }, { "url" : "/log", diff --git a/modules/entry/front/summary/index.html b/modules/entry/front/summary/index.html index f03710dc4..d5d3ebf1e 100644 --- a/modules/entry/front/summary/index.html +++ b/modules/entry/front/summary/index.html @@ -32,9 +32,6 @@ - - diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js index e0f191962..42ebe52b3 100644 --- a/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js +++ b/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('invoiceIn clone()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should return the cloned invoiceIn and also clone invoiceInDueDays and invoiceInTaxes if there are any referencing the invoiceIn', async() => { const userId = 1; const ctx = { diff --git a/modules/invoiceIn/back/models/invoice-in-log.json b/modules/invoiceIn/back/models/invoice-in-log.json index a5d0cba56..70892d0f9 100644 --- a/modules/invoiceIn/back/models/invoice-in-log.json +++ b/modules/invoiceIn/back/models/invoice-in-log.json @@ -1,6 +1,6 @@ { "name": "InvoiceInLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "invoiceInLog" @@ -48,7 +48,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } }, @@ -58,4 +58,4 @@ "id DESC" ] } -} \ No newline at end of file +} diff --git a/modules/invoiceIn/back/models/invoice-in-tax.json b/modules/invoiceIn/back/models/invoice-in-tax.json index 789020161..1f68476c3 100644 --- a/modules/invoiceIn/back/models/invoice-in-tax.json +++ b/modules/invoiceIn/back/models/invoice-in-tax.json @@ -1,10 +1,6 @@ { "name": "InvoiceInTax", "base": "Loggable", - "log": { - "model": "InvoiceInLog", - "relation": "invoiceIn" - }, "options": { "mysql": { "table": "invoiceInTax" @@ -55,4 +51,4 @@ "foreignKey": "transactionTypeSageFk" } } -} \ No newline at end of file +} diff --git a/modules/invoiceIn/back/models/invoice-in.json b/modules/invoiceIn/back/models/invoice-in.json index c6a736b06..754899866 100644 --- a/modules/invoiceIn/back/models/invoice-in.json +++ b/modules/invoiceIn/back/models/invoice-in.json @@ -1,9 +1,6 @@ { "name": "InvoiceIn", "base": "Loggable", - "log": { - "model": "InvoiceInLog" - }, "options": { "mysql": { "table": "invoiceIn" diff --git a/modules/invoiceIn/front/tax/index.html b/modules/invoiceIn/front/tax/index.html index acc9cf492..e13f769ce 100644 --- a/modules/invoiceIn/front/tax/index.html +++ b/modules/invoiceIn/front/tax/index.html @@ -34,7 +34,7 @@ rule> {{id}}: {{name}} - @@ -57,7 +57,10 @@ search-function="{or: [{id: $search}, {vat: {like: '%'+ $search +'%'}}]}" selection="taxRateSelection" rule> - {{id}}: {{vat}} + +
{{::vat}}
+
#{{::id}}
+
- {{id}}: {{transaction}} + +
{{::transaction}}
+
#{{::id}}
+
- + @@ -105,7 +111,7 @@ - + @@ -115,7 +121,7 @@ @@ -129,7 +135,7 @@ @@ -140,4 +146,4 @@ - \ No newline at end of file + diff --git a/modules/invoiceOut/back/methods/invoiceOut/createPdf.js b/modules/invoiceOut/back/methods/invoiceOut/createPdf.js index 23b6c9e04..a9c151ae4 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/createPdf.js +++ b/modules/invoiceOut/back/methods/invoiceOut/createPdf.js @@ -43,7 +43,7 @@ module.exports = Self => { try { const invoiceOut = await Self.findById(id, null, myOptions); - const hasInvoicing = await models.Account.hasRole(userId, 'invoicing', myOptions); + const hasInvoicing = await models.VnUser.hasRole(userId, 'invoicing', myOptions); if (invoiceOut.hasPdf && !hasInvoicing) throw new UserError(`You don't have enough privileges`); diff --git a/modules/invoiceOut/back/methods/invoiceOut/refund.js b/modules/invoiceOut/back/methods/invoiceOut/refund.js index ba1fdfedd..ad480dc7d 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/refund.js +++ b/modules/invoiceOut/back/methods/invoiceOut/refund.js @@ -35,7 +35,7 @@ module.exports = Self => { const tickets = await models.Ticket.find(filter, myOptions); const ticketsIds = tickets.map(ticket => ticket.id); - const refundedTickets = await models.Ticket.refund(ticketsIds, true, myOptions); + const refundedTickets = await models.Ticket.refund(ticketsIds, myOptions); if (tx) await tx.commit(); diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js index c5a1ac603..35f2b4023 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js +++ b/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js @@ -17,7 +17,7 @@ describe('InvoiceOut refund()', () => { try { const result = await models.InvoiceOut.refund('T1111111', options); - expect(result.length).toEqual(1); + expect(result).toBeDefined(); await tx.rollback(); } catch (e) { diff --git a/modules/invoiceOut/front/descriptor-menu/index.js b/modules/invoiceOut/front/descriptor-menu/index.js index 456939119..57ea653a8 100644 --- a/modules/invoiceOut/front/descriptor-menu/index.js +++ b/modules/invoiceOut/front/descriptor-menu/index.js @@ -118,8 +118,11 @@ class Controller extends Section { const query = 'InvoiceOuts/refund'; const params = {ref: this.invoiceOut.ref}; this.$http.post(query, params).then(res => { - const ticketIds = res.data.map(ticket => ticket.id).join(', '); - this.vnApp.showSuccess(this.$t('The following refund tickets have been created', {ticketIds})); + const refundTicket = res.data; + this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { + ticketId: refundTicket.id + })); + this.$state.go('ticket.card.sale', {id: refundTicket.id}); }); } } diff --git a/modules/invoiceOut/front/global-invoicing/index.html b/modules/invoiceOut/front/global-invoicing/index.html index ebe46b84a..6d5b16329 100644 --- a/modules/invoiceOut/front/global-invoicing/index.html +++ b/modules/invoiceOut/front/global-invoicing/index.html @@ -98,7 +98,10 @@ ng-model="$ctrl.clientId" required="true" ng-if="$ctrl.clientsToInvoice == 'one'"> - {{::id}} - {{::name}} + +
{{::name}}
+
#{{::id}}
+
- {{::id}} - {{::nickname}} +
#{{::id}}
+
{{::nickname}}
Or diff --git a/modules/item/back/locale/item-barcode/en.yml b/modules/item/back/locale/item-barcode/en.yml new file mode 100644 index 000000000..16b18b163 --- /dev/null +++ b/modules/item/back/locale/item-barcode/en.yml @@ -0,0 +1,5 @@ +name: barcode +columns: + id: id + code: code + itemFk: item diff --git a/modules/item/back/locale/item-barcode/es.yml b/modules/item/back/locale/item-barcode/es.yml new file mode 100644 index 000000000..11d9f0c22 --- /dev/null +++ b/modules/item/back/locale/item-barcode/es.yml @@ -0,0 +1,5 @@ +name: código barras +columns: + id: id + code: código + itemFk: artículo diff --git a/modules/item/back/locale/item-botanical/en.yml b/modules/item/back/locale/item-botanical/en.yml new file mode 100644 index 000000000..03c66a097 --- /dev/null +++ b/modules/item/back/locale/item-botanical/en.yml @@ -0,0 +1,5 @@ +name: botanical +columns: + itemFk: item + genusFk: genus + specieFk: specie diff --git a/modules/item/back/locale/item-botanical/es.yml b/modules/item/back/locale/item-botanical/es.yml new file mode 100644 index 000000000..ca7fd5bf1 --- /dev/null +++ b/modules/item/back/locale/item-botanical/es.yml @@ -0,0 +1,5 @@ +name: botánico +columns: + itemFk: artículo + genusFk: género + specieFk: especie diff --git a/modules/item/back/locale/item-tag/en.yml b/modules/item/back/locale/item-tag/en.yml new file mode 100644 index 000000000..8d8288a96 --- /dev/null +++ b/modules/item/back/locale/item-tag/en.yml @@ -0,0 +1,7 @@ +name: tag +columns: + id: id + value: value + itemFk: item + tagFk: tag + priority: priority diff --git a/modules/item/back/locale/item-tag/es.yml b/modules/item/back/locale/item-tag/es.yml new file mode 100644 index 000000000..f9c9aac0b --- /dev/null +++ b/modules/item/back/locale/item-tag/es.yml @@ -0,0 +1,7 @@ +name: etiqueta +columns: + id: id + value: valor + itemFk: artículo + tagFk: etiqueta + priority: prioridad diff --git a/modules/item/back/locale/item-tax-country/en.yml b/modules/item/back/locale/item-tax-country/en.yml new file mode 100644 index 000000000..c85c5af43 --- /dev/null +++ b/modules/item/back/locale/item-tax-country/en.yml @@ -0,0 +1,7 @@ +name: country tax +columns: + id: id + effectived: effectived + itemFk: item + countryFk: country + taxClassFk: tax class diff --git a/modules/item/back/locale/item-tax-country/es.yml b/modules/item/back/locale/item-tax-country/es.yml new file mode 100644 index 000000000..48baf735b --- /dev/null +++ b/modules/item/back/locale/item-tax-country/es.yml @@ -0,0 +1,7 @@ +name: impuesto país +columns: + id: id + effectived: efectivo + itemFk: artículo + countryFk: país + taxClassFk: clase impuesto diff --git a/modules/item/back/locale/item/en.yml b/modules/item/back/locale/item/en.yml new file mode 100644 index 000000000..39e465300 --- /dev/null +++ b/modules/item/back/locale/item/en.yml @@ -0,0 +1,49 @@ +name: item +columns: + id: id + name: name + quantity: quantity + size: size + category: category + typeFk: type + stems: stems + description: description + isActive: active + relevancy: relevancy + weightByPiece: weight by piece + stemMultiplier: stem multiplier + image: image + longName: long name + subName: sub name + tag5: tag5 + value5: value5 + tag6: tag6 + value6: value6 + tag7: tag7 + value7: value7 + tag8: tag8 + value8: value8 + tag9: tag9 + value9: value9 + tag10: tag10 + value10: value10 + itemPackingTypeFk: item packing type + hasKgPrice: has kg price + family: family + expenseFk: expense + minPrice: min price + packingOut: packing out + hasMinPrice: has min price + isFragile: fragile + isFloramondo: is floramondo + packingShelve: packing shelve + isLaid: laid + inkFk: ink + originFk: origin + producerFk: producer + intrastatFk: intrastat + genericFk: generic + itemFk: item + density: density + compression: compression + diff --git a/modules/item/back/locale/item/es.yml b/modules/item/back/locale/item/es.yml new file mode 100644 index 000000000..4b75b4704 --- /dev/null +++ b/modules/item/back/locale/item/es.yml @@ -0,0 +1,49 @@ +name: artículo +columns: + id: id + name: nombre + quantity: cantidad + size: tamaño + category: categoría + typeFk: tipo + stems: tallos + description: descripción + isActive: activo + relevancy: relevancia + weightByPiece: peso por pieza + stemMultiplier: multiplicador de tallo + image: imagen + longName: nombre largo + subName: subnombre + tag5: etiqueta5 + value5: valor5 + tag6: etiqueta6 + value6: valor6 + tag7: etiqueta7 + value7: valor7 + tag8: etiqueta8 + value8: valor8 + tag9: etiqueta9 + value9: valor9 + tag10: etiqueta10 + value10: valor10 + itemPackingTypeFk: tipo embalaje + hasKgPrice: precio kg + family: familia + expenseFk: gasto + minPrice: precio mínimo + packingOut: empaquetar + hasMinPrice: tiene precio mínimo + isFragile: frágil + isFloramondo: es floramondo + packingShelve: estantería embalaje + isLaid: puesto + inkFk: tinta + originFk: origen + producerFk: productor + intrastatFk: intrastat + genericFk: genérico + itemFk: artículo + density: densidad + compression: compresión + diff --git a/modules/item/back/methods/item/specs/updateTaxes.spec.js b/modules/item/back/methods/item/specs/updateTaxes.spec.js index 66d2ce81c..793e43de8 100644 --- a/modules/item/back/methods/item/specs/updateTaxes.spec.js +++ b/modules/item/back/methods/item/specs/updateTaxes.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('item updateTaxes()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should throw an error if the taxClassFk is blank', async() => { const tx = await models.Item.beginTransaction({}); const options = {transaction: tx}; diff --git a/modules/item/back/methods/tag/specs/onSubmit.spec.js b/modules/item/back/methods/tag/specs/onSubmit.spec.js index f24aad7e4..1e96d9e81 100644 --- a/modules/item/back/methods/tag/specs/onSubmit.spec.js +++ b/modules/item/back/methods/tag/specs/onSubmit.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('tag onSubmit()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should delete a tag', async() => { const tx = await models.Item.beginTransaction({}); const options = {transaction: tx}; diff --git a/modules/item/back/models/item-barcode.json b/modules/item/back/models/item-barcode.json index e2ce347cb..12068a65f 100644 --- a/modules/item/back/models/item-barcode.json +++ b/modules/item/back/models/item-barcode.json @@ -1,11 +1,6 @@ { "name": "ItemBarcode", "base": "Loggable", - "log": { - "model": "ItemLog", - "relation": "item", - "showField": "code" - }, "options": { "mysql": { "table": "itemBarcode" @@ -27,6 +22,6 @@ "type": "belongsTo", "model": "Item", "foreignKey": "itemFk" - } + } } } diff --git a/modules/item/back/models/item-botanical.json b/modules/item/back/models/item-botanical.json index 8d8fd389f..8a8bba870 100644 --- a/modules/item/back/models/item-botanical.json +++ b/modules/item/back/models/item-botanical.json @@ -1,10 +1,6 @@ { "name": "ItemBotanical", "base": "Loggable", - "log": { - "model": "ItemLog", - "relation": "item" - }, "options": { "mysql": { "table": "itemBotanical" @@ -34,4 +30,4 @@ "foreignKey": "specieFk" } } -} \ No newline at end of file +} diff --git a/modules/item/back/models/item-log.json b/modules/item/back/models/item-log.json index 633a8f86b..19c132187 100644 --- a/modules/item/back/models/item-log.json +++ b/modules/item/back/models/item-log.json @@ -1,6 +1,6 @@ { "name": "ItemLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "itemLog" @@ -12,7 +12,7 @@ "type": "number", "forceId": false }, - "originFk": { + "originFk": { "type": "number", "required": true }, @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/item/back/models/item-shelving-sale.json b/modules/item/back/models/item-shelving-sale.json index 8b89a7597..283bf3298 100644 --- a/modules/item/back/models/item-shelving-sale.json +++ b/modules/item/back/models/item-shelving-sale.json @@ -32,7 +32,7 @@ }, "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } } diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json index 339b9ab6e..49bebcb6b 100644 --- a/modules/item/back/models/item-shelving.json +++ b/modules/item/back/models/item-shelving.json @@ -20,9 +20,9 @@ }, "created": { "type": "date" - }, - "isChecked": { - "type": "boolean" + }, + "isChecked": { + "type": "boolean" } }, "relations": { @@ -33,7 +33,7 @@ }, "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" }, "shelving": { diff --git a/modules/item/back/models/item-tag.json b/modules/item/back/models/item-tag.json index 5660b3628..0742f8d3f 100644 --- a/modules/item/back/models/item-tag.json +++ b/modules/item/back/models/item-tag.json @@ -1,11 +1,6 @@ { "name": "ItemTag", "base": "Loggable", - "log": { - "model": "ItemLog", - "relation": "item", - "showField": "value" - }, "options": { "mysql": { "table": "itemTag" diff --git a/modules/item/back/models/item-tax-country.json b/modules/item/back/models/item-tax-country.json index f10a9eb72..002be97d8 100644 --- a/modules/item/back/models/item-tax-country.json +++ b/modules/item/back/models/item-tax-country.json @@ -1,11 +1,6 @@ { "name": "ItemTaxCountry", "base": "Loggable", - "log": { - "model": "ItemLog", - "relation": "item", - "showField": "countryFk" - }, "options": { "mysql": { "table": "itemTaxCountry" @@ -47,4 +42,4 @@ "foreignKey": "taxClassFk" } } -} \ No newline at end of file +} diff --git a/modules/item/back/models/item.json b/modules/item/back/models/item.json index d6b3c27ad..4a7e04002 100644 --- a/modules/item/back/models/item.json +++ b/modules/item/back/models/item.json @@ -1,11 +1,6 @@ { "name": "Item", "base": "Loggable", - "log": { - "model": "ItemLog", - "showField": "id", - "grabUser": true - }, "options": { "mysql": { "table": "item" diff --git a/modules/item/front/basic-data/index.html b/modules/item/front/basic-data/index.html index 974aa37d8..a7e603bd1 100644 --- a/modules/item/front/basic-data/index.html +++ b/modules/item/front/basic-data/index.html @@ -20,47 +20,52 @@ - -
{{name}}
+
{{::name}}
- {{category.name}} + {{::category.name}}
- - -
{{::id}}
+
{{::description}}
+
+ #{{::id}} +
- -
+ ng-model="$ctrl.item.stemMultiplier" + vn-name="stemMultiplier"> - {{::id}} - {{::name}} +
{{::name}}
+
+ #{{::id}} +
+ ng-model="$ctrl.item.isActive" + vn-name="isActive"> + ng-model="$ctrl.item.hasKgPrice" + vn-name="priceInKg"> @@ -211,16 +221,19 @@ message="New intrastat"> - - diff --git a/modules/item/front/create/index.html b/modules/item/front/create/index.html index 15e212250..b284abf06 100644 --- a/modules/item/front/create/index.html +++ b/modules/item/front/create/index.html @@ -18,6 +18,7 @@ + label="Tag" + vn-name="tag"> + value-field="priority" + vn-name="priority">
- -
{{::id}}
+
{{::description}}
+
+ #{{::id}} +
- + ng-model="$ctrl.item.originFk" + vn-name="origin">
diff --git a/modules/item/front/fixed-price-search-panel/index.html b/modules/item/front/fixed-price-search-panel/index.html index 5c8a58674..ebe210277 100644 --- a/modules/item/front/fixed-price-search-panel/index.html +++ b/modules/item/front/fixed-price-search-panel/index.html @@ -1,136 +1,215 @@ - - -
-
- - - - - - - - - -
{{name}}
-
- {{category.name}} -
-
-
-
- - - - - - - - - - - - - - - - - - - - - Tags - - - - - - - - - - - - - - - - - - -
+ + + + + + + + + + + + + + + + + + +
{{name}}
+
+ {{category.name}} +
+
+
+
+ + + + + + + + + + + + + + + + + + + + Tags + + + + + + + + + + + + + +
+ + Id/{{$ctrl.$t('Name')}}: {{$ctrl.filter.search}} + + + {{$ctrl.$t('Category')}}: {{category.selection.name}} + + + {{$ctrl.$t('Type')}}: {{type.selection.name}} + + + {{$ctrl.$t('Buyer')}}: {{buyer.selection.nickname}} + + + {{$ctrl.$t('Warehouse')}}: {{warehouse.selection.name}} + + + {{$ctrl.$t('Started')}}: {{$ctrl.filter.started | date:'dd/MM/yyyy'}} + + + {{$ctrl.$t('Ended')}}: {{$ctrl.filter.ended | date:'dd/MM/yyyy'}} + + + {{$ctrl.$t('For me')}}: {{$ctrl.filter.mine ? '✓' : '✗'}} + + + {{$ctrl.$t('Minimum price')}}: {{$ctrl.filter.hasMinPrice ? '✓' : '✗'}} + + + {{$ctrl.showTagInfo(chipTag)}} + +
+
diff --git a/modules/item/front/fixed-price-search-panel/index.js b/modules/item/front/fixed-price-search-panel/index.js index ec13765fd..0882eb5ac 100644 --- a/modules/item/front/fixed-price-search-panel/index.js +++ b/modules/item/front/fixed-price-search-panel/index.js @@ -1,19 +1,60 @@ import ngModule from '../module'; import SearchPanel from 'core/components/searchbar/search-panel'; +import './style.scss'; class Controller extends SearchPanel { - get filter() { - return this.$.filter; + constructor($element, $) { + super($element, $); } - set filter(value = {}) { - if (!value.tags) value.tags = [{}]; + $onInit() { + this.filter = { + tags: [] + }; + } - this.$.filter = value; + changeCategory(id) { + if (this.filter.categoryFk != id) { + this.filter.categoryFk = id; + this.addFilters(); + } + } + + removeItemFilter(param) { + this.filter[param] = null; + if (param == 'categoryFk') this.filter['typeFk'] = null; + this.addFilters(); + } + + removeTag(tag) { + const index = this.filter.tags.indexOf(tag); + if (index > -1) this.filter.tags.splice(index, 1); + this.addFilters(); + } + + onKeyPress($event) { + if ($event.key === 'Enter') + this.addFilters(); + } + + addFilters() { + for (let i = 0; i < this.filter.tags.length; i++) { + if (!this.filter.tags[i].value) + this.filter.tags.splice(i, 1); + } + return this.model.addFilter({}, this.filter); + } + + showTagInfo(itemTag) { + if (!itemTag.tagFk) return itemTag.value; + return `${this.tags.find(tag => tag.id == itemTag.tagFk).name}: ${itemTag.value}`; } } ngModule.vnComponent('vnFixedPriceSearchPanel', { template: require('./index.html'), - controller: Controller + controller: Controller, + bindings: { + model: '<' + } }); diff --git a/modules/item/front/fixed-price-search-panel/index.spec.js b/modules/item/front/fixed-price-search-panel/index.spec.js new file mode 100644 index 000000000..597bc108e --- /dev/null +++ b/modules/item/front/fixed-price-search-panel/index.spec.js @@ -0,0 +1,56 @@ +import './index.js'; + +describe('Item', () => { + describe('Component vnFixedPriceSearchPanel', () => { + let $element; + let controller; + + beforeEach(ngModule('item')); + + beforeEach(angular.mock.inject($componentController => { + $element = angular.element(``); + controller = $componentController('vnFixedPriceSearchPanel', {$element}); + controller.model = {addFilter: () => {}}; + })); + + describe('removeItemFilter()', () => { + it(`should remove param from filter`, () => { + controller.filter = {tags: [], categoryFk: 1, typeFk: 1}; + const expectFilter = {tags: [], categoryFk: null, typeFk: null}; + + controller.removeItemFilter('categoryFk'); + + expect(controller.filter).toEqual(expectFilter); + }); + }); + + describe('removeTag()', () => { + it(`should remove tag from filter`, () => { + const tag = {tagFk: 1, value: 'Value'}; + controller.filter = {tags: [tag]}; + const expectFilter = {tags: []}; + + controller.removeTag(tag); + + expect(controller.filter).toEqual(expectFilter); + }); + }); + + describe('showTagInfo()', () => { + it(`should show tag value`, () => { + const tag = {value: 'Value'}; + const result = controller.showTagInfo(tag); + + expect(result).toEqual('Value'); + }); + + it(`should show tag name and value`, () => { + const tag = {tagFk: 1, value: 'Value'}; + controller.tags = [{id: 1, name: 'tagName'}]; + const result = controller.showTagInfo(tag); + + expect(result).toEqual('tagName: Value'); + }); + }); + }); +}); diff --git a/modules/item/front/fixed-price-search-panel/style.scss b/modules/item/front/fixed-price-search-panel/style.scss new file mode 100644 index 000000000..e386033dd --- /dev/null +++ b/modules/item/front/fixed-price-search-panel/style.scss @@ -0,0 +1,71 @@ +@import "variables"; + +vn-fixed-price-search-panel vn-side-menu { + .menu { + min-width: $menu-width; + } + & > div { + .input { + padding-left: $spacing-md; + padding-right: $spacing-md; + border-color: $color-spacer; + border-bottom: $border-thin; + } + .horizontal { + padding-left: $spacing-md; + padding-right: $spacing-md; + grid-auto-flow: column; + grid-column-gap: $spacing-sm; + align-items: center; + } + .tags { + padding: $spacing-md; + padding-bottom: 0%; + padding-top: 0%; + align-items: center; + } + .chips { + display: flex; + flex-wrap: wrap; + padding: $spacing-md; + overflow: hidden; + max-width: 100%; + border-color: $color-spacer; + border-top: $border-thin; + } + .item-category { + padding: $spacing-sm; + justify-content: flex-start; + align-items: flex-start; + flex-wrap: wrap; + + vn-autocomplete[vn-id="category"] { + display: none; + } + + & > vn-one { + padding: $spacing-sm; + min-width: 33.33%; + text-align: center; + box-sizing: border-box; + + & > vn-icon { + padding: $spacing-sm; + background-color: $color-font-secondary; + border-radius: 50%; + cursor: pointer; + + &.active { + background-color: $color-main; + color: #fff; + } + & > i:before { + font-size: 2.6rem; + width: 16px; + height: 16px; + } + } + } + } + } +} diff --git a/modules/item/front/fixed-price/index.html b/modules/item/front/fixed-price/index.html index a82fd2742..d9a955fe1 100644 --- a/modules/item/front/fixed-price/index.html +++ b/modules/item/front/fixed-price/index.html @@ -14,16 +14,10 @@ order="name">
- - + +
{ ENGINE = MEMORY SELECT DISTINCT clientFk FROM tmp.filter`); - stmt = new ParameterizedSQL('CALL clientGetDebt(?)', [args.to]); + stmt = new ParameterizedSQL('CALL client_getDebt(?)', [args.to]); stmts.push(stmt); stmts.push('DROP TEMPORARY TABLE tmp.clientGetDebt'); diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index 008c0e5c9..10185af7e 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -141,7 +141,7 @@ module.exports = Self => { let stmt; stmt = new ParameterizedSQL( - `CREATE TEMPORARY TABLE tmp.filter + `CREATE OR REPLACE TEMPORARY TABLE tmp.filter (INDEX (id)) ENGINE = MEMORY SELECT diff --git a/modules/order/front/basic-data/index.html b/modules/order/front/basic-data/index.html index 109168e29..019153b0d 100644 --- a/modules/order/front/basic-data/index.html +++ b/modules/order/front/basic-data/index.html @@ -19,13 +19,17 @@ vn-one url="Clients" label="Client" - search-function="{or: [{id: $search}, {name: {like: '%'+$search+'%'}}]}" + search-function="{or: [{id: $search}, {name: {like: '%'+ $search +'%'}}]}" show-field="name" value-field="id" ng-model="$ctrl.order.clientFk" + vn-name="client" selection="$ctrl.selection" fields="['defaultAddressFk']"> - {{::id}}: {{::name}} + +
{{::name}}
+
#{{::id}}
+
{{::nickname}} - + ng-model="$ctrl.order.agencyModeFk" + vn-name="agencyMode"> diff --git a/modules/order/front/create/card.html b/modules/order/front/create/card.html index d252d680f..ed6f752d3 100644 --- a/modules/order/front/create/card.html +++ b/modules/order/front/create/card.html @@ -7,6 +7,7 @@ show-field="name" value-field="id" ng-model="$ctrl.clientFk" + vn-name="client" order="id"> {{id}}: {{name}} @@ -15,14 +16,16 @@ url="{{ $ctrl.clientFk ? 'Clients/'+ $ctrl.clientFk +'/addresses' : null }}" fields="['nickname', 'street', 'city']" ng-model="$ctrl.addressFk" + vn-name="address" show-field="nickname" value-field="id" label="Address"> {{nickname}}: {{street}}, {{city}} - + + ng-model="$ctrl.order.agencyModeFk" + vn-name="agencyMode"> diff --git a/modules/order/front/volume/index.html b/modules/order/front/volume/index.html index 7c2ff4e3d..e0053f9ed 100644 --- a/modules/order/front/volume/index.html +++ b/modules/order/front/volume/index.html @@ -12,11 +12,11 @@ @@ -24,7 +24,7 @@ - Item + Item Description Quantity m³ per quantity diff --git a/modules/order/front/volume/index.js b/modules/order/front/volume/index.js index aaadf2af6..c1bc5ec7d 100644 --- a/modules/order/front/volume/index.js +++ b/modules/order/front/volume/index.js @@ -6,9 +6,10 @@ class Controller extends Section { constructor($element, $) { super($element, $); this.filter = { - include: [{ + include: { relation: 'item' - }] + }, + order: 'itemFk' }; this.order = {}; this.ticketVolumes = []; diff --git a/modules/route/back/locale/route/en.yml b/modules/route/back/locale/route/en.yml new file mode 100644 index 000000000..96aaddb72 --- /dev/null +++ b/modules/route/back/locale/route/en.yml @@ -0,0 +1,19 @@ +name: route +columns: + id: id + created: created + time: time + kmStart: km start + kmEnd: km end + started: started + finished: finished + gestdoc: gestdoc + cost: cost + m3: m3 + description: description + isOk: ok + workerFk: worker + vehicleFk: vehicle + agencyModeFk: agency + routeFk: route + zoneFk: zone diff --git a/modules/route/back/locale/route/es.yml b/modules/route/back/locale/route/es.yml new file mode 100644 index 000000000..c0a434791 --- /dev/null +++ b/modules/route/back/locale/route/es.yml @@ -0,0 +1,19 @@ +name: ruta +columns: + id: id + created: creada + time: tiempo + kmStart: km inicio + kmEnd: km fin + started: empezada + finished: terminada + gestdoc: gestdoc + cost: coste + m3: m3 + description: descripción + isOk: ok + workerFk: trabajador + vehicleFk: vehículo + agencyModeFk: agencia + routeFk: ruta + zoneFk: zona diff --git a/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js b/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js index 2a8ebdba3..628c5fb9a 100644 --- a/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js +++ b/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js @@ -1,6 +1,20 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('AgencyTerm createInvoiceIn()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); const rows = [ { routeFk: 2, diff --git a/modules/route/back/models/route-log.json b/modules/route/back/models/route-log.json index 37f898267..93f570593 100644 --- a/modules/route/back/models/route-log.json +++ b/modules/route/back/models/route-log.json @@ -1,6 +1,6 @@ { "name": "RouteLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "routeLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/route/back/models/route.json b/modules/route/back/models/route.json index 3b12f4ee6..cdb64dd71 100644 --- a/modules/route/back/models/route.json +++ b/modules/route/back/models/route.json @@ -1,10 +1,6 @@ { "name": "Route", "base": "Loggable", - "log": { - "model":"RouteLog", - "grabUser": true - }, "options": { "mysql": { "table": "route" diff --git a/modules/route/front/basic-data/index.html b/modules/route/front/basic-data/index.html index 831599ae8..c63fee53b 100644 --- a/modules/route/front/basic-data/index.html +++ b/modules/route/front/basic-data/index.html @@ -9,76 +9,80 @@ + label="Worker" + vn-name="worker"> -
{{name}} - {{nickname}}
+
{{::nickname}}
+
{{::name}}
+ label="Vehicle" + vn-name="vehicle">
+ ng-model="$ctrl.route.created" + vn-name="created"> + label="Agency" + vn-name="agencyMode"> + ng-model="$ctrl.route.started" + vn-name="started"> - - - + ng-model="$ctrl.route.finished" + vn-name="finished"> + + + diff --git a/modules/shelving/back/models/shelving-log.json b/modules/shelving/back/models/shelving-log.json index a2267394e..e8245f770 100644 --- a/modules/shelving/back/models/shelving-log.json +++ b/modules/shelving/back/models/shelving-log.json @@ -1,6 +1,6 @@ { "name": "ShelvingLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "shelvingLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/shelving/back/models/shelving.json b/modules/shelving/back/models/shelving.json index 508ac428f..5f60318a5 100644 --- a/modules/shelving/back/models/shelving.json +++ b/modules/shelving/back/models/shelving.json @@ -1,10 +1,6 @@ { "name": "Shelving", "base": "Loggable", - "log": { - "model": "ShelvingLog", - "showField": "id" - }, "options": { "mysql": { "table": "shelving" diff --git a/modules/supplier/back/locale/supplier-account/en.yml b/modules/supplier/back/locale/supplier-account/en.yml new file mode 100644 index 000000000..2bce50cfa --- /dev/null +++ b/modules/supplier/back/locale/supplier-account/en.yml @@ -0,0 +1,7 @@ +name: account +columns: + id: id + iban: IBAN + beneficiary: beneficiary + supplierFk: supplier + bankEntityFk: bank entity diff --git a/modules/supplier/back/locale/supplier-account/es.yml b/modules/supplier/back/locale/supplier-account/es.yml new file mode 100644 index 000000000..120293c8a --- /dev/null +++ b/modules/supplier/back/locale/supplier-account/es.yml @@ -0,0 +1,7 @@ +name: cuenta +columns: + id: id + iban: IBAN + beneficiary: beneficiario + supplierFk: proveedor + bankEntityFk: entidad bancaria diff --git a/modules/supplier/back/locale/supplier-contact/en.yml b/modules/supplier/back/locale/supplier-contact/en.yml new file mode 100644 index 000000000..f79dfae19 --- /dev/null +++ b/modules/supplier/back/locale/supplier-contact/en.yml @@ -0,0 +1,9 @@ +name: contact +columns: + id: id + supplierFk: supplier + phone: phone + mobile: mobile + email: email + observation: observation + name: name diff --git a/modules/supplier/back/locale/supplier-contact/es.yml b/modules/supplier/back/locale/supplier-contact/es.yml new file mode 100644 index 000000000..486c7924d --- /dev/null +++ b/modules/supplier/back/locale/supplier-contact/es.yml @@ -0,0 +1,9 @@ +name: contacto +columns: + id: id + supplierFk: proveedor + phone: teléfono + mobile: móvil + email: email + observation: observación + name: nombre diff --git a/modules/supplier/back/locale/supplier/en.yml b/modules/supplier/back/locale/supplier/en.yml new file mode 100644 index 000000000..25bcae1e3 --- /dev/null +++ b/modules/supplier/back/locale/supplier/en.yml @@ -0,0 +1,36 @@ +name: supplier +columns: + id: id + name: name + account: account + countryFk: country + nif: NIF + phone: phone + retAccount: ret account + commission: commission + postcodeFk: postcode + isActive: active + isOfficial: official + isSerious: serious + isTrucker: trucker + note: note + street: street + city: city + provinceFk: province + postCode: postcode + payMethodFk: pay method + payDemFk: pay dem + payDay: pay day + nickname: nickname + workerFk: worker + sageTaxTypeFk: sage tax type + taxTypeSageFk: sage tax type + sageTransactionTypeFk: sage transaction type + transactionTypeSageFk: sage transaction type + sageWithholdingFk: sage with holding + withholdingSageFk: sage with holding + isPayMethodChecked: pay method checked + supplierActivityFk: supplier activity + healthRegister: health register + isVies: vies + supplierFk: supplier diff --git a/modules/supplier/back/locale/supplier/es.yml b/modules/supplier/back/locale/supplier/es.yml new file mode 100644 index 000000000..678c384a9 --- /dev/null +++ b/modules/supplier/back/locale/supplier/es.yml @@ -0,0 +1,36 @@ +name: proveedor +columns: + id: id + name: nombre + account: cuenta + countryFk: país + nif: NIF + phone: teléfono + retAccount: cuenta ret + commission: comisión + postcodeFk: código postal + isActive: activo + isOfficial: oficial + isSerious: serio + isTrucker: camionero + note: nota + street: calle + city: ciudad + provinceFk: provincia + postCode: código postal + payMethodFk: método pago + payDemFk: pagar dem + payDay: día pago + nickname: apodo + workerFk: trabajador + sageTaxTypeFk: tipo de impuesto sage + taxTypeSageFk: tipo de impuesto sage + sageTransactionTypeFk: tipo de transacción sage + transactionTypeSageFk: tipo de transacción sage + sageWithholdingFk: sage con tenencia + withholdingSageFk: sage con tenencia + isPayMethodChecked: método pago verificado + supplierActivityFk: actividad del proveedor + healthRegister: registro sanitario + isVies: vies + supplierFk: proveedor diff --git a/modules/supplier/back/methods/supplier/specs/filter.spec.js b/modules/supplier/back/methods/supplier/specs/filter.spec.js index 2620bb687..8f8ff1346 100644 --- a/modules/supplier/back/methods/supplier/specs/filter.spec.js +++ b/modules/supplier/back/methods/supplier/specs/filter.spec.js @@ -23,6 +23,6 @@ describe('Supplier filter()', () => { let result = await app.models.Supplier.filter(ctx); - expect(result.length).toEqual(2); + expect(result.length).toEqual(3); }); }); diff --git a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js index d4479d00b..c368ec1b8 100644 --- a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js +++ b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js @@ -19,13 +19,14 @@ describe('Supplier newSupplier()', () => { }); }); - it('should create a new supplier containing only the name', async() => { + it('should create a new supplier containing only the name and the nif', async() => { const tx = await models.Supplier.beginTransaction({}); try { const options = {transaction: tx}; ctx.args = { - name: 'newSupplier' + name: 'newSupplier', + nif: '12345678Z' }; const result = await models.Supplier.newSupplier(ctx, options); diff --git a/modules/supplier/back/models/supplier-account.js b/modules/supplier/back/models/supplier-account.js index dc6c6d5fd..51da113ec 100644 --- a/modules/supplier/back/models/supplier-account.js +++ b/modules/supplier/back/models/supplier-account.js @@ -25,7 +25,7 @@ module.exports = Self => { Self.observe('after save', async ctx => { const loopBackContext = LoopBackContext.getCurrentContext(); const models = Self.app.models; - const user = await models.user.findById(loopBackContext.active.accessToken.userId); + const user = await models.VnUser.findById(loopBackContext.active.accessToken.userId); const bankEntity = await models.BankEntity.findById(ctx.instance.bankEntityFk); await Self.app.models.Mail.create({ receiver: 'finanzas@verdnatura.es', diff --git a/modules/supplier/back/models/supplier-account.json b/modules/supplier/back/models/supplier-account.json index 2ee83338b..bc9cf0e24 100644 --- a/modules/supplier/back/models/supplier-account.json +++ b/modules/supplier/back/models/supplier-account.json @@ -1,10 +1,6 @@ { "name": "SupplierAccount", "base": "Loggable", - "log": { - "model":"SupplierLog", - "relation": "supplier" - }, "options": { "mysql": { "table": "supplierAccount" @@ -35,4 +31,4 @@ "foreignKey": "bankEntityFk" } } -} \ No newline at end of file +} diff --git a/modules/supplier/back/models/supplier-address.json b/modules/supplier/back/models/supplier-address.json index 302f15e4b..001b3a31f 100644 --- a/modules/supplier/back/models/supplier-address.json +++ b/modules/supplier/back/models/supplier-address.json @@ -2,11 +2,6 @@ "name": "SupplierAddress", "description": "Supplier addresses", "base": "Loggable", - "log": { - "model": "SupplierLog", - "relation": "supplier", - "showField": "name" - }, "options": { "mysql": { "table": "supplierAddress" @@ -52,4 +47,4 @@ "foreignKey": "supplierFk" } } -} \ No newline at end of file +} diff --git a/modules/supplier/back/models/supplier-contact.json b/modules/supplier/back/models/supplier-contact.json index 9e13c33a8..f928cd204 100644 --- a/modules/supplier/back/models/supplier-contact.json +++ b/modules/supplier/back/models/supplier-contact.json @@ -1,10 +1,6 @@ { "name": "SupplierContact", "base": "Loggable", - "log": { - "model":"SupplierLog", - "relation": "supplier" - }, "options": { "mysql": { "table": "supplierContact" @@ -50,4 +46,4 @@ "permission": "ALLOW" } ] -} \ No newline at end of file +} diff --git a/modules/supplier/back/models/supplier-log.json b/modules/supplier/back/models/supplier-log.json index 7c07fa9d4..86fa2e54a 100644 --- a/modules/supplier/back/models/supplier-log.json +++ b/modules/supplier/back/models/supplier-log.json @@ -1,6 +1,6 @@ { "name": "SupplierLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "supplierLog" @@ -48,11 +48,11 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } }, "scope": { "order": ["creationDate DESC", "id DESC"] } -} \ No newline at end of file +} diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js index 4e509aafc..ae3eb4bcc 100644 --- a/modules/supplier/back/models/supplier.js +++ b/modules/supplier/back/models/supplier.js @@ -67,8 +67,9 @@ module.exports = Self => { }; const country = await Self.app.models.Country.findOne(filter); const code = country ? country.code.toLowerCase() : null; + const countryCode = this.nif.toLowerCase().substring(0, 2); - if (!this.nif || !validateTin(this.nif, code)) + if (!this.nif || !validateTin(this.nif, code) || (this.isVies && countryCode == code)) err(); done(); } @@ -103,7 +104,7 @@ module.exports = Self => { const orgData = ctx.currentInstance; const userId = loopbackContext.active.accessToken.userId; - const isNotFinancial = !await Self.app.models.Account.hasRole(userId, 'financial'); + const isNotFinancial = !await Self.app.models.VnUser.hasRole(userId, 'financial'); const isPayMethodChecked = changes.isPayMethodChecked || orgData.isPayMethodChecked; const hasChanges = orgData && changes; const isPayMethodCheckedChanged = hasChanges diff --git a/modules/supplier/back/models/supplier.json b/modules/supplier/back/models/supplier.json index ee2c4fbbd..b6245ef32 100644 --- a/modules/supplier/back/models/supplier.json +++ b/modules/supplier/back/models/supplier.json @@ -1,9 +1,6 @@ { "name": "Supplier", "base": "Loggable", - "log": { - "model":"SupplierLog" - }, "options": { "mysql": { "table": "supplier" diff --git a/modules/supplier/front/consumption/index.html b/modules/supplier/front/consumption/index.html index 9e3bdac17..e6c86abe3 100644 --- a/modules/supplier/front/consumption/index.html +++ b/modules/supplier/front/consumption/index.html @@ -47,9 +47,11 @@ - - {{::buy.itemName}} - + + {{::buy.itemName}} +
@@ -89,3 +91,7 @@ message="The consumption report will be sent" on-accept="$ctrl.sendEmail()"> + + diff --git a/modules/supplier/front/fiscal-data/index.html b/modules/supplier/front/fiscal-data/index.html index ccbd5b0d9..218fe284d 100644 --- a/modules/supplier/front/fiscal-data/index.html +++ b/modules/supplier/front/fiscal-data/index.html @@ -42,6 +42,7 @@ vn-two vn-focus label="Social name" + vn-name="socialName" ng-model="$ctrl.supplier.name" info="Only letters, numbers and spaces can be used" required="true" @@ -50,6 +51,7 @@ @@ -59,35 +61,42 @@ - - - @@ -95,12 +104,14 @@ - - - - - @@ -188,7 +210,9 @@ + info="When activating it, do not enter the country code in the ID field." + ng-model="$ctrl.supplier.isVies" + > diff --git a/modules/supplier/front/fiscal-data/locale/es.yml b/modules/supplier/front/fiscal-data/locale/es.yml index 5232dd95d..ee641231f 100644 --- a/modules/supplier/front/fiscal-data/locale/es.yml +++ b/modules/supplier/front/fiscal-data/locale/es.yml @@ -3,4 +3,6 @@ Sage transaction type: Tipo de transacción Sage Sage withholding: Retención Sage Supplier activity: Actividad proveedor Healt register: Pasaporte sanitario -Trucker: Transportista \ No newline at end of file +Trucker: Transportista +When activating it, do not enter the country code in the ID field.: Al activarlo, no informar el código del país en el campo nif +The first two values are letters.: Los dos primeros valores son letras \ No newline at end of file diff --git a/modules/supplier/front/locale/es.yml b/modules/supplier/front/locale/es.yml index abb6a9775..a2b6dd04d 100644 --- a/modules/supplier/front/locale/es.yml +++ b/modules/supplier/front/locale/es.yml @@ -1 +1,2 @@ -Accounts: Cuentas \ No newline at end of file +Accounts: Cuentas +Invalid NIF for VIES: NIF no valido por VIES \ No newline at end of file diff --git a/modules/ticket/back/locale/expedition/en.yml b/modules/ticket/back/locale/expedition/en.yml new file mode 100644 index 000000000..5ec5d5ecd --- /dev/null +++ b/modules/ticket/back/locale/expedition/en.yml @@ -0,0 +1,14 @@ +name: expedition +columns: + id: id + freightItemFk: freight item + created: created + counter: counter + ticketFk: ticket + agencyModeFk: agency + workerFk: worker + packagingFk: packaging + hasNewRoute: new route + hostFk: PC + isBox: box + itemPackingTypeFk: packing type diff --git a/modules/ticket/back/locale/expedition/es.yml b/modules/ticket/back/locale/expedition/es.yml new file mode 100644 index 000000000..cda577f18 --- /dev/null +++ b/modules/ticket/back/locale/expedition/es.yml @@ -0,0 +1,14 @@ +name: expedición +columns: + id: id + freightItemFk: artículo de carga + created: creado + counter: contador + ticketFk: ticket + agencyModeFk: agencia + workerFk: trabajador + packagingFk: embalaje + hasNewRoute: nueva ruta + hostFk: PC + isBox: caja + itemPackingTypeFk: tipo empaquetado diff --git a/modules/ticket/back/locale/sale/en.yml b/modules/ticket/back/locale/sale/en.yml index ae8f67d5e..09fa6735c 100644 --- a/modules/ticket/back/locale/sale/en.yml +++ b/modules/ticket/back/locale/sale/en.yml @@ -1,11 +1,18 @@ -concept: concept -quantity: quantity -price: price -discount: discount -reserved: reserved -isPicked: is picked -created: created -originalQuantity: original quantity -itemFk: item -ticketFk: ticket -saleFk: sale +name: sale +columns: + id: id + concept: concept + quantity: quantity + price: price + discount: discount + reserved: reserved + isPicked: is picked + created: created + originalQuantity: original quantity + itemFk: item + ticketFk: ticket + saleFk: sale + priceFixed: price fixed + isPriceFixed: has fixed price + isAdded: added + total: total diff --git a/modules/ticket/back/locale/sale/es.yml b/modules/ticket/back/locale/sale/es.yml index ff8cc5466..e6a984a5d 100644 --- a/modules/ticket/back/locale/sale/es.yml +++ b/modules/ticket/back/locale/sale/es.yml @@ -1,11 +1,18 @@ -concept: concepto -quantity: cantidad -price: precio -discount: descuento -reserved: reservado -isPicked: esta seleccionado -created: creado -originalQuantity: cantidad original -itemFk: artículo -ticketFk: ticket -saleFk: línea +name: línea +columns: + id: id + concept: concepto + quantity: cantidad + price: precio + discount: descuento + reserved: reservado + isPicked: cogida + created: creado + originalQuantity: cantidad original + itemFk: artículo + ticketFk: ticket + saleFk: línea + priceFixed: precio fijado + isPriceFixed: tiene precio fijado + isAdded: añadida + total: total diff --git a/modules/ticket/back/locale/ticket-dms/en.yml b/modules/ticket/back/locale/ticket-dms/en.yml new file mode 100644 index 000000000..ff4c9f14b --- /dev/null +++ b/modules/ticket/back/locale/ticket-dms/en.yml @@ -0,0 +1,4 @@ +name: document +columns: + dmsFk: dms + ticketFk: ticket diff --git a/modules/ticket/back/locale/ticket-dms/es.yml b/modules/ticket/back/locale/ticket-dms/es.yml new file mode 100644 index 000000000..09c380732 --- /dev/null +++ b/modules/ticket/back/locale/ticket-dms/es.yml @@ -0,0 +1,4 @@ +name: documento +columns: + dmsFk: dms + ticketFk: ticket diff --git a/modules/ticket/back/locale/ticket-observation/en.yml b/modules/ticket/back/locale/ticket-observation/en.yml new file mode 100644 index 000000000..5a43b5887 --- /dev/null +++ b/modules/ticket/back/locale/ticket-observation/en.yml @@ -0,0 +1,6 @@ +name: observation +columns: + id: id + description: description + ticketFk: ticket + observationTypeFk: observation type diff --git a/modules/ticket/back/locale/ticket-observation/es.yml b/modules/ticket/back/locale/ticket-observation/es.yml new file mode 100644 index 000000000..7e72cd0c7 --- /dev/null +++ b/modules/ticket/back/locale/ticket-observation/es.yml @@ -0,0 +1,6 @@ +name: observación +columns: + id: id + description: descripción + ticketFk: ticket + observationTypeFk: tipo observación diff --git a/modules/ticket/back/locale/ticket-packaging/en.yml b/modules/ticket/back/locale/ticket-packaging/en.yml new file mode 100644 index 000000000..51cc01e07 --- /dev/null +++ b/modules/ticket/back/locale/ticket-packaging/en.yml @@ -0,0 +1,8 @@ +name: packaging +columns: + id: id + quantity: quantity + created: created + pvp: pvp + ticketFk: ticket + packagingFk: packaging diff --git a/modules/ticket/back/locale/ticket-packaging/es.yml b/modules/ticket/back/locale/ticket-packaging/es.yml new file mode 100644 index 000000000..b2c3e22ce --- /dev/null +++ b/modules/ticket/back/locale/ticket-packaging/es.yml @@ -0,0 +1,8 @@ +name: embalaje +columns: + id: id + quantity: cantidad + created: creado + pvp: pvp + ticketFk: ticket + packagingFk: embalaje diff --git a/modules/ticket/back/locale/ticket-refund/en.yml b/modules/ticket/back/locale/ticket-refund/en.yml new file mode 100644 index 000000000..7da82a1a3 --- /dev/null +++ b/modules/ticket/back/locale/ticket-refund/en.yml @@ -0,0 +1,5 @@ +name: refund +columns: + id: id + refundTicketFk: refund ticket + originalTicketFk: original ticket diff --git a/modules/ticket/back/locale/ticket-refund/es.yml b/modules/ticket/back/locale/ticket-refund/es.yml new file mode 100644 index 000000000..d83a60c55 --- /dev/null +++ b/modules/ticket/back/locale/ticket-refund/es.yml @@ -0,0 +1,5 @@ +name: abono +columns: + id: id + refundTicketFk: ticket abono + originalTicketFk: ticket original diff --git a/modules/ticket/back/locale/ticket-request/en.yml b/modules/ticket/back/locale/ticket-request/en.yml new file mode 100644 index 000000000..f381e0c9d --- /dev/null +++ b/modules/ticket/back/locale/ticket-request/en.yml @@ -0,0 +1,15 @@ +name: request +columns: + id: id + description: description + created: created + quantity: quantity + price: price + isOk: ok + response: response + saleFk: sale + ticketFk: ticket + attenderFk: attender + requesterFk: requester + itemFk: item + diff --git a/modules/ticket/back/locale/ticket-request/es.yml b/modules/ticket/back/locale/ticket-request/es.yml new file mode 100644 index 000000000..5504448bf --- /dev/null +++ b/modules/ticket/back/locale/ticket-request/es.yml @@ -0,0 +1,15 @@ +name: peticion +columns: + id: id + description: descripción + created: creado + quantity: cantidad + price: precio + isOk: ok + response: respuesta + saleFk: línea + ticketFk: ticket + attenderFk: asistente + requesterFk: solicitante + itemFk: artículo + diff --git a/modules/ticket/back/locale/ticket-service/en.yml b/modules/ticket/back/locale/ticket-service/en.yml new file mode 100644 index 000000000..a7c329415 --- /dev/null +++ b/modules/ticket/back/locale/ticket-service/en.yml @@ -0,0 +1,10 @@ +name: service +columns: + id: id + ticketFk: ticket + description: description + quantity: quantity + price: price + taxClassFk: tax class + ticketServiceTypeFk: ticket service type + diff --git a/modules/ticket/back/locale/ticket-service/es.yml b/modules/ticket/back/locale/ticket-service/es.yml new file mode 100644 index 000000000..4b11be6d1 --- /dev/null +++ b/modules/ticket/back/locale/ticket-service/es.yml @@ -0,0 +1,10 @@ +name: servicio +columns: + id: id + ticketFk: ticket + description: descripción + quantity: cantidad + price: precio + taxClassFk: tipo impuestos + ticketServiceTypeFk: tipo servicio ticket + diff --git a/modules/ticket/back/locale/ticket-tracking/en.yml b/modules/ticket/back/locale/ticket-tracking/en.yml new file mode 100644 index 000000000..213b9bff5 --- /dev/null +++ b/modules/ticket/back/locale/ticket-tracking/en.yml @@ -0,0 +1,8 @@ +name: state +columns: + id: id + created: created + ticketFk: ticket + stateFk: state + workerFk: worker + failFk: fail diff --git a/modules/ticket/back/locale/ticket-tracking/es.yml b/modules/ticket/back/locale/ticket-tracking/es.yml new file mode 100644 index 000000000..d8d7a121f --- /dev/null +++ b/modules/ticket/back/locale/ticket-tracking/es.yml @@ -0,0 +1,8 @@ +name: estado +columns: + id: id + created: creado + ticketFk: ticket + stateFk: estado + workerFk: trabajador + failFk: fallo diff --git a/modules/ticket/back/locale/ticket-weekly/en.yml b/modules/ticket/back/locale/ticket-weekly/en.yml new file mode 100644 index 000000000..af1c94dc9 --- /dev/null +++ b/modules/ticket/back/locale/ticket-weekly/en.yml @@ -0,0 +1,5 @@ +name: ticket weekly +columns: + ticketFk: ticket + weekDay: week day + agencyModeFk: agency diff --git a/modules/ticket/back/locale/ticket-weekly/es.yml b/modules/ticket/back/locale/ticket-weekly/es.yml new file mode 100644 index 000000000..597d9d46a --- /dev/null +++ b/modules/ticket/back/locale/ticket-weekly/es.yml @@ -0,0 +1,5 @@ +name: ticket semanal +columns: + ticketFk: ticket + weekDay: día semana + agencyModeFk: agencia diff --git a/modules/ticket/back/locale/ticket/en.yml b/modules/ticket/back/locale/ticket/en.yml index c4ad84232..96f7569ef 100644 --- a/modules/ticket/back/locale/ticket/en.yml +++ b/modules/ticket/back/locale/ticket/en.yml @@ -1,23 +1,37 @@ -shipped: shipped -landed: landed -nickname: nickname -location: location -solution: solution -packages: packages -updated: updated -isDeleted: is deleted -priority: priority -zoneFk: zone -zonePrice: zone price -zoneBonus: zone bonus -totalWithVat: total with vat -totalWithoutVat: total without vat -clientFk: client -warehouseFk: warehouse -refFk: reference -addressFk: address -routeFk: route -companyFk: company -agencyModeFk: agency -ticketFk: ticket -mergedTicket: merged ticket +name: ticket +columns: + id: id + shipped: shipped + landed: landed + nickname: nickname + location: location + solution: solution + packages: packages + updated: updated + isDeleted: is deleted + priority: priority + zoneFk: zone + zonePrice: zone price + zoneBonus: zone bonus + totalWithVat: total with vat + totalWithoutVat: total without vat + clientFk: client + warehouseFk: warehouse + refFk: reference + addressFk: address + routeFk: route + companyFk: company + agencyModeFk: agency + ticketFk: ticket + mergedTicket: merged ticket + withWarningAccept: negative warning + isWithoutNegatives: without negatives + isSigned: signed + isLabeled: labeled + isPrinted: printed + hour: hour + created: created + isBlocked: bloqued + hasPriority: priority + isBoxed: boxed + clonedFrom: cloned from diff --git a/modules/ticket/back/locale/ticket/es.yml b/modules/ticket/back/locale/ticket/es.yml index 15b5a39bf..1cb8f478e 100644 --- a/modules/ticket/back/locale/ticket/es.yml +++ b/modules/ticket/back/locale/ticket/es.yml @@ -1,25 +1,37 @@ -shipped: fecha salida -landed: fecha entrega -nickname: alias -location: ubicación -solution: solución -packages: embalajes -updated: fecha última actualización -isDeleted: esta eliminado -priority: prioridad -zoneFk: zona -zonePrice: precio zona -zoneBonus: bonus zona -totalWithVat: total con IVA -totalWithoutVat: total sin IVA -clientFk: cliente -warehouseFk: almacén -refFk: referencia -addressFk: dirección -routeFk: ruta -companyFk: empresa -agencyModeFk: agencia -ticketFk: ticket -mergedTicket: ticket fusionado -withWarningAccept: aviso negativos -isWithoutNegatives: sin negativos +name: ticket +columns: + id: id + shipped: salida + landed: entrega + nickname: alias + location: ubicación + solution: solución + packages: embalajes + updated: última actualización + isDeleted: eliminado + priority: prioridad + zoneFk: zona + zonePrice: precio zona + zoneBonus: bonus zona + totalWithVat: total con IVA + totalWithoutVat: total sin IVA + clientFk: cliente + warehouseFk: almacén + refFk: referencia + addressFk: dirección + routeFk: ruta + companyFk: empresa + agencyModeFk: agencia + ticketFk: ticket + mergedTicket: ticket fusionado + withWarningAccept: aviso negativos + isWithoutNegatives: sin negativos + isSigned: firmado + isLabeled: etiquetado + isPrinted: impreso + hour: hora + created: creado + isBlocked: bloqueado + hasPriority: prioritario + isBoxed: encajado + clonedFrom: Clonado de diff --git a/modules/ticket/back/methods/boxing/getVideoList.js b/modules/ticket/back/methods/boxing/getVideoList.js index 3d45a720d..ba989936e 100644 --- a/modules/ticket/back/methods/boxing/getVideoList.js +++ b/modules/ticket/back/methods/boxing/getVideoList.js @@ -53,7 +53,7 @@ module.exports = Self => { let start = new Date(expedition.created); let end = new Date(start.getTime() + (packingSiteConfig.avgBoxingTime * 1000)); - if (from && to) { + if (from != undefined && to != undefined) { start.setHours(from, 0, 0); end.setHours(to, 0, 0); } diff --git a/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js index 14bdf7aea..61937989e 100644 --- a/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js +++ b/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('ticket deleteExpeditions()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should delete the selected expeditions', async() => { const tx = await models.Expedition.beginTransaction({}); diff --git a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js index ac397d38e..5f211543e 100644 --- a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js +++ b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('ticket moveExpeditions()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should move the selected expeditions to new ticket', async() => { const tx = await models.Expedition.beginTransaction({}); const ctx = { diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js index 7b63fd66e..af58a6286 100644 --- a/modules/ticket/back/methods/sale/refund.js +++ b/modules/ticket/back/methods/sale/refund.js @@ -11,11 +11,6 @@ module.exports = Self => { { arg: 'servicesIds', type: ['number'] - }, - { - arg: 'createSingleTicket', - type: 'boolean', - required: false } ], returns: { @@ -28,7 +23,7 @@ module.exports = Self => { } }); - Self.refund = async(salesIds, servicesIds, createSingleTicket = false, options) => { + Self.refund = async(salesIds, servicesIds, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -67,40 +62,14 @@ module.exports = Self => { const sales = await models.Sale.find(salesFilter, myOptions); const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))]; - const refundTickets = []; - const mappedTickets = new Map(); const now = Date.vnNew(); - const [firstTicketId] = ticketsIds; - if (createSingleTicket) { - await createTicketRefund( - firstTicketId, - refundTickets, - mappedTickets, - now, - refundAgencyMode, - refoundZoneId, - myOptions - ); - } else { - for (let ticketId of ticketsIds) { - await createTicketRefund( - ticketId, - refundTickets, - mappedTickets, - now, - refundAgencyMode, - refoundZoneId, - myOptions - ); - } - } + + const refundTicket = await createTicketRefund(firstTicketId, now, refundAgencyMode, refoundZoneId, myOptions); for (const sale of sales) { - const refundTicketId = await getTicketRefundId(createSingleTicket, sale.ticketFk, refundTickets, mappedTickets); - const createdSale = await models.Sale.create({ - ticketFk: refundTicketId, + ticketFk: refundTicket.id, itemFk: sale.itemFk, quantity: - sale.quantity, concept: sale.concept, @@ -120,16 +89,13 @@ module.exports = Self => { where: {id: {inq: servicesIds}} }; const services = await models.TicketService.find(servicesFilter, myOptions); - for (const service of services) { - const refundTicketId = await getTicketRefundId(createSingleTicket, service.ticketFk, refundTickets, mappedTickets); - await models.TicketService.create({ description: service.description, quantity: - service.quantity, price: service.price, taxClassFk: service.taxClassFk, - ticketFk: refundTicketId, + ticketFk: refundTicket.id, ticketServiceTypeFk: service.ticketServiceTypeFk, }, myOptions); } @@ -137,22 +103,14 @@ module.exports = Self => { if (tx) await tx.commit(); - return refundTickets; + return refundTicket; } catch (e) { if (tx) await tx.rollback(); throw e; } }; - async function createTicketRefund( - ticketId, - refundTickets, - mappedTickets, - now, - refundAgencyMode, - refoundZoneId, - myOptions - ) { + async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, myOptions) { const models = Self.app.models; const filter = {include: {relation: 'address'}}; @@ -170,20 +128,11 @@ module.exports = Self => { zoneFk: refoundZoneId }, myOptions); - refundTickets.push(refundTicket); - - mappedTickets.set(ticketId, refundTicket.id); - await models.TicketRefund.create({ refundTicketFk: refundTicket.id, originalTicketFk: ticket.id, }, myOptions); - } - async function getTicketRefundId(createSingleTicket, ticketId, refundTickets, mappedTickets) { - if (createSingleTicket) { - const [firstRefundTicket] = refundTickets; - return firstRefundTicket.id; - } else return mappedTickets.get(ticketId); + return refundTicket; } }; diff --git a/modules/ticket/back/methods/sale/specs/refund.spec.js b/modules/ticket/back/methods/sale/specs/refund.spec.js index 403b4b477..83b3755e2 100644 --- a/modules/ticket/back/methods/sale/specs/refund.spec.js +++ b/modules/ticket/back/methods/sale/specs/refund.spec.js @@ -22,9 +22,9 @@ describe('Sale refund()', () => { try { const options = {transaction: tx}; - const response = await models.Sale.refund(salesIds, servicesIds, false, options); + const refundedTicket = await models.Sale.refund(salesIds, servicesIds, options); - expect(response.length).toBeGreaterThanOrEqual(1); + expect(refundedTicket).toBeDefined(); await tx.rollback(); } catch (e) { @@ -33,23 +33,18 @@ describe('Sale refund()', () => { } }); - it('should create a ticket for each unique ticketFk in the sales', async() => { + it('should create one ticket for each unique ticketFk in the sales', async() => { const tx = await models.Sale.beginTransaction({}); const salesIds = [6, 7]; try { const options = {transaction: tx}; - const createSingleTicket = false; - const tickets = await models.Sale.refund(salesIds, servicesIds, createSingleTicket, options); + const ticket = await models.Sale.refund(salesIds, servicesIds, options); - const ticketsIds = tickets.map(ticket => ticket.id); - - const refundedTickets = await models.Ticket.find({ + const refundedTicket = await models.Ticket.findOne({ where: { - id: { - inq: ticketsIds - } + id: ticket.id }, include: [ { @@ -66,16 +61,12 @@ describe('Sale refund()', () => { ] }, options); - const firstRefoundedTicket = refundedTickets[0]; - const secondRefoundedTicket = refundedTickets[1]; - const salesLength = firstRefoundedTicket.ticketSales().length; - const componentsLength = firstRefoundedTicket.ticketSales()[0].components().length; - const servicesLength = secondRefoundedTicket.ticketServices().length; + const salesLength = refundedTicket.ticketSales().length; + const componentsLength = refundedTicket.ticketSales()[0].components().length; - expect(refundedTickets.length).toEqual(2); - expect(salesLength).toEqual(1); + expect(refundedTicket).toBeDefined(); + expect(salesLength).toEqual(2); expect(componentsLength).toEqual(4); - expect(servicesLength).toBeGreaterThanOrEqual(1); await tx.rollback(); } catch (e) { diff --git a/modules/ticket/back/methods/state/editableStates.js b/modules/ticket/back/methods/state/editableStates.js index 115876f26..061097a65 100644 --- a/modules/ticket/back/methods/state/editableStates.js +++ b/modules/ticket/back/methods/state/editableStates.js @@ -25,9 +25,9 @@ module.exports = Self => { Object.assign(myOptions, options); let statesList = await models.State.find(filter, myOptions); - const isProduction = await models.Account.hasRole(userId, 'production', myOptions); - const isSalesPerson = await models.Account.hasRole(userId, 'salesPerson', myOptions); - const isAdministrative = await models.Account.hasRole(userId, 'administrative', myOptions); + const isProduction = await models.VnUser.hasRole(userId, 'production', myOptions); + const isSalesPerson = await models.VnUser.hasRole(userId, 'salesPerson', myOptions); + const isAdministrative = await models.VnUser.hasRole(userId, 'administrative', myOptions); if (isProduction || isAdministrative) return statesList; diff --git a/modules/ticket/back/methods/state/isEditable.js b/modules/ticket/back/methods/state/isEditable.js index a0d11c2b7..730e6b9eb 100644 --- a/modules/ticket/back/methods/state/isEditable.js +++ b/modules/ticket/back/methods/state/isEditable.js @@ -27,9 +27,9 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const isProduction = await models.Account.hasRole(userId, 'production', myOptions); - const isSalesPerson = await models.Account.hasRole(userId, 'salesPerson', myOptions); - const isAdministrative = await models.Account.hasRole(userId, 'administrative', myOptions); + const isProduction = await models.VnUser.hasRole(userId, 'production', myOptions); + const isSalesPerson = await models.VnUser.hasRole(userId, 'salesPerson', myOptions); + const isAdministrative = await models.VnUser.hasRole(userId, 'administrative', myOptions); const state = await models.State.findById(stateId, null, myOptions); const salesPersonAllowed = (isSalesPerson && (state.code == 'PICKER_DESIGNED' || state.code == 'PRINTED')); diff --git a/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js b/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js index 49413cf44..de2817d87 100644 --- a/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js +++ b/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js @@ -1,6 +1,20 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('ticket-request confirm()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); let ctx = { req: { accessToken: {userId: 9}, diff --git a/modules/ticket/back/methods/ticket-request/specs/deny.spec.js b/modules/ticket/back/methods/ticket-request/specs/deny.spec.js index 95fd0e84d..875a75921 100644 --- a/modules/ticket/back/methods/ticket-request/specs/deny.spec.js +++ b/modules/ticket/back/methods/ticket-request/specs/deny.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('ticket-request deny()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should return the denied ticket request', async() => { const tx = await models.TicketRequest.beginTransaction({}); diff --git a/modules/ticket/back/methods/ticket/closeAll.js b/modules/ticket/back/methods/ticket/closeAll.js index 3726d85b7..6690126b9 100644 --- a/modules/ticket/back/methods/ticket/closeAll.js +++ b/modules/ticket/back/methods/ticket/closeAll.js @@ -52,7 +52,7 @@ module.exports = Self => { JOIN province p ON p.id = c.provinceFk JOIN country co ON co.id = p.countryFk LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk - WHERE al.code = 'PACKED' OR (am.code = 'refund' AND al.code != 'delivered') + WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code != 'delivered')) AND DATE(t.shipped) BETWEEN DATE_ADD(?, INTERVAL -2 DAY) AND util.dayEnd(?) AND t.refFk IS NULL diff --git a/modules/ticket/back/methods/ticket/componentUpdate.js b/modules/ticket/back/methods/ticket/componentUpdate.js index bd01592fa..b03301204 100644 --- a/modules/ticket/back/methods/ticket/componentUpdate.js +++ b/modules/ticket/back/methods/ticket/componentUpdate.js @@ -121,7 +121,7 @@ module.exports = Self => { if (!isEditable) throw new UserError(`The sales of this ticket can't be modified`); - const isDeliveryBoss = await models.Account.hasRole(userId, 'deliveryBoss', myOptions); + const isDeliveryBoss = await models.VnUser.hasRole(userId, 'deliveryBoss', myOptions); if (!isDeliveryBoss) { const zoneShipped = await models.Agency.getShipped( ctx, diff --git a/modules/ticket/back/methods/ticket/isRoleAdvanced.js b/modules/ticket/back/methods/ticket/isRoleAdvanced.js index 7c5c8ed86..d6186a0c9 100644 --- a/modules/ticket/back/methods/ticket/isRoleAdvanced.js +++ b/modules/ticket/back/methods/ticket/isRoleAdvanced.js @@ -20,10 +20,10 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const isSalesAssistant = await models.Account.hasRole(userId, 'salesAssistant', myOptions); - const isDeliveryBoss = await models.Account.hasRole(userId, 'deliveryBoss', myOptions); - const isBuyer = await models.Account.hasRole(userId, 'buyer', myOptions); - const isClaimManager = await models.Account.hasRole(userId, 'claimManager', myOptions); + const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', myOptions); + const isDeliveryBoss = await models.VnUser.hasRole(userId, 'deliveryBoss', myOptions); + const isBuyer = await models.VnUser.hasRole(userId, 'buyer', myOptions); + const isClaimManager = await models.VnUser.hasRole(userId, 'claimManager', myOptions); const isRoleAdvanced = isSalesAssistant || isDeliveryBoss || isBuyer || isClaimManager; diff --git a/modules/ticket/back/methods/ticket/makeInvoice.js b/modules/ticket/back/methods/ticket/makeInvoice.js index 9739f5985..d8ec5eb9a 100644 --- a/modules/ticket/back/methods/ticket/makeInvoice.js +++ b/modules/ticket/back/methods/ticket/makeInvoice.js @@ -24,7 +24,6 @@ module.exports = function(Self) { }); Self.makeInvoice = async(ctx, ticketsIds, options) => { - const userId = ctx.req.accessToken.userId; const models = Self.app.models; const date = Date.vnNew(); date.setHours(0, 0, 0, 0); @@ -42,6 +41,7 @@ module.exports = function(Self) { let serial; let invoiceId; + let invoiceOut; try { const tickets = await models.Ticket.find({ where: { @@ -75,8 +75,8 @@ module.exports = function(Self) { serial = result.serial; await Self.rawSql(` - DROP TEMPORARY TABLE IF EXISTS ticketToInvoice; - CREATE TEMPORARY TABLE ticketToInvoice + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; + CREATE TEMPORARY TABLE tmp.ticketToInvoice (PRIMARY KEY (id)) ENGINE = MEMORY SELECT id FROM vn.ticket @@ -89,24 +89,14 @@ module.exports = function(Self) { invoiceId = resultInvoice.id; - for (let ticket of tickets) { - const ticketInvoice = await models.Ticket.findById(ticket.id, { - fields: ['refFk'] - }, myOptions); - - await models.TicketLog.create({ - originFk: ticket.id, - userFk: userId, - action: 'insert', - changedModel: 'Ticket', - changedModelId: ticket.id, - newInstance: ticketInvoice - }, myOptions); - } - if (serial != 'R' && invoiceId) await Self.rawSql('CALL invoiceOutBooking(?)', [invoiceId], myOptions); + invoiceOut = await models.InvoiceOut.findById(invoiceId, { + include: { + relation: 'client' + } + }, myOptions); if (tx) await tx.commit(); } catch (e) { if (tx) await tx.rollback(); @@ -116,6 +106,15 @@ module.exports = function(Self) { if (serial != 'R' && invoiceId) await models.InvoiceOut.createPdf(ctx, invoiceId); + if (invoiceId) { + ctx.args = { + reference: invoiceOut.ref, + recipientId: invoiceOut.clientFk, + recipient: invoiceOut.client().email + }; + await models.InvoiceOut.invoiceEmail(ctx, invoiceOut.ref); + } + return {invoiceFk: invoiceId, serial: serial}; }; }; diff --git a/modules/ticket/back/methods/ticket/priceDifference.js b/modules/ticket/back/methods/ticket/priceDifference.js index 76a71a54b..16812dcb0 100644 --- a/modules/ticket/back/methods/ticket/priceDifference.js +++ b/modules/ticket/back/methods/ticket/priceDifference.js @@ -78,7 +78,7 @@ module.exports = Self => { if (!isEditable) throw new UserError(`The sales of this ticket can't be modified`); - const isDeliveryBoss = await models.Account.hasRole(userId, 'deliveryBoss', myOptions); + const isDeliveryBoss = await models.VnUser.hasRole(userId, 'deliveryBoss', myOptions); if (!isDeliveryBoss) { const zoneShipped = await models.Agency.getShipped( ctx, diff --git a/modules/ticket/back/methods/ticket/refund.js b/modules/ticket/back/methods/ticket/refund.js index 1f0021316..91f48cfd6 100644 --- a/modules/ticket/back/methods/ticket/refund.js +++ b/modules/ticket/back/methods/ticket/refund.js @@ -7,11 +7,6 @@ module.exports = Self => { arg: 'ticketsIds', type: ['number'], required: true - }, - { - arg: 'createSingleTicket', - type: 'boolean', - required: false } ], returns: { @@ -24,7 +19,7 @@ module.exports = Self => { } }); - Self.refund = async(ticketsIds, createSingleTicket = false, options) => { + Self.refund = async(ticketsIds, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -46,7 +41,7 @@ module.exports = Self => { const services = await models.TicketService.find(filter, myOptions); const servicesIds = services.map(service => service.id); - const refundedTickets = await models.Sale.refund(salesIds, servicesIds, createSingleTicket, myOptions); + const refundedTickets = await models.Sale.refund(salesIds, servicesIds, myOptions); if (tx) await tx.commit(); diff --git a/modules/ticket/back/methods/ticket/setDeleted.js b/modules/ticket/back/methods/ticket/setDeleted.js index 6ebc37d6e..2889160d1 100644 --- a/modules/ticket/back/methods/ticket/setDeleted.js +++ b/modules/ticket/back/methods/ticket/setDeleted.js @@ -51,7 +51,7 @@ module.exports = Self => { throw new UserError($t('Tickets with associated refunds', {id: ticketRefunds[0].id})); // Check if has sales with shelving - const isSalesAssistant = await models.Account.hasRole(userId, 'salesAssistant', myOptions); + const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', myOptions); const sales = await models.Sale.find({ include: {relation: 'itemShelvingSale'}, where: {ticketFk: id} diff --git a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js index d65c87654..ef6422be2 100644 --- a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js +++ b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js @@ -17,6 +17,17 @@ describe('ticket componentUpdate()', () => { let componentValue; beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); const deliveryComponenet = await models.Component.findOne({where: {code: 'delivery'}}); deliveryComponentId = deliveryComponenet.id; componentOfSaleSeven = `SELECT value @@ -180,9 +191,6 @@ describe('ticket componentUpdate()', () => { } }; - spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ - active: ctx.req - }); const oldTicket = await models.Ticket.findById(ticketID, null, options); await models.Ticket.componentUpdate(ctx, options); diff --git a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js index 24d4a48ba..270ba5c93 100644 --- a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js +++ b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js @@ -6,6 +6,9 @@ describe('ticket makeInvoice()', () => { const ticketId = 11; const clientId = 1102; const activeCtx = { + getLocale: () => { + return 'en'; + }, accessToken: {userId: userId}, headers: {origin: 'http://localhost:5000'}, }; @@ -67,6 +70,7 @@ describe('ticket makeInvoice()', () => { it('should invoice a ticket, then try again to fail', async() => { const invoiceOutModel = models.InvoiceOut; spyOn(invoiceOutModel, 'createPdf'); + spyOn(invoiceOutModel, 'invoiceEmail'); const tx = await models.Ticket.beginTransaction({}); @@ -90,6 +94,7 @@ describe('ticket makeInvoice()', () => { it('should success to invoice a ticket', async() => { const invoiceOutModel = models.InvoiceOut; spyOn(invoiceOutModel, 'createPdf'); + spyOn(invoiceOutModel, 'invoiceEmail'); const tx = await models.Ticket.beginTransaction({}); diff --git a/modules/ticket/back/methods/ticket/updateDiscount.js b/modules/ticket/back/methods/ticket/updateDiscount.js index 4dd346161..8300db886 100644 --- a/modules/ticket/back/methods/ticket/updateDiscount.js +++ b/modules/ticket/back/methods/ticket/updateDiscount.js @@ -85,7 +85,7 @@ module.exports = Self => { const userId = ctx.req.accessToken.userId; const isLocked = await models.Ticket.isLocked(id, myOptions); - const roles = await models.Account.getRoles(userId, myOptions); + const roles = await models.VnUser.getRoles(userId, myOptions); const hasAllowedRoles = roles.filter(role => role == 'salesPerson' || role == 'claimManager' ); diff --git a/modules/ticket/back/models/expedition.json b/modules/ticket/back/models/expedition.json index d74c56d2c..e32a3b23d 100644 --- a/modules/ticket/back/models/expedition.json +++ b/modules/ticket/back/models/expedition.json @@ -1,10 +1,6 @@ { "name": "Expedition", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket" - }, "options": { "mysql": { "table": "expedition" @@ -59,4 +55,3 @@ } } } - \ No newline at end of file diff --git a/modules/ticket/back/models/sale.json b/modules/ticket/back/models/sale.json index 7b8cf501b..72ca1f5e0 100644 --- a/modules/ticket/back/models/sale.json +++ b/modules/ticket/back/models/sale.json @@ -1,12 +1,6 @@ { "name": "Sale", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket", - "showField": "concept", - "grabUser": true - }, "options": { "mysql": { "table": "sale" diff --git a/modules/ticket/back/models/specs/ticket-packaging.spec.js b/modules/ticket/back/models/specs/ticket-packaging.spec.js index f2834643d..6d59456a3 100644 --- a/modules/ticket/back/models/specs/ticket-packaging.spec.js +++ b/modules/ticket/back/models/specs/ticket-packaging.spec.js @@ -1,6 +1,20 @@ const app = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); describe('ticket model TicketTracking', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); let ticketTrackingId; afterAll(async() => { diff --git a/modules/ticket/back/models/ticket-config.json b/modules/ticket/back/models/ticket-config.json index a1c96e7f6..d757fbd1a 100644 --- a/modules/ticket/back/models/ticket-config.json +++ b/modules/ticket/back/models/ticket-config.json @@ -14,6 +14,15 @@ }, "scopeDays": { "type": "number" + }, + "pickingDelay": { + "type": "number" + }, + "packagingInvoicingDated": { + "type": "date" + }, + "daysForWarningClaim": { + "type": "number" } } } diff --git a/modules/ticket/back/models/ticket-dms.json b/modules/ticket/back/models/ticket-dms.json index 8bcff254c..071999be7 100644 --- a/modules/ticket/back/models/ticket-dms.json +++ b/modules/ticket/back/models/ticket-dms.json @@ -1,10 +1,6 @@ { "name": "TicketDms", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket" - }, "options": { "mysql": { "table": "ticketDms" @@ -29,4 +25,4 @@ "foreignKey": "dmsFk" } } -} \ No newline at end of file +} diff --git a/modules/ticket/back/models/ticket-log.json b/modules/ticket/back/models/ticket-log.json index 169bdeaa0..df04348da 100644 --- a/modules/ticket/back/models/ticket-log.json +++ b/modules/ticket/back/models/ticket-log.json @@ -1,6 +1,6 @@ { "name": "TicketLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "ticketLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/ticket/back/models/ticket-observation.json b/modules/ticket/back/models/ticket-observation.json index 9035e4440..64e49b217 100644 --- a/modules/ticket/back/models/ticket-observation.json +++ b/modules/ticket/back/models/ticket-observation.json @@ -1,10 +1,6 @@ { "name": "TicketObservation", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket" - }, "options": { "mysql": { "table": "ticketObservation" diff --git a/modules/ticket/back/models/ticket-packaging.json b/modules/ticket/back/models/ticket-packaging.json index 533f4064c..6c94c810e 100644 --- a/modules/ticket/back/models/ticket-packaging.json +++ b/modules/ticket/back/models/ticket-packaging.json @@ -1,10 +1,6 @@ { "name": "TicketPackaging", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket" - }, "options": { "mysql": { "table": "ticketPackaging" diff --git a/modules/ticket/back/models/ticket-refund.json b/modules/ticket/back/models/ticket-refund.json index 8fd0e2306..d344a3f1c 100644 --- a/modules/ticket/back/models/ticket-refund.json +++ b/modules/ticket/back/models/ticket-refund.json @@ -6,10 +6,6 @@ "table": "ticketRefund" } }, - "log": { - "model": "TicketLog", - "relation": "originalTicket" - }, "properties": { "id": { "id": true, diff --git a/modules/ticket/back/models/ticket-request.json b/modules/ticket/back/models/ticket-request.json index 01601c7f6..f8407792e 100644 --- a/modules/ticket/back/models/ticket-request.json +++ b/modules/ticket/back/models/ticket-request.json @@ -1,10 +1,6 @@ { "name": "TicketRequest", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket" - }, "options": { "mysql": { "table": "ticketRequest" @@ -64,4 +60,4 @@ "foreignKey": "itemFk" } } -} \ No newline at end of file +} diff --git a/modules/ticket/back/models/ticket-service.json b/modules/ticket/back/models/ticket-service.json index 347b6b976..f1dbede13 100644 --- a/modules/ticket/back/models/ticket-service.json +++ b/modules/ticket/back/models/ticket-service.json @@ -1,11 +1,6 @@ { "name": "TicketService", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket", - "showField": "description" - }, "options": { "mysql": { "table": "ticketService" @@ -59,4 +54,4 @@ "foreignKey": "ticketServiceTypeFk" } } -} \ No newline at end of file +} diff --git a/modules/ticket/back/models/ticket-tracking.json b/modules/ticket/back/models/ticket-tracking.json index e80e2f8f4..8b5ce0b64 100644 --- a/modules/ticket/back/models/ticket-tracking.json +++ b/modules/ticket/back/models/ticket-tracking.json @@ -1,16 +1,11 @@ { "name": "TicketTracking", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket", - "showField": "stateFk" - }, - "options": { - "mysql": { - "table": "ticketTracking" - } - }, + "options": { + "mysql": { + "table": "ticketTracking" + } + }, "properties": { "id": { "id": true, @@ -48,4 +43,3 @@ } } } - \ No newline at end of file diff --git a/modules/ticket/back/models/ticket-weekly.json b/modules/ticket/back/models/ticket-weekly.json index d81baf4ad..c5e485aa2 100644 --- a/modules/ticket/back/models/ticket-weekly.json +++ b/modules/ticket/back/models/ticket-weekly.json @@ -1,11 +1,6 @@ { "name": "TicketWeekly", "base": "Loggable", - "log": { - "model": "TicketLog", - "relation": "ticket", - "showField": "ticketFk" - }, "options": { "mysql": { "table": "ticketWeekly" @@ -32,4 +27,4 @@ "foreignKey": "agencyModeFk" } } -} \ No newline at end of file +} diff --git a/modules/ticket/back/models/ticket.json b/modules/ticket/back/models/ticket.json index dabda838a..b2e87362f 100644 --- a/modules/ticket/back/models/ticket.json +++ b/modules/ticket/back/models/ticket.json @@ -1,11 +1,6 @@ { "name": "Ticket", "base": "Loggable", - "log": { - "model":"TicketLog", - "showField": "id", - "grabUser": true - }, "options": { "mysql": { "table": "ticket" diff --git a/modules/ticket/front/create/card.html b/modules/ticket/front/create/card.html index e48aea681..015d92fa0 100644 --- a/modules/ticket/front/create/card.html +++ b/modules/ticket/front/create/card.html @@ -4,7 +4,8 @@ data="warehouses" order="name"> - - {{id}}: {{name}} + +
{{::name}}
+
#{{::id}}
+
- {{nickname}}: {{street}}, {{city}} + +
{{::nickname}}
+
{{::street}}, {{::city}}
+
+ label="Landed" + ng-model="$ctrl.landed" + vn-name="landed"> - \ No newline at end of file + ng-model="$ctrl.agencyModeId" + vn-name="agencyMode"> + diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index ff029db78..987d6a3f1 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -142,9 +142,10 @@ class Controller extends Section { sendPdfDeliveryNote($data) { let query = `tickets/${this.id}/delivery-note-email`; - if (this.hasDocuwareFile) query = `docuwares/${this.id}/delivery-note-email`; + if (this.hasDocuwareFile) query = `docuwares/delivery-note-email`; return this.vnEmail.send(query, { + id: this.id, recipientId: this.ticket.client.id, recipient: $data.email }); @@ -300,7 +301,7 @@ class Controller extends Section { const params = {ticketsIds: [this.id]}; const query = 'Tickets/refund'; return this.$http.post(query, params).then(res => { - const [refundTicket] = res.data; + const refundTicket = res.data; this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { ticketId: refundTicket.id })); @@ -326,8 +327,13 @@ class Controller extends Section { return this.$http.post(`Docuwares/${this.id}/upload`, {fileCabinet: 'deliveryNote'}) .then(() => { - this.vnApp.showSuccess(this.$t('PDF sent!')); + this.$.balanceCreate.amountPaid = this.ticket.totalWithVat; + this.$.balanceCreate.clientFk = this.ticket.clientFk; + this.$.balanceCreate.description = 'Albaran: '; + this.$.balanceCreate.description += this.ticket.id; + this.$.balanceCreate.show(); + this.vnApp.showSuccess(this.$t('PDF sent!')); }); } } diff --git a/modules/ticket/front/descriptor-menu/index.spec.js b/modules/ticket/front/descriptor-menu/index.spec.js index babc22038..5d27acff1 100644 --- a/modules/ticket/front/descriptor-menu/index.spec.js +++ b/modules/ticket/front/descriptor-menu/index.spec.js @@ -141,6 +141,7 @@ describe('Ticket Component vnTicketDescriptorMenu', () => { const $data = {email: 'brucebanner@gothamcity.com'}; const params = { + id: 16, recipient: $data.email, recipientId: ticket.client.id }; @@ -250,7 +251,7 @@ describe('Ticket Component vnTicketDescriptorMenu', () => { const params = { ticketsIds: [16] }; - $httpBackend.expectPOST('Tickets/refund', params).respond([{id: 99}]); + $httpBackend.expectPOST('Tickets/refund', params).respond({id: 99}); controller.refund(); $httpBackend.flush(); diff --git a/modules/ticket/front/future/index.js b/modules/ticket/front/future/index.js index 8cb7f16aa..1732c562c 100644 --- a/modules/ticket/front/future/index.js +++ b/modules/ticket/front/future/index.js @@ -149,19 +149,9 @@ export default class Controller extends Section { case 'lines': return {'lines': value}; case 'ipt': - return {or: - [ - {'ipt': {like: `%${value}%`}}, - {'ipt': null} - ] - }; + return {'ipt': {like: `%${value}%`}}; case 'futureIpt': - return {or: - [ - {'futureIpt': {like: `%${value}%`}}, - {'futureIpt': null} - ] - }; + return {'futureIpt': {like: `%${value}%`}}; } } } diff --git a/modules/ticket/front/package/index.html b/modules/ticket/front/package/index.html index c5d83edfb..c588fb8ed 100644 --- a/modules/ticket/front/package/index.html +++ b/modules/ticket/front/package/index.html @@ -1,4 +1,4 @@ - - {{itemFk}} : {{name}} + +
{{::name}}
+
+ #{{itemFk}} +
- +
- - + + --> - \ No newline at end of file + diff --git a/modules/ticket/front/sale/index.html b/modules/ticket/front/sale/index.html index 6fc986e8f..6c37230ae 100644 --- a/modules/ticket/front/sale/index.html +++ b/modules/ticket/front/sale/index.html @@ -481,6 +481,13 @@ on-accept="$ctrl.transferSales($ctrl.transfer.ticketId)"> + + + Add claim + { + this.ticketConfig = res.data; + }); + } get isClaimable() { if (this.ticket) { @@ -184,6 +194,19 @@ class Controller extends Section { } createClaim() { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const timeDifference = today.getTime() - new Date(this.ticket.landed).getTime(); + + const pastDays = Math.floor(timeDifference / 86400000); + + if (pastDays >= this.ticketConfig[0].daysForWarningClaim) + this.$.claimConfirm.show(); + else + this.onCreateClaimAccepted(); + } + + onCreateClaimAccepted() { const sales = this.selectedValidSales(); const params = {ticketId: this.ticket.id, sales: sales}; this.resetChanges(); @@ -496,7 +519,7 @@ class Controller extends Section { const params = {salesIds: salesIds}; const query = 'Sales/refund'; this.$http.post(query, params).then(res => { - const [refundTicket] = res.data; + const refundTicket = res.data; this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { ticketId: refundTicket.id })); diff --git a/modules/ticket/front/sale/index.spec.js b/modules/ticket/front/sale/index.spec.js index 8585503cc..5fb3b3df3 100644 --- a/modules/ticket/front/sale/index.spec.js +++ b/modules/ticket/front/sale/index.spec.js @@ -45,6 +45,7 @@ describe('Ticket', () => { $scope.model = crudModel; $scope.editDiscount = {relocate: () => {}, hide: () => {}}; $scope.editPricePopover = {relocate: () => {}}; + $scope.claimConfirm = {show: () => {}}; $httpBackend = _$httpBackend_; Object.defineProperties($state.params, { id: { @@ -61,6 +62,10 @@ describe('Ticket', () => { controller.card = {reload: () => {}}; controller._ticket = ticket; controller._sales = sales; + controller.ticketConfig = [ + {daysForWarningClaim: 1} + ]; + $httpBackend.expect('GET', 'TicketConfigs').respond(200); })); describe('ticket() setter', () => { @@ -113,7 +118,6 @@ describe('Ticket', () => { it('should make an HTTP GET query and return the worker mana', () => { controller.edit = {}; const expectedAmount = 250; - $httpBackend.expect('GET', 'Tickets/1/getSalesPersonMana').respond(200, expectedAmount); $httpBackend.expect('GET', 'Sales/usesMana').respond(200); $httpBackend.expect('GET', 'WorkerManas/getCurrentWorkerMana').respond(200, expectedAmount); @@ -279,7 +283,17 @@ describe('Ticket', () => { }); describe('createClaim()', () => { - it('should perform a query and call windows open', () => { + it('should call to the claimConfirm show() method', () => { + jest.spyOn(controller.$.claimConfirm, 'show').mockReturnThis(); + + controller.createClaim(); + + expect(controller.$.claimConfirm.show).toHaveBeenCalledWith(); + }); + }); + + describe('onCreateClaimAccepted()', () => { + it('should perform a query and call window open', () => { jest.spyOn(controller, 'resetChanges').mockReturnThis(); jest.spyOn(controller.$state, 'go').mockReturnThis(); @@ -290,7 +304,7 @@ describe('Ticket', () => { const expectedParams = {ticketId: 1, sales: [firstSale]}; $httpBackend.expect('POST', `Claims/createFromSales`, expectedParams).respond(200, {id: 1}); - controller.createClaim(); + controller.onCreateClaimAccepted(); $httpBackend.flush(); expect(controller.resetChanges).toHaveBeenCalledWith(); @@ -712,8 +726,7 @@ describe('Ticket', () => { salesIds: [1, 4], }; const refundTicket = {id: 99}; - const createdTickets = [refundTicket]; - $httpBackend.expect('POST', 'Sales/refund', params).respond(200, createdTickets); + $httpBackend.expect('POST', 'Sales/refund', params).respond(200, refundTicket); controller.createRefund(); $httpBackend.flush(); diff --git a/modules/ticket/front/sale/locale/es.yml b/modules/ticket/front/sale/locale/es.yml index 41ba52d17..bb61db824 100644 --- a/modules/ticket/front/sale/locale/es.yml +++ b/modules/ticket/front/sale/locale/es.yml @@ -40,4 +40,5 @@ Refund: Abono Promotion mana: Maná promoción Claim mana: Maná reclamación History: Historial -Select lines to see the options: Seleccione lineas para ver las opciones +Do you want to continue?: ¿Desea continuar? +Claim out of time: Reclamación fuera de plazo diff --git a/modules/ticket/front/volume/index.html b/modules/ticket/front/volume/index.html index f5dd18033..ff0a86772 100644 --- a/modules/ticket/front/volume/index.html +++ b/modules/ticket/front/volume/index.html @@ -1,4 +1,5 @@ -
- -
@@ -23,7 +24,7 @@ Item - Description + Description Packing type Quantity m³ per quantity diff --git a/modules/ticket/front/volume/index.js b/modules/ticket/front/volume/index.js index a3d531898..7acecf570 100644 --- a/modules/ticket/front/volume/index.js +++ b/modules/ticket/front/volume/index.js @@ -5,9 +5,10 @@ class Controller extends Section { constructor($element, $) { super($element, $); this.filter = { - include: [{ + include: { relation: 'item' - }] + }, + order: 'concept' }; this.ticketVolumes = []; diff --git a/modules/ticket/front/weekly/index.html b/modules/ticket/front/weekly/index.html index ca3b6e662..6b10efcb5 100644 --- a/modules/ticket/front/weekly/index.html +++ b/modules/ticket/front/weekly/index.html @@ -21,7 +21,7 @@ @@ -76,7 +76,7 @@
- @@ -66,14 +66,15 @@ vn-focus url="Items/withName" ng-model="buy.itemFk" - show-field="name" + show-field="id" value-field="id" search-function="$ctrl.itemSearchFunc($search)" on-change="$ctrl.saveBuy(buy)" order="id DESC" tabindex="1"> - {{::id}} - {{::name}} +
{{::name}}
+
#{{::id}}
- {{buy.quantity * buy.buyingValue | currency: 'EUR':2}} @@ -246,4 +247,4 @@ question="You are going to delete buy(s) from this entry" message="Continue anyway?" on-accept="$ctrl.deleteBuys()"> - \ No newline at end of file + diff --git a/modules/entry/front/create/index.html b/modules/entry/front/create/index.html index ed08b5c76..e1e4dc064 100644 --- a/modules/entry/front/create/index.html +++ b/modules/entry/front/create/index.html @@ -21,7 +21,8 @@ order="nickname" required="true"> - {{::id}} - {{::nickname}} +
{{::nickname}}
+
#{{::id}}
@@ -31,11 +32,16 @@ ng-model="$ctrl.entry.travelFk" url="Travels/filter" search-function="$ctrl.searchFunction($search)" + show-field="warehouseInName" order="id" required="true"> - {{::agencyModeName}} - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) → - {{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}}) +
+ {{::agencyModeName}} + - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) + → {{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}}) +
+
#{{::id}}
diff --git a/modules/entry/front/index/locale/es.yml b/modules/entry/front/index/locale/es.yml index 4f12fc7bb..cebe57a42 100644 --- a/modules/entry/front/index/locale/es.yml +++ b/modules/entry/front/index/locale/es.yml @@ -12,7 +12,6 @@ Reference: Referencia Created: Creado Booked: Contabilizada Is inventory: Inventario -Notes: Notas Status: Estado Selection: Selección Invoice number: Núm. factura \ No newline at end of file diff --git a/modules/entry/front/latest-buys/index.html b/modules/entry/front/latest-buys/index.html index 727b19220..a2cf62da2 100644 --- a/modules/entry/front/latest-buys/index.html +++ b/modules/entry/front/latest-buys/index.html @@ -192,19 +192,19 @@ {{::buy.entryFk}}
{{::buy.buyingValue | currency: 'EUR':2}}{{::buy.freightValue | currency: 'EUR':2}}{{::buy.comissionValue | currency: 'EUR':2}}{{::buy.packageValue | currency: 'EUR':2}}{{::buy.buyingValue | currency: 'EUR':3}}{{::buy.freightValue | currency: 'EUR':3}}{{::buy.comissionValue | currency: 'EUR':3}}{{::buy.packageValue | currency: 'EUR':3}} {{::buy.price2 | currency: 'EUR':2}}{{::buy.price3 | currency: 'EUR':2}}{{::buy.minPrice | currency: 'EUR':2}}{{::buy.price2 | currency: 'EUR':3}}{{::buy.price3 | currency: 'EUR':3}}{{::buy.minPrice | currency: 'EUR':3}} {{::buy.ektFk | dashIfEmpty}} {{::buy.weight}} {{::buy.packageFk}} - - \ No newline at end of file + diff --git a/modules/travel/back/locale/travel-thermograph/en.yml b/modules/travel/back/locale/travel-thermograph/en.yml new file mode 100644 index 000000000..d0d42d199 --- /dev/null +++ b/modules/travel/back/locale/travel-thermograph/en.yml @@ -0,0 +1,10 @@ +name: thermograph +columns: + id: id + created: created + temperatureFk: temperature + result: result + warehouseFk: warehouse + travelFk: travel + dmsFk: document + thermographFk: thermograph diff --git a/modules/travel/back/locale/travel-thermograph/es.yml b/modules/travel/back/locale/travel-thermograph/es.yml new file mode 100644 index 000000000..086fba3e6 --- /dev/null +++ b/modules/travel/back/locale/travel-thermograph/es.yml @@ -0,0 +1,10 @@ +name: termógrafo +columns: + id: id + created: creado + temperatureFk: temperatura + result: resultado + warehouseFk: almacén + travelFk: envío + dmsFk: documento + thermographFk: termógrafo diff --git a/modules/travel/back/locale/travel/en.yml b/modules/travel/back/locale/travel/en.yml new file mode 100644 index 000000000..f3bab57d1 --- /dev/null +++ b/modules/travel/back/locale/travel/en.yml @@ -0,0 +1,15 @@ +name: travel +columns: + id: id + shipped: shipped + landed: landed + isDelivered: delivered + isReceived: received + ref: ref + totalEntries: total entries + m3: m3 + kg: kg + cargoSupplierFk: cargo supplier + agencyModeFk: agency + warehouseInFk: warehouse in + warehouseOutFk: warehouse out diff --git a/modules/travel/back/locale/travel/es.yml b/modules/travel/back/locale/travel/es.yml new file mode 100644 index 000000000..ac86c003d --- /dev/null +++ b/modules/travel/back/locale/travel/es.yml @@ -0,0 +1,15 @@ +name: envío +columns: + id: id + shipped: enviado + landed: entregado + isDelivered: está entregado + isReceived: está recibido + ref: referencia + totalEntries: entradas totales + m3: m3 + kg: kg + cargoSupplierFk: proveedor carga + agencyModeFk: agencia + warehouseInFk: almacén entrega + warehouseOutFk: almacén salida diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js index 5ee51de8e..388ba52a1 100644 --- a/modules/travel/back/methods/travel/extraCommunityFilter.js +++ b/modules/travel/back/methods/travel/extraCommunityFilter.js @@ -167,7 +167,6 @@ module.exports = Self => { s.name AS supplierName, SUM(b.stickers) AS stickers, e.evaNotes, - e.notes, e.invoiceAmount, CAST(SUM(b.weight * b.stickers) AS DECIMAL(10,0)) as loadedkg, CAST(SUM(vc.aerealVolumetricDensity * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000) AS DECIMAL(10,0)) as volumeKg diff --git a/modules/travel/back/methods/travel/getEntries.js b/modules/travel/back/methods/travel/getEntries.js index 5ca12f7a1..71bb0d8fb 100644 --- a/modules/travel/back/methods/travel/getEntries.js +++ b/modules/travel/back/methods/travel/getEntries.js @@ -31,7 +31,6 @@ module.exports = Self => { e.isConfirmed, e.invoiceNumber, e.reference, - e.notes, e.evaNotes AS observation, s.name AS supplierName, CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap)) diff --git a/modules/travel/back/methods/travel/specs/createThermograph.spec.js b/modules/travel/back/methods/travel/specs/createThermograph.spec.js index 742e2dc18..e812eae70 100644 --- a/modules/travel/back/methods/travel/specs/createThermograph.spec.js +++ b/modules/travel/back/methods/travel/specs/createThermograph.spec.js @@ -1,6 +1,20 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('Travel createThermograph()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); const travelId = 3; const currentUserId = 1102; const thermographId = '138350-0'; diff --git a/modules/travel/back/models/travel-log.json b/modules/travel/back/models/travel-log.json index d07f83e50..e781c2948 100644 --- a/modules/travel/back/models/travel-log.json +++ b/modules/travel/back/models/travel-log.json @@ -1,6 +1,6 @@ { "name": "TravelLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "travelLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/travel/back/models/travel-thermograph.json b/modules/travel/back/models/travel-thermograph.json index 754df1c3e..08eec2847 100644 --- a/modules/travel/back/models/travel-thermograph.json +++ b/modules/travel/back/models/travel-thermograph.json @@ -1,14 +1,9 @@ { "name": "TravelThermograph", "base": "Loggable", - "log": { - "model":"TravelLog", - "relation": "travel", - "showField": "ref" - }, "options": { "mysql": { - "table": "travelThermograph" + "table": "travelThermograph" } }, "properties": { diff --git a/modules/travel/back/models/travel.json b/modules/travel/back/models/travel.json index 7dd9f5bba..95d458121 100644 --- a/modules/travel/back/models/travel.json +++ b/modules/travel/back/models/travel.json @@ -1,11 +1,6 @@ { "name": "Travel", "base": "Loggable", - "log": { - "model":"TravelLog", - "showField": "ref", - "grabUser": true - }, "options": { "mysql": { "table": "travel" diff --git a/modules/travel/front/basic-data/index.html b/modules/travel/front/basic-data/index.html index e7143ffc0..783208d9a 100644 --- a/modules/travel/front/basic-data/index.html +++ b/modules/travel/front/basic-data/index.html @@ -17,7 +17,8 @@ + ng-model="$ctrl.travel.ref" + vn-name="reference"> + label="Agency" + vn-name="agencyMode"> + ng-model="$ctrl.travel.shipped" + vn-name="shipped"> + ng-model="$ctrl.travel.landed" + vn-name="landed"> + ng-model="$ctrl.travel.ref" + vn-name="reference"> @@ -22,22 +24,26 @@ + ng-model="$ctrl.travel.shipped" + vn-name="shipped"> + ng-model="$ctrl.travel.landed" + vn-name="landed"> diff --git a/modules/travel/front/search-panel/style.scss b/modules/travel/front/search-panel/style.scss index 94fe7b239..0da52408a 100644 --- a/modules/travel/front/search-panel/style.scss +++ b/modules/travel/front/search-panel/style.scss @@ -2,7 +2,7 @@ vn-travel-search-panel vn-side-menu { .menu { - min-width: $right-menu-width; + min-width: $menu-width; } & > div { .input { diff --git a/modules/travel/front/summary/index.html b/modules/travel/front/summary/index.html index 113128e0e..5d38ed08f 100644 --- a/modules/travel/front/summary/index.html +++ b/modules/travel/front/summary/index.html @@ -100,12 +100,6 @@ {{entry.pallet}} {{entry.m3}} - - { const conn = Self.dataSource.connector; const userId = ctx.req.accessToken.userId; - const account = await Self.app.models.Account.findById(userId); + const account = await Self.app.models.VnUser.findById(userId); const stmt = new ParameterizedSQL( `SELECT d.id dmsFk, d.reference, d.description, d.file, d.created, d.hardCopyNumber, d.hasFile FROM workerDocument wd diff --git a/modules/worker/back/methods/worker-time-control/addTimeEntry.js b/modules/worker/back/methods/worker-time-control/addTimeEntry.js index c8c08d9b1..01a5a16ee 100644 --- a/modules/worker/back/methods/worker-time-control/addTimeEntry.js +++ b/modules/worker/back/methods/worker-time-control/addTimeEntry.js @@ -40,7 +40,7 @@ module.exports = Self => { Object.assign(myOptions, options); const isSubordinate = await models.Worker.isSubordinate(ctx, workerId, myOptions); - const isTeamBoss = await models.Account.hasRole(currentUserId, 'teamBoss', myOptions); + const isTeamBoss = await models.VnUser.hasRole(currentUserId, 'teamBoss', myOptions); const isHimself = currentUserId == workerId; if (isSubordinate === false || (isSubordinate && isHimself && !isTeamBoss)) diff --git a/modules/worker/back/methods/worker-time-control/deleteTimeEntry.js b/modules/worker/back/methods/worker-time-control/deleteTimeEntry.js index e33d6b790..1dcd12f5b 100644 --- a/modules/worker/back/methods/worker-time-control/deleteTimeEntry.js +++ b/modules/worker/back/methods/worker-time-control/deleteTimeEntry.js @@ -32,7 +32,7 @@ module.exports = Self => { const targetTimeEntry = await Self.findById(id, null, myOptions); const isSubordinate = await models.Worker.isSubordinate(ctx, targetTimeEntry.userFk, myOptions); - const isTeamBoss = await models.Account.hasRole(currentUserId, 'teamBoss', myOptions); + const isTeamBoss = await models.VnUser.hasRole(currentUserId, 'teamBoss', myOptions); const isHimself = currentUserId == targetTimeEntry.userFk; if (isSubordinate === false || (isSubordinate && isHimself && !isTeamBoss)) diff --git a/modules/worker/back/methods/worker-time-control/updateTimeEntry.js b/modules/worker/back/methods/worker-time-control/updateTimeEntry.js index 83349ea63..344421311 100644 --- a/modules/worker/back/methods/worker-time-control/updateTimeEntry.js +++ b/modules/worker/back/methods/worker-time-control/updateTimeEntry.js @@ -38,7 +38,7 @@ module.exports = Self => { const targetTimeEntry = await Self.findById(id, null, myOptions); const isSubordinate = await models.Worker.isSubordinate(ctx, targetTimeEntry.userFk, myOptions); - const isTeamBoss = await models.Account.hasRole(currentUserId, 'teamBoss', myOptions); + const isTeamBoss = await models.VnUser.hasRole(currentUserId, 'teamBoss', myOptions); const isHimself = currentUserId == targetTimeEntry.userFk; const notAllowed = isSubordinate === false || (isSubordinate && isHimself && !isTeamBoss); diff --git a/modules/worker/back/methods/worker/createAbsence.js b/modules/worker/back/methods/worker/createAbsence.js index 43a9f4d23..f53164a50 100644 --- a/modules/worker/back/methods/worker/createAbsence.js +++ b/modules/worker/back/methods/worker/createAbsence.js @@ -53,7 +53,7 @@ module.exports = Self => { try { const isSubordinate = await models.Worker.isSubordinate(ctx, id, myOptions); - const isTeamBoss = await models.Account.hasRole(userId, 'teamBoss', myOptions); + const isTeamBoss = await models.VnUser.hasRole(userId, 'teamBoss', myOptions); if (!isSubordinate || (isSubordinate && userId == id && !isTeamBoss)) throw new UserError(`You don't have enough privileges`); @@ -107,8 +107,8 @@ module.exports = Self => { const department = labour.department(); if (department && department.notificationEmail) { const absenceType = await models.AbsenceType.findById(args.absenceTypeId, null, myOptions); - const account = await models.Account.findById(userId, null, myOptions); - const subordinated = await models.Account.findById(id, null, myOptions); + const account = await models.VnUser.findById(userId, null, myOptions); + const subordinated = await models.VnUser.findById(id, null, myOptions); const origin = ctx.req.headers.origin; const body = $t('Created absence', { author: account.nickname, diff --git a/modules/worker/back/methods/worker/deleteAbsence.js b/modules/worker/back/methods/worker/deleteAbsence.js index 45dc04b2d..2d0078ba7 100644 --- a/modules/worker/back/methods/worker/deleteAbsence.js +++ b/modules/worker/back/methods/worker/deleteAbsence.js @@ -40,7 +40,7 @@ module.exports = Self => { try { const isSubordinate = await models.Worker.isSubordinate(ctx, id, myOptions); - const isTeamBoss = await models.Account.hasRole(userId, 'teamBoss', myOptions); + const isTeamBoss = await models.VnUser.hasRole(userId, 'teamBoss', myOptions); if (!isSubordinate || (isSubordinate && userId == id && !isTeamBoss)) throw new UserError(`You don't have enough privileges`); @@ -58,8 +58,8 @@ module.exports = Self => { const department = labour && labour.department(); if (department && department.notificationEmail) { const absenceType = await models.AbsenceType.findById(absence.dayOffTypeFk, null, myOptions); - const account = await models.Account.findById(userId, null, myOptions); - const subordinated = await models.Account.findById(labour.workerFk, null, myOptions); + const account = await models.VnUser.findById(userId, null, myOptions); + const subordinated = await models.VnUser.findById(labour.workerFk, null, myOptions); const origin = ctx.req.headers.origin; const body = $t('Deleted absence', { author: account.nickname, diff --git a/modules/worker/back/methods/worker/isSubordinate.js b/modules/worker/back/methods/worker/isSubordinate.js index f051cf768..6c17ad0d0 100644 --- a/modules/worker/back/methods/worker/isSubordinate.js +++ b/modules/worker/back/methods/worker/isSubordinate.js @@ -37,7 +37,7 @@ module.exports = Self => { return subordinate.workerFk == id; }); - const isHr = await models.Account.hasRole(myUserId, 'hr', myOptions); + const isHr = await models.VnUser.hasRole(myUserId, 'hr', myOptions); if (isHr || isSubordinate) return true; diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index a7bb883cd..6e2b6f17c 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -1,4 +1,4 @@ -/* eslint max-len: ["error", { "code": 130 }]*/ +/* eslint max-len: ["error", { "code": 150 }]*/ const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { @@ -139,12 +139,12 @@ module.exports = Self => { if (!client) { const nickname = args.firstName.concat(' ', args.lastNames); - const workerConfig = await models.WorkerConfig.findOne({fields: ['roleFk']}); + const workerConfig = await models.WorkerConfig.findOne({fields: ['roleFk', 'businessTypeFk']}); const [randomPassword] = await models.Worker.rawSql( 'SELECT account.passwordGenerate() as password;' ); - const user = await models.Account.create( + const user = await models.VnUser.create( { name: args.name, nickname, @@ -155,7 +155,7 @@ module.exports = Self => { myOptions ); - await models.UserAccount.create( + await models.Account.create( { id: user.id, }, @@ -169,7 +169,7 @@ module.exports = Self => { args.lastNames, args.fi, args.street, - args.postalCode, + args.postcode, args.city, args.provinceFk, args.companyFk, @@ -186,7 +186,7 @@ module.exports = Self => { street: args.street, city: args.city, provinceFk: args.provinceFk, - postalCode: args.postalCode, + postalCode: args.postcode, mobile: args.phone, nickname: nickname, isDefaultAddress: true, @@ -196,7 +196,7 @@ module.exports = Self => { client = await models.Client.findById( user.id, - {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk']}, + {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk', 'businessTypeFk', 'fi']}, myOptions ); @@ -205,12 +205,13 @@ module.exports = Self => { iban: args.iban, bankEntityFk: args.bankEntityFk, defaultAddressFk: address.id, + businessTypeFk: workerConfig.businessTypeFk, }, myOptions ); } - const user = await models.Account.findById(client.id, null, myOptions); + const user = await models.VnUser.findById(client.id, null, myOptions); await user.updateAttribute('email', args.email, myOptions); await models.Worker.rawSql( @@ -233,7 +234,7 @@ module.exports = Self => { const code = error.code; const message = error.sqlMessage; - if (code === 'ER_DUP_ENTRY' && message.includes(`for key 'mail'`)) + if (error.message && error.message.includes(`Email already exists`)) throw new UserError(`This personal mail already exists`); if (code === 'ER_DUP_ENTRY' && message.includes(`CodigoTrabajador_UNIQUE`)) @@ -245,7 +246,7 @@ module.exports = Self => { throw error; } - await models.user.resetPassword({ + await models.VnUser.resetPassword({ email: args.email, emailTemplate: 'worker-welcome', id: client.id diff --git a/modules/worker/back/methods/worker/specs/activeWithInheritedRole.spec.js b/modules/worker/back/methods/worker/specs/activeWithInheritedRole.spec.js index 411cb8e57..da54f6adb 100644 --- a/modules/worker/back/methods/worker/specs/activeWithInheritedRole.spec.js +++ b/modules/worker/back/methods/worker/specs/activeWithInheritedRole.spec.js @@ -13,7 +13,7 @@ describe('Worker activeWithInheritedRole', () => { const randomIndex = Math.floor(Math.random() * result.length); const worker = result[randomIndex]; - const isSalesPerson = await app.models.Account.hasRole(worker.id, 'salesPerson'); + const isSalesPerson = await app.models.VnUser.hasRole(worker.id, 'salesPerson'); expect(result.length).toBeGreaterThan(1); expect(result.length).toBeLessThan(allRolesCount); @@ -27,7 +27,7 @@ describe('Worker activeWithInheritedRole', () => { const randomIndex = Math.floor(Math.random() * result.length); const worker = result[randomIndex]; - const isBuyer = await app.models.Account.hasRole(worker.id, 'buyer'); + const isBuyer = await app.models.VnUser.hasRole(worker.id, 'buyer'); expect(result.length).toBeGreaterThan(1); expect(result.length).toBeLessThan(allRolesCount); diff --git a/modules/worker/back/methods/worker/specs/new.spec.js b/modules/worker/back/methods/worker/specs/new.spec.js index f695ab80e..dbcc66683 100644 --- a/modules/worker/back/methods/worker/specs/new.spec.js +++ b/modules/worker/back/methods/worker/specs/new.spec.js @@ -38,7 +38,7 @@ describe('Worker new', () => { }; it('should return error if personal mail already exists', async() => { - const user = await models.Account.findById(employeeId, {fields: ['email']}); + const user = await models.VnUser.findById(employeeId, {fields: ['email']}); const tx = await models.Worker.beginTransaction({}); @@ -112,7 +112,7 @@ describe('Worker new', () => { await models.Address.destroyAll({clientFk: newWorker.id}); await models.Mandate.destroyAll({clientFk: newWorker.id}); await models.Client.destroyById(newWorker.id); - await models.Account.destroyById(newWorker.id); + await models.VnUser.destroyById(newWorker.id); expect(newWorker.id).toBeDefined(); }); diff --git a/modules/worker/back/methods/worker/updateAbsence.js b/modules/worker/back/methods/worker/updateAbsence.js index 7ed8992d3..d904c2c14 100644 --- a/modules/worker/back/methods/worker/updateAbsence.js +++ b/modules/worker/back/methods/worker/updateAbsence.js @@ -30,7 +30,7 @@ module.exports = Self => { const models = Self.app.models; const userId = ctx.req.accessToken.userId; const isSubordinate = await models.Worker.isSubordinate(ctx, id); - const isTeamBoss = await models.Account.hasRole(userId, 'teamBoss'); + const isTeamBoss = await models.VnUser.hasRole(userId, 'teamBoss'); if (!isSubordinate || (isSubordinate && userId == id && !isTeamBoss)) throw new UserError(`You don't have enough privileges`); diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index 145934700..fd34c013b 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -23,6 +23,9 @@ "DeviceProduction": { "dataSource": "vn" }, + "DeviceProductionLog": { + "dataSource": "vn" + }, "DeviceProductionModels": { "dataSource": "vn" }, diff --git a/modules/worker/back/models/device-production-log.json b/modules/worker/back/models/device-production-log.json new file mode 100644 index 000000000..71c54a9c1 --- /dev/null +++ b/modules/worker/back/models/device-production-log.json @@ -0,0 +1,55 @@ +{ + "name": "DeviceProductionLog", + "base": "Log", + "options": { + "mysql": { + "table": "deviceProductionLog" + } + }, + "properties": { + "id": { + "id": true, + "type": "number", + "forceId": false + }, + "originFk": { + "type": "number", + "required": true + }, + "userFk": { + "type": "number" + }, + "deviceProduction": { + "type": "number" + }, + "action": { + "type": "string", + "required": true + }, + "created": { + "type": "date" + }, + "oldInstance": { + "type": "object" + }, + "newInstance": { + "type": "object" + }, + "changedModel": { + "type": "string" + }, + "changedModelId": { + "type": "number" + } + }, + "relations": { + "user": { + "type": "belongsTo", + "model": "Account", + "foreignKey": "userFk" + } + }, + "scope": { + "order": ["created DESC", "id DESC"] + } +} diff --git a/modules/worker/back/models/device-production-user.json b/modules/worker/back/models/device-production-user.json index 568e79413..3eeaae137 100644 --- a/modules/worker/back/models/device-production-user.json +++ b/modules/worker/back/models/device-production-user.json @@ -1,6 +1,10 @@ { "name": "DeviceProductionUser", - "base": "VnModel", + "base": "Loggable", + "log": { + "model": "DeviceProductionLog", + "relation": "deviceProduction" + }, "options": { "mysql": { "table": "deviceProductionUser" diff --git a/modules/worker/back/models/device-production.json b/modules/worker/back/models/device-production.json index 63672500b..35787cccc 100644 --- a/modules/worker/back/models/device-production.json +++ b/modules/worker/back/models/device-production.json @@ -1,6 +1,9 @@ { "name": "DeviceProduction", - "base": "VnModel", + "base": "Loggable", + "log": { + "model": "DeviceProductionLog" + }, "options": { "mysql": { "table": "deviceProduction" diff --git a/modules/worker/back/models/device.json b/modules/worker/back/models/device.json index 566f7da7d..f7cff1aee 100644 --- a/modules/worker/back/models/device.json +++ b/modules/worker/back/models/device.json @@ -21,7 +21,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" } } diff --git a/modules/worker/back/models/worker-config.json b/modules/worker/back/models/worker-config.json index 05cdfef42..bcee74067 100644 --- a/modules/worker/back/models/worker-config.json +++ b/modules/worker/back/models/worker-config.json @@ -14,6 +14,9 @@ }, "roleFk": { "type": "number" + }, + "businessTypeFk": { + "type": "string" } }, "acls": [ diff --git a/modules/worker/back/models/worker-dms.json b/modules/worker/back/models/worker-dms.json index 575cfbc24..e9a9f1773 100644 --- a/modules/worker/back/models/worker-dms.json +++ b/modules/worker/back/models/worker-dms.json @@ -1,11 +1,6 @@ { "name": "WorkerDms", "base": "Loggable", - "log": { - "model":"ClientLog", - "relation": "worker", - "showField": "dmsFk" - }, "options": { "mysql": { "table": "workerDocument" diff --git a/modules/worker/back/models/worker-log.json b/modules/worker/back/models/worker-log.json index d2fa0487d..6eb8b75be 100644 --- a/modules/worker/back/models/worker-log.json +++ b/modules/worker/back/models/worker-log.json @@ -1,6 +1,6 @@ { "name": "WorkerLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "workerLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/worker/back/models/worker-team.json b/modules/worker/back/models/worker-team.json index 0b490ba6e..dbb15c5ac 100644 --- a/modules/worker/back/models/worker-team.json +++ b/modules/worker/back/models/worker-team.json @@ -19,7 +19,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" }, "worker": { diff --git a/modules/worker/back/models/worker-time-control.json b/modules/worker/back/models/worker-time-control.json index bc3e53501..b045946e7 100644 --- a/modules/worker/back/models/worker-time-control.json +++ b/modules/worker/back/models/worker-time-control.json @@ -30,7 +30,7 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" }, "worker": { diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json index d21094f26..88200a4a9 100644 --- a/modules/worker/back/models/worker.json +++ b/modules/worker/back/models/worker.json @@ -2,10 +2,6 @@ "name": "Worker", "description": "Company employees", "base": "Loggable", - "log": { - "model":"WorkerLog", - "showField": "firstName" - }, "options": { "mysql": { "table": "worker" @@ -63,12 +59,12 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" }, "boss": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "bossFk" }, "client": { diff --git a/modules/worker/front/account/index.html b/modules/worker/front/account/index.html index f51876a07..6f6be660c 100644 --- a/modules/worker/front/account/index.html +++ b/modules/worker/front/account/index.html @@ -1,11 +1,11 @@ diff --git a/modules/worker/front/pda/index.html b/modules/worker/front/pda/index.html index 2f1626ba8..c6d31dc85 100644 --- a/modules/worker/front/pda/index.html +++ b/modules/worker/front/pda/index.html @@ -31,11 +31,12 @@ value-field="id" show-field="serialNumber"> - ID: {{id}} - - {{'Model' | translate}}: {{modelFk}} - - {{'Serial Number' | translate}}: {{serialNumber}} +
+ ID: {{id}} +
+
+ {{modelFk}}, {{serialNumber}} +
diff --git a/modules/worker/front/pda/style.scss b/modules/worker/front/pda/style.scss index 4d9d70953..c55c9d218 100644 --- a/modules/worker/front/pda/style.scss +++ b/modules/worker/front/pda/style.scss @@ -1,6 +1,6 @@ -span.separator{ - border-left: 1px solid black; - height: 100%; - margin: 0 10px; +@import "./variables"; + +.text-grey { + color: $color-font-light; } diff --git a/modules/worker/front/routes.json b/modules/worker/front/routes.json index 64cb186d6..25a0ffbcf 100644 --- a/modules/worker/front/routes.json +++ b/modules/worker/front/routes.json @@ -85,7 +85,8 @@ "description": "Notes", "params": { "worker": "$ctrl.worker" - } + }, + "acl": ["hr"] }, { "url": "/create", "state": "worker.card.note.create", diff --git a/modules/zone/back/locale/zone-event/en.yml b/modules/zone/back/locale/zone-event/en.yml new file mode 100644 index 000000000..2d6ef39ab --- /dev/null +++ b/modules/zone/back/locale/zone-event/en.yml @@ -0,0 +1,14 @@ +name: zone event +columns: + id: id + zoneFk: zone + type: type + dated: dated + started: started + ended: ended + weekDays: week days + hour: hour + travelingDays: traveling days + price: price + bonus: bonus + m3Max: max m3 diff --git a/modules/zone/back/locale/zone-event/es.yml b/modules/zone/back/locale/zone-event/es.yml new file mode 100644 index 000000000..9bc8db9fe --- /dev/null +++ b/modules/zone/back/locale/zone-event/es.yml @@ -0,0 +1,14 @@ +name: evento zona +columns: + id: id + zoneFk: zona + type: tipo + dated: fecha + started: comenzado + ended: terminado + weekDays: días semana + hour: hora + travelingDays: días de viaje + price: precio + bonus: bono + m3Max: máx. m3 diff --git a/modules/zone/back/locale/zone-exclusion/en.yml b/modules/zone/back/locale/zone-exclusion/en.yml new file mode 100644 index 000000000..4389d8b93 --- /dev/null +++ b/modules/zone/back/locale/zone-exclusion/en.yml @@ -0,0 +1,5 @@ +name: zone exclusion +columns: + id: id + dated: dated + zoneFk: zone diff --git a/modules/zone/back/locale/zone-exclusion/es.yml b/modules/zone/back/locale/zone-exclusion/es.yml new file mode 100644 index 000000000..4e59cba46 --- /dev/null +++ b/modules/zone/back/locale/zone-exclusion/es.yml @@ -0,0 +1,5 @@ +name: zone exclusion +columns: + id: id + dated: fecha + zoneFk: zona diff --git a/modules/zone/back/locale/zone-included/en.yml b/modules/zone/back/locale/zone-included/en.yml new file mode 100644 index 000000000..0e44989e9 --- /dev/null +++ b/modules/zone/back/locale/zone-included/en.yml @@ -0,0 +1,5 @@ +name: zone included +columns: + id: id + dated: dated + zoneFk: zone diff --git a/modules/zone/back/locale/zone-included/es.yml b/modules/zone/back/locale/zone-included/es.yml new file mode 100644 index 000000000..30a89373a --- /dev/null +++ b/modules/zone/back/locale/zone-included/es.yml @@ -0,0 +1,5 @@ +name: zona incluida +columns: + id: id + dated: fecha + zoneFk: zona diff --git a/modules/zone/back/locale/zone-warehouse/en.yml b/modules/zone/back/locale/zone-warehouse/en.yml new file mode 100644 index 000000000..b9c4f7609 --- /dev/null +++ b/modules/zone/back/locale/zone-warehouse/en.yml @@ -0,0 +1,5 @@ +name: zone warehouse +columns: + id: id + warehouseFk: warehouse + zoneFk: zone diff --git a/modules/zone/back/locale/zone-warehouse/es.yml b/modules/zone/back/locale/zone-warehouse/es.yml new file mode 100644 index 000000000..ec8dec2dd --- /dev/null +++ b/modules/zone/back/locale/zone-warehouse/es.yml @@ -0,0 +1,5 @@ +name: almacén zona +columns: + id: id + warehouseFk: almacén + zoneFk: zona diff --git a/modules/zone/back/locale/zone/en.yml b/modules/zone/back/locale/zone/en.yml new file mode 100644 index 000000000..649631faa --- /dev/null +++ b/modules/zone/back/locale/zone/en.yml @@ -0,0 +1,14 @@ +name: zone +columns: + id: id + name: name + hour: hour + travelingDays: traveling days + price: price + bonus: bonus + isVolumetric: volumetric + inflation: inflation + m3Max: max m3 + itemMaxSize: item max size + agencyModeFk: agency + zoneFk: zone diff --git a/modules/zone/back/locale/zone/es.yml b/modules/zone/back/locale/zone/es.yml new file mode 100644 index 000000000..3534c2e12 --- /dev/null +++ b/modules/zone/back/locale/zone/es.yml @@ -0,0 +1,14 @@ +name: zona +columns: + id: id + name: nombre + hour: hora + travelingDays: días viaje + price: precio + bonus: bono + isVolumetric: volumétrico + inflation: inflación + m3Max: máx. m3 + itemMaxSize: tamaño máximo artículo + agencyModeFk: agencia + zoneFk: zona diff --git a/modules/zone/back/methods/agency-mode/specs/byWarehouse.spec.js b/modules/zone/back/methods/agency-mode/specs/byWarehouse.spec.js index 707c3354d..577ab0cfe 100644 --- a/modules/zone/back/methods/agency-mode/specs/byWarehouse.spec.js +++ b/modules/zone/back/methods/agency-mode/specs/byWarehouse.spec.js @@ -1,16 +1,16 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('AgencyMode byWarehhouse()', () => { const warehouseId = 1; it('should return all the agencies', async() => { const where = {}; - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - const agencies = await app.models.AgencyMode.byWarehouse({where}, options); + const agencies = await models.AgencyMode.byWarehouse({where}, options); expect(agencies.length).toBeGreaterThan(10); @@ -24,12 +24,12 @@ describe('AgencyMode byWarehhouse()', () => { it('should return only the agencies for a warehouse', async() => { const where = {warehouseFk: warehouseId}; - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - const agencies = await app.models.AgencyMode.byWarehouse({where}, options); + const agencies = await models.AgencyMode.byWarehouse({where}, options); const validWarehouse = agencies.every(agency => agency.warehouseFk = warehouseId); expect(agencies.length).toEqual(6); diff --git a/modules/zone/back/methods/agency/getLanded.js b/modules/zone/back/methods/agency/getLanded.js index a662f59dd..cdde3b155 100644 --- a/modules/zone/back/methods/agency/getLanded.js +++ b/modules/zone/back/methods/agency/getLanded.js @@ -42,7 +42,7 @@ module.exports = Self => { const userId = ctx.req.accessToken.userId; const models = Self.app.models; - const roles = await models.Account.getRoles(userId); + const roles = await models.VnUser.getRoles(userId); const canSeeExpired = roles.filter(role => role == 'productionBoss' || role == 'administrative' ); diff --git a/modules/zone/back/methods/agency/getShipped.js b/modules/zone/back/methods/agency/getShipped.js index dd25493d6..7ef912abd 100644 --- a/modules/zone/back/methods/agency/getShipped.js +++ b/modules/zone/back/methods/agency/getShipped.js @@ -43,7 +43,7 @@ module.exports = Self => { const stmts = []; const userId = ctx.req.accessToken.userId; const models = Self.app.models; - const isProductionAssistant = await models.Account.hasRole(userId, 'productionAssi', myOptions); + const isProductionAssistant = await models.VnUser.hasRole(userId, 'productionAssi', myOptions); stmts.push(new ParameterizedSQL( `CALL vn.zone_getShipped(?, ?, ?, ?)`, [ landed, diff --git a/modules/zone/back/methods/agency/specs/landsThatDay.spec.js b/modules/zone/back/methods/agency/specs/landsThatDay.spec.js index ea10e708f..4bde37984 100644 --- a/modules/zone/back/methods/agency/specs/landsThatDay.spec.js +++ b/modules/zone/back/methods/agency/specs/landsThatDay.spec.js @@ -1,14 +1,14 @@ -const app = require('vn-loopback/server/server'); +const {models} = require('vn-loopback/server/server'); describe('Agency landsThatDay()', () => { const today = Date.vnNew(); it('should return a list of agencies that can land a shipment on a day for an address', async() => { - const tx = await app.models.Agency.beginTransaction({}); + const tx = await models.Agency.beginTransaction({}); try { const options = {transaction: tx}; - const agencies = await app.models.Agency.landsThatDay(101, today, options); + const agencies = await models.Agency.landsThatDay(101, today, options); expect(agencies.length).toBeGreaterThanOrEqual(3); diff --git a/modules/zone/back/methods/zone/includingExpired.js b/modules/zone/back/methods/zone/includingExpired.js index e93b86471..59e4079c2 100644 --- a/modules/zone/back/methods/zone/includingExpired.js +++ b/modules/zone/back/methods/zone/includingExpired.js @@ -36,7 +36,7 @@ module.exports = Self => { && where.agencyModeFk && where.warehouseFk; if (filterByAvailability) { - const roles = await models.Account.getRoles(userId, myOptions); + const roles = await models.VnUser.getRoles(userId, myOptions); const canSeeExpired = roles.filter(role => role == 'productionBoss' || role == 'administrative' ); diff --git a/modules/zone/back/methods/zone/specs/clone.spec.js b/modules/zone/back/methods/zone/specs/clone.spec.js index 92392d789..1b7393912 100644 --- a/modules/zone/back/methods/zone/specs/clone.spec.js +++ b/modules/zone/back/methods/zone/specs/clone.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('agency clone()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should clone a zone', async() => { const tx = await models.Zone.beginTransaction({}); diff --git a/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js b/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js index a34132be4..fbe96fc5f 100644 --- a/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js +++ b/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js @@ -1,6 +1,20 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('zone exclusionGeo()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); const zoneId = 1; const today = Date.vnNew(); diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index 562e62f5f..746a2d0bd 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -1,6 +1,21 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('zone toggleIsIncluded()', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should return the created location with isIncluded true', async() => { const tx = await models.Zone.beginTransaction({}); diff --git a/modules/zone/back/models/zone-event.json b/modules/zone/back/models/zone-event.json index 7cf4b8301..e477dad6a 100644 --- a/modules/zone/back/models/zone-event.json +++ b/modules/zone/back/models/zone-event.json @@ -1,10 +1,6 @@ { "name": "ZoneEvent", "base": "Loggable", - "log": { - "model":"ZoneLog", - "relation": "zone" - }, "options": { "mysql": { "table": "zoneEvent" @@ -57,4 +53,4 @@ "foreignKey": "zoneFk" } } -} \ No newline at end of file +} diff --git a/modules/zone/back/models/zone-exclusion.json b/modules/zone/back/models/zone-exclusion.json index e8088cd44..00c9145cd 100644 --- a/modules/zone/back/models/zone-exclusion.json +++ b/modules/zone/back/models/zone-exclusion.json @@ -1,10 +1,6 @@ { "name": "ZoneExclusion", "base": "Loggable", - "log": { - "model":"ZoneLog", - "relation": "zone" - }, "options": { "mysql": { "table": "zoneExclusion" @@ -27,4 +23,4 @@ "foreignKey": "zoneFk" } } -} \ No newline at end of file +} diff --git a/modules/zone/back/models/zone-included.json b/modules/zone/back/models/zone-included.json index 595f47a78..61633a3c7 100644 --- a/modules/zone/back/models/zone-included.json +++ b/modules/zone/back/models/zone-included.json @@ -1,11 +1,6 @@ { "name": "ZoneIncluded", "base": "Loggable", - "log": { - "model": "ZoneLog", - "relation": "zone", - "showField": "isIncluded" - }, "options": { "mysql": { "table": "zoneIncluded" @@ -32,4 +27,4 @@ "foreignKey": "geoFk" } } -} \ No newline at end of file +} diff --git a/modules/zone/back/models/zone-log.json b/modules/zone/back/models/zone-log.json index c2c66c155..72dd305b2 100644 --- a/modules/zone/back/models/zone-log.json +++ b/modules/zone/back/models/zone-log.json @@ -1,6 +1,6 @@ { "name": "ZoneLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "zoneLog" @@ -48,9 +48,9 @@ "relations": { "user": { "type": "belongsTo", - "model": "Account", + "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/zone/back/models/zone-warehouse.json b/modules/zone/back/models/zone-warehouse.json index 003e4e3c2..b222e95e7 100644 --- a/modules/zone/back/models/zone-warehouse.json +++ b/modules/zone/back/models/zone-warehouse.json @@ -1,10 +1,6 @@ { "name": "ZoneWarehouse", "base": "Loggable", - "log": { - "model":"ZoneLog", - "relation": "zone" - }, "options": { "mysql": { "table": "zoneWarehouse" @@ -32,4 +28,4 @@ "foreignKey": "warehouseFk" } } -} \ No newline at end of file +} diff --git a/modules/zone/back/models/zone.json b/modules/zone/back/models/zone.json index 06ea5ca2b..c86da3d3e 100644 --- a/modules/zone/back/models/zone.json +++ b/modules/zone/back/models/zone.json @@ -1,10 +1,6 @@ { "name": "Zone", "base": "Loggable", - "log": { - "model":"ZoneLog", - "showField": "name" - }, "options": { "mysql": { "table": "zone" @@ -59,7 +55,7 @@ "exclusions": { "type": "hasMany", "model": "ZoneExclusion", - "foreignKey": "zoneFk" + "foreignKey": "zoneFk" }, "warehouses": { "type": "hasMany", @@ -72,4 +68,4 @@ "foreignKey": "zoneFk" } } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 5adcb93a9..d373248fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,26192 @@ { "name": "salix-back", - "version": "23.14.01", + "version": "23.18.01", "lockfileVersion": 1, "requires": true, + "packages": { + "": { + "name": "salix-back", + "version": "23.16.01", + "license": "GPL-3.0", + "dependencies": { + "axios": "^1.2.2", + "base64url": "^3.0.1", + "bcrypt": "^5.0.1", + "bmp-js": "^0.1.0", + "compression": "^1.7.3", + "form-data": "^4.0.0", + "fs-extra": "^5.0.0", + "ftps": "^1.2.0", + "gm": "^1.25.0", + "got": "^10.7.0", + "helmet": "^3.21.2", + "i18n": "^0.8.4", + "image-type": "^4.1.0", + "imap": "^0.8.19", + "jsdom": "^16.7.0", + "jszip": "^3.10.0", + "ldapjs": "^2.2.0", + "loopback": "^3.28.0", + "loopback-boot": "3.3.1", + "loopback-component-explorer": "^6.5.0", + "loopback-component-storage": "3.6.1", + "loopback-connector-mysql": "^5.4.3", + "loopback-connector-remote": "^3.4.1", + "loopback-context": "^3.4.0", + "mailparser": "^2.8.0", + "md5": "^2.2.1", + "node-ssh": "^11.0.0", + "object-diff": "0.0.4", + "object.pick": "^1.3.0", + "puppeteer": "^18.0.5", + "read-chunk": "^3.2.0", + "require-yaml": "0.0.1", + "smbhash": "0.0.1", + "strong-error-handler": "^2.3.2", + "uuid": "^3.3.3", + "vn-loopback": "file:./loopback", + "vn-print": "file:./print", + "xml2js": "^0.4.23" + }, + "devDependencies": { + "@babel/core": "^7.7.7", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/preset-env": "^7.11.0", + "@babel/register": "^7.7.7", + "angular-mocks": "^1.7.9", + "babel-jest": "^26.0.1", + "babel-loader": "^8.0.6", + "core-js": "^3.9.1", + "css-loader": "^2.1.0", + "del": "^2.2.2", + "eslint": "^7.11.0", + "eslint-config-google": "^0.11.0", + "eslint-plugin-jasmine": "^2.10.1", + "fancy-log": "^1.3.2", + "file-loader": "^1.1.11", + "gulp": "^4.0.2", + "gulp-concat": "^2.6.1", + "gulp-env": "^0.4.0", + "gulp-file": "^0.4.0", + "gulp-install": "^1.1.0", + "gulp-merge-json": "^1.3.1", + "gulp-nodemon": "^2.5.0", + "gulp-print": "^2.0.1", + "gulp-wrap": "^0.15.0", + "gulp-yaml": "^1.0.1", + "html-loader": "^0.4.5", + "html-loader-jest": "^0.2.1", + "html-webpack-plugin": "^4.0.0-beta.11", + "identity-obj-proxy": "^3.0.0", + "jasmine": "^4.5.0", + "jasmine-reporters": "^2.4.0", + "jasmine-spec-reporter": "^7.0.0", + "jest": "^26.0.1", + "jest-junit": "^8.0.0", + "json-loader": "^0.5.7", + "merge-stream": "^1.0.1", + "minimist": "^1.2.5", + "mysql2": "^1.7.0", + "node-sass": "^4.14.1", + "nodemon": "^2.0.16", + "plugin-error": "^1.0.1", + "raw-loader": "^1.0.0", + "regenerator-runtime": "^0.13.7", + "sass-loader": "^7.3.1", + "style-loader": "^0.23.1", + "webpack": "^4.41.5", + "webpack-cli": "^3.3.10", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2", + "yaml-loader": "^0.5.0" + }, + "engines": { + "node": ">=14" + } + }, + "loopback": { + "name": "vn-loopback", + "version": "1.0.0", + "license": "GPL-3.0" + }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.17.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.17.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.8", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/runtime": { + "version": "7.17.8", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.17.8", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@google-cloud/common": { + "version": "0.32.1", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/projectify": "^0.3.3", + "@google-cloud/promisify": "^0.4.0", + "@types/request": "^2.48.1", + "arrify": "^2.0.0", + "duplexify": "^3.6.0", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^3.1.1", + "pify": "^4.0.1", + "retry-request": "^4.0.0", + "teeny-request": "^3.11.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@google-cloud/common/node_modules/arrify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "0.2.0", + "license": "Apache-2.0", + "dependencies": { + "arrify": "^1.0.1", + "extend": "^3.0.1", + "split-array-stream": "^2.0.0", + "stream-events": "^1.0.4" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "0.3.3", + "license": "Apache-2.0" + }, + "node_modules/@google-cloud/promisify": { + "version": "0.4.0", + "license": "Apache-2.0" + }, + "node_modules/@google-cloud/storage": { + "version": "2.5.0", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/common": "^0.32.0", + "@google-cloud/paginator": "^0.2.0", + "@google-cloud/promisify": "^0.4.0", + "arrify": "^1.0.0", + "async": "^2.0.1", + "compressible": "^2.0.12", + "concat-stream": "^2.0.0", + "date-and-time": "^0.6.3", + "duplexify": "^3.5.0", + "extend": "^3.0.0", + "gcs-resumable-upload": "^1.0.0", + "hash-stream-validation": "^0.2.1", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "pumpify": "^1.5.1", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "teeny-request": "^3.11.3", + "through2": "^3.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@google-cloud/storage/node_modules/mime": { + "version": "2.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.8", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { + "version": "6.1.11", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/@sindresorhus/is": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.2", + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.13", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "17.0.23", + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/@types/request": { + "version": "2.48.8", + "license": "MIT", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.5", + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/accept-language": { + "version": "3.0.18", + "license": "MIT", + "dependencies": { + "bcp47": "^1.1.2", + "stable": "^0.1.6" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "dev": true, + "license": "BSD-3-Clause OR MIT", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/angular-mocks": { + "version": "1.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/archy": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-initial": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-parallel": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", + "integrity": "sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==" + }, + "node_modules/array-series": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", + "integrity": "sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==" + }, + "node_modules/array-slice": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.9.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-done": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async-hook-jl": { + "version": "1.7.6", + "license": "MIT", + "dependencies": { + "stack-chain": "^1.3.7" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/async-settle": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sdk": { + "version": "2.1102.0", + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/sax": { + "version": "1.2.1", + "license": "ISC" + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "3.3.2", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/aws-sdk/node_modules/xml2js": { + "version": "0.4.19", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/aws-sdk/node_modules/xmlbuilder": { + "version": "9.0.7", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", + "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/babel-loader/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/backoff": { + "version": "2.5.0", + "license": "MIT", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/bcp47": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/bcrypt": { + "version": "5.1.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "license": "MIT" + }, + "node_modules/beeper": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bigdecimal": { + "version": "0.6.1", + "engines": [ + "node" + ], + "bin": { + "bigdecimal.js": "repl.js" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/block-stream": { + "version": "0.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.19.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/bops": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "base64-js": "1.0.2", + "to-utf8": "0.0.1" + } + }, + "node_modules/bowser": { + "version": "2.9.0", + "license": "MIT" + }, + "node_modules/boxen": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.20.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/bufferstreams": { + "version": "1.0.1", + "dev": true, + "dependencies": { + "readable-stream": "^1.0.33" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001320", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canonical-json": { + "version": "0.0.4", + "license": "BSD" + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/chokidar/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cldrjs": { + "version": "0.5.5" + }, + "node_modules/clean-css": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cls-hooked": { + "version": "4.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" + } + }, + "node_modules/cls-hooked/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/collection-map": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concat-with-sourcemaps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/configstore": { + "version": "4.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/consolidate": { + "version": "0.15.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-security-policy-builder": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/core-js": { + "version": "3.21.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.21.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.21.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/css-loader/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/css-loader/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dargs": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dasherize": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-and-time": { + "version": "0.6.3", + "license": "MIT" + }, + "node_modules/date-format": { + "version": "4.0.14", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/denque": { + "version": "1.5.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecate": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/des.js": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/detect-file": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.1045489", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1045489.tgz", + "integrity": "sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ==" + }, + "node_modules/diff": { + "version": "1.4.0", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "2.4.2", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dont-sniff-mimetype": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplex": { + "version": "1.0.0" + }, + "node_modules/duplex-child-process": { + "version": "0.0.5", + "license": "MIT" + }, + "node_modules/duplexer": { + "version": "0.0.4" + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "dev": true, + "license": "BSD", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "license": "BSD-3-Clause" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/each-props/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "2.7.4", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.96", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "license": "BSD-2-Clause", + "dependencies": { + "shimmer": "^1.2.0" + } + }, + "node_modules/emittery": { + "version": "0.7.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-japanese": { + "version": "1.0.30", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/enhanced-resolve/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/entities": { + "version": "1.1.2", + "license": "BSD-2-Clause" + }, + "node_modules/errno": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/errs": { + "version": "0.3.2", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.19.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.59", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-templates": { + "version": "0.2.3", + "dev": true, + "license": "Apache 2", + "dependencies": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-google": { + "version": "0.11.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.4.0" + } + }, + "node_modules/eslint-plugin-jasmine": { + "version": "2.10.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=2" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/espree": { + "version": "7.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/express": { + "version": "4.17.3", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.6.0", + "dev": true, + "license": "ISC" + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/eyes": { + "version": "0.1.8", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.3", + "license": "Apache-2.0" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/feature-policy": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "dev": true, + "license": "ISC" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/file-loader/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/file-loader/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "0.4.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-type": { + "version": "10.11.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/filed-mimefix": { + "version": "0.1.3", + "license": "ASL 2.0", + "dependencies": { + "mime": "^1.4.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/filelist": { + "version": "1.0.2", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "license": "ISC" + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.1" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-mkdirp-stream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/fs-readfile-promise": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fstream": { + "version": "1.0.12", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ftps": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "duplex-child-process": "0.0.5", + "lodash": "^4.4.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/g11n-pipeline": { + "version": "2.0.6", + "license": "Apache-2.0", + "dependencies": { + "swagger-client": "^3.8.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gauge": { + "version": "2.7.4", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gaxios": { + "version": "1.8.4", + "license": "Apache-2.0", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^2.2.1", + "node-fetch": "^2.3.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gcp-metadata": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "gaxios": "^1.0.2", + "json-bigint": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gcs-resumable-upload": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "abort-controller": "^2.0.2", + "configstore": "^4.0.0", + "gaxios": "^1.5.0", + "google-auth-library": "^3.0.0", + "pumpify": "^1.5.1", + "stream-events": "^1.0.4" + }, + "bin": { + "gcs-upload": "build/src/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gcs-resumable-upload/node_modules/abort-controller": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globalize": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "cldrjs": "^0.5.4" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globule": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gm": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/gm/-/gm-1.25.0.tgz", + "integrity": "sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==", + "dependencies": { + "array-parallel": "~0.1.3", + "array-series": "~0.1.5", + "cross-spawn": "^4.0.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gm/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/gm/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/gm/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/gm/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/gm/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/gm/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/google-auth-library": { + "version": "3.1.2", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "fast-text-encoding": "^1.0.0", + "gaxios": "^1.2.1", + "gcp-metadata": "^1.0.0", + "gtoken": "^2.3.2", + "https-proxy-agent": "^2.2.1", + "jws": "^3.1.5", + "lru-cache": "^5.0.0", + "semver": "^5.5.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/google-auth-library/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/google-auth-library/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/google-p12-pem": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "node-forge": "^0.10.0", + "pify": "^4.0.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + } + }, + "node_modules/got": { + "version": "10.7.0", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "license": "ISC" + }, + "node_modules/growl": { + "version": "1.9.2", + "license": "MIT" + }, + "node_modules/growly": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/gtoken": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "gaxios": "^1.0.4", + "google-p12-pem": "^1.0.0", + "jws": "^3.1.5", + "mime": "^2.2.0", + "pify": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/gtoken/node_modules/mime": { + "version": "2.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/gulp": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-concat": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-concat/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-concat/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-concat/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-concat/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-concat/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp-env": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "through2": "^2.0.0" + } + }, + "node_modules/gulp-env/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-env/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-env/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-env/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-env/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp-file": { + "version": "0.4.0", + "dev": true, + "license": "BSD", + "dependencies": { + "through2": "^0.4.1", + "vinyl": "^2.1.0" + } + }, + "node_modules/gulp-file/node_modules/object-keys": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-file/node_modules/readable-stream": { + "version": "1.0.34", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/gulp-file/node_modules/through2": { + "version": "0.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "node_modules/gulp-file/node_modules/xtend": { + "version": "2.1.2", + "dev": true, + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp-install": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^5.1.0", + "gulp-util": "^3.0.7", + "lodash.groupby": "^4.6.0", + "p-queue": "^1.0.0", + "through2": "^2.0.3", + "which": "^1.2.14" + } + }, + "node_modules/gulp-install/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-install/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-install/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-install/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-install/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/gulp-install/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp-merge-json": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deprecate": "^1.0.0", + "json5": "^1.0.1", + "lodash.mergewith": "^4.6.1", + "plugin-error": "^1.0.1", + "through": "^2.3.8", + "vinyl": "^2.1.0" + } + }, + "node_modules/gulp-merge-json/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/gulp-nodemon": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "colors": "^1.2.1", + "gulp": "^4.0.0", + "nodemon": "^2.0.2" + } + }, + "node_modules/gulp-nodemon/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-nodemon/node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/gulp-nodemon/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/gulp-nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-nodemon/node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-nodemon/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-nodemon/node_modules/nodemon": { + "version": "2.0.15", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/gulp-nodemon/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/gulp-nodemon/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/gulp-nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-print": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "gulp-util": "^3.0.6", + "map-stream": "~0.0.6" + }, + "engines": { + "node": ">=0.10.0", + "npm": ">=1.2.10" + } + }, + "node_modules/gulp-util": { + "version": "3.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/gulp-util/node_modules/clone-stats": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-util/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-util/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-util/node_modules/lodash.template": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/gulp-util/node_modules/lodash.templatesettings": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "node_modules/gulp-util/node_modules/object-assign": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-util/node_modules/replace-ext": { + "version": "0.0.1", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gulp-util/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-util/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-util/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-util/node_modules/vinyl": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulp-util/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp-wrap": { + "version": "0.15.0", + "dev": true, + "dependencies": { + "consolidate": "^0.15.1", + "es6-promise": "^4.2.6", + "fs-readfile-promise": "^3.0.1", + "js-yaml": "^3.13.0", + "lodash": "^4.17.11", + "node.extend": "2.0.2", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "tryit": "^1.0.1", + "vinyl-bufferstream": "^1.0.1" + }, + "engines": { + "node": ">=6.14", + "npm": ">=1.4.3" + } + }, + "node_modules/gulp-wrap/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gulp-yaml": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bufferstreams": "1.1.0", + "gulp-util": "^3.0.6", + "js-yaml": "^3.4.3", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-yaml/node_modules/bufferstreams": { + "version": "1.1.0", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/gulp-yaml/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-yaml/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gulp-yaml/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-yaml/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-yaml/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-yaml/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp/node_modules/ansi-colors": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/camelcase": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/cliui": { + "version": "3.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/gulp/node_modules/concat-stream": { + "version": "1.6.2", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/gulp/node_modules/get-caller-file": { + "version": "1.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp/node_modules/gulp-cli": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp/node_modules/invert-kv": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp/node_modules/lcid": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/os-locale": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp/node_modules/require-main-filename": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp/node_modules/which-module": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp/node_modules/wrap-ansi": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/y18n": { + "version": "3.2.2", + "dev": true, + "license": "ISC" + }, + "node_modules/gulp/node_modules/yargs": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/gulp/node_modules/yargs-parser": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/has-value": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/hash-stream-validation": { + "version": "0.2.4", + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/helmet": { + "version": "3.23.3", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "dont-sniff-mimetype": "1.1.0", + "feature-policy": "0.3.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-crossdomain": { + "version": "0.4.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-csp": { + "version": "2.10.0", + "license": "MIT", + "dependencies": { + "bowser": "2.9.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hide-powered-by": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hpkp": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/hsts": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-loader": { + "version": "0.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-templates": "^0.2.2", + "fastparse": "^1.1.1", + "html-minifier": "^3.0.1", + "loader-utils": "^1.0.2", + "object-assign": "^4.1.0" + } + }, + "node_modules/html-loader-jest": { + "version": "0.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "html-loader": "^0.5.1" + } + }, + "node_modules/html-loader-jest/node_modules/html-loader": { + "version": "0.5.5", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/html-loader-jest/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-loader-jest/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-loader/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-loader/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-minifier-terser/node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "dev": true, + "license": "MIT" + }, + "node_modules/html-to-text": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "he": "^1.2.0", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0" + }, + "bin": { + "html-to-text": "bin/cli.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/htmlparser2/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http-status": { + "version": "1.5.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/httpntlm": { + "version": "1.6.1", + "dependencies": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/httpreq": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 6.15.1" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "1.1.1", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/i18n": { + "version": "0.8.6", + "license": "MIT", + "dependencies": { + "debug": "*", + "make-plural": "^6.0.1", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", + "mustache": "*", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/image-type": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "file-type": "^10.10.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imap": { + "version": "0.8.19", + "dependencies": { + "readable-stream": "1.1.x", + "utf7": ">=1.0.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/in-publish": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "bin": { + "in-install": "in-install.js", + "in-publish": "in-publish.js", + "not-in-install": "not-in-install.js", + "not-in-publish": "not-in-publish.js" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inflection": { + "version": "1.13.2", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "license": "MIT" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "license": "MIT" + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/isemail": { + "version": "3.2.0", + "license": "BSD-3-Clause", + "dependencies": { + "punycode": "2.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jade": { + "version": "0.26.3", + "dependencies": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "bin": { + "jade": "bin/jade" + } + }, + "node_modules/jade/node_modules/commander": { + "version": "0.6.1", + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/jade/node_modules/mkdirp": { + "version": "0.3.0", + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, + "node_modules/jake": { + "version": "10.8.4", + "license": "Apache-2.0", + "dependencies": { + "async": "0.9.x", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/jasmine": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.5.0.tgz", + "integrity": "sha512-9olGRvNZyADIwYL9XBNBst5BTU/YaePzuddK+YRslc7rI9MdTIE4r3xaBKbv2GEmzYYUfMOdTR8/i6JfLZaxSQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "jasmine-core": "^4.5.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", + "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", + "dev": true + }, + "node_modules/jasmine-reporters": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.7.3", + "mkdirp": "^1.0.4" + } + }, + "node_modules/jasmine-reporters/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jasmine-spec-reporter": { + "version": "7.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jayson": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@types/node": "^10.3.5", + "commander": "^2.12.2", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.1", + "lodash": "^4.17.11", + "uuid": "^3.2.1" + }, + "bin": { + "jayson": "bin/jayson.js" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "10.17.60", + "license": "MIT" + }, + "node_modules/jest": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-junit": { + "version": "8.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jest-validate": "^24.0.0", + "mkdirp": "^0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/jest-junit/node_modules/@jest/types": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-junit/node_modules/@types/yargs": { + "version": "13.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-junit/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-junit/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/jest-junit/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/jest-get-type": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/jest-validate": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/pretty-format": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/react-is": { + "version": "16.13.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-junit/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-util": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/js2xmlparser": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^1.0.1" + } + }, + "node_modules/jsbarcode": { + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/jsbarcode/-/jsbarcode-3.11.5.tgz", + "integrity": "sha512-zv3KsH51zD00I/LrFzFSM6dst7rDn0vIMzaiZFL7qusTjPZiPtxg3zxetp0RR7obmjTw4f6NyGgbdkBCgZUIrA==", + "bin": { + "auto.js": "bin/barcodes/CODE128/auto.js", + "Barcode.js": "bin/barcodes/Barcode.js", + "barcodes": "bin/barcodes", + "canvas.js": "bin/renderers/canvas.js", + "checksums.js": "bin/barcodes/MSI/checksums.js", + "codabar": "bin/barcodes/codabar", + "CODE128": "bin/barcodes/CODE128", + "CODE128_AUTO.js": "bin/barcodes/CODE128/CODE128_AUTO.js", + "CODE128.js": "bin/barcodes/CODE128/CODE128.js", + "CODE128A.js": "bin/barcodes/CODE128/CODE128A.js", + "CODE128B.js": "bin/barcodes/CODE128/CODE128B.js", + "CODE128C.js": "bin/barcodes/CODE128/CODE128C.js", + "CODE39": "bin/barcodes/CODE39", + "constants.js": "bin/barcodes/ITF/constants.js", + "defaults.js": "bin/options/defaults.js", + "EAN_UPC": "bin/barcodes/EAN_UPC", + "EAN.js": "bin/barcodes/EAN_UPC/EAN.js", + "EAN13.js": "bin/barcodes/EAN_UPC/EAN13.js", + "EAN2.js": "bin/barcodes/EAN_UPC/EAN2.js", + "EAN5.js": "bin/barcodes/EAN_UPC/EAN5.js", + "EAN8.js": "bin/barcodes/EAN_UPC/EAN8.js", + "encoder.js": "bin/barcodes/EAN_UPC/encoder.js", + "ErrorHandler.js": "bin/exceptions/ErrorHandler.js", + "exceptions": "bin/exceptions", + "exceptions.js": "bin/exceptions/exceptions.js", + "fixOptions.js": "bin/help/fixOptions.js", + "GenericBarcode": "bin/barcodes/GenericBarcode", + "getOptionsFromElement.js": "bin/help/getOptionsFromElement.js", + "getRenderProperties.js": "bin/help/getRenderProperties.js", + "help": "bin/help", + "index.js": "bin/renderers/index.js", + "index.tmp.js": "bin/barcodes/index.tmp.js", + "ITF": "bin/barcodes/ITF", + "ITF.js": "bin/barcodes/ITF/ITF.js", + "ITF14.js": "bin/barcodes/ITF/ITF14.js", + "JsBarcode.js": "bin/JsBarcode.js", + "linearizeEncodings.js": "bin/help/linearizeEncodings.js", + "merge.js": "bin/help/merge.js", + "MSI": "bin/barcodes/MSI", + "MSI.js": "bin/barcodes/MSI/MSI.js", + "MSI10.js": "bin/barcodes/MSI/MSI10.js", + "MSI1010.js": "bin/barcodes/MSI/MSI1010.js", + "MSI11.js": "bin/barcodes/MSI/MSI11.js", + "MSI1110.js": "bin/barcodes/MSI/MSI1110.js", + "object.js": "bin/renderers/object.js", + "options": "bin/options", + "optionsFromStrings.js": "bin/help/optionsFromStrings.js", + "pharmacode": "bin/barcodes/pharmacode", + "renderers": "bin/renderers", + "shared.js": "bin/renderers/shared.js", + "svg.js": "bin/renderers/svg.js", + "UPC.js": "bin/barcodes/EAN_UPC/UPC.js", + "UPCE.js": "bin/barcodes/EAN_UPC/UPCE.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "16.7.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.7.0", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-loader": { + "version": "0.5.7", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jsprim/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/jsprim/node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/jsprim/node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/jszip": { + "version": "3.10.0", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/just-debounce": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lcid": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "invert-kv": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ldap-filter": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldapjs": { + "version": "2.3.2", + "license": "MIT", + "dependencies": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libbase64": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/libmime": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "encoding-japanese": "1.0.30", + "iconv-lite": "0.6.2", + "libbase64": "1.2.1", + "libqp": "1.1.0" + } + }, + "node_modules/libmime/node_modules/iconv-lite": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liboneandone": { + "version": "1.2.0", + "license": "BSD", + "dependencies": { + "mocha": "^2.5.3", + "request": "^2.74.0" + } + }, + "node_modules/libqp": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log4js": { + "version": "6.7.0", + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.3" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/log4js/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/long": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/loopback": { + "version": "3.28.0", + "license": "MIT", + "dependencies": { + "async": "^2.0.1", + "bcryptjs": "^2.1.0", + "bluebird": "^3.1.1", + "body-parser": "^1.12.0", + "canonical-json": "0.0.4", + "debug": "^2.1.2", + "depd": "^1.0.0", + "ejs": "^2.3.1", + "express": "^4.14.0", + "inflection": "^1.6.0", + "isemail": "^3.2.0", + "loopback-connector-remote": "^3.0.0", + "loopback-datasource-juggler": "^3.28.0", + "loopback-filters": "^1.0.0", + "loopback-phase": "^3.0.0", + "nodemailer": "^6.4.16", + "nodemailer-direct-transport": "^3.3.2", + "nodemailer-stub-transport": "^1.1.0", + "serve-favicon": "^2.2.0", + "stable": "^0.1.5", + "strong-globalize": "^4.1.1", + "strong-remoting": "^3.11.0", + "uid2": "0.0.3", + "underscore.string": "^3.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loopback-boot": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "async": "^2.4.0", + "bluebird": "^3.5.3", + "commondir": "^1.0.1", + "debug": "^4.1.1", + "lodash": "^4.17.11", + "semver": "^5.1.0", + "strong-globalize": "^4.1.1", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loopback-boot/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/loopback-boot/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/loopback-component-explorer": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash": "^4.17.11", + "loopback-swagger": "^5.0.0", + "strong-globalize": "^4.1.1", + "swagger-ui": "^2.2.5" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/loopback-component-explorer/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-component-explorer/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback-component-storage": { + "version": "3.6.1", + "license": "Artistic-2.0", + "dependencies": { + "async": "^2.6.1", + "debug": "^3.1.0", + "formidable": "^1.2.1", + "pkgcloud": "^2.0.0", + "strong-globalize": "^4.1.1", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loopback-component-storage/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-component-storage/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback-connector": { + "version": "4.11.1", + "license": "MIT", + "dependencies": { + "async": "^3.2.0", + "bluebird": "^3.7.2", + "debug": "^4.1.1", + "msgpack5": "^4.2.0", + "strong-globalize": "^5.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/loopback-connector-mysql": { + "version": "5.4.4", + "license": "MIT", + "dependencies": { + "async": "^2.6.1", + "debug": "^3.1.0", + "lodash": "^4.17.11", + "loopback-connector": "^4.0.0", + "mysql": "^2.11.1", + "strong-globalize": "^5.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loopback-connector-mysql/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-connector-mysql/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback-connector-mysql/node_modules/strong-globalize": { + "version": "5.1.0", + "license": "Artistic-2.0", + "dependencies": { + "accept-language": "^3.0.18", + "debug": "^4.1.1", + "globalize": "^1.5.0", + "lodash": "^4.17.15", + "md5": "^2.2.1", + "mkdirp": "^0.5.5", + "os-locale": "^5.0.0", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/loopback-connector-mysql/node_modules/strong-globalize/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/loopback-connector-mysql/node_modules/strong-globalize/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/loopback-connector-remote": { + "version": "3.4.1", + "license": "MIT", + "dependencies": { + "loopback-datasource-juggler": "^3.0.0", + "strong-remoting": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loopback-connector/node_modules/async": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/loopback-connector/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/loopback-connector/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/loopback-connector/node_modules/strong-globalize": { + "version": "5.1.0", + "license": "Artistic-2.0", + "dependencies": { + "accept-language": "^3.0.18", + "debug": "^4.1.1", + "globalize": "^1.5.0", + "lodash": "^4.17.15", + "md5": "^2.2.1", + "mkdirp": "^0.5.5", + "os-locale": "^5.0.0", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/loopback-connector/node_modules/uuid": { + "version": "7.0.3", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/loopback-context": { + "version": "3.5.2", + "license": "MIT", + "dependencies": { + "cls-hooked": "^4.2.0" + }, + "engines": { + "node": "^8.2.1 || ^10.14 || ^12.15" + } + }, + "node_modules/loopback-datasource-juggler": { + "version": "3.36.1", + "license": "MIT", + "dependencies": { + "async": "^2.6.0", + "bluebird": "^3.1.1", + "debug": "^3.1.0", + "depd": "^1.0.0", + "inflection": "^1.6.0", + "lodash": "^4.17.4", + "loopback-connector": "^4.4.0", + "minimatch": "^3.0.3", + "qs": "^6.5.0", + "shortid": "^2.2.6", + "strong-globalize": "^4.1.1", + "traverse": "^0.6.6", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loopback-datasource-juggler/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-datasource-juggler/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/loopback-datasource-juggler/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback-datatype-geopoint": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/loopback-filters": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "debug": "^3.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loopback-filters/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-filters/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback-phase": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "async": "^2.6.1", + "debug": "^3.1.0", + "strong-globalize": "^4.1.1" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/loopback-phase/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-phase/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback-swagger": { + "version": "5.9.0", + "license": "MIT", + "dependencies": { + "async": "^2.1.4", + "debug": "^3.1.0", + "ejs": "^2.5.5", + "lodash": "^4.17.11", + "strong-globalize": "^4.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loopback-swagger/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/loopback-swagger/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/loopback/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/mailparser": { + "version": "2.8.1", + "license": "(MIT OR EUPL-1.1+)", + "dependencies": { + "encoding-japanese": "1.0.30", + "he": "1.2.0", + "html-to-text": "5.1.1", + "iconv-lite": "0.6.2", + "libmime": "5.0.0", + "linkify-it": "3.0.2", + "mailsplit": "5.0.0", + "nodemailer": "6.4.11", + "tlds": "1.208.0" + } + }, + "node_modules/mailparser/node_modules/iconv-lite": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailparser/node_modules/nodemailer": { + "version": "6.4.11", + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/mailsplit": { + "version": "5.0.0", + "license": "(MIT OR EUPL-1.1+)", + "dependencies": { + "libbase64": "1.2.1", + "libmime": "4.2.1", + "libqp": "1.1.0" + } + }, + "node_modules/mailsplit/node_modules/iconv-lite": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailsplit/node_modules/libmime": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "encoding-japanese": "1.0.30", + "iconv-lite": "0.5.0", + "libbase64": "1.2.1", + "libqp": "1.1.0" + } + }, + "node_modules/make-dir": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-plural": { + "version": "6.2.2", + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-interval-parser": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/merge-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/messageformat": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "make-plural": "^4.3.0", + "messageformat-formatters": "^2.0.1", + "messageformat-parser": "^4.1.2" + } + }, + "node_modules/messageformat-formatters": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/messageformat-parser": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/messageformat/node_modules/make-plural": { + "version": "4.3.0", + "license": "ISC", + "bin": { + "make-plural": "bin/make-plural" + }, + "optionalDependencies": { + "minimist": "^1.2.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "license": "MIT" + }, + "node_modules/minipass": { + "version": "3.3.4", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mississippi/node_modules/concat-stream": { + "version": "1.6.2", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/mississippi/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/mississippi/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/mississippi/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/mississippi/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/mississippi/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT" + }, + "node_modules/mktmpdir": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "rimraf": "~2.2.8" + } + }, + "node_modules/mktmpdir/node_modules/rimraf": { + "version": "2.2.8", + "license": "MIT", + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mocha": { + "version": "2.5.3", + "license": "MIT", + "dependencies": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/mocha/node_modules/commander": { + "version": "2.3.0", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "3.2.11", + "license": "BSD", + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/lru-cache": { + "version": "2.7.3", + "license": "ISC" + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/minimist": { + "version": "0.0.8", + "license": "MIT" + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "0.7.1" + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/msgpack-js": { + "version": "0.3.0", + "dependencies": { + "bops": "~0.0.6" + } + }, + "node_modules/msgpack-js/node_modules/base64-js": { + "version": "0.0.2", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/msgpack-js/node_modules/bops": { + "version": "0.0.7", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.2", + "to-utf8": "0.0.1" + } + }, + "node_modules/msgpack-stream": { + "version": "0.0.13", + "license": "MIT", + "dependencies": { + "bops": "1.0.0", + "msgpack-js": "0.3.0", + "through": "2.3.4" + } + }, + "node_modules/msgpack-stream/node_modules/through": { + "version": "2.3.4", + "license": "MIT" + }, + "node_modules/msgpack5": { + "version": "4.5.1", + "license": "MIT", + "dependencies": { + "bl": "^2.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.3.6", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/msgpack5/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/msgpack5/node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/msgpack5/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/multipipe": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/mux-demux": { + "version": "3.7.9", + "dependencies": { + "duplex": "~1.0.0", + "json-buffer": "~2.0.4", + "msgpack-stream": "~0.0.10", + "stream-combiner": "0.0.2", + "stream-serializer": "~1.1.1", + "through": "~2.3.1", + "xtend": "~1.0.3" + } + }, + "node_modules/mux-demux/node_modules/json-buffer": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/mysql": { + "version": "2.18.1", + "license": "MIT", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/bignumber.js": { + "version": "9.0.0", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/mysql/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/mysql/node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/mysql/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/mysql2": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.5.0", + "long": "^4.0.0", + "lru-cache": "^5.1.1", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.1.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/nan": { + "version": "2.15.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "2.1.11", + "license": "MIT" + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nocache": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "3.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "3.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/node-libs-browser/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-libs-browser/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/node-libs-browser/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/url": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/node-libs-browser/node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/node-sass": { + "version": "4.14.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/cross-spawn": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/node-sass/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/node-sass/node_modules/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/node-sass/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/node-sass/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/node-sass/node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/node-ssh": { + "version": "11.1.1", + "license": "MIT", + "dependencies": { + "make-dir": "^3.1.0", + "sb-promise-queue": "^2.1.0", + "sb-scandir": "^3.1.0", + "shell-escape": "^0.2.0", + "ssh2": "^0.8.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-ssh/node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-ssh/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node.extend": { + "version": "2.0.2", + "dev": true, + "license": "(MIT OR GPL-2.0)", + "dependencies": { + "has": "^1.0.3", + "is": "^3.2.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/nodemailer": { + "version": "6.7.3", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemailer-direct-transport": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "node_modules/nodemailer-fetch": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/nodemailer-shared": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "nodemailer-fetch": "1.6.0" + } + }, + "node_modules/nodemailer-stub-transport": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "2.0.19", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nodemon/node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-diff": { + "version": "0.0.4", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/optional": { + "version": "0.1.4", + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/options": { + "version": "0.0.6", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ordered-read-streams/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-queue": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/decompress-response": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/defer-to-connect": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/json-buffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/package-json/node_modules/keyv": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/package-json/node_modules/lowercase-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/mimic-response": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/normalize-url": { + "version": "4.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/responselike": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/package-json/node_modules/to-readable-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/parallel-transform/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/parallel-transform/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkgcloud": { + "version": "2.2.0", + "dependencies": { + "@google-cloud/storage": "^2.4.3", + "async": "^2.6.1", + "aws-sdk": "^2.382.0", + "errs": "^0.3.2", + "eventemitter2": "^5.0.1", + "fast-json-patch": "^2.1.0", + "filed-mimefix": "^0.1.3", + "ip": "^1.1.5", + "liboneandone": "^1.2.0", + "lodash": "^4.17.10", + "mime": "^2.4.1", + "qs": "^6.5.2", + "request": "^2.88.0", + "through2": "^3.0.1", + "url-join": "^4.0.0", + "xml2js": "^0.4.19" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/pkgcloud/node_modules/mime": { + "version": "2.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/ansi-colors": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posix-getopt": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/precond": { + "version": "0.2.3", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/private": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.8.0", + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-18.2.1.tgz", + "integrity": "sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ==", + "hasInstallScript": true, + "dependencies": { + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "puppeteer-core": "18.2.1" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-cluster": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "debug": "^4.3.3" + }, + "peerDependencies": { + "puppeteer": ">=1.5.0" + } + }, + "node_modules/puppeteer-cluster/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-cluster/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/puppeteer-core": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-18.2.1.tgz", + "integrity": "sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==", + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1045489", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.9.0" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/puppeteer/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.9.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.3.0" + } + }, + "node_modules/raw-loader/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/raw-loader/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/read-chunk": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recast": { + "version": "0.11.23", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/recast/node_modules/esprima": { + "version": "3.1.3", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/referrer-policy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/remove-bom-stream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/require-yaml": { + "version": "0.0.1", + "license": "BSD", + "dependencies": { + "js-yaml": "" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/retry-request/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/retry-request/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "dev": true, + "license": "MIT", + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sane": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sass-graph": { + "version": "2.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "bin": { + "sassgraph": "bin/sassgraph" + } + }, + "node_modules/sass-graph/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/sass-graph/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/sass-graph/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-graph/node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-graph/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/yargs": { + "version": "13.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/sass-graph/node_modules/yargs-parser": { + "version": "13.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/sass-loader": { + "version": "7.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/sass-loader/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/sass-loader/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sb-promise-queue": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/sb-scandir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "sb-promise-queue": "^2.1.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.4.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send": { + "version": "0.17.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "dev": true + }, + "node_modules/serve-favicon": { + "version": "2.5.0", + "license": "MIT", + "dependencies": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/node_modules/ms": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.1.1", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-static": { + "version": "1.14.2", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/set-value": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-escape": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/shellwords": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/shimmer": { + "version": "1.2.1", + "license": "BSD-2-Clause" + }, + "node_modules/shortid": { + "version": "2.2.16", + "license": "MIT", + "dependencies": { + "nanoid": "^2.1.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smbhash": { + "version": "0.0.1", + "engines": [ + "node" + ], + "dependencies": { + "bigdecimal": ">= 0.6.0" + } + }, + "node_modules/smtp-connection": { + "version": "2.12.0", + "license": "MIT", + "dependencies": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } + }, + "node_modules/snakeize": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.6", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/sparkles": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy-transport/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/spdy-transport/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/split-array-stream": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "is-stream-ended": "^0.1.4" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sse": { + "version": "0.0.8", + "dependencies": { + "options": "0.0.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ssh2": { + "version": "0.8.9", + "dependencies": { + "ssh2-streams": "~0.4.10" + }, + "engines": { + "node": ">=5.2.0" + } + }, + "node_modules/ssh2-streams": { + "version": "0.4.10", + "dependencies": { + "asn1": "~0.2.0", + "bcrypt-pbkdf": "^1.0.2", + "streamsearch": "~0.1.2" + }, + "engines": { + "node": ">=5.2.0" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/stack-chain": { + "version": "1.3.7", + "license": "MIT" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stdout-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.2", + "license": "MIT", + "dependencies": { + "duplexer": "~0.0.3" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-http": { + "version": "2.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-http/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-http/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/stream-serializer": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/streamroller": { + "version": "3.1.3", + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/streamsearch": { + "version": "0.1.2", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-error-handler": { + "version": "2.3.2", + "license": "MIT", + "dependencies": { + "accepts": "^1.3.3", + "debug": "^2.2.0", + "ejs": "^2.5.7", + "http-status": "^1.0.0", + "js2xmlparser": "^3.0.0", + "strong-globalize": "^3.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/cross-spawn": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/strong-error-handler/node_modules/execa": { + "version": "0.7.0", + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/get-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/invert-kv": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-error-handler/node_modules/is-stream": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-error-handler/node_modules/lcid": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-error-handler/node_modules/lru-cache": { + "version": "4.1.5", + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/strong-error-handler/node_modules/mem": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/mimic-fn": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/strong-error-handler/node_modules/npm-run-path": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/os-locale": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/path-key": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-error-handler/node_modules/shebang-command": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-error-handler/node_modules/shebang-regex": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-error-handler/node_modules/strong-globalize": { + "version": "3.3.0", + "license": "Artistic-2.0", + "dependencies": { + "accept-language": "^3.0.18", + "async": "^2.4.1", + "debug": "^3.1.0", + "esprima": "^4.0.0", + "estraverse": "^4.2.0", + "g11n-pipeline": "^2.0.1", + "globalize": "^1.3.0", + "htmlparser2": "^3.9.2", + "lodash": "^4.17.4", + "md5": "^2.2.1", + "mkdirp": "^0.5.1", + "mktmpdir": "^0.1.1", + "optional": "^0.1.3", + "os-locale": "^2.0.0", + "posix-getopt": "^1.2.0", + "word-count": "^0.2.2", + "xtend": "^4.0.1", + "yamljs": "^0.3.0" + }, + "bin": { + "slt-globalize": "bin/slt-globalize.js" + } + }, + "node_modules/strong-error-handler/node_modules/strong-globalize/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/strong-error-handler/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/strong-error-handler/node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/strong-error-handler/node_modules/yallist": { + "version": "2.1.2", + "license": "ISC" + }, + "node_modules/strong-globalize": { + "version": "4.1.3", + "license": "Artistic-2.0", + "dependencies": { + "accept-language": "^3.0.18", + "debug": "^4.1.1", + "globalize": "^1.4.2", + "lodash": "^4.17.4", + "md5": "^2.2.1", + "mkdirp": "^0.5.1", + "os-locale": "^3.1.0", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strong-globalize/node_modules/cross-spawn": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/strong-globalize/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/strong-globalize/node_modules/execa": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strong-globalize/node_modules/get-stream": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strong-globalize/node_modules/invert-kv": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-globalize/node_modules/is-stream": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-globalize/node_modules/lcid": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "invert-kv": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strong-globalize/node_modules/mem": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strong-globalize/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/strong-globalize/node_modules/npm-run-path": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-globalize/node_modules/os-locale": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strong-globalize/node_modules/path-key": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-globalize/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/strong-globalize/node_modules/shebang-command": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-globalize/node_modules/shebang-regex": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-globalize/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/strong-remoting": { + "version": "3.17.0", + "license": "Artistic-2.0", + "dependencies": { + "async": "^3.1.0", + "body-parser": "^1.12.4", + "debug": "^4.1.1", + "depd": "^2.0.0", + "escape-string-regexp": "^2.0.0", + "eventemitter2": "^5.0.1", + "express": "4.x", + "inflection": "^1.7.1", + "jayson": "^2.0.5", + "js2xmlparser": "^3.0.0", + "loopback-datatype-geopoint": "^1.0.0", + "loopback-phase": "^3.1.0", + "mux-demux": "^3.7.9", + "qs": "^6.2.1", + "request": "^2.83.0", + "sse": "0.0.8", + "strong-error-handler": "^3.0.0", + "strong-globalize": "^5.0.2", + "traverse": "^0.6.6", + "xml2js": "^0.4.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strong-remoting/node_modules/async": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/strong-remoting/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/strong-remoting/node_modules/ejs": { + "version": "3.1.6", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strong-remoting/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/strong-remoting/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/strong-remoting/node_modules/strong-error-handler": { + "version": "3.5.0", + "license": "MIT", + "dependencies": { + "@types/express": "^4.16.0", + "accepts": "^1.3.3", + "debug": "^4.1.1", + "ejs": "^3.1.3", + "fast-safe-stringify": "^2.0.6", + "http-status": "^1.1.2", + "js2xmlparser": "^4.0.0", + "strong-globalize": "^6.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/strong-remoting/node_modules/strong-error-handler/node_modules/js2xmlparser": { + "version": "4.0.2", + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/strong-remoting/node_modules/strong-error-handler/node_modules/strong-globalize": { + "version": "6.0.5", + "license": "Artistic-2.0", + "dependencies": { + "accept-language": "^3.0.18", + "debug": "^4.2.0", + "globalize": "^1.6.0", + "lodash": "^4.17.20", + "md5": "^2.3.0", + "mkdirp": "^1.0.4", + "os-locale": "^5.0.0", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/strong-remoting/node_modules/strong-globalize": { + "version": "5.1.0", + "license": "Artistic-2.0", + "dependencies": { + "accept-language": "^3.0.18", + "debug": "^4.1.1", + "globalize": "^1.5.0", + "lodash": "^4.17.15", + "md5": "^2.2.1", + "mkdirp": "^0.5.5", + "os-locale": "^5.0.0", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/strong-remoting/node_modules/strong-globalize/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/strong-remoting/node_modules/xmlcreate": { + "version": "2.0.4", + "license": "Apache-2.0" + }, + "node_modules/stubs": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/style-loader": { + "version": "0.23.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/style-loader/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/swagger-client": { + "version": "3.18.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.11.2", + "btoa": "^1.2.1", + "cookie": "~0.4.1", + "cross-fetch": "^3.1.5", + "deepmerge": "~4.2.2", + "fast-json-patch": "^3.0.0-1", + "form-data-encoder": "^1.4.3", + "formdata-node": "^4.0.0", + "is-plain-object": "^5.0.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "qs": "^6.10.2", + "traverse": "~0.6.6", + "url": "~0.11.0" + } + }, + "node_modules/swagger-client/node_modules/fast-json-patch": { + "version": "3.1.1", + "license": "MIT" + }, + "node_modules/swagger-client/node_modules/punycode": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/swagger-client/node_modules/qs": { + "version": "6.10.3", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-client/node_modules/url": { + "version": "0.11.0", + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/swagger-ui": { + "version": "2.2.10", + "license": "Apache-2.0" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "node_modules/table": { + "version": "6.8.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "2.2.2", + "dev": true, + "license": "ISC", + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/teeny-request": { + "version": "3.11.3", + "license": "Apache-2.0", + "dependencies": { + "https-proxy-agent": "^2.2.1", + "node-fetch": "^2.2.0", + "uuid": "^3.3.2" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/is-wsl": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "4.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/throat": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "license": "MIT" + }, + "node_modules/through2": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through2-filter/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2-filter/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tlds": { + "version": "1.208.0", + "license": "MIT", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-iso-string": { + "version": "0.0.2", + "license": "MIT" + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-through/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/to-through/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-through/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/to-utf8": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/touch": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.6.6", + "license": "MIT" + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/true-case-path": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "glob": "^7.1.2" + } + }, + "node_modules/tryit": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.3.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "node_modules/type": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.10.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uid2": { + "version": "0.0.3" + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.7.0" + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "license": "MIT", + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/configstore": { + "version": "5.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/crypto-random-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/unique-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/update-notifier/node_modules/xdg-basedir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/upper-case": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/url": { + "version": "0.10.3", + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/use": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/utf7": { + "version": "1.0.2", + "dependencies": { + "semver": "~5.3.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vasync": { + "version": "2.2.1", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "verror": "1.10.0" + } + }, + "node_modules/vasync/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/vasync/node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/vinyl": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-bufferstream": { + "version": "1.0.1", + "dev": true, + "dependencies": { + "bufferstreams": "1.0.1" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/vn-loopback": { + "resolved": "loopback", + "link": true + }, + "node_modules/vn-print": { + "resolved": "print", + "link": true + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/watchpack/node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.1", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "4.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-cli/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-cli/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-cli/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/webpack-cli/node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/webpack-cli/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/import-local": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack-cli/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-cli/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/resolve-cwd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-cli/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/supports-color": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/webpack-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/yargs": { + "version": "13.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/import-local": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-path-cwd": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-path-in-cwd": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-path-inside": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/punycode": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/url": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/wide-align": { + "version": "1.1.5", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/with-open-file": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/word-count": { + "version": "0.2.2", + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "7.5.7", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/x-xss-protection": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/xmlcreate": { + "version": "1.0.2", + "license": "Apache-2.0" + }, + "node_modules/xmldom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", + "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xtend": { + "version": "1.0.3", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml-loader": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.5.2" + } + }, + "node_modules/yaml-loader/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/yamljs": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "print": { + "name": "vn-print", + "version": "2.0.0", + "license": "GPL-3.0", + "dependencies": { + "fs-extra": "^7.0.1", + "intl": "^1.2.5", + "js-yaml": "^3.13.1", + "jsbarcode": "^3.11.5", + "jsonexport": "^3.2.0", + "juice": "^5.2.0", + "log4js": "^6.7.0", + "mysql2": "^1.7.0", + "nodemailer": "^4.7.0", + "puppeteer-cluster": "^0.23.0", + "qrcode": "^1.4.2", + "strftime": "^0.10.0", + "vue": "^2.6.10", + "vue-i18n": "^8.15.0", + "vue-server-renderer": "^2.6.10", + "xmldom": "^0.6.0" + } + }, + "print/node_modules/@babel/parser": { + "version": "7.19.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "print/node_modules/@vue/compiler-sfc": { + "version": "2.7.10", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "print/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "print/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "print/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "print/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "print/node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "print/node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "print/node_modules/async": { + "version": "3.2.4", + "license": "MIT" + }, + "print/node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "print/node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "print/node_modules/aws4": { + "version": "1.11.0", + "license": "MIT" + }, + "print/node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "print/node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "print/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "print/node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "print/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "print/node_modules/cheerio": { + "version": "0.22.0", + "license": "MIT", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "print/node_modules/cliui": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "print/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "print/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "print/node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "print/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "print/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "print/node_modules/cross-spawn": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "print/node_modules/css-select": { + "version": "1.2.0", + "license": "BSD-like", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "print/node_modules/css-what": { + "version": "2.1.3", + "license": "BSD-2-Clause", + "engines": { + "node": "*" + } + }, + "print/node_modules/csstype": { + "version": "3.1.1", + "license": "MIT" + }, + "print/node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "print/node_modules/datauri": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "image-size": "^0.7.3", + "mimer": "^1.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "print/node_modules/decamelize": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "print/node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "print/node_modules/denque": { + "version": "1.5.1", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "print/node_modules/dijkstrajs": { + "version": "1.0.2", + "license": "MIT" + }, + "print/node_modules/dom-serializer": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "print/node_modules/domelementtype": { + "version": "1.3.1", + "license": "BSD-2-Clause" + }, + "print/node_modules/domhandler": { + "version": "2.4.2", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "1" + } + }, + "print/node_modules/domutils": { + "version": "1.5.1", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "print/node_modules/ecc-jsbn": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "print/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "print/node_modules/encode-utf8": { + "version": "1.0.3", + "license": "MIT" + }, + "print/node_modules/entities": { + "version": "1.1.2", + "license": "BSD-2-Clause" + }, + "print/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "print/node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "print/node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "print/node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "print/node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "print/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "print/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "print/node_modules/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "print/node_modules/fs-extra": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "print/node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "print/node_modules/generate-function": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "print/node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "print/node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "print/node_modules/graceful-fs": { + "version": "4.2.10", + "license": "ISC" + }, + "print/node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "print/node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "print/node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "print/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "print/node_modules/hash-sum": { + "version": "2.0.0", + "license": "MIT" + }, + "print/node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "print/node_modules/htmlparser2": { + "version": "3.10.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "print/node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "print/node_modules/iconv-lite": { + "version": "0.5.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/image-size": { + "version": "0.7.5", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "print/node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "print/node_modules/intl": { + "version": "1.2.5", + "license": "MIT" + }, + "print/node_modules/is-core-module": { + "version": "2.10.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "print/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "print/node_modules/is-property": { + "version": "1.0.2", + "license": "MIT" + }, + "print/node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "print/node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "print/node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "print/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "print/node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "print/node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "print/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "print/node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "print/node_modules/jsonexport": { + "version": "3.2.0", + "license": "Apache-2.0", + "bin": { + "jsonexport": "bin/jsonexport.js" + } + }, + "print/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "print/node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "print/node_modules/juice": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "cheerio": "^0.22.0", + "commander": "^2.15.1", + "cross-spawn": "^6.0.5", + "deep-extend": "^0.6.0", + "mensch": "^0.3.3", + "slick": "^1.12.2", + "web-resource-inliner": "^4.3.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "print/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "license": "MIT" + }, + "print/node_modules/lodash.assignin": { + "version": "4.2.0", + "license": "MIT" + }, + "print/node_modules/lodash.bind": { + "version": "4.2.1", + "license": "MIT" + }, + "print/node_modules/lodash.defaults": { + "version": "4.2.0", + "license": "MIT" + }, + "print/node_modules/lodash.filter": { + "version": "4.6.0", + "license": "MIT" + }, + "print/node_modules/lodash.flatten": { + "version": "4.4.0", + "license": "MIT" + }, + "print/node_modules/lodash.foreach": { + "version": "4.5.0", + "license": "MIT" + }, + "print/node_modules/lodash.map": { + "version": "4.6.0", + "license": "MIT" + }, + "print/node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "print/node_modules/lodash.pick": { + "version": "4.4.0", + "license": "MIT" + }, + "print/node_modules/lodash.reduce": { + "version": "4.6.0", + "license": "MIT" + }, + "print/node_modules/lodash.reject": { + "version": "4.6.0", + "license": "MIT" + }, + "print/node_modules/lodash.some": { + "version": "4.6.0", + "license": "MIT" + }, + "print/node_modules/lodash.template": { + "version": "4.5.0", + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "print/node_modules/lodash.templatesettings": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "print/node_modules/lodash.unescape": { + "version": "4.0.1", + "license": "MIT" + }, + "print/node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "print/node_modules/long": { + "version": "4.0.0", + "license": "Apache-2.0" + }, + "print/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "print/node_modules/mensch": { + "version": "0.3.4", + "license": "MIT" + }, + "print/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "print/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "print/node_modules/mimer": { + "version": "1.1.1", + "license": "MIT", + "bin": { + "mimer": "bin/mimer" + }, + "engines": { + "node": ">= 6.0" + } + }, + "print/node_modules/mysql2": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.5.0", + "long": "^4.0.0", + "lru-cache": "^5.1.1", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "print/node_modules/named-placeholders": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "lru-cache": "^4.1.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "print/node_modules/named-placeholders/node_modules/lru-cache": { + "version": "4.1.5", + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "print/node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "license": "ISC" + }, + "print/node_modules/nanoid": { + "version": "3.3.4", + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "print/node_modules/nice-try": { + "version": "1.0.5", + "license": "MIT" + }, + "print/node_modules/nodemailer": { + "version": "4.7.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "print/node_modules/nth-check": { + "version": "1.0.2", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "print/node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "print/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "print/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "print/node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "print/node_modules/path-key": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "print/node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "print/node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "print/node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "print/node_modules/pngjs": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "print/node_modules/postcss": { + "version": "8.4.17", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "print/node_modules/pseudomap": { + "version": "1.0.2", + "license": "ISC" + }, + "print/node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "print/node_modules/punycode": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "print/node_modules/qrcode": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "print/node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "print/node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "print/node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "print/node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "print/node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/require-main-filename": { + "version": "2.0.0", + "license": "ISC" + }, + "print/node_modules/resolve": { + "version": "1.22.1", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "print/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "print/node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "print/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "print/node_modules/seq-queue": { + "version": "0.0.5" + }, + "print/node_modules/serialize-javascript": { + "version": "6.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "print/node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" + }, + "print/node_modules/shebang-command": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/shebang-regex": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/slick": { + "version": "1.12.2", + "license": "MIT (http://mootools.net/license.txt)", + "engines": { + "node": "*" + } + }, + "print/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/source-map-js": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "print/node_modules/sqlstring": { + "version": "2.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "print/node_modules/sshpk": { + "version": "1.17.0", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/strftime": { + "version": "0.10.1", + "license": "MIT", + "engines": { + "node": ">=0.2.0" + } + }, + "print/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "print/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "print/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "print/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "print/node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "print/node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "print/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "print/node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "print/node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "print/node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "print/node_modules/valid-data-url": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "print/node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "print/node_modules/vue": { + "version": "2.7.10", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "2.7.10", + "csstype": "^3.1.0" + } + }, + "print/node_modules/vue-i18n": { + "version": "8.27.2", + "license": "MIT" + }, + "print/node_modules/vue-server-renderer": { + "version": "2.7.10", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "hash-sum": "^2.0.0", + "he": "^1.2.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.22.0", + "serialize-javascript": "^6.0.0", + "source-map": "0.5.6" + } + }, + "print/node_modules/vue-server-renderer/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "print/node_modules/vue-server-renderer/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "print/node_modules/vue-server-renderer/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "print/node_modules/vue-server-renderer/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "print/node_modules/vue-server-renderer/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "print/node_modules/vue-server-renderer/node_modules/source-map": { + "version": "0.5.6", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "print/node_modules/vue-server-renderer/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/web-resource-inliner": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "async": "^3.1.0", + "chalk": "^2.4.2", + "datauri": "^2.0.0", + "htmlparser2": "^4.0.0", + "lodash.unescape": "^4.0.1", + "request": "^2.88.0", + "safer-buffer": "^2.1.2", + "valid-data-url": "^2.0.0", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "print/node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "print/node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "print/node_modules/web-resource-inliner/node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "print/node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "print/node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "print/node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "print/node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "print/node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "print/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "print/node_modules/which-module": { + "version": "2.0.0", + "license": "ISC" + }, + "print/node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "print/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "print/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "print/node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "print/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "print/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "print/node_modules/yargs": { + "version": "15.4.1", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "print/node_modules/yargs-parser": { + "version": "18.1.3", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@ampproject/remapping": { "version": "2.1.2", diff --git a/package.json b/package.json index 484deee20..4b4f552ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "23.14.01", + "version": "23.20.01", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", @@ -39,7 +39,6 @@ "mailparser": "^2.8.0", "md5": "^2.2.1", "node-ssh": "^11.0.0", - "npm": "^8.19.4", "object-diff": "0.0.4", "object.pick": "^1.3.0", "puppeteer": "^18.0.5", diff --git a/print/core/components/report-footer/assets/css/style.css b/print/core/components/report-footer/assets/css/style.css index 9727e6f8f..b260c1b9f 100644 --- a/print/core/components/report-footer/assets/css/style.css +++ b/print/core/components/report-footer/assets/css/style.css @@ -4,6 +4,7 @@ margin-right: 2cm; font-size: 10px; color: #555; + width: 100%; zoom: 0.65 } diff --git a/print/core/components/report-footer/locale/en.yml b/print/core/components/report-footer/locale/en.yml index 3899f8b98..8ca14b4d7 100644 --- a/print/core/components/report-footer/locale/en.yml +++ b/print/core/components/report-footer/locale/en.yml @@ -1,8 +1 @@ -numPages: Page of -law: - privacy: 'In compliance with the provisions of Organic Law 15/1999, on the - Protection of Personal Data, we inform you that the personal data you provide - will be included in automated files of VERDNATURA LEVANTE SL, being able at all - times to exercise the rights of access, rectification, cancellation and opposition, - communicating it in writing to the registered office of the entity. - The purpose of the file is administrative management, accounting, and billing.' +numPages: Page of \ No newline at end of file diff --git a/print/core/components/report-footer/locale/es.yml b/print/core/components/report-footer/locale/es.yml index 985c1e17a..5ac6544ad 100644 --- a/print/core/components/report-footer/locale/es.yml +++ b/print/core/components/report-footer/locale/es.yml @@ -1,8 +1 @@ -numPages: Página de -law: - privacy: En cumplimiento de lo dispuesto en la Ley Orgánica 15/1999, de Protección - de Datos de Carácter Personal, le comunicamos que los datos personales que facilite - se incluirán en ficheros automatizados de VERDNATURA LEVANTE S.L., pudiendo en - todo momento ejercitar los derechos de acceso, rectificación, cancelación y oposición, - comunicándolo por escrito al domicilio social de la entidad. La finalidad del - fichero es la gestión administrativa, contabilidad, y facturación. +numPages: Página de \ No newline at end of file diff --git a/print/core/components/report-footer/locale/fr.yml b/print/core/components/report-footer/locale/fr.yml index 861ee5684..6fb644b2c 100644 --- a/print/core/components/report-footer/locale/fr.yml +++ b/print/core/components/report-footer/locale/fr.yml @@ -1,8 +1 @@ numPages: Page de -law: - privacy: Conformément aux dispositions de la loi organique 15/1999 sur la protection - des données personnelles, nous vous informons que les données personnelles que - vous fournissez seront incluses dans des dossiers. VERDNATURA LEVANTE S.L., vous - pouvez à tout moment, exercer les droits d'accès, de rectification, d'annulation - et d'opposition, en communiquant par écrit au siège social de la société. Le dossier - a pour objet la gestion administrative, la comptabilité et la facturation. diff --git a/print/core/components/report-footer/locale/pt.yml b/print/core/components/report-footer/locale/pt.yml index 1c343bb4c..9354ba3e9 100644 --- a/print/core/components/report-footer/locale/pt.yml +++ b/print/core/components/report-footer/locale/pt.yml @@ -1,8 +1 @@ numPages: Página de -law: - privacy: Em cumprimento do disposto na lei Orgânica 15/1999, de Protecção de Dados - de Carácter Pessoal, comunicamos que os dados pessoais que facilite se incluirão - nos ficheiros automatizados de VERDNATURA LEVANTE S.L., podendo em todo momento - exercer os direitos de acesso, rectificação, cancelação e oposição, comunicando - por escrito ao domicílio social da entidade. A finalidade do ficheiro é a gestão - administrativa, contabilidade e facturação. diff --git a/print/core/components/report-footer/report-footer.html b/print/core/components/report-footer/report-footer.html index 1af8df4d4..67b5f3cd0 100644 --- a/print/core/components/report-footer/report-footer.html +++ b/print/core/components/report-footer/report-footer.html @@ -5,6 +5,11 @@
{{centerText}}
-

+

+

+ + diff --git a/print/core/components/report-footer/report-footer.js b/print/core/components/report-footer/report-footer.js index 1ba36b1d7..077ef0bde 100755 --- a/print/core/components/report-footer/report-footer.js +++ b/print/core/components/report-footer/report-footer.js @@ -1,4 +1,18 @@ +/* eslint-disable no-tabs */ +const db = require('../../database'); + module.exports = { name: 'report-footer', - props: ['leftText', 'centerText'] + async serverPrefetch() { + this.company = await db.findOne(` + SELECT IFNULL(ci.footnotes, cl.footnotes) as footnotes + FROM company c + LEFT JOIN companyL10n cl ON c.id = cl.id + LEFT JOIN companyI18n ci ON ci.companyFk = cl.id + AND ci.lang = (SELECT lang FROM account.user where id = ?) + WHERE c.code = ?`, + [this.recipientId, this.companyCode]); + }, + + props: ['leftText', 'companyCode', 'recipientId', 'centerText'] }; diff --git a/print/core/components/report-header/report-header.html b/print/core/components/report-header/report-header.html index 0479e5caf..22f2068e2 100644 --- a/print/core/components/report-header/report-header.html +++ b/print/core/components/report-header/report-header.html @@ -8,7 +8,7 @@ {{companyName}}. {{company.street}}. {{company.postCode}} {{company.city}}. ☎ {{companyPhone}} - · {{$t('company.contactData')}} + · {{company.web}} - {{company.email}}
CIF: {{fiscalAddress.nif}} {{fiscalAddress.register}}
diff --git a/print/core/components/report-header/report-header.js b/print/core/components/report-header/report-header.js index 50c3a1337..d85e2c836 100755 --- a/print/core/components/report-header/report-header.js +++ b/print/core/components/report-header/report-header.js @@ -43,7 +43,9 @@ module.exports = { s.postCode, s.city, s.phone, - cg.code AS groupName + cg.code AS groupName, + c.email, + c.web FROM company c JOIN companyGroup cg ON cg.id = c.companyGroupFk JOIN supplier s ON s.id = c.id diff --git a/print/templates/email/client-welcome/locale/es.yml b/print/templates/email/client-welcome/locale/es.yml index 478fd242c..1f3ef3704 100644 --- a/print/templates/email/client-welcome/locale/es.yml +++ b/print/templates/email/client-welcome/locale/es.yml @@ -24,9 +24,11 @@ sections: dicho stock puede variar en función de la fecha seleccionada al configurar el pedido. Es importante CONFIRMAR los pedidos para que la mercancía quede reservada. delivery: El reparto se realiza de lunes a sábado según la zona en la que te encuentres. - Por regla general, los pedidos que se entregan por agencia, deben estar confirmados - y pagados antes de las 17h del día en que se preparan (el día anterior a recibirlos), - aunque esto puede variar si el pedido se envía a través de nuestro reparto y + Los pedidos que se entregan por agencia o por reparto Verdnatura deben estar confirmados y pagados + antes del cierre de la correspondiente ruta el mismo día de preparación del pedido. Este horario + puede variar mucho en función de la ruta y del volumen de pedidos para ese día, por lo que es + recomendable no apurar el tiempo y dejar todo listo a primera hora del día de preparación del pedido. + Aunque esto puede variar si el pedido se envía a través de nuestro reparto y según la zona. howToPay: title: Cómo pagar diff --git a/print/templates/email/client-welcome/locale/fr.yml b/print/templates/email/client-welcome/locale/fr.yml new file mode 100644 index 000000000..be064d80d --- /dev/null +++ b/print/templates/email/client-welcome/locale/fr.yml @@ -0,0 +1,51 @@ +subject: Bienvenue chez Verdnatura +title: "Nous vous souhaitons la bienvenue!" +dearClient: Cher client +clientData: 'Vos données pour pouvoir acheter sur le site de Verdnatura (https://shop.verdnatura.es) + ou sur nos applications pour iOS et Android, sont' +clientId: Identifiant du client +user: Utilisateur +password: Mot de passe +passwordResetText: Cliquez sur "Vous avez oublié votre mot de passe?" +sections: + howToBuy: + title: Comment passer une commande + description: 'Pour passer une commande sur notre site, vous devez configurer celle-ci en indiquant :' + requeriments: + - Si vous souhaitez recevoir la commande (par agence ou par notre propre livraison) + ou si vous préférez la récupérer dans l'un de nos entrepôts. + - La date à laquelle vous souhaitez recevoir la commande (elle sera préparée la veille). + - L'adresse de livraison ou l'entrepôt où vous souhaitez récupérer la commande. + stock: Sur notre site et nos applications, vous pouvez visualiser le stock disponible de + fleurs coupées, feuillages, plantes, accessoires et artificiels. Veuillez noter que ce + stock peut varier en fonction de la date sélectionnée lors de la configuration de la + commande. Il est important de CONFIRMER les commandes pour que la marchandise soit réservée. + delivery: La livraison est effectuée du lundi au samedi selon la zone dans laquelle vous + vous trouvez. Les commandes livrées par agence ou par notre propre livraison doivent + être confirmées et payées avant la fermeture de la route correspondante le jour même + de la préparation de la commande. Cet horaire peut varier considérablement en fonction + de la route et du volume de commandes pour cette journée, il est donc recommandé de ne + pas attendre la dernière minute et de tout préparer tôt le matin le jour de la + préparation de la commande. Cela peut toutefois varier si la commande est envoyée par + notre propre livraison et en fonction de la zone. + howToPay: + title: Comment payer + description: 'Les moyens de paiement acceptés chez Verdnatura sont les suivants :' + options: + - Par carte de crédit via notre plateforme web (lors de la confirmation de la commande). + - Par virement bancaire mensuel, modalité à demander et à gérer. + toConsider: + title: Choses à prendre en compte + description: Verdnatura vend EXCLUSIVEMENT aux professionnels, vous devez donc nous envoyer + le modèle 036 ou 037 pour vérifier que vous êtes bien inscrit dans la catégorie du commerce de fleurs. + claimsPolicy: + title: POLITIQUE DE RÉCLAMATION + description: Verdnatura acceptera les réclamations effectuées dans les deux jours civils suivant + la réception de la commande (y compris le jour même de la réception). Passé ce délai, aucune réclamation ne sera acceptée. +help: Si vous avez des questions, n'hésitez pas à nous contacter, nous sommes là pour vous aider ! +salesPersonName: Je suis votre commercial et mon nom est +salesPersonPhone: Téléphone et Whatsapp +salesPersonEmail: Adresse e-mail diff --git a/print/templates/email/client-welcome/locale/pt.yml b/print/templates/email/client-welcome/locale/pt.yml new file mode 100644 index 000000000..a03b2f848 --- /dev/null +++ b/print/templates/email/client-welcome/locale/pt.yml @@ -0,0 +1,50 @@ +subject: Bem-Vindo à Verdnatura +title: "Damos-te as boas-vindas!" +dearClient: Estimado cliente +clientData: 'seus dados para poder comprar na loja online da Verdnatura (https://shop.verdnatura.es) +ou em nossos aplicativos para iOS +e Android, são' +clientId: Identificador de cliente +user: Utilizador +password: Palavra-passe +passwordResetText: Clique em 'Esqueceu a sua palavra-passe?' +sections: + howToBuy: + title: Como fazer uma encomenda + description: 'Para realizar uma encomenda no nosso site, deves configurá-la indicando:' + requeriments: + - Se queres receber a encomenda (por agência ou o nosso próprio transporte) ou se preferes levantá-lo em algum dos nossos armazéns. + - A data que queres receber a encomenda (se preparará no dia anterior). + - A morada de entrega ou armazém aonde queres levantar a encomenda. + stock: No nosso site e apps podes visualizar o estoque disponível de + flor-de-corte, verduras, plantas, acessórios e artificial. Tenha presente que + dito estoque pode variar em função da data escolhida ao configurar a + encomenda. É importante confirmar as encomendas para que a mercadoria fique reservada. + delivery: O transporte se realiza de terça a sabado. As encomendas que se entreguem por agências ou transporte Verdnatura, devem estar confirmadas e pagas até + antes do horário de encerre da correspondente rota do dia de preparação da mesma. Este horario + pode variar muito em função da rota e o volume de encomendas deste dia, pelo qual é + recomendável não esperar à última hora e deixar tudo pronto à primeira hora do dia de preparação. Ainda que isto possa variar se a encomenda se envia através do nosso transporte + dependendo da zona. + howToPay: + title: Como pagar + description: 'As formas de pagamentos admitidas na Verdnatura são:' + options: + - Com cartão através da plataforma de pagamentos (ao confirmar a encomenda ou entrando em Encomendas > Confirmadas). + - Mediante débito automatico mensual, modalidade que deve-se solicitar e tramitar. + toConsider: + title: Coisas a ter em conta + description: A Verdnatura vende EXCLUSIVAMENTE a profissionais, pelo qual deves + remetir-nos o documento de Inicio de Actividade, para comprobar-mos que o vosso CAE + esteja relacionado com o mundo das flores. + claimsPolicy: + title: POLÍTICA DE RECLAMAÇÕES + description: A Verdnatura aceitará as reclamações que se realizem dentro dos + dois dias naturais seguintes à recepção da encomenda (incluindo o mesmo + dia da receção). Passado este prazo não se aceitará nenhuma reclamação. +help: Qualquer dúvida que lhe surja, não hesite em consultá-la estamos + para atender-te! +salesPersonName: Sou o seu asesor comercial e o meu nome é +salesPersonPhone: Telemovel e whatsapp +salesPersonEmail: Correio eletrônico + diff --git a/print/templates/email/greuge-wrong/assets/css/import.js b/print/templates/email/greuge-wrong/assets/css/import.js new file mode 100644 index 000000000..89b2afaa5 --- /dev/null +++ b/print/templates/email/greuge-wrong/assets/css/import.js @@ -0,0 +1,11 @@ +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); + +module.exports = new Stylesheet([ + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`]) + .mergeStyles(); \ No newline at end of file diff --git a/print/templates/email/greuge-wrong/greuge-wrong.html b/print/templates/email/greuge-wrong/greuge-wrong.html new file mode 100644 index 000000000..336007122 --- /dev/null +++ b/print/templates/email/greuge-wrong/greuge-wrong.html @@ -0,0 +1,15 @@ + +
+
+

{{ $t('total') }}: {{tickets.length}}

+
+
+
+

{{ $t('ticketId') }}: {{ticket.ticketId}}

+

{{ $t('clientId') }}: {{ticket.clientId}}

+

{{ $t('description') }}: {{ticket.description}}

+

{{ $t('amount') }}: {{ticket.amount}} €

+
+
+
+
\ No newline at end of file diff --git a/print/templates/email/greuge-wrong/greuge-wrong.js b/print/templates/email/greuge-wrong/greuge-wrong.js new file mode 100644 index 000000000..2aa3d50a7 --- /dev/null +++ b/print/templates/email/greuge-wrong/greuge-wrong.js @@ -0,0 +1,36 @@ +const Component = require(`vn-print/core/component`); +const emailBody = new Component('email-body'); +const models = require('vn-loopback/server/server').models; + +module.exports = { + name: 'greuge-wrong', + async serverPrefetch() { + this.url = await this.salixUrl(); + + if (!this.url) + throw new Error('Something went wrong'); + }, + components: { + 'email-body': emailBody.build(), + }, + methods: { + async salixUrl() { + const salix = await models.Url.findOne({ + where: { + appName: 'salix', + environment: process.env.NODE_ENV || 'dev' + } + }); + return salix.url; + }, + clientGreugeUrl(clientId) { + return `${this.url}client/${clientId}/greuge/index` + }, + }, + props: { + tickets: { + type: Array, + required: true + }, + }, +}; \ No newline at end of file diff --git a/print/templates/email/greuge-wrong/locale/en.yml b/print/templates/email/greuge-wrong/locale/en.yml new file mode 100644 index 000000000..0ace99c36 --- /dev/null +++ b/print/templates/email/greuge-wrong/locale/en.yml @@ -0,0 +1,6 @@ +subject: Abnormal greuges have been created +total: Total number of abnormal greuges +ticketId: Ticket +clientId: Client +description: Description +amount: Amount \ No newline at end of file diff --git a/print/templates/email/greuge-wrong/locale/es.yml b/print/templates/email/greuge-wrong/locale/es.yml new file mode 100644 index 000000000..fd2397182 --- /dev/null +++ b/print/templates/email/greuge-wrong/locale/es.yml @@ -0,0 +1,6 @@ +subject: Se han creado greuges anormales +total: Número total de greuges anormales +ticketId: Ticket +clientId: Cliente +description: Descipción +amount: Importe \ No newline at end of file diff --git a/print/templates/email/printer-setup/locale/es.yml b/print/templates/email/printer-setup/locale/es.yml index f47592fcf..b96d6d5f4 100644 --- a/print/templates/email/printer-setup/locale/es.yml +++ b/print/templates/email/printer-setup/locale/es.yml @@ -17,9 +17,10 @@ sections: title: Utilización de GoLabel description: Para utilizar el programa de impresión de cintas sigue estos pasos steps: + - Adjunto a este correo tenemos el 'model.ezp' (la plantilla de cintas de corona estandar), descárgalo y seguramente lo tengas en la carpeta 'Descargas' - Abre el programa GoLabel - Haz clic en el icono de la barra superior con forma de carpeta con una hoja. - - Selecciona el archivo llamado 'model.ezp'(que seguramente este en 'Descargas') adjunto en este correo, haz clic en abrir. + - Selecciona el archivo llamado 'model.ezp'(que seguramente este en 'Descargas'), haz clic en abrir. - Una vez abierto el archivo, haz doble click sobre el texto, en el cuadro que nos sale pulse donde esta el texto de ejemplo (En este caso "TUS HERMANOS") y nos saldra en ese mismo recuadro a la parte izquierda para editarlo y escribir lo que quiera. - Cuando ya tenga el texto que desee pulse en el boton 'OK'. - Ve a 'Archivo' → 'Guardar Como' y guárdelo en el escritorio en el escritorio con otro nombre. diff --git a/print/templates/email/receipt/assets/css/import.js b/print/templates/email/receipt/assets/css/import.js new file mode 100644 index 000000000..4b4bb7086 --- /dev/null +++ b/print/templates/email/receipt/assets/css/import.js @@ -0,0 +1,11 @@ +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); + +module.exports = new Stylesheet([ + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`]) + .mergeStyles(); diff --git a/print/templates/email/receipt/attachments.json b/print/templates/email/receipt/attachments.json new file mode 100644 index 000000000..9930596e0 --- /dev/null +++ b/print/templates/email/receipt/attachments.json @@ -0,0 +1,6 @@ +[ + { + "filename": "receipt.pdf", + "component": "receipt" + } +] diff --git a/print/templates/email/receipt/locale/es.yml b/print/templates/email/receipt/locale/es.yml new file mode 100644 index 000000000..95883afaa --- /dev/null +++ b/print/templates/email/receipt/locale/es.yml @@ -0,0 +1,5 @@ +subject: Recibo +title: Recibo +dear: Estimado cliente +description: Ya está disponible el recibo {0}.
+ Puedes descargarlo haciendo clic en el adjunto de este correo. diff --git a/print/templates/email/receipt/receipt.html b/print/templates/email/receipt/receipt.html new file mode 100644 index 000000000..734552014 --- /dev/null +++ b/print/templates/email/receipt/receipt.html @@ -0,0 +1,9 @@ + +
+
+

{{ $t('title') }}

+

{{$t('dear')}},

+

+
+
+
diff --git a/print/templates/email/receipt/receipt.js b/print/templates/email/receipt/receipt.js new file mode 100755 index 000000000..606534f4d --- /dev/null +++ b/print/templates/email/receipt/receipt.js @@ -0,0 +1,15 @@ +const Component = require(`vn-print/core/component`); +const emailBody = new Component('email-body'); + +module.exports = { + name: 'receipt', + components: { + 'email-body': emailBody.build(), + }, + props: { + id: { + type: Number, + required: true + } + } +}; diff --git a/print/templates/email/weekly-hour-record/locale/en.yml b/print/templates/email/weekly-hour-record/locale/en.yml index 817e5451e..b76372fb9 100644 --- a/print/templates/email/weekly-hour-record/locale/en.yml +++ b/print/templates/email/weekly-hour-record/locale/en.yml @@ -1,6 +1,7 @@ subject: Weekly time log title: Record of hours week {0} year {1} dear: Dear worker -description: Access the following link:

- {0}

+Acceda al siguiente enlace: Access the following link:
+description: Click 'SATISFIED' if you agree with the hours worked. Otherwise, press 'NOT SATISFIED', detailing the cause of the disagreement. +Hours: Hours \ No newline at end of file diff --git a/print/templates/email/weekly-hour-record/locale/es.yml b/print/templates/email/weekly-hour-record/locale/es.yml index b70862f16..95466addb 100644 --- a/print/templates/email/weekly-hour-record/locale/es.yml +++ b/print/templates/email/weekly-hour-record/locale/es.yml @@ -1,6 +1,7 @@ subject: Registro de horas semanal title: Registro de horas semana {0} año {1} dear: Estimado trabajador -description: Acceda al siguiente enlace:

- {0}

+toaccess: Acceda al siguiente enlace:
+description: Pulse 'CONFORME' si esta de acuerdo con las horas trabajadas. En caso contrario pulse 'NO CONFORME', detallando la causa de la disconformidad. +Hours: Horas \ No newline at end of file diff --git a/print/templates/email/weekly-hour-record/weekly-hour-record.html b/print/templates/email/weekly-hour-record/weekly-hour-record.html index 84abb4c61..b1eb4e0b3 100644 --- a/print/templates/email/weekly-hour-record/weekly-hour-record.html +++ b/print/templates/email/weekly-hour-record/weekly-hour-record.html @@ -3,7 +3,9 @@

{{ $t('title', [week, year]) }}

{{$t('dear')}},

-

+

+ +

{{$t('description')}}

diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index 5d362dea9..ddf0e9b5d 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -77,16 +77,6 @@
-
-
-
-
-

{{$t('notes')}}

-
{{entry.notes}}
-
-
-
-
diff --git a/print/templates/reports/invoice/invoice.js b/print/templates/reports/invoice/invoice.js index 42988113f..1c9965d3b 100755 --- a/print/templates/reports/invoice/invoice.js +++ b/print/templates/reports/invoice/invoice.js @@ -11,8 +11,12 @@ module.exports = { this.client = await this.findOneFromDef('client', [this.reference]); this.taxes = await this.rawSqlFromDef(`taxes`, [this.reference]); this.hasIntrastat = await this.findValueFromDef(`hasIntrastat`, [this.reference]); - this.intrastat = await this.rawSqlFromDef(`intrastat`, - [this.reference, this.reference, this.reference, this.reference]); + this.intrastat = await this.rawSqlFromDef(`intrastat`, [ + this.reference, + this.reference, + this.reference, + this.reference + ]); this.rectified = await this.rawSqlFromDef(`rectified`, [this.reference]); this.hasIncoterms = await this.findValueFromDef(`hasIncoterms`, [this.reference]); diff --git a/print/templates/reports/invoice/sql/invoice.sql b/print/templates/reports/invoice/sql/invoice.sql index 0f12e4f53..303fa937f 100644 --- a/print/templates/reports/invoice/sql/invoice.sql +++ b/print/templates/reports/invoice/sql/invoice.sql @@ -11,7 +11,7 @@ FROM invoiceOut io JOIN client c ON c.id = io.clientFk JOIN payMethod pm ON pm.id = c.payMethodFk JOIN company cny ON cny.id = io.companyFk - JOIN supplierAccount sa ON sa.id = cny.supplierAccountFk + LEFT JOIN supplierAccount sa ON sa.id = cny.supplierAccountFk LEFT JOIN invoiceOutSerial ios ON ios.code = io.serial LEFT JOIN ticket t ON t.refFk = io.ref WHERE t.refFk = ? \ No newline at end of file diff --git a/print/templates/reports/invoiceIn/invoiceIn.html b/print/templates/reports/invoiceIn/invoiceIn.html index 22988b654..8f072947f 100644 --- a/print/templates/reports/invoiceIn/invoiceIn.html +++ b/print/templates/reports/invoiceIn/invoiceIn.html @@ -19,7 +19,7 @@ {{$t('date')}} - {{formatDate(invoice.created, '%d-%m-%Y')}} + {{formatDate(invoice.issued, '%d-%m-%Y')}} diff --git a/print/templates/reports/invoiceIn/sql/invoice.sql b/print/templates/reports/invoiceIn/sql/invoice.sql index eea8e81a5..dae979011 100644 --- a/print/templates/reports/invoiceIn/sql/invoice.sql +++ b/print/templates/reports/invoiceIn/sql/invoice.sql @@ -1,7 +1,7 @@ SELECT i.supplierRef, s.id supplierId, - i.created, + i.issued, s.name, s.street AS postalAddress, s.nif,