From d88679f854e82c2c358df30d791cf632ea3569d9 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 10 Feb 2023 16:48:47 -0600 Subject: [PATCH 01/37] first steps for the generation of the event table together with its services --- src/app.module.ts | 6 ++++-- src/events/event.entity.ts | 18 +++++++++++++++++ src/events/events.controller.ts | 35 +++++++++++++++++++++++++++++++++ src/events/events.service.ts | 6 ++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/events/event.entity.ts create mode 100644 src/events/events.controller.ts create mode 100644 src/events/events.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index 8662803..ad4b079 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; +import { EventsController } from './events/events.controller'; +import { EventsService } from './events/events.service'; @Module({ imports: [], - controllers: [AppController], - providers: [AppService], + controllers: [AppController, EventsController], + providers: [AppService, EventsService], }) export class AppModule {} diff --git a/src/events/event.entity.ts b/src/events/event.entity.ts new file mode 100644 index 0000000..9079d51 --- /dev/null +++ b/src/events/event.entity.ts @@ -0,0 +1,18 @@ +export class event { + //evento_identificador:string + id_event: number //id_evento + event_name: string //nombre + desciption:string //descripcion + start_date:Date //fecha_inicio + end_date:Date //fecha_fin + regitration_deadline:Date //fecha_limite_inscripcionme + schedule:Date //horarior + requirements: string + modality: string //modalidad + place: string //lugar + registration_fee: string //cuota_inscripcionl + sponsor: string //patrocinador + type_acreditation: string //tipo_acreditacion + event_type: string //tipo_evento + state: boolean //estado +} \ No newline at end of file diff --git a/src/events/events.controller.ts b/src/events/events.controller.ts new file mode 100644 index 0000000..ca542db --- /dev/null +++ b/src/events/events.controller.ts @@ -0,0 +1,35 @@ +import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post } from '@nestjs/common'; + +@Controller('events') +export class EventsController { + @Get() + getEvents(): string{ + return "Aqui irán los eventos" + } + +/* @Get(':id') + getEvent(@Param() params){ + return `El evento que estamos llamando es: ${params.id}` + } */ + + @Get(':id') + getEvent(@Param('id') id: string): string{ + return `El evento que estamos llamando es: ${id}` + } + + @Post() +/* @HttpCode(HttpStatus.NO_CONTENT) esta linea es para no teornar nada*/ + createEvent(@Body('message') message: string){ + return `el evento creado es: ${message}` + } + + @Delete(':id') + deleteEvent(@Param('id') id:string): string{ + return `Estamos borrando el evento: ${id}` + } + + @Patch(':id') + updateEvent(@Param('id') id:string, @Body() body){ + return `Actualizando el evento: ${id}` + } +} \ No newline at end of file diff --git a/src/events/events.service.ts b/src/events/events.service.ts new file mode 100644 index 0000000..b9672fc --- /dev/null +++ b/src/events/events.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class EventsService { + +} -- 2.43.0 From bc84b7d63de967447dc64c22b2c1d47df524265a Mon Sep 17 00:00:00 2001 From: jorge alvarado Date: Mon, 13 Feb 2023 13:24:30 -0600 Subject: [PATCH 02/37] creacion de dto para event y algunos servicios --- package-lock.json | 79 ++++++++++++++++++++++++++++++ package.json | 3 ++ src/app.controller.spec.ts | 22 --------- src/app.module.ts | 9 ++-- src/events/dto/create-event.dto.ts | 55 +++++++++++++++++++++ src/events/event.entity.ts | 66 +++++++++++++++++++------ src/events/events.controller.ts | 63 +++++++++++++++--------- src/events/events.module.ts | 10 ++++ src/events/events.service.ts | 69 +++++++++++++++++++++++++- 9 files changed, 307 insertions(+), 69 deletions(-) delete mode 100644 src/app.controller.spec.ts create mode 100644 src/events/dto/create-event.dto.ts create mode 100644 src/events/events.module.ts diff --git a/package-lock.json b/package-lock.json index 3732974..ce38b61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,9 @@ "@nestjs/common": "^9.0.0", "@nestjs/core": "^9.0.0", "@nestjs/platform-express": "^9.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "moment": "^2.29.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0" }, @@ -2087,6 +2090,11 @@ "@types/superagent": "*" } }, + "node_modules/@types/validator": { + "version": "13.7.12", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz", + "integrity": "sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==" + }, "node_modules/@types/yargs": { "version": "17.0.22", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", @@ -3100,6 +3108,21 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/class-validator": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", + "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", + "dependencies": { + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", + "validator": "^13.7.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5896,6 +5919,11 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.10.19", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz", + "integrity": "sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -6179,6 +6207,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8084,6 +8120,14 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -10003,6 +10047,11 @@ "@types/superagent": "*" } }, + "@types/validator": { + "version": "13.7.12", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz", + "integrity": "sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==" + }, "@types/yargs": { "version": "17.0.22", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", @@ -10736,6 +10785,21 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "class-validator": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", + "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", + "requires": { + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", + "validator": "^13.7.0" + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -12841,6 +12905,11 @@ "type-check": "~0.4.0" } }, + "libphonenumber-js": { + "version": "1.10.19", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz", + "integrity": "sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==" + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -13050,6 +13119,11 @@ "minimist": "^1.2.6" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14419,6 +14493,11 @@ } } }, + "validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 3932781..3faac17 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,9 @@ "@nestjs/common": "^9.0.0", "@nestjs/core": "^9.0.0", "@nestjs/platform-express": "^9.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "moment": "^2.29.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0" }, diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts deleted file mode 100644 index d22f389..0000000 --- a/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/src/app.module.ts b/src/app.module.ts index ad4b079..93ffdcb 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,12 +1,11 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; -import { EventsController } from './events/events.controller'; -import { EventsService } from './events/events.service'; +import { eventsModule } from './events/events.module'; @Module({ - imports: [], - controllers: [AppController, EventsController], - providers: [AppService, EventsService], + imports: [eventsModule], + controllers: [AppController], + providers: [AppService], }) export class AppModule {} diff --git a/src/events/dto/create-event.dto.ts b/src/events/dto/create-event.dto.ts new file mode 100644 index 0000000..a992b6e --- /dev/null +++ b/src/events/dto/create-event.dto.ts @@ -0,0 +1,55 @@ +import { IsString } from "class-validator"; +import { IsBoolean, IsDate, IsNumber } from "class-validator"; + +export class CreateEventDto { + @IsNumber() + id_event: number + + @IsString() + event_name: string + + @IsString() + desciption:string + + @IsNumber() + limit: number + + @IsDate() + start_date:Date + + @IsDate() + end_date:Date + + @IsDate() + regitration_deadline:Date + + @IsString() + start_time:string + + @IsString() + end_time:string + + @IsString() + requirements: string + + @IsString() + modality: string + + @IsString() + place: string + + @IsNumber() + registration_fee: number + + @IsString() + sponsor: string + + @IsString() + type_acreditation: string + + @IsString() + event_type: string + + @IsBoolean() + active: boolean +} \ No newline at end of file diff --git a/src/events/event.entity.ts b/src/events/event.entity.ts index 9079d51..4337830 100644 --- a/src/events/event.entity.ts +++ b/src/events/event.entity.ts @@ -1,18 +1,52 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() export class event { - //evento_identificador:string - id_event: number //id_evento - event_name: string //nombre - desciption:string //descripcion - start_date:Date //fecha_inicio - end_date:Date //fecha_fin - regitration_deadline:Date //fecha_limite_inscripcionme - schedule:Date //horarior - requirements: string - modality: string //modalidad - place: string //lugar - registration_fee: string //cuota_inscripcionl - sponsor: string //patrocinador - type_acreditation: string //tipo_acreditacion - event_type: string //tipo_evento - state: boolean //estado + @PrimaryGeneratedColumn() + id_evento: number + + @Column() + evento_identificador: string + + @Column() + nombre: string + + @Column() + fecha_inicio: Date + + @Column() + fecha_fin: Date + + @Column() + horario: string + + @Column() + requisitos: string + + @Column() + modalidad: string + + @Column() + lugar: string + + @Column() + cuota_inscripcion: number + + @Column() + patrocinador: string + + @Column() + tipo_acreditacion: string + + @Column() + fecha_limite_inscripcion: string + + @Column() + tipo_evento: string + + @Column() + estado: boolean + + @Column() + descripcion: string } \ No newline at end of file diff --git a/src/events/events.controller.ts b/src/events/events.controller.ts index ca542db..6edc184 100644 --- a/src/events/events.controller.ts +++ b/src/events/events.controller.ts @@ -1,35 +1,50 @@ -import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + HttpCode, + HttpStatus, + Param, + Patch, + Post, +} from '@nestjs/common'; +import { CreateEventDto } from './dto/create-event.dto'; +import { event } from './event.entity'; +import { EventsService } from './events.service'; @Controller('events') export class EventsController { - @Get() - getEvents(): string{ - return "Aqui irán los eventos" - } + constructor(private readonly eventsServices: EventsService) {} -/* @Get(':id') + @Get() + getEvents(): event[] { + return this.eventsServices.getEvents(); + } + + /* @Get(':id') getEvent(@Param() params){ return `El evento que estamos llamando es: ${params.id}` } */ - @Get(':id') - getEvent(@Param('id') id: string): string{ - return `El evento que estamos llamando es: ${id}` - } + @Get(':id') + getEvent(@Param('id') id: string): event { + return this.eventsServices.getEvent(parseInt(id)); + } - @Post() -/* @HttpCode(HttpStatus.NO_CONTENT) esta linea es para no teornar nada*/ - createEvent(@Body('message') message: string){ - return `el evento creado es: ${message}` - } + @Post() + createEvent(@Body() body: CreateEventDto): string { + this.eventsServices.createEvent(body); + return 'evento creado con exito'; + } - @Delete(':id') - deleteEvent(@Param('id') id:string): string{ - return `Estamos borrando el evento: ${id}` - } + @Delete(':id') + deleteEvent(@Param('id') id: string) { + return this.eventsServices.deleteEvent(parseInt(id)); + } - @Patch(':id') - updateEvent(@Param('id') id:string, @Body() body){ - return `Actualizando el evento: ${id}` - } -} \ No newline at end of file + @Patch(':id') + updateEvent(@Param('id') id: string, @Body() body) { + return `Actualizando el evento: ${id}`; + } +} diff --git a/src/events/events.module.ts b/src/events/events.module.ts new file mode 100644 index 0000000..ce0c450 --- /dev/null +++ b/src/events/events.module.ts @@ -0,0 +1,10 @@ +import { Module } from "@nestjs/common"; +import { EventsController } from "./events.controller"; +import { EventsService } from "./events.service"; + +@Module({ + controllers: [EventsController], + providers: [EventsService], +}) + +export class eventsModule {} diff --git a/src/events/events.service.ts b/src/events/events.service.ts index b9672fc..9190baa 100644 --- a/src/events/events.service.ts +++ b/src/events/events.service.ts @@ -1,6 +1,71 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; +import { event } from './event.entity'; +import * as moment from 'moment'; +import { CreateEventDto } from './dto/create-event.dto'; @Injectable() export class EventsService { - + private events: event[] = [ + { + id_event: 1, //id_evento + event_name: 'Platica de ejemplo', //nombre + desciption: 'Esta platica servira como ejemplo', //descripcion + limit: 30, //limite + start_date: new Date('2023-02-20'), //fecha_inicio + end_date: new Date('2023-02-20'), //fecha_fin + regitration_deadline: new Date('2023-02-19'), //fecha_limite_inscripcionme + start_time: '13:00', //hora de inicio + end_time: '14:00', //hora de fin + requirements: 'Sin requerimientos de hardware ni conocimiento', + modality: 'mixta', //modalidad + place: 'CEDETEC', //lugar + registration_fee: 0.0, //cuota_inscripcionl + sponsor: 'CIDWA', //patrocinador + type_acreditation: 'nose', //tipo_acreditacion + event_type: 'Platica', //tipo_evento + active: true, //estado + } + ]; + + getEvents(): event[]{ + return this.events + } + + getEvent(id: number): event{ + const eventGetting = this.events.find((item) => item.id_event === id); + if(!eventGetting){ + throw new NotFoundException("Evento no encontrado") + } + return eventGetting + } + + createEvent(body: CreateEventDto){ + this.events.push({ + id_event: (Math.floor(Math.random()*20000) + 1 ), + event_name: body.event_name, + desciption: body.desciption, + limit: body.limit, + start_date: body.start_date, + end_date: body.end_date, + regitration_deadline: body.regitration_deadline, + start_time: body.start_time, + end_time: body.end_time, + requirements: body.requirements, + modality: body.modality, + place: body.place, + registration_fee: body.registration_fee, + sponsor: body.sponsor, + type_acreditation: body.type_acreditation, + event_type: body.event_type, + active: body.active, + }) + } + + deleteEvent(id: number){ + const index = this.events.findIndex((event) => event.id_event === id); + if(index >= 0){ + this.events.splice(index, 1) + } + } + } -- 2.43.0 From acf2bb3856c728fa4d1a29d78ec2097a8280b353 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Thu, 16 Feb 2023 16:49:52 -0600 Subject: [PATCH 03/37] se creo el servicio para guardar participantes --- .env | 19 + package-lock.json | 1135 +++++++++++++++-- package.json | 6 +- src/app.module.ts | 32 +- .../dto/registrarParticipanteDto.dto.ts | 22 + .../evento-participante.controller.ts | 15 + .../evento-participante.module.ts | 13 + .../evento-participante.service.ts | 34 + .../eventoParticipante.entity.ts | 20 + src/eventos/dto/actualizarEvento.dto.ts | 31 + src/eventos/dto/crearEvento.dto.ts | 32 + src/eventos/evento.entity.ts | 65 + src/eventos/eventos.controller.ts | 36 + src/eventos/eventos.module.ts | 12 + src/eventos/eventos.service.ts | 37 + src/events/dto/create-event.dto.ts | 55 - src/events/event.entity.ts | 52 - src/events/events.controller.ts | 50 - src/events/events.module.ts | 10 - src/events/events.service.ts | 71 -- src/main.ts | 2 +- src/participante/participante.controller.ts | 5 + src/participante/participante.entity.ts | 44 + src/participante/participante.module.ts | 12 + src/participante/participante.service.ts | 34 + 25 files changed, 1488 insertions(+), 356 deletions(-) create mode 100644 .env create mode 100644 src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts create mode 100644 src/evento-participante/evento-participante/evento-participante.controller.ts create mode 100644 src/evento-participante/evento-participante/evento-participante.module.ts create mode 100644 src/evento-participante/evento-participante/evento-participante.service.ts create mode 100644 src/evento-participante/evento-participante/eventoParticipante.entity.ts create mode 100644 src/eventos/dto/actualizarEvento.dto.ts create mode 100644 src/eventos/dto/crearEvento.dto.ts create mode 100644 src/eventos/evento.entity.ts create mode 100644 src/eventos/eventos.controller.ts create mode 100644 src/eventos/eventos.module.ts create mode 100644 src/eventos/eventos.service.ts delete mode 100644 src/events/dto/create-event.dto.ts delete mode 100644 src/events/event.entity.ts delete mode 100644 src/events/events.controller.ts delete mode 100644 src/events/events.module.ts delete mode 100644 src/events/events.service.ts create mode 100644 src/participante/participante.controller.ts create mode 100644 src/participante/participante.entity.ts create mode 100644 src/participante/participante.module.ts create mode 100644 src/participante/participante.service.ts diff --git a/.env b/.env new file mode 100644 index 0000000..25debad --- /dev/null +++ b/.env @@ -0,0 +1,19 @@ +PORT=5089 + +DB_HOST=localhost +DB_USER=root +DB_PASS=password +DB_NAME=cedetec_proyectos + + +SALT_ROUNDS = 10 + +KEY = +CADUCIDAD_TOKEN = 1800000 + +TOKEN_KEY = +TOKEN_EXPIRATION = 1800000 + + +EMAIL= +EMAIL_PASS= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ce38b61..38f7f1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,17 @@ "license": "UNLICENSED", "dependencies": { "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.1", "@nestjs/core": "^9.0.0", "@nestjs/platform-express": "^9.0.0", + "@nestjs/typeorm": "^9.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "moment": "^2.29.4", + "pg": "^8.9.0", "reflect-metadata": "^0.1.13", - "rxjs": "^7.2.0" + "rxjs": "^7.2.0", + "typeorm": "^0.3.12" }, "devDependencies": { "@nestjs/cli": "^9.0.0", @@ -812,7 +816,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -824,7 +828,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1391,7 +1395,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -1433,7 +1437,7 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", @@ -1544,6 +1548,30 @@ } } }, + "node_modules/@nestjs/config": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.1.tgz", + "integrity": "sha512-Ckzel0NZ9CWhNsLfE1hxfDuxJuEbhQvGxSlmZ1/X8awjRmAA/g3kT6M1+MO1SHj1wMtPyUfd9WpwkiqFbiwQgA==", + "dependencies": { + "dotenv": "16.0.3", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^6.0.0 || ^7.2.0" + } + }, + "node_modules/@nestjs/config/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@nestjs/core": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.7.tgz", @@ -1734,6 +1762,21 @@ } } }, + "node_modules/@nestjs/typeorm": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", + "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", + "dependencies": { + "uuid": "8.3.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1825,29 +1868,34 @@ "@sinonjs/commons": "^2.0.0" } }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "devOptional": true }, "node_modules/@types/babel__core": { "version": "7.20.0", @@ -2023,7 +2071,7 @@ "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true + "devOptional": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2472,7 +2520,7 @@ "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -2502,7 +2550,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -2580,7 +2628,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2599,6 +2646,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2612,6 +2664,14 @@ "node": ">= 8" } }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -2621,13 +2681,12 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -2765,14 +2824,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "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==", - "dev": true, "funding": [ { "type": "github", @@ -2958,6 +3015,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -3135,6 +3200,76 @@ "node": ">=8" } }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/cli-spinners": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", @@ -3175,7 +3310,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -3359,7 +3493,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -3375,11 +3509,22 @@ "node": ">= 8" } }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -3474,7 +3619,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.3.1" } @@ -3512,6 +3657,22 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "engines": { + "node": ">=12" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3538,8 +3699,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -3590,7 +3750,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -4373,8 +4532,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -4408,7 +4566,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4571,6 +4728,14 @@ "node": ">=8" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4616,7 +4781,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -4689,7 +4853,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4818,7 +4981,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -5820,7 +5982,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -5957,8 +6118,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -6065,7 +6225,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -6218,8 +6378,7 @@ "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==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multer": { "version": "1.4.4-lts.1", @@ -6244,6 +6403,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6368,7 +6537,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -6508,6 +6676,11 @@ "node": ">=6" } }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6538,6 +6711,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6593,6 +6784,80 @@ "node": ">=8" } }, + "node_modules/pg": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", + "integrity": "sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -6693,6 +6958,41 @@ "node": ">=4" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6939,7 +7239,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7111,6 +7410,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -7262,6 +7566,18 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7369,6 +7685,14 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7442,7 +7766,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7456,7 +7779,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7688,6 +8010,25 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7837,7 +8178,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -8005,11 +8346,215 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "node_modules/typeorm": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.12.tgz", + "integrity": "sha512-sYSxBmCf1nJLLTcYtwqZ+lQIRtLPyUoO93rHTOKk9vJCyT4UfRtU7oRsJvfvKP3nnZTD1hzz2SEy2zwPEN6OyA==", + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^8.1.0", + "js-yaml": "^4.1.0", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "xml2js": "^0.4.23", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^3.6.0", + "mssql": "^7.3.0", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, + "node_modules/typeorm/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/typeorm/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", + "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8094,11 +8639,19 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "node_modules/v8-to-istanbul": { "version": "9.0.1", @@ -8336,7 +8889,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8352,8 +8904,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -8368,6 +8919,26 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -8380,7 +8951,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -8404,7 +8974,6 @@ "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8422,7 +8991,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -8431,7 +8999,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -9035,7 +9603,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -9044,7 +9612,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -9489,7 +10057,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "devOptional": true }, "@jridgewell/set-array": { "version": "1.1.2", @@ -9524,7 +10092,7 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "@jridgewell/trace-mapping": { "version": "0.3.17", @@ -9600,6 +10168,24 @@ "uid": "2.0.1" } }, + "@nestjs/config": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.1.tgz", + "integrity": "sha512-Ckzel0NZ9CWhNsLfE1hxfDuxJuEbhQvGxSlmZ1/X8awjRmAA/g3kT6M1+MO1SHj1wMtPyUfd9WpwkiqFbiwQgA==", + "requires": { + "dotenv": "16.0.3", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21", + "uuid": "9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, "@nestjs/core": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.7.tgz", @@ -9711,6 +10297,14 @@ "tslib": "2.5.0" } }, + "@nestjs/typeorm": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", + "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", + "requires": { + "uuid": "8.3.2" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -9782,29 +10376,34 @@ "@sinonjs/commons": "^2.0.0" } }, + "@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "devOptional": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "devOptional": true }, "@types/babel__core": { "version": "7.20.0", @@ -9980,7 +10579,7 @@ "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true + "devOptional": true }, "@types/parse-json": { "version": "4.0.0", @@ -10337,7 +10936,7 @@ "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true + "devOptional": true }, "acorn-import-assertions": { "version": "1.8.0", @@ -10357,7 +10956,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "devOptional": true }, "ajv": { "version": "8.12.0", @@ -10406,8 +11005,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -10417,6 +11015,11 @@ "color-convert": "^2.0.1" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -10427,6 +11030,11 @@ "picomatch": "^2.0.4" } }, + "app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" + }, "append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -10436,13 +11044,12 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "1.1.1", @@ -10552,14 +11159,12 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "binary-extensions": { "version": "2.2.0", @@ -10689,6 +11294,11 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -10809,6 +11419,59 @@ "restore-cursor": "^3.1.0" } }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + } + } + }, "cli-spinners": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", @@ -10835,7 +11498,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -10982,7 +11644,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "cross-spawn": { "version": "7.0.3", @@ -10995,11 +11657,15 @@ "which": "^2.0.1" } }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -11067,7 +11733,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "devOptional": true }, "diff-sequences": { "version": "29.4.2", @@ -11093,6 +11759,16 @@ "esutils": "^2.0.2" } }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -11113,8 +11789,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -11158,8 +11833,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -11759,8 +12433,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -11783,8 +12456,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.2.0", @@ -11896,6 +12568,11 @@ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -11931,8 +12608,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.2.4", @@ -11970,7 +12646,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -12073,8 +12748,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -12832,7 +13506,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -12934,8 +13607,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.memoize": { "version": "4.1.2", @@ -13016,7 +13688,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "makeerror": { "version": "1.0.12", @@ -13127,8 +13799,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multer": { "version": "1.4.4-lts.1", @@ -13150,6 +13821,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13245,7 +13926,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -13342,6 +14022,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -13363,6 +14048,26 @@ "lines-and-columns": "^1.1.6" } }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13403,6 +14108,61 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pg": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", + "integrity": "sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "requires": {} + }, + "pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "requires": { + "split2": "^4.1.0" + } + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -13475,6 +14235,29 @@ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13653,8 +14436,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", @@ -13757,6 +14539,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -13888,6 +14675,15 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13972,6 +14768,11 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -14034,7 +14835,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14045,7 +14845,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -14202,6 +15001,22 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -14298,7 +15113,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -14414,11 +15229,93 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "typeorm": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.12.tgz", + "integrity": "sha512-sYSxBmCf1nJLLTcYtwqZ+lQIRtLPyUoO93rHTOKk9vJCyT4UfRtU7oRsJvfvKP3nnZTD1hzz2SEy2zwPEN6OyA==", + "requires": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^8.1.0", + "js-yaml": "^4.1.0", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "xml2js": "^0.4.23", + "yargs": "^17.6.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mkdirp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", + "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, "typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true + "devOptional": true }, "uid": { "version": "2.0.1", @@ -14468,11 +15365,16 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "v8-to-istanbul": { "version": "9.0.1", @@ -14651,7 +15553,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14661,8 +15562,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "4.0.2", @@ -14674,6 +15574,20 @@ "signal-exit": "^3.0.7" } }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -14682,8 +15596,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "3.1.1", @@ -14701,7 +15614,6 @@ "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14715,14 +15627,13 @@ "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "devOptional": true }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index 3faac17..fb738ed 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,17 @@ }, "dependencies": { "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.1", "@nestjs/core": "^9.0.0", "@nestjs/platform-express": "^9.0.0", + "@nestjs/typeorm": "^9.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "moment": "^2.29.4", + "pg": "^8.9.0", "reflect-metadata": "^0.1.13", - "rxjs": "^7.2.0" + "rxjs": "^7.2.0", + "typeorm": "^0.3.12" }, "devDependencies": { "@nestjs/cli": "^9.0.0", diff --git a/src/app.module.ts b/src/app.module.ts index 93ffdcb..902af73 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,11 +1,35 @@ import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ConfigModule, ConfigService } from '@nestjs/config' import { AppController } from './app.controller'; import { AppService } from './app.service'; -import { eventsModule } from './events/events.module'; +import { EventosModule } from './eventos/eventos.module'; +import { ParticipanteController } from './participante/participante.controller'; +import { ParticipanteModule } from './participante/participante.module'; +import { EventoParticipanteModule } from './evento-participante/evento-participante/evento-participante.module'; @Module({ - imports: [eventsModule], - controllers: [AppController], + imports: [ + ConfigModule.forRoot({isGlobal: true}), + TypeOrmModule.forRoot({ + type: 'mariadb', + host: 'localhost', + port: 3306, + username:'root', + password: 'password', + database: 'cedetec_proyectos', + entities: [__dirname + '/**/*.entity{.ts,.js}'], + synchronize: true + }), + EventosModule, + ParticipanteModule, + EventoParticipanteModule], + controllers: [AppController, ParticipanteController], providers: [AppService], }) -export class AppModule {} +export class AppModule { + static port: number + constructor(private readonly configService: ConfigService){ + AppModule.port = this.configService.get('PORT') + } +} diff --git a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts new file mode 100644 index 0000000..ca4ab32 --- /dev/null +++ b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts @@ -0,0 +1,22 @@ +import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; + +export class RegistrarParticipanteDto { + @IsString() + @IsNotEmpty() + nombre: string; + + @IsString() + @IsNotEmpty() + apellido_paterno: string; + + @IsString() + @IsNotEmpty() + apellido_materno: string; + + @IsEmail() + correo: string; + + @IsString() + @IsNotEmpty() + carrera: string; +} diff --git a/src/evento-participante/evento-participante/evento-participante.controller.ts b/src/evento-participante/evento-participante/evento-participante.controller.ts new file mode 100644 index 0000000..d54f2f3 --- /dev/null +++ b/src/evento-participante/evento-participante/evento-participante.controller.ts @@ -0,0 +1,15 @@ +import { Body, Controller, Post } from '@nestjs/common'; +import { RegistrarParticipanteDto } from './dto/registrarParticipanteDto.dto'; +import { EventoParticipanteService } from './evento-participante.service'; + +@Controller('evento-participante') +export class EventoParticipanteController { + constructor(private readonly eventoParticipanteService: EventoParticipanteService){} + + @Post() + regitrarParticipante(@Body() datos: RegistrarParticipanteDto){ + return this.eventoParticipanteService.registrarParticipante(datos) + } + + +} diff --git a/src/evento-participante/evento-participante/evento-participante.module.ts b/src/evento-participante/evento-participante/evento-participante.module.ts new file mode 100644 index 0000000..9888101 --- /dev/null +++ b/src/evento-participante/evento-participante/evento-participante.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Participante } from 'src/participante/participante.entity'; +import { EventoParticipanteController } from './evento-participante.controller'; +import { EventoParticipanteService } from './evento-participante.service'; +import { EventoParticipante } from './eventoParticipante.entity'; + +@Module({ + imports:[TypeOrmModule.forFeature([EventoParticipante,Participante])], + controllers: [EventoParticipanteController], + providers: [EventoParticipanteService] +}) +export class EventoParticipanteModule {} diff --git a/src/evento-participante/evento-participante/evento-participante.service.ts b/src/evento-participante/evento-participante/evento-participante.service.ts new file mode 100644 index 0000000..db861a0 --- /dev/null +++ b/src/evento-participante/evento-participante/evento-participante.service.ts @@ -0,0 +1,34 @@ +import { ConflictException, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; + +import { RegistrarParticipanteDto } from './dto/registrarParticipanteDto.dto'; + +import { Evento } from 'src/eventos/evento.entity'; +import { EventoParticipante } from './eventoParticipante.entity'; +import { Participante } from 'src/participante/participante.entity'; + +@Injectable() +export class EventoParticipanteService { + constructor( + @InjectRepository(Participante) + private participanteRepository: Repository, + ) {} + + participanteExiste(correo: string): Promise { + return this.participanteRepository.findOne({ where: { correo } }); + } + + registrarParticipante(registrarParticipanteDto: RegistrarParticipanteDto) { + return this.participanteExiste(registrarParticipanteDto.correo).then( + (participante) => { + if (participante) { + throw new ConflictException('Este Usuario ya existe'); + } + return this.participanteRepository.save( + this.participanteRepository.create(registrarParticipanteDto) + ); + }, + ); + } +} diff --git a/src/evento-participante/evento-participante/eventoParticipante.entity.ts b/src/evento-participante/evento-participante/eventoParticipante.entity.ts new file mode 100644 index 0000000..55a0059 --- /dev/null +++ b/src/evento-participante/evento-participante/eventoParticipante.entity.ts @@ -0,0 +1,20 @@ +import { Evento } from 'src/eventos/evento.entity'; +import { Entity, JoinColumn, ManyToOne, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm'; +import { Participante } from '../../participante/participante.entity'; + +@Entity() +export class EventoParticipante { + @PrimaryGeneratedColumn() + id_eventoParticipante: number + + @ManyToOne(() => Evento, (evento) => evento.eventoParticipantes) + @JoinColumn({ name: 'id_evento' }) + evento: Evento; + + @ManyToOne( + () => Participante, + (participante) => participante.eventosParticipante, + ) + @JoinColumn({ name: 'id_participante' }) + participante: Participante; +} diff --git a/src/eventos/dto/actualizarEvento.dto.ts b/src/eventos/dto/actualizarEvento.dto.ts new file mode 100644 index 0000000..1f5af31 --- /dev/null +++ b/src/eventos/dto/actualizarEvento.dto.ts @@ -0,0 +1,31 @@ +export class actualizarEventoDto { + nombre?: string + + evento_identificador ?: string + + fecha_inicio?: Date + + fecha_fin?: Date + + horario?: string + + requisitos?: string + + modalidad?: string + + lugar?: string + + cuota_inscripcion ?: number + + patrocinador ?: string + + tipo_acreditacion?: string + + fecha_limite_inscripcion?: Date + + tipo_evento?: string + + estado?: boolean + + descripcion?: string +} \ No newline at end of file diff --git a/src/eventos/dto/crearEvento.dto.ts b/src/eventos/dto/crearEvento.dto.ts new file mode 100644 index 0000000..f55c970 --- /dev/null +++ b/src/eventos/dto/crearEvento.dto.ts @@ -0,0 +1,32 @@ +export class crearEventoDto { + nombre: string + + evento_identificador ?: string + + fecha_inicio: Date + + fecha_fin: Date + + horario: string + + requisitos: string + + modalidad: string + + lugar: string + + cuota_inscripcion ?: number + + patrocinador ?: string + + tipo_acreditacion: string + + fecha_limite_inscripcion: Date + + tipo_evento: string + + estado: boolean + + descripcion: string +} + diff --git a/src/eventos/evento.entity.ts b/src/eventos/evento.entity.ts new file mode 100644 index 0000000..ac307e6 --- /dev/null +++ b/src/eventos/evento.entity.ts @@ -0,0 +1,65 @@ +import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; +import { + Column, + Entity, + JoinColumn, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; + +@Entity() +export class Evento { + @PrimaryGeneratedColumn() + id_evento: number; + + @Column({ nullable: false }) + nombre: string; + + @Column({ nullable: true }) + evento_identificador: string; + + @Column({ nullable: false, type: 'datetime' }) + fecha_inicio: Date; + + @Column({ nullable: false, type: 'datetime' }) + fecha_fin: Date; + + @Column({ nullable: false }) + horario: string; + + @Column({ nullable: false }) + requisitos: string; + + @Column({ nullable: false }) + modalidad: string; + + @Column({ nullable: false }) + lugar: string; + + @Column({ nullable: true }) + cuota_inscripcion: number; + + @Column({ nullable: true }) + patrocinador: string; + + @Column({ nullable: false }) + tipo_acreditacion: string; + + @Column({ nullable: false, type: 'datetime' }) + fecha_limite_inscripcion: Date; + + @Column({ nullable: false }) + tipo_evento: string; + + @Column({ nullable: false }) + estado: boolean; + + @Column({ nullable: false }) + descripcion: string; + + @OneToMany( + () => EventoParticipante, + (eventoParticipante) => eventoParticipante.evento, + ) + eventoParticipantes: EventoParticipante[]; +} diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts new file mode 100644 index 0000000..cae339d --- /dev/null +++ b/src/eventos/eventos.controller.ts @@ -0,0 +1,36 @@ +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post } from '@nestjs/common'; +import { actualizarEventoDto } from './dto/actualizarEvento.dto'; +import { crearEventoDto } from './dto/crearEvento.dto'; +import { Evento } from './evento.entity'; +import { EventosService } from './eventos.service'; + +@Controller('eventos') +export class EventosController { + + constructor(private readonly eventoService: EventosService){} + + @Get() + getEventos(): Promise{ + return this.eventoService.getEventos() + } + + @Get(':id') + getEventosPorId(@Param('id', ParseIntPipe)id: number):Promise{ + return this.eventoService.getEventosPorId(id) + } + + @Post() + postEvento(@Body() nuevoEvento: crearEventoDto): Promise{ + return this.eventoService.postEvento(nuevoEvento) + } + + @Patch(':id') + patchEvento(@Param('id', ParseIntPipe)id:number, @Body() actualizacion: actualizarEventoDto){ + return this.eventoService.updateEvento(id,actualizacion) + } + + @Delete(':id') + deleteEvento(@Param('id', ParseIntPipe)id: number){ + return this.eventoService.deleteEvento(id) + } +} diff --git a/src/eventos/eventos.module.ts b/src/eventos/eventos.module.ts new file mode 100644 index 0000000..21a19a9 --- /dev/null +++ b/src/eventos/eventos.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Evento } from './evento.entity'; +import { EventosController } from './eventos.controller'; +import { EventosService } from './eventos.service'; + +@Module({ + imports:[TypeOrmModule.forFeature([Evento])], + controllers:[EventosController], + providers:[EventosService] +}) +export class EventosModule {} diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts new file mode 100644 index 0000000..4f3c3fd --- /dev/null +++ b/src/eventos/eventos.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { actualizarEventoDto } from './dto/actualizarEvento.dto'; +import { crearEventoDto } from './dto/crearEvento.dto'; +import { Evento } from './evento.entity'; + + +@Injectable() +export class EventosService { + constructor(@InjectRepository(Evento) private eventoRepository: Repository){} + + getEventos(){ + return this.eventoRepository.find() + } + + getEventosPorId(id: number){ + return this.eventoRepository.findOne({ + where:{ + id_evento: id + } + }) + } + + postEvento(evento: crearEventoDto){ + const nuevoEvento = this.eventoRepository.create(evento) + return this.eventoRepository.save(nuevoEvento) + } + + updateEvento(id: number, actualizacion: actualizarEventoDto){ + return this.eventoRepository.update({id_evento: id}, actualizacion) + } + + deleteEvento(id:number){ + return this.eventoRepository.delete({id_evento:id}) + } +} diff --git a/src/events/dto/create-event.dto.ts b/src/events/dto/create-event.dto.ts deleted file mode 100644 index a992b6e..0000000 --- a/src/events/dto/create-event.dto.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { IsString } from "class-validator"; -import { IsBoolean, IsDate, IsNumber } from "class-validator"; - -export class CreateEventDto { - @IsNumber() - id_event: number - - @IsString() - event_name: string - - @IsString() - desciption:string - - @IsNumber() - limit: number - - @IsDate() - start_date:Date - - @IsDate() - end_date:Date - - @IsDate() - regitration_deadline:Date - - @IsString() - start_time:string - - @IsString() - end_time:string - - @IsString() - requirements: string - - @IsString() - modality: string - - @IsString() - place: string - - @IsNumber() - registration_fee: number - - @IsString() - sponsor: string - - @IsString() - type_acreditation: string - - @IsString() - event_type: string - - @IsBoolean() - active: boolean -} \ No newline at end of file diff --git a/src/events/event.entity.ts b/src/events/event.entity.ts deleted file mode 100644 index 4337830..0000000 --- a/src/events/event.entity.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; - -@Entity() -export class event { - @PrimaryGeneratedColumn() - id_evento: number - - @Column() - evento_identificador: string - - @Column() - nombre: string - - @Column() - fecha_inicio: Date - - @Column() - fecha_fin: Date - - @Column() - horario: string - - @Column() - requisitos: string - - @Column() - modalidad: string - - @Column() - lugar: string - - @Column() - cuota_inscripcion: number - - @Column() - patrocinador: string - - @Column() - tipo_acreditacion: string - - @Column() - fecha_limite_inscripcion: string - - @Column() - tipo_evento: string - - @Column() - estado: boolean - - @Column() - descripcion: string -} \ No newline at end of file diff --git a/src/events/events.controller.ts b/src/events/events.controller.ts deleted file mode 100644 index 6edc184..0000000 --- a/src/events/events.controller.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - HttpCode, - HttpStatus, - Param, - Patch, - Post, -} from '@nestjs/common'; -import { CreateEventDto } from './dto/create-event.dto'; -import { event } from './event.entity'; -import { EventsService } from './events.service'; - -@Controller('events') -export class EventsController { - constructor(private readonly eventsServices: EventsService) {} - - @Get() - getEvents(): event[] { - return this.eventsServices.getEvents(); - } - - /* @Get(':id') - getEvent(@Param() params){ - return `El evento que estamos llamando es: ${params.id}` - } */ - - @Get(':id') - getEvent(@Param('id') id: string): event { - return this.eventsServices.getEvent(parseInt(id)); - } - - @Post() - createEvent(@Body() body: CreateEventDto): string { - this.eventsServices.createEvent(body); - return 'evento creado con exito'; - } - - @Delete(':id') - deleteEvent(@Param('id') id: string) { - return this.eventsServices.deleteEvent(parseInt(id)); - } - - @Patch(':id') - updateEvent(@Param('id') id: string, @Body() body) { - return `Actualizando el evento: ${id}`; - } -} diff --git a/src/events/events.module.ts b/src/events/events.module.ts deleted file mode 100644 index ce0c450..0000000 --- a/src/events/events.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from "@nestjs/common"; -import { EventsController } from "./events.controller"; -import { EventsService } from "./events.service"; - -@Module({ - controllers: [EventsController], - providers: [EventsService], -}) - -export class eventsModule {} diff --git a/src/events/events.service.ts b/src/events/events.service.ts deleted file mode 100644 index 9190baa..0000000 --- a/src/events/events.service.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { event } from './event.entity'; -import * as moment from 'moment'; -import { CreateEventDto } from './dto/create-event.dto'; - -@Injectable() -export class EventsService { - private events: event[] = [ - { - id_event: 1, //id_evento - event_name: 'Platica de ejemplo', //nombre - desciption: 'Esta platica servira como ejemplo', //descripcion - limit: 30, //limite - start_date: new Date('2023-02-20'), //fecha_inicio - end_date: new Date('2023-02-20'), //fecha_fin - regitration_deadline: new Date('2023-02-19'), //fecha_limite_inscripcionme - start_time: '13:00', //hora de inicio - end_time: '14:00', //hora de fin - requirements: 'Sin requerimientos de hardware ni conocimiento', - modality: 'mixta', //modalidad - place: 'CEDETEC', //lugar - registration_fee: 0.0, //cuota_inscripcionl - sponsor: 'CIDWA', //patrocinador - type_acreditation: 'nose', //tipo_acreditacion - event_type: 'Platica', //tipo_evento - active: true, //estado - } - ]; - - getEvents(): event[]{ - return this.events - } - - getEvent(id: number): event{ - const eventGetting = this.events.find((item) => item.id_event === id); - if(!eventGetting){ - throw new NotFoundException("Evento no encontrado") - } - return eventGetting - } - - createEvent(body: CreateEventDto){ - this.events.push({ - id_event: (Math.floor(Math.random()*20000) + 1 ), - event_name: body.event_name, - desciption: body.desciption, - limit: body.limit, - start_date: body.start_date, - end_date: body.end_date, - regitration_deadline: body.regitration_deadline, - start_time: body.start_time, - end_time: body.end_time, - requirements: body.requirements, - modality: body.modality, - place: body.place, - registration_fee: body.registration_fee, - sponsor: body.sponsor, - type_acreditation: body.type_acreditation, - event_type: body.event_type, - active: body.active, - }) - } - - deleteEvent(id: number){ - const index = this.events.findIndex((event) => event.id_event === id); - if(index >= 0){ - this.events.splice(index, 1) - } - } - -} diff --git a/src/main.ts b/src/main.ts index 13cad38..744f328 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,6 @@ import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); - await app.listen(3000); + await app.listen(AppModule.port); } bootstrap(); diff --git a/src/participante/participante.controller.ts b/src/participante/participante.controller.ts new file mode 100644 index 0000000..eb2ca4f --- /dev/null +++ b/src/participante/participante.controller.ts @@ -0,0 +1,5 @@ +import { Controller, Post } from '@nestjs/common'; +import { ParticipanteService } from './participante.service'; + +@Controller('participante') +export class ParticipanteController {} diff --git a/src/participante/participante.entity.ts b/src/participante/participante.entity.ts new file mode 100644 index 0000000..59774af --- /dev/null +++ b/src/participante/participante.entity.ts @@ -0,0 +1,44 @@ +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; +import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; + +@Entity() +export class Participante { + @PrimaryGeneratedColumn() + id_participante: number; + + @Column({ type: String, nullable: false, length: 100 }) + nombre: string; + + @Column({ nullable: false }) + apellido_paterno: string; + + @Column({ nullable: false }) + apellido_materno: string; + + @Column({ nullable: true }) + telefono: string; + + @Column({ nullable: false }) + correo: string; + + @Column({ nullable: true }) // + password: string; + + @Column({ nullable: true }) // + tipo: string; + + @Column({ nullable: true }) // + estado: string; + + @Column({ nullable: true }) + institucion_procedencia: string; + + @Column({ nullable: true }) + carrera: string; + + @OneToMany( + () => EventoParticipante, + (eventoParticipante) => eventoParticipante.participante, + ) + eventosParticipante: EventoParticipante[]; +} diff --git a/src/participante/participante.module.ts b/src/participante/participante.module.ts new file mode 100644 index 0000000..77b7436 --- /dev/null +++ b/src/participante/participante.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ParticipanteController } from './participante.controller'; +import { Participante } from './participante.entity'; +import { ParticipanteService } from './participante.service'; + +@Module({ + imports:[TypeOrmModule.forFeature([Participante])], + controllers:[ParticipanteController], + providers: [ParticipanteService] +}) +export class ParticipanteModule {} diff --git a/src/participante/participante.service.ts b/src/participante/participante.service.ts new file mode 100644 index 0000000..4f1ae5c --- /dev/null +++ b/src/participante/participante.service.ts @@ -0,0 +1,34 @@ +import { ConflictException, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { RegistrarParticipanteDto } from '../evento-participante/evento-participante/dto/registrarParticipanteDto.dto'; +import { Participante } from './participante.entity'; + +@Injectable() +export class ParticipanteService { + constructor( + @InjectRepository(Participante) + private participanteRepository: Repository, + ) {} + + async participanteExiste(correo: string): Promise { + /* const participante = await this.participanteRepository.findOne({ + where: { correo: correo }, + }); + return participante !== undefined; */ + return this.participanteRepository.findOne({ where: { correo } }); + } + + async registrarParticipante(registrarParticipanteDto: RegistrarParticipanteDto) { + return this.participanteExiste(registrarParticipanteDto.correo).then( + (participante) => { + if (participante) { + throw new ConflictException('Este usuario ya está registrado'); + } + return this.participanteRepository.save( + this.participanteRepository.create(), + ); + }, + ); + } +} -- 2.43.0 From d14e7e21d1dd66d0d156e040af181b27cd84aa8b Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 17 Feb 2023 15:06:59 -0600 Subject: [PATCH 04/37] intento de registrar a un participante a un evento --- .../evento-participante.controller.ts | 7 ++-- .../evento-participante.service.ts | 33 ++++++++++++++++--- .../eventoParticipante.entity.ts | 8 ++++- src/main.ts | 1 + 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/evento-participante/evento-participante/evento-participante.controller.ts b/src/evento-participante/evento-participante/evento-participante.controller.ts index d54f2f3..751186f 100644 --- a/src/evento-participante/evento-participante/evento-participante.controller.ts +++ b/src/evento-participante/evento-participante/evento-participante.controller.ts @@ -1,14 +1,15 @@ -import { Body, Controller, Post } from '@nestjs/common'; +import { Body, Controller, Param, ParseIntPipe, Post } from '@nestjs/common'; import { RegistrarParticipanteDto } from './dto/registrarParticipanteDto.dto'; import { EventoParticipanteService } from './evento-participante.service'; +import { EventoParticipante } from './eventoParticipante.entity'; @Controller('evento-participante') export class EventoParticipanteController { constructor(private readonly eventoParticipanteService: EventoParticipanteService){} @Post() - regitrarParticipante(@Body() datos: RegistrarParticipanteDto){ - return this.eventoParticipanteService.registrarParticipante(datos) + regitrarParticipante(@Param()id_evento:number, @Body() datos: RegistrarParticipanteDto){ + return this.eventoParticipanteService.registrarParticipante(id_evento, datos) } diff --git a/src/evento-participante/evento-participante/evento-participante.service.ts b/src/evento-participante/evento-participante/evento-participante.service.ts index db861a0..b836b82 100644 --- a/src/evento-participante/evento-participante/evento-participante.service.ts +++ b/src/evento-participante/evento-participante/evento-participante.service.ts @@ -1,4 +1,4 @@ -import { ConflictException, Injectable } from '@nestjs/common'; +import { Body, ConflictException, Injectable, Param } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; @@ -7,26 +7,51 @@ import { RegistrarParticipanteDto } from './dto/registrarParticipanteDto.dto'; import { Evento } from 'src/eventos/evento.entity'; import { EventoParticipante } from './eventoParticipante.entity'; import { Participante } from 'src/participante/participante.entity'; +import { info } from 'console'; @Injectable() export class EventoParticipanteService { constructor( @InjectRepository(Participante) private participanteRepository: Repository, + @InjectRepository(EventoParticipante) + private eventoParticipanteRepository: Repository, ) {} - participanteExiste(correo: string): Promise { + participanteExiste(correo: string) { return this.participanteRepository.findOne({ where: { correo } }); } - registrarParticipante(registrarParticipanteDto: RegistrarParticipanteDto) { + registrarEnEvento( + id_evento: number, + registrarParticipanteDto: RegistrarParticipanteDto, + ) { + this.participanteExiste(registrarParticipanteDto.correo).then( + (participante) => { + let info : EventoParticipante; + + info.id_evento = id_evento + info.id_participante = participante.id_participante + + this.eventoParticipanteRepository.save( + this.eventoParticipanteRepository.create(info), + ); + }, + ); + } + + registrarParticipante( + id_evento: number, + registrarParticipanteDto: RegistrarParticipanteDto, + ) { return this.participanteExiste(registrarParticipanteDto.correo).then( (participante) => { if (participante) { + this.registrarEnEvento(id_evento, registrarParticipanteDto); throw new ConflictException('Este Usuario ya existe'); } return this.participanteRepository.save( - this.participanteRepository.create(registrarParticipanteDto) + this.participanteRepository.create(registrarParticipanteDto), ); }, ); diff --git a/src/evento-participante/evento-participante/eventoParticipante.entity.ts b/src/evento-participante/evento-participante/eventoParticipante.entity.ts index 55a0059..ce842af 100644 --- a/src/evento-participante/evento-participante/eventoParticipante.entity.ts +++ b/src/evento-participante/evento-participante/eventoParticipante.entity.ts @@ -1,5 +1,5 @@ import { Evento } from 'src/eventos/evento.entity'; -import { Entity, JoinColumn, ManyToOne, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm'; import { Participante } from '../../participante/participante.entity'; @Entity() @@ -7,6 +7,12 @@ export class EventoParticipante { @PrimaryGeneratedColumn() id_eventoParticipante: number + @Column({type: Number, nullable:false}) + id_evento: number + + @Column({type:Number, nullable:false}) + id_participante: number + @ManyToOne(() => Evento, (evento) => evento.eventoParticipantes) @JoinColumn({ name: 'id_evento' }) evento: Evento; diff --git a/src/main.ts b/src/main.ts index 744f328..d10bb48 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); + app.enableCors() await app.listen(AppModule.port); } bootstrap(); -- 2.43.0 From 3b87fad0874793f673ab65dfa79f14e0c4721b0b Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Wed, 22 Feb 2023 16:28:12 -0600 Subject: [PATCH 05/37] =?UTF-8?q?se=20a=C3=B1adieron=20los=20controldores?= =?UTF-8?q?=20para=20autorizacion=20de=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 985 ++++++++++++++++++++++++++- package.json | 9 + src/app.module.ts | 8 +- src/auth/auth.controller.ts | 25 + src/auth/auth.module.ts | 26 + src/auth/auth.service.ts | 61 ++ src/auth/dto/loginUsuario.dto.ts | 10 + src/auth/dto/registrarUsuario.dto.ts | 10 + src/auth/jwt-auth.guard.ts | 6 + src/auth/jwt.constants.ts | 3 + src/auth/jwt.strategy.ts | 19 + src/main.ts | 13 +- src/usuario/usuario.entity.ts | 16 + src/usuario/usuario.module.ts | 12 + src/usuario/usuario.service.ts | 23 + src/usuario/usuarios.controller.ts | 18 + 16 files changed, 1208 insertions(+), 36 deletions(-) create mode 100644 src/auth/auth.controller.ts create mode 100644 src/auth/auth.module.ts create mode 100644 src/auth/auth.service.ts create mode 100644 src/auth/dto/loginUsuario.dto.ts create mode 100644 src/auth/dto/registrarUsuario.dto.ts create mode 100644 src/auth/jwt-auth.guard.ts create mode 100644 src/auth/jwt.constants.ts create mode 100644 src/auth/jwt.strategy.ts create mode 100644 src/usuario/usuario.entity.ts create mode 100644 src/usuario/usuario.module.ts create mode 100644 src/usuario/usuario.service.ts create mode 100644 src/usuario/usuarios.controller.ts diff --git a/package-lock.json b/package-lock.json index 38f7f1c..0d569b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,14 +12,22 @@ "@nestjs/common": "^9.0.0", "@nestjs/config": "^2.3.1", "@nestjs/core": "^9.0.0", + "@nestjs/jwt": "^10.0.2", + "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", + "@nestjs/swagger": "^6.2.1", "@nestjs/typeorm": "^9.0.1", + "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "moment": "^2.29.4", + "passport": "^0.6.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", "pg": "^8.9.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", + "swagger-ui-express": "^4.6.1", "typeorm": "^0.3.12" }, "devDependencies": { @@ -29,6 +37,7 @@ "@types/express": "^4.17.13", "@types/jest": "29.2.4", "@types/node": "18.11.18", + "@types/passport-local": "^1.0.35", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", @@ -1457,6 +1466,39 @@ "node": ">=8" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "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/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@nestjs/cli": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", @@ -1609,6 +1651,46 @@ } } }, + "node_modules/@nestjs/jwt": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.0.2.tgz", + "integrity": "sha512-MLxjCSbO7C9fN2hst5kpIhnJAgglJmrKppXAXqElB8A9ip3ZuCowMDjjmNWWJyfOzE98NV0E0iEQGE2StMUC+Q==", + "dependencies": { + "@types/jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.2.tgz", + "integrity": "sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==", + "peerDependencies": { + "@nestjs/common": "^7.0.8 || ^8.0.0 || ^9.0.0", + "class-transformer": "^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0", + "class-validator": "^0.11.1 || ^0.12.0 || ^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/passport": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.3.tgz", + "integrity": "sha512-HplSJaimEAz1IOZEu+pdJHHJhQyBOPAYWXYHfAPQvRqWtw4FJF1VXl1Qtk9dcXQX1eKytDtH+qBzNQc19GWNEg==", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "passport": "^0.4.0 || ^0.5.0 || ^0.6.0" + } + }, "node_modules/@nestjs/platform-express": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.3.7.tgz", @@ -1735,6 +1817,37 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/@nestjs/swagger": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.2.1.tgz", + "integrity": "sha512-9M2vkfJHIzLqDZwvM5TEZO0MxRCvIb0xVy0LsmWwxH1lrb0z/4MhU+r2CWDhBtTccVJrKxVPiU2s3T3b9uUJbg==", + "dependencies": { + "@nestjs/mapped-types": "1.2.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "4.15.5" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0", + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/testing": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.7.tgz", @@ -2061,6 +2174,14 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -2070,8 +2191,7 @@ "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "devOptional": true + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2079,6 +2199,36 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/passport": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", + "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-local": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.35.tgz", + "integrity": "sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", + "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -2504,6 +2654,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2555,6 +2710,17 @@ "node": ">=0.4.0" } }, + "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/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -2677,6 +2843,36 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -2845,6 +3041,19 @@ } ] }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2919,7 +3128,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3010,6 +3218,11 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3143,6 +3356,14 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -3360,6 +3581,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3390,8 +3619,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3412,6 +3640,11 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3579,6 +3812,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3596,6 +3834,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3673,6 +3919,14 @@ "node": ">=12" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4523,6 +4777,33 @@ "node": ">=14.14" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -4553,6 +4834,25 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "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/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4608,7 +4908,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4719,6 +5018,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -4757,6 +5061,18 @@ "node": ">= 0.8" } }, + "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/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -6049,6 +6365,40 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "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", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -6201,7 +6551,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -6216,7 +6565,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -6340,7 +6688,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6356,6 +6703,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -6445,6 +6828,11 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -6485,6 +6873,20 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6506,6 +6908,17 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "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/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6737,6 +7150,51 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "dependencies": { + "jsonwebtoken": "^9.0.0", + "passport-strategy": "^1.0.0" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6750,7 +7208,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6784,6 +7241,11 @@ "node": ">=8" } }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/pg": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", @@ -7468,7 +7930,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7483,7 +7944,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7494,8 +7954,7 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { "version": "0.18.0", @@ -7561,6 +8020,11 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7632,8 +8096,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -7885,6 +8348,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-ui-dist": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.5.tgz", + "integrity": "sha512-V3eIa28lwB6gg7/wfNvAbjwJYmDXy1Jo1POjyTzlB6wPcHiGlRxq39TSjYGVjQrUSAzpv+a7nzp7mDxgNy57xA==" + }, + "node_modules/swagger-ui-express": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.1.tgz", + "integrity": "sha512-Pss7YNFKNdq66XKNjRe4IRXKKYNx/LvOSml9TdrZ8/78UpxUHIp9JoXpXWA5Z4L+SCmX63DZ9IPlQ8nnRuncvA==", + "dependencies": { + "swagger-ui-dist": ">=4.11.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0" + } + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -7903,6 +8385,38 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/terser": { "version": "5.16.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", @@ -8814,6 +9328,14 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", @@ -10109,6 +10631,32 @@ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==" }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "requires": { + "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" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "@nestjs/cli": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", @@ -10199,6 +10747,27 @@ "uid": "2.0.1" } }, + "@nestjs/jwt": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.0.2.tgz", + "integrity": "sha512-MLxjCSbO7C9fN2hst5kpIhnJAgglJmrKppXAXqElB8A9ip3ZuCowMDjjmNWWJyfOzE98NV0E0iEQGE2StMUC+Q==", + "requires": { + "@types/jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.0" + } + }, + "@nestjs/mapped-types": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.2.tgz", + "integrity": "sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==", + "requires": {} + }, + "@nestjs/passport": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.3.tgz", + "integrity": "sha512-HplSJaimEAz1IOZEu+pdJHHJhQyBOPAYWXYHfAPQvRqWtw4FJF1VXl1Qtk9dcXQX1eKytDtH+qBzNQc19GWNEg==", + "requires": {} + }, "@nestjs/platform-express": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.3.7.tgz", @@ -10288,6 +10857,18 @@ } } }, + "@nestjs/swagger": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.2.1.tgz", + "integrity": "sha512-9M2vkfJHIzLqDZwvM5TEZO0MxRCvIb0xVy0LsmWwxH1lrb0z/4MhU+r2CWDhBtTccVJrKxVPiU2s3T3b9uUJbg==", + "requires": { + "@nestjs/mapped-types": "1.2.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "4.15.5" + } + }, "@nestjs/testing": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.7.tgz", @@ -10569,6 +11150,14 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "requires": { + "@types/node": "*" + } + }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -10578,8 +11167,7 @@ "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "devOptional": true + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "@types/parse-json": { "version": "4.0.0", @@ -10587,6 +11175,36 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/passport": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", + "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/passport-local": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.35.tgz", + "integrity": "sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "@types/passport-strategy": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", + "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*" + } + }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -10923,6 +11541,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -10958,6 +11581,14 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true }, + "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==", + "requires": { + "debug": "4" + } + }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -11040,6 +11671,32 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -11166,6 +11823,15 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -11234,7 +11900,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11289,6 +11954,11 @@ "ieee754": "^1.1.13" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -11377,6 +12047,11 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -11535,6 +12210,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -11559,8 +12239,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.2", @@ -11578,6 +12257,11 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -11703,6 +12387,11 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -11713,6 +12402,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -11769,6 +12463,14 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==" }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -12424,6 +13126,29 @@ "universalify": "^2.0.0" } }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -12447,6 +13172,22 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "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" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12484,7 +13225,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12562,6 +13302,11 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -12591,6 +13336,15 @@ "toidentifier": "1.0.1" } }, + "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==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -13556,6 +14310,36 @@ "universalify": "^2.0.0" } }, + "jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "requires": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -13671,7 +14455,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" }, @@ -13679,8 +14462,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -13773,7 +14555,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -13783,6 +14564,35 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -13860,6 +14670,11 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, + "node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, "node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -13889,6 +14704,14 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13904,6 +14727,17 @@ "path-key": "^3.0.0" } }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14073,6 +14907,38 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + } + }, + "passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "requires": { + "jsonwebtoken": "^9.0.0", + "passport-strategy": "^1.0.0" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14082,8 +14948,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -14108,6 +14973,11 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "pg": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", @@ -14586,7 +15456,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "requires": { "lru-cache": "^6.0.0" }, @@ -14595,7 +15464,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -14603,8 +15471,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -14670,6 +15537,11 @@ "send": "0.18.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14723,8 +15595,7 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sisteransi": { "version": "1.0.5", @@ -14917,6 +15788,19 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "swagger-ui-dist": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.5.tgz", + "integrity": "sha512-V3eIa28lwB6gg7/wfNvAbjwJYmDXy1Jo1POjyTzlB6wPcHiGlRxq39TSjYGVjQrUSAzpv+a7nzp7mDxgNy57xA==" + }, + "swagger-ui-express": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.1.tgz", + "integrity": "sha512-Pss7YNFKNdq66XKNjRe4IRXKKYNx/LvOSml9TdrZ8/78UpxUHIp9JoXpXWA5Z4L+SCmX63DZ9IPlQ8nnRuncvA==", + "requires": { + "swagger-ui-dist": ">=4.11.0" + } + }, "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -14929,6 +15813,31 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "terser": { "version": "5.16.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", @@ -15500,6 +16409,14 @@ "isexe": "^2.0.0" } }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", diff --git a/package.json b/package.json index fb738ed..29ad066 100644 --- a/package.json +++ b/package.json @@ -23,14 +23,22 @@ "@nestjs/common": "^9.0.0", "@nestjs/config": "^2.3.1", "@nestjs/core": "^9.0.0", + "@nestjs/jwt": "^10.0.2", + "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", + "@nestjs/swagger": "^6.2.1", "@nestjs/typeorm": "^9.0.1", + "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "moment": "^2.29.4", + "passport": "^0.6.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", "pg": "^8.9.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", + "swagger-ui-express": "^4.6.1", "typeorm": "^0.3.12" }, "devDependencies": { @@ -40,6 +48,7 @@ "@types/express": "^4.17.13", "@types/jest": "29.2.4", "@types/node": "18.11.18", + "@types/passport-local": "^1.0.35", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", diff --git a/src/app.module.ts b/src/app.module.ts index 902af73..4edb59b 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,6 +7,10 @@ import { EventosModule } from './eventos/eventos.module'; import { ParticipanteController } from './participante/participante.controller'; import { ParticipanteModule } from './participante/participante.module'; import { EventoParticipanteModule } from './evento-participante/evento-participante/evento-participante.module'; +import { UsuarioModule } from './usuario/usuario.module'; +import { AuthModule } from './auth/auth.module'; +import { PassportModule } from '@nestjs/passport'; +import { JwtModule } from '@nestjs/jwt'; @Module({ imports: [ @@ -23,7 +27,9 @@ import { EventoParticipanteModule } from './evento-participante/evento-participa }), EventosModule, ParticipanteModule, - EventoParticipanteModule], + EventoParticipanteModule, + UsuarioModule, + AuthModule, PassportModule, JwtModule.register({})], controllers: [AppController, ParticipanteController], providers: [AppService], }) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts new file mode 100644 index 0000000..4b43b6c --- /dev/null +++ b/src/auth/auth.controller.ts @@ -0,0 +1,25 @@ +import { Body, Controller, Post, Request, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Usuario } from 'src/usuario/usuario.entity'; +import { Repository } from 'typeorm'; +import { AuthService } from './auth.service'; +import { LoginUsuarioDto } from './dto/loginUsuario.dto'; +import { RegistrarUsuarioDto } from './dto/registrarUsuario.dto'; + +@Controller('auth') +export class AuthController { + constructor( + private authService: AuthService, + ) /* @InjectRepository(Usuario) private usuarioRepository: Repository */ {} + + @Post('registro') + registrarUsuario(@Body() registrarUsuario: RegistrarUsuarioDto) { + return this.authService.registrar(registrarUsuario); + } + + @Post('login') + login(@Body() LoginUsuario: LoginUsuarioDto) { + return this.authService.login(LoginUsuario); + } +} diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts new file mode 100644 index 0000000..2e3c76d --- /dev/null +++ b/src/auth/auth.module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; +import { PassportModule } from '@nestjs/passport'; +import { UsuarioModule } from 'src/usuario/usuario.module'; +import { AuthService } from './auth.service'; +import { jwtStrategy } from './jwt.strategy'; +import { AuthController } from './auth.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Usuario } from 'src/usuario/usuario.entity'; +import { UsuarioService } from 'src/usuario/usuario.service'; +import { JwtModule } from '@nestjs/jwt'; +import { jwtConstants } from './jwt.constants'; + +@Module({ + imports: [ + UsuarioModule, + PassportModule, + TypeOrmModule.forFeature([Usuario]), + JwtModule.register({ + secret: jwtConstants.secret, + signOptions: { expiresIn: '5h' }, + }), + ], + providers: [AuthService, jwtStrategy, UsuarioService, jwtStrategy], + controllers: [AuthController], +}) +export class AuthModule {} diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts new file mode 100644 index 0000000..2d0ab7c --- /dev/null +++ b/src/auth/auth.service.ts @@ -0,0 +1,61 @@ +import { HttpException, Injectable } from '@nestjs/common'; +import { UsuarioService } from 'src/usuario/usuario.service'; +import { JwtService } from '@nestjs/jwt'; +import * as bcrypt from 'bcrypt'; +import { RegistrarUsuarioDto } from './dto/registrarUsuario.dto'; +import { hash } from 'bcrypt'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Usuario } from 'src/usuario/usuario.entity'; +import { Repository } from 'typeorm'; +import { LoginUsuarioDto } from './dto/loginUsuario.dto'; +import { compare } from 'bcrypt'; + +@Injectable() +export class AuthService { + constructor( + private jwtService: JwtService, + private readonly usuarioService: UsuarioService, + @InjectRepository(Usuario) private usuarioRepository: Repository, + ) {} + + async registrar(registrarUsuario: RegistrarUsuarioDto) { + + const { email, password } = registrarUsuario; + + const plainToHash = await hash(password, 10); + + if (await this.usuarioRepository.findOne({ where: { email } })) + throw new HttpException('usuario existe', 403); + + registrarUsuario = { ...registrarUsuario, password: plainToHash }; + + return this.usuarioRepository.save( + this.usuarioRepository.create(registrarUsuario), + ); + } + + + async login(loginUsuario: LoginUsuarioDto) { + const { email, password } = loginUsuario; + + const usuario = await this.usuarioRepository.findOne({ where: { email } }); + + if (!usuario) throw new HttpException('Usuario no encontrado', 404); + + const checkPassword = await compare(password, (await usuario).password); + + if (!checkPassword) throw new HttpException('Contraseña incorrecta', 403); + + const payload = { id_usuario: usuario.id_usuario, name: usuario.name }; + const token = this.jwtService.sign(payload); //firma el token + + const data = { + usuario: usuario.name, + id: usuario.id_usuario, + email: usuario.email, + token, + }; + + return data; + } +} diff --git a/src/auth/dto/loginUsuario.dto.ts b/src/auth/dto/loginUsuario.dto.ts new file mode 100644 index 0000000..c327256 --- /dev/null +++ b/src/auth/dto/loginUsuario.dto.ts @@ -0,0 +1,10 @@ +import { IsEmail, MaxLength, MinLength } from "class-validator"; + +export class LoginUsuarioDto { + @IsEmail() + email: string + + @MinLength(10) + @MaxLength(15) + password: string +} \ No newline at end of file diff --git a/src/auth/dto/registrarUsuario.dto.ts b/src/auth/dto/registrarUsuario.dto.ts new file mode 100644 index 0000000..464ef2c --- /dev/null +++ b/src/auth/dto/registrarUsuario.dto.ts @@ -0,0 +1,10 @@ +import { PartialType } from "@nestjs/swagger"; +import { IsNotEmpty } from "class-validator"; +import { LoginUsuarioDto } from "./loginUsuario.dto"; + + +export class RegistrarUsuarioDto extends PartialType(LoginUsuarioDto){ + @IsNotEmpty() + name: string + +} \ No newline at end of file diff --git a/src/auth/jwt-auth.guard.ts b/src/auth/jwt-auth.guard.ts new file mode 100644 index 0000000..6a2e62e --- /dev/null +++ b/src/auth/jwt-auth.guard.ts @@ -0,0 +1,6 @@ + +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') {} diff --git a/src/auth/jwt.constants.ts b/src/auth/jwt.constants.ts new file mode 100644 index 0000000..5f47145 --- /dev/null +++ b/src/auth/jwt.constants.ts @@ -0,0 +1,3 @@ +export const jwtConstants = { + secret: "SemillaSecreta" +} \ No newline at end of file diff --git a/src/auth/jwt.strategy.ts b/src/auth/jwt.strategy.ts new file mode 100644 index 0000000..6593e36 --- /dev/null +++ b/src/auth/jwt.strategy.ts @@ -0,0 +1,19 @@ +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { jwtConstants } from './jwt.constants'; + +@Injectable() +export class jwtStrategy extends PassportStrategy(Strategy) { + constructor() { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: jwtConstants.secret, + }); + } + + async validate(payload: any) { + return { userId: payload.sub , username: payload.username }; + } +} diff --git a/src/main.ts b/src/main.ts index d10bb48..2837580 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,20 @@ import { NestFactory } from '@nestjs/core'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); - app.enableCors() + + const config = new DocumentBuilder() + .addBearerAuth() + .setTitle('Documentacion') + .setDescription('des') + .setVersion('1.0') + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('api', app, document); + + app.enableCors(); await app.listen(AppModule.port); } bootstrap(); diff --git a/src/usuario/usuario.entity.ts b/src/usuario/usuario.entity.ts new file mode 100644 index 0000000..ba268cc --- /dev/null +++ b/src/usuario/usuario.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class Usuario { + @PrimaryGeneratedColumn() + id_usuario: number; + + @Column({ nullable: false }) + name: string; + + @Column({ nullable: false }) + password: string; + + @Column({nullable:false}) + email:string +} diff --git a/src/usuario/usuario.module.ts b/src/usuario/usuario.module.ts new file mode 100644 index 0000000..02216b9 --- /dev/null +++ b/src/usuario/usuario.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { UsuarioService } from './usuario.service'; +import { UsuarioController } from './usuarios.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Usuario } from './usuario.entity'; + +@Module({ + imports:[TypeOrmModule.forFeature([Usuario])], + providers: [UsuarioService], + controllers: [UsuarioController] +}) +export class UsuarioModule {} diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts new file mode 100644 index 0000000..4b3680c --- /dev/null +++ b/src/usuario/usuario.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Usuario } from './usuario.entity'; + +@Injectable() +export class UsuarioService { + constructor( + @InjectRepository(Usuario) private usuarioRepository: Repository, + ) {} + + getUsuarios(){ + return this.usuarioRepository.find() + } + + getUsuario(email: string) { + return this.usuarioRepository.findOne({ + where: { + email, + }, + }); + } +} diff --git a/src/usuario/usuarios.controller.ts b/src/usuario/usuarios.controller.ts new file mode 100644 index 0000000..f5aa574 --- /dev/null +++ b/src/usuario/usuarios.controller.ts @@ -0,0 +1,18 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { ApiBearerAuth } from '@nestjs/swagger'; +import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; +import { Usuario } from './usuario.entity'; +import { UsuarioService } from './usuario.service'; + +@ApiBearerAuth() +@Controller('usuarios') +export class UsuarioController { + + constructor(private readonly usuarioService: UsuarioService){} + + @UseGuards(JwtAuthGuard) + @Get() + getUsuarios(): Promise{ + return this.usuarioService.getUsuarios() + } +} -- 2.43.0 From 7abc8d0134038a4da3ea8097b5f5f59c38364828 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 24 Feb 2023 15:35:23 -0600 Subject: [PATCH 06/37] linea jwt --- src/auth/auth.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 2d0ab7c..be20860 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -9,6 +9,7 @@ import { Usuario } from 'src/usuario/usuario.entity'; import { Repository } from 'typeorm'; import { LoginUsuarioDto } from './dto/loginUsuario.dto'; import { compare } from 'bcrypt'; +import { jwtConstants } from './jwt.constants'; @Injectable() export class AuthService { -- 2.43.0 From 82515998164bda0a4f079c15e274ab9a03be214d Mon Sep 17 00:00:00 2001 From: JorgeMike <119615322+JorgeMike@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:01:13 -0600 Subject: [PATCH 07/37] creacion de eventos, registro, eliminacion de eventos, login --- .env | 3 +- src/app.module.ts | 30 +++++--- src/auth/dto/registrarUsuario.dto.ts | 22 ++++-- .../dto/registrarEnEvento.dto.ts | 15 ++++ .../dto/registrarParticipanteDto.dto.ts | 6 +- .../evento-participante.controller.ts | 6 +- .../evento-participante.service.ts | 40 ++++++----- src/eventos/dto/actualizarEvento.dto.ts | 43 ++++-------- src/eventos/dto/crearEvento.dto.ts | 44 ++++-------- src/eventos/evento.entity.ts | 54 ++++++++------- src/eventos/eventos.controller.ts | 4 +- src/eventos/eventos.module.ts | 3 +- src/eventos/eventos.service.ts | 68 +++++++++++++------ 13 files changed, 190 insertions(+), 148 deletions(-) create mode 100644 src/evento-participante/evento-participante/dto/registrarEnEvento.dto.ts diff --git a/.env b/.env index 25debad..2cd7493 100644 --- a/.env +++ b/.env @@ -2,8 +2,9 @@ PORT=5089 DB_HOST=localhost DB_USER=root -DB_PASS=password +DB_PASSWORD=Dosmiluno2001 DB_NAME=cedetec_proyectos +DB_PORT=3306 SALT_ROUNDS = 10 diff --git a/src/app.module.ts b/src/app.module.ts index 4edb59b..363a1c5 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -11,19 +11,29 @@ import { UsuarioModule } from './usuario/usuario.module'; import { AuthModule } from './auth/auth.module'; import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs/jwt'; +import { Evento } from './eventos/evento.entity'; +import { Participante } from './participante/participante.entity'; +import { EventoParticipante } from './evento-participante/evento-participante/eventoParticipante.entity'; +import { Usuario } from './usuario/usuario.entity'; @Module({ imports: [ - ConfigModule.forRoot({isGlobal: true}), - TypeOrmModule.forRoot({ - type: 'mariadb', - host: 'localhost', - port: 3306, - username:'root', - password: 'password', - database: 'cedetec_proyectos', - entities: [__dirname + '/**/*.entity{.ts,.js}'], - synchronize: true + ConfigModule.forRoot({ + envFilePath: '.env', + isGlobal: true}), + TypeOrmModule.forRootAsync({ + imports:[ConfigModule], + inject:[ConfigService], + useFactory: async (configService: ConfigService) => ({ + type: 'mariadb', + host: configService.get('DB_HOST'), + port: configService.get('DB_PORT'), + username: configService.get('DB_USER'), + password: configService.get('DB_PASSWORD'), + database: configService.get('DB_NAME'), + entities: [Evento, Participante, EventoParticipante, Usuario], + synchronize: true + }) }), EventosModule, ParticipanteModule, diff --git a/src/auth/dto/registrarUsuario.dto.ts b/src/auth/dto/registrarUsuario.dto.ts index 464ef2c..eafb987 100644 --- a/src/auth/dto/registrarUsuario.dto.ts +++ b/src/auth/dto/registrarUsuario.dto.ts @@ -1,10 +1,18 @@ -import { PartialType } from "@nestjs/swagger"; -import { IsNotEmpty } from "class-validator"; -import { LoginUsuarioDto } from "./loginUsuario.dto"; +import { PartialType } from '@nestjs/swagger'; +import { IsEmail, IsNotEmpty, MaxLength, MinLength } from 'class-validator'; +import { LoginUsuarioDto } from './loginUsuario.dto'; +export class RegistrarUsuarioDto extends PartialType(LoginUsuarioDto) { + @IsNotEmpty() + name: string; -export class RegistrarUsuarioDto extends PartialType(LoginUsuarioDto){ - @IsNotEmpty() - name: string + @IsNotEmpty() + lastName: string; -} \ No newline at end of file + @IsEmail() + email: string; + + @MinLength(10) + @MaxLength(15) + password: string; +} diff --git a/src/evento-participante/evento-participante/dto/registrarEnEvento.dto.ts b/src/evento-participante/evento-participante/dto/registrarEnEvento.dto.ts new file mode 100644 index 0000000..8d86df3 --- /dev/null +++ b/src/evento-participante/evento-participante/dto/registrarEnEvento.dto.ts @@ -0,0 +1,15 @@ +import { IsNotEmpty, IsNumber } from "class-validator" + +export class registrarEnEvento { + @IsNumber() + @IsNotEmpty() + id_eventoParticipante: number + + @IsNumber() + @IsNotEmpty() + id_evento: number + + @IsNumber() + @IsNotEmpty() + id_participante: number +} \ No newline at end of file diff --git a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts index ca4ab32..7ab0048 100644 --- a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts +++ b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts @@ -13,10 +13,10 @@ export class RegistrarParticipanteDto { @IsNotEmpty() apellido_materno: string; - @IsEmail() - correo: string; - @IsString() @IsNotEmpty() carrera: string; + + @IsEmail() + correo: string; } diff --git a/src/evento-participante/evento-participante/evento-participante.controller.ts b/src/evento-participante/evento-participante/evento-participante.controller.ts index 751186f..9af94da 100644 --- a/src/evento-participante/evento-participante/evento-participante.controller.ts +++ b/src/evento-participante/evento-participante/evento-participante.controller.ts @@ -7,9 +7,9 @@ import { EventoParticipante } from './eventoParticipante.entity'; export class EventoParticipanteController { constructor(private readonly eventoParticipanteService: EventoParticipanteService){} - @Post() - regitrarParticipante(@Param()id_evento:number, @Body() datos: RegistrarParticipanteDto){ - return this.eventoParticipanteService.registrarParticipante(id_evento, datos) + @Post(':id') + regitrarParticipante(@Param("id", ParseIntPipe)id: number, @Body() datos: RegistrarParticipanteDto){ + return this.eventoParticipanteService.registrarParticipante(id, datos) } diff --git a/src/evento-participante/evento-participante/evento-participante.service.ts b/src/evento-participante/evento-participante/evento-participante.service.ts index b836b82..2908175 100644 --- a/src/evento-participante/evento-participante/evento-participante.service.ts +++ b/src/evento-participante/evento-participante/evento-participante.service.ts @@ -8,6 +8,7 @@ import { Evento } from 'src/eventos/evento.entity'; import { EventoParticipante } from './eventoParticipante.entity'; import { Participante } from 'src/participante/participante.entity'; import { info } from 'console'; +import { registrarEnEvento } from './dto/registrarEnEvento.dto'; @Injectable() export class EventoParticipanteService { @@ -22,21 +23,22 @@ export class EventoParticipanteService { return this.participanteRepository.findOne({ where: { correo } }); } - registrarEnEvento( + async registrarEnEvento( id_evento: number, registrarParticipanteDto: RegistrarParticipanteDto, ) { - this.participanteExiste(registrarParticipanteDto.correo).then( - (participante) => { - let info : EventoParticipante; + const participante = await this.participanteExiste( + registrarParticipanteDto.correo, + ); + /* console.log(id_evento); + console.log(participante); */ - info.id_evento = id_evento - info.id_participante = participante.id_participante + const registro = new EventoParticipante(); + registro.id_evento = id_evento; + registro.id_participante = participante.id_participante; - this.eventoParticipanteRepository.save( - this.eventoParticipanteRepository.create(info), - ); - }, + return this.eventoParticipanteRepository.save( + this.eventoParticipanteRepository.create(registro), ); } @@ -44,15 +46,19 @@ export class EventoParticipanteService { id_evento: number, registrarParticipanteDto: RegistrarParticipanteDto, ) { +/* console.log(id_evento); + console.log(registrarParticipanteDto); */ return this.participanteExiste(registrarParticipanteDto.correo).then( - (participante) => { - if (participante) { - this.registrarEnEvento(id_evento, registrarParticipanteDto); - throw new ConflictException('Este Usuario ya existe'); + (res) => { + if (res) { + this.registrarEnEvento(id_evento, res); + } else { + this.participanteRepository + .save(this.participanteRepository.create(registrarParticipanteDto)) + .then((res) => { + this.registrarEnEvento(id_evento, res); + }); } - return this.participanteRepository.save( - this.participanteRepository.create(registrarParticipanteDto), - ); }, ); } diff --git a/src/eventos/dto/actualizarEvento.dto.ts b/src/eventos/dto/actualizarEvento.dto.ts index 1f5af31..7532801 100644 --- a/src/eventos/dto/actualizarEvento.dto.ts +++ b/src/eventos/dto/actualizarEvento.dto.ts @@ -1,31 +1,16 @@ export class actualizarEventoDto { - nombre?: string - - evento_identificador ?: string - - fecha_inicio?: Date - - fecha_fin?: Date - - horario?: string - - requisitos?: string - - modalidad?: string - - lugar?: string - - cuota_inscripcion ?: number - - patrocinador ?: string - - tipo_acreditacion?: string - - fecha_limite_inscripcion?: Date - - tipo_evento?: string - - estado?: boolean - - descripcion?: string + nombre?: string; + tipo_evento?: string; + organizadores?: string[]; + proyecto?: string[]; + modalidad?: string[]; + lugar?: string; + requisitos?: string; + cuota_inscripcion?: number; + patrocinador?: string; + tipo_acreditacion?: string; + descripcion?: string; + fecha_inicio?: Date; + fecha_fin?: Date; + fecha_limite_inscripcion?: Date; } \ No newline at end of file diff --git a/src/eventos/dto/crearEvento.dto.ts b/src/eventos/dto/crearEvento.dto.ts index f55c970..14b499b 100644 --- a/src/eventos/dto/crearEvento.dto.ts +++ b/src/eventos/dto/crearEvento.dto.ts @@ -1,32 +1,16 @@ export class crearEventoDto { - nombre: string - - evento_identificador ?: string - - fecha_inicio: Date - - fecha_fin: Date - - horario: string - - requisitos: string - - modalidad: string - - lugar: string - - cuota_inscripcion ?: number - - patrocinador ?: string - - tipo_acreditacion: string - - fecha_limite_inscripcion: Date - - tipo_evento: string - - estado: boolean - - descripcion: string + nombre: string; + tipo_evento: string; + organizadores: string[]; + proyecto: string[]; + modalidad: string[]; + lugar: string; + requisitos: string; + cuota_inscripcion: number; + patrocinador: string; + tipo_acreditacion: string; + descripcion: string; + fecha_inicio: Date; + fecha_fin: Date; + fecha_limite_inscripcion: Date; } - diff --git a/src/eventos/evento.entity.ts b/src/eventos/evento.entity.ts index ac307e6..061b1ea 100644 --- a/src/eventos/evento.entity.ts +++ b/src/eventos/evento.entity.ts @@ -14,49 +14,55 @@ export class Evento { @Column({ nullable: false }) nombre: string; - - @Column({ nullable: true }) - evento_identificador: string; - - @Column({ nullable: false, type: 'datetime' }) - fecha_inicio: Date; - - @Column({ nullable: false, type: 'datetime' }) - fecha_fin: Date; - + @Column({ nullable: false }) - horario: string; + tipo_evento: string; + + @Column("simple-array", {nullable: false}) + organizadores: string[] + + @Column("simple-array", {nullable: false}) + proyecto: string[] + + @Column("simple-array", {nullable: false}) + modalidad: string[] + + @Column({ nullable: false }) + lugar: string; @Column({ nullable: false }) requisitos: string; - @Column({ nullable: false }) - modalidad: string; - - @Column({ nullable: false }) - lugar: string; - @Column({ nullable: true }) cuota_inscripcion: number; @Column({ nullable: true }) patrocinador: string; - @Column({ nullable: false }) + @Column({ nullable: true }) tipo_acreditacion: string; + @Column({nullable: false}) + descripcion: string + + @Column({ nullable: false, type: 'datetime' }) + fecha_inicio: Date; + + @Column({ nullable: false, type: 'datetime' }) + fecha_fin: Date; + @Column({ nullable: false, type: 'datetime' }) fecha_limite_inscripcion: Date; - @Column({ nullable: false }) - tipo_evento: string; + @Column({ nullable: true }) + evento_identificador: string; - @Column({ nullable: false }) + @Column({ nullable: true }) + horario: string; + + @Column({ nullable: true }) estado: boolean; - @Column({ nullable: false }) - descripcion: string; - @OneToMany( () => EventoParticipante, (eventoParticipante) => eventoParticipante.evento, diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index cae339d..9f9f74f 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -20,7 +20,7 @@ export class EventosController { } @Post() - postEvento(@Body() nuevoEvento: crearEventoDto): Promise{ + postEvento(@Body() nuevoEvento: crearEventoDto){ return this.eventoService.postEvento(nuevoEvento) } @@ -31,6 +31,6 @@ export class EventosController { @Delete(':id') deleteEvento(@Param('id', ParseIntPipe)id: number){ - return this.eventoService.deleteEvento(id) + return this.eventoService.deleteEventoParticipante(id) } } diff --git a/src/eventos/eventos.module.ts b/src/eventos/eventos.module.ts index 21a19a9..52755c1 100644 --- a/src/eventos/eventos.module.ts +++ b/src/eventos/eventos.module.ts @@ -1,11 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; import { Evento } from './evento.entity'; import { EventosController } from './eventos.controller'; import { EventosService } from './eventos.service'; @Module({ - imports:[TypeOrmModule.forFeature([Evento])], + imports:[TypeOrmModule.forFeature([Evento, EventoParticipante])], controllers:[EventosController], providers:[EventosService] }) diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index 4f3c3fd..72aa66d 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -1,37 +1,63 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; +import { Participante } from 'src/participante/participante.entity'; import { Repository } from 'typeorm'; import { actualizarEventoDto } from './dto/actualizarEvento.dto'; import { crearEventoDto } from './dto/crearEvento.dto'; import { Evento } from './evento.entity'; - @Injectable() export class EventosService { - constructor(@InjectRepository(Evento) private eventoRepository: Repository){} + constructor( + @InjectRepository(Evento) private eventoRepository: Repository, + @InjectRepository(EventoParticipante) + private eventoParticipanteRepository: Repository, + ) {} - getEventos(){ - return this.eventoRepository.find() - } + getEventos() { + return this.eventoRepository.find(); + } - getEventosPorId(id: number){ - return this.eventoRepository.findOne({ - where:{ - id_evento: id - } - }) - } + getEventosPorId(id: number) { + return this.eventoRepository.findOne({ + where: { + id_evento: id, + }, + }); + } - postEvento(evento: crearEventoDto){ - const nuevoEvento = this.eventoRepository.create(evento) - return this.eventoRepository.save(nuevoEvento) - } + postEvento(evento: crearEventoDto) { + const nuevoEvento = this.eventoRepository.create(evento); + return this.eventoRepository.save(nuevoEvento); + } - updateEvento(id: number, actualizacion: actualizarEventoDto){ - return this.eventoRepository.update({id_evento: id}, actualizacion) - } + updateEvento(id: number, actualizacion: actualizarEventoDto) { + return this.eventoRepository.update({ id_evento: id }, actualizacion); + } - deleteEvento(id:number){ - return this.eventoRepository.delete({id_evento:id}) + deleteParticipantes(id: number) { + this.eventoParticipanteRepository.delete({ id_evento: id }); + } + + deleteEvento(id: number) { + this.eventoRepository.delete({ id_evento: id }); + } + + async deleteEventoParticipante(id: number) { + const queryRunner = + this.eventoRepository.manager.connection.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + await this.deleteParticipantes(id); + await this.deleteEvento(id); + await queryRunner.commitTransaction(); + } catch (err) { + await queryRunner.rollbackTransaction(); + throw err; + } finally { + await queryRunner.release(); } + } } -- 2.43.0 From 7321c103b1a590ef21ff01b4e70e37f9e0ba020d Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 28 Feb 2023 16:33:04 -0600 Subject: [PATCH 08/37] added enities --- .env | 2 +- src/app.module.ts | 73 +++++++++++++++---- src/catalogos/area.entity.ts | 17 +++++ src/catalogos/carrera.entity.ts | 16 ++++ src/catalogos/tipo-miembro.entity.ts | 16 ++++ .../entity/inscripcion_area.entity.ts | 30 ++++++++ .../inscripcion-area.controller.ts | 4 + .../inscripcion-area.module.ts | 9 +++ .../inscripcion-area.service.ts | 4 + .../entity/inscripcion_dsc.entity.ts | 68 +++++++++++++++++ .../inscripcion-dsc.controller.ts | 4 + src/inscripcion-dsc/inscripcion-dsc.module.ts | 9 +++ .../inscripcion-dsc.service.ts | 4 + .../entity/inscripcion_status.entity.ts | 17 +++++ .../inscripcion-status.controller.ts | 4 + .../inscripcion-status.module.ts | 4 + .../inscripcion-status.service.ts | 4 + .../entity/inscripcion_usuario.entity.ts | 29 ++++++++ .../inscripcion-usuario.controller.ts | 4 + .../inscripcion-usuario.module.ts | 9 +++ .../inscripcion-usuario.service.ts | 4 + src/miembro/entity/miembro.entity.ts | 63 ++++++++++++++++ src/miembro/miembro.controller.ts | 4 + src/miembro/miembro.module.ts | 9 +++ src/miembro/miembro.service.ts | 4 + src/periodo/entity/periodo.entity.ts | 17 +++++ src/periodo/periodo.controller.ts | 4 + src/periodo/periodo.module.ts | 9 +++ src/periodo/periodo.service.ts | 4 + 29 files changed, 430 insertions(+), 15 deletions(-) create mode 100644 src/catalogos/area.entity.ts create mode 100644 src/catalogos/carrera.entity.ts create mode 100644 src/catalogos/tipo-miembro.entity.ts create mode 100644 src/inscripcion-area/entity/inscripcion_area.entity.ts create mode 100644 src/inscripcion-area/inscripcion-area.controller.ts create mode 100644 src/inscripcion-area/inscripcion-area.module.ts create mode 100644 src/inscripcion-area/inscripcion-area.service.ts create mode 100644 src/inscripcion-dsc/entity/inscripcion_dsc.entity.ts create mode 100644 src/inscripcion-dsc/inscripcion-dsc.controller.ts create mode 100644 src/inscripcion-dsc/inscripcion-dsc.module.ts create mode 100644 src/inscripcion-dsc/inscripcion-dsc.service.ts create mode 100644 src/inscripcion-status/entity/inscripcion_status.entity.ts create mode 100644 src/inscripcion-status/inscripcion-status.controller.ts create mode 100644 src/inscripcion-status/inscripcion-status.module.ts create mode 100644 src/inscripcion-status/inscripcion-status.service.ts create mode 100644 src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts create mode 100644 src/inscripcion-usuario/inscripcion-usuario.controller.ts create mode 100644 src/inscripcion-usuario/inscripcion-usuario.module.ts create mode 100644 src/inscripcion-usuario/inscripcion-usuario.service.ts create mode 100644 src/miembro/entity/miembro.entity.ts create mode 100644 src/miembro/miembro.controller.ts create mode 100644 src/miembro/miembro.module.ts create mode 100644 src/miembro/miembro.service.ts create mode 100644 src/periodo/entity/periodo.entity.ts create mode 100644 src/periodo/periodo.controller.ts create mode 100644 src/periodo/periodo.module.ts create mode 100644 src/periodo/periodo.service.ts diff --git a/.env b/.env index 2cd7493..02e37b4 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ PORT=5089 DB_HOST=localhost DB_USER=root -DB_PASSWORD=Dosmiluno2001 +DB_PASSWORD=password DB_NAME=cedetec_proyectos DB_PORT=3306 diff --git a/src/app.module.ts b/src/app.module.ts index 363a1c5..0c80ed7 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { ConfigModule, ConfigService } from '@nestjs/config' +import { ConfigModule, ConfigService } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { EventosModule } from './eventos/eventos.module'; @@ -15,15 +15,33 @@ import { Evento } from './eventos/evento.entity'; import { Participante } from './participante/participante.entity'; import { EventoParticipante } from './evento-participante/evento-participante/eventoParticipante.entity'; import { Usuario } from './usuario/usuario.entity'; +import { InscripcionDscModule } from './inscripcion-dsc/inscripcion-dsc.module'; +import { InscripcionAreaModule } from './inscripcion-area/inscripcion-area.module'; +import { InscripcionStatusService } from './inscripcion-status/inscripcion-status.service'; +import { InscripcionStatusController } from './inscripcion-status/inscripcion-status.controller'; +import { InscripcionStatusModule } from './inscripcion-status/inscripcion-status.module'; +import { PeriodoModule } from './periodo/periodo.module'; +import { InscripcionUsuarioModule } from './inscripcion-usuario/inscripcion-usuario.module'; +import { MiembroModule } from './miembro/miembro.module'; +import { Miembro } from './miembro/entity/miembro.entity'; +import { InscripcionArea } from './inscripcion-area/entity/inscripcion_area.entity'; +import { InscripcionDSC } from './inscripcion-dsc/entity/inscripcion_dsc.entity'; +import { InscripcionStatus } from './inscripcion-status/entity/inscripcion_status.entity'; +import { InscripcionUsuario } from './inscripcion-usuario/entity/inscripcion_usuario.entity'; +import { Area } from './catalogos/area.entity'; +import { TipoMiembro } from './catalogos/tipo-miembro.entity'; +import { Carrera } from './catalogos/carrera.entity'; +import { Periodo } from './periodo/entity/periodo.entity'; @Module({ imports: [ ConfigModule.forRoot({ envFilePath: '.env', - isGlobal: true}), + isGlobal: true, + }), TypeOrmModule.forRootAsync({ - imports:[ConfigModule], - inject:[ConfigService], + imports: [ConfigModule], + inject: [ConfigService], useFactory: async (configService: ConfigService) => ({ type: 'mariadb', host: configService.get('DB_HOST'), @@ -31,21 +49,48 @@ import { Usuario } from './usuario/usuario.entity'; username: configService.get('DB_USER'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_NAME'), - entities: [Evento, Participante, EventoParticipante, Usuario], - synchronize: true - }) - }), + entities: [ + Evento, + Participante, + EventoParticipante, + Usuario, + Miembro, + InscripcionArea, + InscripcionDSC, + InscripcionStatus, + InscripcionUsuario, + Area, + TipoMiembro, + Carrera, + Periodo + ], + synchronize: true, + }), + }), EventosModule, ParticipanteModule, EventoParticipanteModule, UsuarioModule, - AuthModule, PassportModule, JwtModule.register({})], - controllers: [AppController, ParticipanteController], - providers: [AppService], + AuthModule, + PassportModule, + JwtModule.register({}), + InscripcionDscModule, + InscripcionAreaModule, + InscripcionStatusModule, + PeriodoModule, + InscripcionUsuarioModule, + MiembroModule, + ], + controllers: [ + AppController, + ParticipanteController, + InscripcionStatusController, + ], + providers: [AppService, InscripcionStatusService], }) export class AppModule { - static port: number - constructor(private readonly configService: ConfigService){ - AppModule.port = this.configService.get('PORT') + static port: number; + constructor(private readonly configService: ConfigService) { + AppModule.port = this.configService.get('PORT'); } } diff --git a/src/catalogos/area.entity.ts b/src/catalogos/area.entity.ts new file mode 100644 index 0000000..9e47ab6 --- /dev/null +++ b/src/catalogos/area.entity.ts @@ -0,0 +1,17 @@ +import { InscripcionArea } from "src/inscripcion-area/entity/inscripcion_area.entity"; +import { Column, Entity, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class Area { + @PrimaryGeneratedColumn() + id_area: number + + @Column({length:60, nullable:false}) + area: string + + @OneToMany( + () => InscripcionArea, (inscripcionArea) => inscripcionArea.area + ) + inscripcionArea: InscripcionArea[] + +} \ No newline at end of file diff --git a/src/catalogos/carrera.entity.ts b/src/catalogos/carrera.entity.ts new file mode 100644 index 0000000..cd27751 --- /dev/null +++ b/src/catalogos/carrera.entity.ts @@ -0,0 +1,16 @@ +import { Miembro } from "src/miembro/entity/miembro.entity"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class Carrera { + @PrimaryGeneratedColumn() + id_carrera: number + + @Column({ length:70, nullable: false}) + carrera: string + + @OneToMany( + () => Miembro, (miembro) => miembro.carrera + ) + miembro: Miembro +} \ No newline at end of file diff --git a/src/catalogos/tipo-miembro.entity.ts b/src/catalogos/tipo-miembro.entity.ts new file mode 100644 index 0000000..e736c22 --- /dev/null +++ b/src/catalogos/tipo-miembro.entity.ts @@ -0,0 +1,16 @@ +import { Miembro } from "src/miembro/entity/miembro.entity"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class TipoMiembro { + @PrimaryGeneratedColumn() + id_tipo_miembro: number + + @Column({length:60, nullable:false}) + tipo_miembro: string + + @OneToMany( + () => Miembro, (miembro) => miembro.tipoMiembro + ) + miembro: Miembro +} \ No newline at end of file diff --git a/src/inscripcion-area/entity/inscripcion_area.entity.ts b/src/inscripcion-area/entity/inscripcion_area.entity.ts new file mode 100644 index 0000000..d9523b7 --- /dev/null +++ b/src/inscripcion-area/entity/inscripcion_area.entity.ts @@ -0,0 +1,30 @@ +import { Area } from 'src/catalogos/area.entity'; +import { InscripcionDSC } from 'src/inscripcion-dsc/entity/inscripcion_dsc.entity'; +import { + Column, + Entity, + JoinColumn, + ManyToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; + +@Entity() +export class InscripcionArea { + @PrimaryGeneratedColumn() + id_inscripcionArea: number; + + @Column() + id_inscripcion: number; + + @Column() + id_area: number; + + @ManyToOne(() => Area, (area) => area.inscripcionArea) + @JoinColumn({ name: 'id_area' }) + area: Area; + + @ManyToOne( + () => InscripcionDSC, (inscripcionDsc) => inscripcionDsc.inscripcionArea + ) + inscripcionDsc: InscripcionDSC +} diff --git a/src/inscripcion-area/inscripcion-area.controller.ts b/src/inscripcion-area/inscripcion-area.controller.ts new file mode 100644 index 0000000..0b1b84f --- /dev/null +++ b/src/inscripcion-area/inscripcion-area.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('inscripcion-area') +export class InscripcionAreaController {} diff --git a/src/inscripcion-area/inscripcion-area.module.ts b/src/inscripcion-area/inscripcion-area.module.ts new file mode 100644 index 0000000..8baa728 --- /dev/null +++ b/src/inscripcion-area/inscripcion-area.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { InscripcionAreaController } from './inscripcion-area.controller'; +import { InscripcionAreaService } from './inscripcion-area.service'; + +@Module({ + controllers: [InscripcionAreaController], + providers: [InscripcionAreaService] +}) +export class InscripcionAreaModule {} diff --git a/src/inscripcion-area/inscripcion-area.service.ts b/src/inscripcion-area/inscripcion-area.service.ts new file mode 100644 index 0000000..0c65815 --- /dev/null +++ b/src/inscripcion-area/inscripcion-area.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class InscripcionAreaService {} diff --git a/src/inscripcion-dsc/entity/inscripcion_dsc.entity.ts b/src/inscripcion-dsc/entity/inscripcion_dsc.entity.ts new file mode 100644 index 0000000..7d5c0d1 --- /dev/null +++ b/src/inscripcion-dsc/entity/inscripcion_dsc.entity.ts @@ -0,0 +1,68 @@ +import { InscripcionArea } from 'src/inscripcion-area/entity/inscripcion_area.entity'; +import { InscripcionStatus } from 'src/inscripcion-status/entity/inscripcion_status.entity'; +import { InscripcionUsuario } from 'src/inscripcion-usuario/entity/inscripcion_usuario.entity'; +import { Periodo } from 'src/periodo/entity/periodo.entity'; +import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class InscripcionDSC { + @PrimaryGeneratedColumn() + id_inscripcion: number; + + @Column({ default: 2}) + validacion: number; + + @Column({ nullable: false, default: false}) + confirmacion: boolean; + + @Column({ length: 5, unique: true, default: null}) + folio: string; + + @Column({ default: null}) + monto: number; + + @Column({ default: null}) + hizoPago: boolean; + + @Column({ length: 100, default: null}) + rutaTicket: string; + + @Column({ length: 6, default: null}) + extension: string; + + @Column({ default: null}) + fechaInscripcion: Date; + + @Column({ default: null}) + fechaFin: Date; + + @Column({nullable:false}) + id_status: number; + + @Column({nullable: false}) + id_periodo: number; + + @OneToMany( + () => InscripcionArea, + (inscripcionArea) => inscripcionArea.inscripcionDsc, + ) + inscripcionArea: InscripcionArea[]; + + @ManyToOne( + () => InscripcionStatus, (inscripcionStatus) => inscripcionStatus.inscripcionDsc + ) + @JoinColumn({name: "id_status"}) + inscripcionStatus: InscripcionStatus + + @ManyToOne( + () => Periodo, (periodo) => periodo.inscripcionDsc + ) + @JoinColumn({name: "id_periodo"}) + periodo: Periodo + + @OneToMany( + () => InscripcionUsuario, (inscripcionUsuario) => inscripcionUsuario.inscripcionDsc + ) + inscripcionUsuario: InscripcionUsuario[] + +} diff --git a/src/inscripcion-dsc/inscripcion-dsc.controller.ts b/src/inscripcion-dsc/inscripcion-dsc.controller.ts new file mode 100644 index 0000000..b73f68f --- /dev/null +++ b/src/inscripcion-dsc/inscripcion-dsc.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('inscripcion-dsc') +export class InscripcionDscController {} diff --git a/src/inscripcion-dsc/inscripcion-dsc.module.ts b/src/inscripcion-dsc/inscripcion-dsc.module.ts new file mode 100644 index 0000000..bd23fcf --- /dev/null +++ b/src/inscripcion-dsc/inscripcion-dsc.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { InscripcionDscController } from './inscripcion-dsc.controller'; +import { InscripcionDscService } from './inscripcion-dsc.service'; + +@Module({ + controllers: [InscripcionDscController], + providers: [InscripcionDscService] +}) +export class InscripcionDscModule {} diff --git a/src/inscripcion-dsc/inscripcion-dsc.service.ts b/src/inscripcion-dsc/inscripcion-dsc.service.ts new file mode 100644 index 0000000..1c8f67d --- /dev/null +++ b/src/inscripcion-dsc/inscripcion-dsc.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class InscripcionDscService {} diff --git a/src/inscripcion-status/entity/inscripcion_status.entity.ts b/src/inscripcion-status/entity/inscripcion_status.entity.ts new file mode 100644 index 0000000..f30ab68 --- /dev/null +++ b/src/inscripcion-status/entity/inscripcion_status.entity.ts @@ -0,0 +1,17 @@ +import { InscripcionDSC } from 'src/inscripcion-dsc/entity/inscripcion_dsc.entity'; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class InscripcionStatus { + @PrimaryGeneratedColumn() + id_inscripcion_status: number; + + @Column({ nullable: false}) + id_status: number; + + @Column({ nullable: false}) + status: number; + + @OneToMany(() => InscripcionDSC, (inscripcionDsc) => inscripcionDsc.inscripcionStatus) + inscripcionDsc: InscripcionDSC[]; +} diff --git a/src/inscripcion-status/inscripcion-status.controller.ts b/src/inscripcion-status/inscripcion-status.controller.ts new file mode 100644 index 0000000..fec979a --- /dev/null +++ b/src/inscripcion-status/inscripcion-status.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('inscripcion-status') +export class InscripcionStatusController {} diff --git a/src/inscripcion-status/inscripcion-status.module.ts b/src/inscripcion-status/inscripcion-status.module.ts new file mode 100644 index 0000000..2e26f4b --- /dev/null +++ b/src/inscripcion-status/inscripcion-status.module.ts @@ -0,0 +1,4 @@ +import { Module } from '@nestjs/common'; + +@Module({}) +export class InscripcionStatusModule {} diff --git a/src/inscripcion-status/inscripcion-status.service.ts b/src/inscripcion-status/inscripcion-status.service.ts new file mode 100644 index 0000000..16c9126 --- /dev/null +++ b/src/inscripcion-status/inscripcion-status.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class InscripcionStatusService {} diff --git a/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts b/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts new file mode 100644 index 0000000..5be8a77 --- /dev/null +++ b/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts @@ -0,0 +1,29 @@ +import { InscripcionDSC } from "src/inscripcion-dsc/entity/inscripcion_dsc.entity"; +import { Miembro } from "src/miembro/entity/miembro.entity"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; + + +@Entity() +export class InscripcionUsuario { + @PrimaryGeneratedColumn() + id_inscripcion_usuario: number + + @Column({nullable: false}) + id_usuario: number + + @Column({nullable: false}) + id_inscripcion: number + + @ManyToOne( + () => InscripcionDSC, (inscripcionDsc) => inscripcionDsc.inscripcionUsuario + ) + @JoinColumn({name: "id_inscripcion"}) + inscripcionDsc: InscripcionDSC + + @ManyToOne( + () => Miembro, (miebro) => miebro.inscripcionUsuario + ) + @JoinColumn({name: "id_usuario"}) + miembro: Miembro[] + +} \ No newline at end of file diff --git a/src/inscripcion-usuario/inscripcion-usuario.controller.ts b/src/inscripcion-usuario/inscripcion-usuario.controller.ts new file mode 100644 index 0000000..eacb791 --- /dev/null +++ b/src/inscripcion-usuario/inscripcion-usuario.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('inscripcion-usuario') +export class InscripcionUsuarioController {} diff --git a/src/inscripcion-usuario/inscripcion-usuario.module.ts b/src/inscripcion-usuario/inscripcion-usuario.module.ts new file mode 100644 index 0000000..8656c35 --- /dev/null +++ b/src/inscripcion-usuario/inscripcion-usuario.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { InscripcionUsuarioController } from './inscripcion-usuario.controller'; +import { InscripcionUsuarioService } from './inscripcion-usuario.service'; + +@Module({ + controllers: [InscripcionUsuarioController], + providers: [InscripcionUsuarioService] +}) +export class InscripcionUsuarioModule {} diff --git a/src/inscripcion-usuario/inscripcion-usuario.service.ts b/src/inscripcion-usuario/inscripcion-usuario.service.ts new file mode 100644 index 0000000..4cbd8db --- /dev/null +++ b/src/inscripcion-usuario/inscripcion-usuario.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class InscripcionUsuarioService {} diff --git a/src/miembro/entity/miembro.entity.ts b/src/miembro/entity/miembro.entity.ts new file mode 100644 index 0000000..01a436e --- /dev/null +++ b/src/miembro/entity/miembro.entity.ts @@ -0,0 +1,63 @@ +import { IsEmail } from 'class-validator'; +import { Carrera } from 'src/catalogos/carrera.entity'; +import { TipoMiembro } from 'src/catalogos/tipo-miembro.entity'; +import { InscripcionUsuario } from 'src/inscripcion-usuario/entity/inscripcion_usuario.entity'; +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; + +@Entity() +export class Miembro { + @PrimaryGeneratedColumn() + id_usuario: number; + + @Column({ nullable: false, length: 50 }) + nombre: string; + + @Column({ nullable: false, length: 50 }) + apellido_paterno: string; + + @Column({ nullable: false, length: 50 }) + apellido_materno: string; + + @Column({ nullable: false }) + id_tipo_miembro: number; + + @Column({ nullable: false }) + @IsEmail() + correo: string; + + @Column({ nullable: false, length: 40 }) + password: string; + + @Column({ length: 260, nullable: false }) + descripcion: string; + + @Column({ nullable: false }) + id_carrera: number; + + @Column({ length: 40 }) + semestre: string; + + @Column({ nullable: false }) + cuenta: number; + + @OneToMany( + () => InscripcionUsuario, + (inscripcionUsuario) => inscripcionUsuario.miembro, + ) + inscripcionUsuario: InscripcionUsuario[]; + + @ManyToOne(() => TipoMiembro, (tipoMiembro) => tipoMiembro.miembro) + @JoinColumn({ name: 'id_tipo_miembro' }) + tipoMiembro: TipoMiembro; + + @ManyToOne(() => Carrera, (carrera) => carrera.miembro) + @JoinColumn({ name: 'id_carrera' }) + carrera: Carrera; +} diff --git a/src/miembro/miembro.controller.ts b/src/miembro/miembro.controller.ts new file mode 100644 index 0000000..464fcf5 --- /dev/null +++ b/src/miembro/miembro.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('miembro') +export class MiembroController {} diff --git a/src/miembro/miembro.module.ts b/src/miembro/miembro.module.ts new file mode 100644 index 0000000..d68d418 --- /dev/null +++ b/src/miembro/miembro.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { MiembroController } from './miembro.controller'; +import { MiembroService } from './miembro.service'; + +@Module({ + controllers: [MiembroController], + providers: [MiembroService] +}) +export class MiembroModule {} diff --git a/src/miembro/miembro.service.ts b/src/miembro/miembro.service.ts new file mode 100644 index 0000000..9caed0f --- /dev/null +++ b/src/miembro/miembro.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class MiembroService {} diff --git a/src/periodo/entity/periodo.entity.ts b/src/periodo/entity/periodo.entity.ts new file mode 100644 index 0000000..7f4986e --- /dev/null +++ b/src/periodo/entity/periodo.entity.ts @@ -0,0 +1,17 @@ +import { InscripcionDSC } from "src/inscripcion-dsc/entity/inscripcion_dsc.entity"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + + +@Entity() +export class Periodo { + @PrimaryGeneratedColumn() + id_periodo: number + + @Column() + activo: number + + @OneToMany( + () => InscripcionDSC, (inscripcionDsc) => inscripcionDsc.periodo + ) + inscripcionDsc: InscripcionDSC[] +} \ No newline at end of file diff --git a/src/periodo/periodo.controller.ts b/src/periodo/periodo.controller.ts new file mode 100644 index 0000000..45824a2 --- /dev/null +++ b/src/periodo/periodo.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('periodo') +export class PeriodoController {} diff --git a/src/periodo/periodo.module.ts b/src/periodo/periodo.module.ts new file mode 100644 index 0000000..6572aa4 --- /dev/null +++ b/src/periodo/periodo.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { PeriodoController } from './periodo.controller'; +import { PeriodoService } from './periodo.service'; + +@Module({ + controllers: [PeriodoController], + providers: [PeriodoService] +}) +export class PeriodoModule {} diff --git a/src/periodo/periodo.service.ts b/src/periodo/periodo.service.ts new file mode 100644 index 0000000..002e00a --- /dev/null +++ b/src/periodo/periodo.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class PeriodoService {} -- 2.43.0 From e01cba238decd0522522ab407355e855ee7ff1f8 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 3 Mar 2023 15:31:28 -0600 Subject: [PATCH 09/37] intento de confirmacion, aun pendiente --- .env | 16 +- .gitignore | 4 +- package-lock.json | 234 +++++++++++++++++- package.json | 2 + sql/00-admin.sql | 1 + src/actividad/actividad.controller.spec.ts | 18 ++ src/actividad/actividad.controller.ts | 4 + src/actividad/actividad.module.ts | 9 + src/actividad/actividad.service.spec.ts | 18 ++ src/actividad/actividad.service.ts | 4 + src/app.module.ts | 40 ++- src/auth/auth.service.ts | 4 +- src/config/db.ts | 51 ++++ src/contacto/entity/contacto.entity.ts | 27 ++ .../entity/equipo_evento.entity.ts | 27 ++ .../entity/equipo_miembro.entity.ts | 27 ++ src/equipo/entity/equipo.entity.ts | 25 ++ src/eventos/evento.entity.ts | 8 + .../entity/inscripcion_area.entity.ts | 1 + .../inscripcion-dsc.controller.ts | 74 +++++- .../inscripcion-dsc.service.ts | 62 ++++- .../entity/inscripcion_usuario.entity.ts | 4 +- .../entity/miembro_contacto.entity.ts | 26 ++ .../miembro-contacto.controller.spec.ts | 18 ++ .../miembro-contacto.controller.ts | 4 + .../miembro-contacto.module.ts | 9 + .../miembro-contacto.service.spec.ts | 18 ++ .../miembro-contacto.service.ts | 4 + .../entity/miembro_proyecto.entity.ts | 26 ++ .../miembro-proyecto.controller.spec.ts | 18 ++ .../miembro-proyecto.controller.ts | 4 + .../miembro-proyecto.module.ts | 9 + .../miembro-proyecto.service.spec.ts | 18 ++ .../miembro-proyecto.service.ts | 4 + src/miembro/entity/miembro.entity.ts | 21 +- .../proyecto-actividad.controller.spec.ts | 18 ++ .../proyecto-actividad.controller.ts | 4 + .../proyecto-actividad.module.ts | 9 + .../proyecto-actividad.service.spec.ts | 18 ++ .../proyecto-actividad.service.ts | 4 + src/proyecto/entity/proyecto.entity.ts | 29 +++ src/proyecto/proyecto.controller.spec.ts | 18 ++ src/proyecto/proyecto.controller.ts | 4 + src/proyecto/proyecto.module.ts | 9 + src/proyecto/proyecto.service.spec.ts | 18 ++ src/proyecto/proyecto.service.ts | 4 + src/sybase/sybase.config.ts | 10 + src/sybase/sybase.module-definition.ts | 7 + src/sybase/sybase.module.ts | 7 + src/sybase/sybase.service.ts | 35 +++ src/usuario/usuario.entity.ts | 2 +- 51 files changed, 1008 insertions(+), 27 deletions(-) create mode 100644 sql/00-admin.sql create mode 100644 src/actividad/actividad.controller.spec.ts create mode 100644 src/actividad/actividad.controller.ts create mode 100644 src/actividad/actividad.module.ts create mode 100644 src/actividad/actividad.service.spec.ts create mode 100644 src/actividad/actividad.service.ts create mode 100644 src/config/db.ts create mode 100644 src/contacto/entity/contacto.entity.ts create mode 100644 src/equipo-evento/entity/equipo_evento.entity.ts create mode 100644 src/equipo-miembro/entity/equipo_miembro.entity.ts create mode 100644 src/equipo/entity/equipo.entity.ts create mode 100644 src/miembro-contacto/entity/miembro_contacto.entity.ts create mode 100644 src/miembro-contacto/miembro-contacto.controller.spec.ts create mode 100644 src/miembro-contacto/miembro-contacto.controller.ts create mode 100644 src/miembro-contacto/miembro-contacto.module.ts create mode 100644 src/miembro-contacto/miembro-contacto.service.spec.ts create mode 100644 src/miembro-contacto/miembro-contacto.service.ts create mode 100644 src/miembro-proyecto/entity/miembro_proyecto.entity.ts create mode 100644 src/miembro-proyecto/miembro-proyecto.controller.spec.ts create mode 100644 src/miembro-proyecto/miembro-proyecto.controller.ts create mode 100644 src/miembro-proyecto/miembro-proyecto.module.ts create mode 100644 src/miembro-proyecto/miembro-proyecto.service.spec.ts create mode 100644 src/miembro-proyecto/miembro-proyecto.service.ts create mode 100644 src/proyecto-actividad/proyecto-actividad.controller.spec.ts create mode 100644 src/proyecto-actividad/proyecto-actividad.controller.ts create mode 100644 src/proyecto-actividad/proyecto-actividad.module.ts create mode 100644 src/proyecto-actividad/proyecto-actividad.service.spec.ts create mode 100644 src/proyecto-actividad/proyecto-actividad.service.ts create mode 100644 src/proyecto/entity/proyecto.entity.ts create mode 100644 src/proyecto/proyecto.controller.spec.ts create mode 100644 src/proyecto/proyecto.controller.ts create mode 100644 src/proyecto/proyecto.module.ts create mode 100644 src/proyecto/proyecto.service.spec.ts create mode 100644 src/proyecto/proyecto.service.ts create mode 100644 src/sybase/sybase.config.ts create mode 100644 src/sybase/sybase.module-definition.ts create mode 100644 src/sybase/sybase.module.ts create mode 100644 src/sybase/sybase.service.ts diff --git a/.env b/.env index 02e37b4..cc0937e 100644 --- a/.env +++ b/.env @@ -6,15 +6,7 @@ DB_PASSWORD=password DB_NAME=cedetec_proyectos DB_PORT=3306 - -SALT_ROUNDS = 10 - -KEY = -CADUCIDAD_TOKEN = 1800000 - -TOKEN_KEY = -TOKEN_EXPIRATION = 1800000 - - -EMAIL= -EMAIL_PASS= \ No newline at end of file +DB_HOST_DSC = 132.248.180.82 +DB_USER_DSC = sites_user +DB_PASS_DSC = F0rTest +DB_NAME_DSC = sat \ No newline at end of file diff --git a/.gitignore b/.gitignore index 22f55ad..ea48d65 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,6 @@ lerna-debug.log* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json -!.vscode/extensions.json \ No newline at end of file +!.vscode/extensions.json + +.env \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0d569b0..48642b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "moment": "^2.29.4", + "mysql2": "^3.1.2", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -28,6 +29,7 @@ "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "swagger-ui-express": "^4.6.1", + "sybase": "^1.2.3", "typeorm": "^0.3.12" }, "devDependencies": { @@ -3817,6 +3819,14 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4853,6 +4863,14 @@ "node": ">=10" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5349,6 +5367,11 @@ "node": ">=8" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -6365,6 +6388,29 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", @@ -6514,6 +6560,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6786,6 +6837,43 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/mysql2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.1.2.tgz", + "integrity": "sha512-NXz6sUvHSEOKz1jv3koSga7eb2dHrwD/mnPmqbbZzMRvjQcSpb0Eh0ectWyYt1U60CLlEbjoA3XYjjbbReRF5Q==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^7.14.1", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "engines": { + "node": ">=12" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -6796,6 +6884,25 @@ "thenify-all": "^1.0.0" } }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "engines": { + "node": ">=12" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7997,6 +8104,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -8162,6 +8274,14 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -8367,6 +8487,14 @@ "express": ">=4.0.0" } }, + "node_modules/sybase": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/sybase/-/sybase-1.2.3.tgz", + "integrity": "sha512-69dtkzLPjWLQknP0x6gGud9WKZs7Ujdo8EEl4nwN/fhLrgXsgMxbGkT2rQfdw1kg2lbJvbpBSbA2vm0rWRxs6g==", + "dependencies": { + "JSONStream": "latest" + } + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -8546,8 +8674,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/tmp": { "version": "0.0.33", @@ -12392,6 +12519,11 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -13188,6 +13320,14 @@ "wide-align": "^1.1.2" } }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -13537,6 +13677,11 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14310,6 +14455,20 @@ "universalify": "^2.0.0" } }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "jsonwebtoken": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", @@ -14427,6 +14586,11 @@ } } }, + "long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -14631,6 +14795,36 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mysql2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.1.2.tgz", + "integrity": "sha512-NXz6sUvHSEOKz1jv3koSga7eb2dHrwD/mnPmqbbZzMRvjQcSpb0Eh0ectWyYt1U60CLlEbjoA3XYjjbbReRF5Q==", + "requires": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^7.14.1", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==" + } + } + }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -14641,6 +14835,21 @@ "thenify-all": "^1.0.0" } }, + "named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "requires": { + "lru-cache": "^7.14.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==" + } + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -15517,6 +15726,11 @@ } } }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -15650,6 +15864,11 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" + }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -15801,6 +16020,14 @@ "swagger-ui-dist": ">=4.11.0" } }, + "sybase": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/sybase/-/sybase-1.2.3.tgz", + "integrity": "sha512-69dtkzLPjWLQknP0x6gGud9WKZs7Ujdo8EEl4nwN/fhLrgXsgMxbGkT2rQfdw1kg2lbJvbpBSbA2vm0rWRxs6g==", + "requires": { + "JSONStream": "latest" + } + }, "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -15929,8 +16156,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "tmp": { "version": "0.0.33", diff --git a/package.json b/package.json index 29ad066..4b5be02 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "moment": "^2.29.4", + "mysql2": "^3.1.2", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -39,6 +40,7 @@ "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "swagger-ui-express": "^4.6.1", + "sybase": "^1.2.3", "typeorm": "^0.3.12" }, "devDependencies": { diff --git a/sql/00-admin.sql b/sql/00-admin.sql new file mode 100644 index 0000000..0755541 --- /dev/null +++ b/sql/00-admin.sql @@ -0,0 +1 @@ +INSERT INTO usuario (nombre, password, email) VALUES("jorge", "Canela1108", "admin@unam.com"); \ No newline at end of file diff --git a/src/actividad/actividad.controller.spec.ts b/src/actividad/actividad.controller.spec.ts new file mode 100644 index 0000000..f7283ce --- /dev/null +++ b/src/actividad/actividad.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ActividadController } from './actividad.controller'; + +describe('ActividadController', () => { + let controller: ActividadController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ActividadController], + }).compile(); + + controller = module.get(ActividadController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/actividad/actividad.controller.ts b/src/actividad/actividad.controller.ts new file mode 100644 index 0000000..728d425 --- /dev/null +++ b/src/actividad/actividad.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('actividad') +export class ActividadController {} diff --git a/src/actividad/actividad.module.ts b/src/actividad/actividad.module.ts new file mode 100644 index 0000000..de0e8c1 --- /dev/null +++ b/src/actividad/actividad.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ActividadController } from './actividad.controller'; +import { ActividadService } from './actividad.service'; + +@Module({ + controllers: [ActividadController], + providers: [ActividadService] +}) +export class ActividadModule {} diff --git a/src/actividad/actividad.service.spec.ts b/src/actividad/actividad.service.spec.ts new file mode 100644 index 0000000..a268525 --- /dev/null +++ b/src/actividad/actividad.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ActividadService } from './actividad.service'; + +describe('ActividadService', () => { + let service: ActividadService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ActividadService], + }).compile(); + + service = module.get(ActividadService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/actividad/actividad.service.ts b/src/actividad/actividad.service.ts new file mode 100644 index 0000000..373da18 --- /dev/null +++ b/src/actividad/actividad.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ActividadService {} diff --git a/src/app.module.ts b/src/app.module.ts index 0c80ed7..dae2cf4 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -32,6 +32,19 @@ import { Area } from './catalogos/area.entity'; import { TipoMiembro } from './catalogos/tipo-miembro.entity'; import { Carrera } from './catalogos/carrera.entity'; import { Periodo } from './periodo/entity/periodo.entity'; +import { MiembroProyectoModule } from './miembro-proyecto/miembro-proyecto.module'; +import { MiembroContactoModule } from './miembro-contacto/miembro-contacto.module'; +import { ProyectoModule } from './proyecto/proyecto.module'; +import { ProyectoActividadModule } from './proyecto-actividad/proyecto-actividad.module'; +import { ActividadModule } from './actividad/actividad.module'; +import { MiembroProyecto } from './miembro-proyecto/entity/miembro_proyecto.entity'; +import { MiembroContacto } from './miembro-contacto/entity/miembro_contacto.entity'; +import { Proyecto } from './proyecto/entity/proyecto.entity'; +import { Contacto } from './contacto/entity/contacto.entity'; +import { Equipo } from './equipo/entity/equipo.entity'; +import { EquipoEvento } from './equipo-evento/entity/equipo_evento.entity'; +import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; +import { SybaseModule } from './sybase/sybase.module'; @Module({ imports: [ @@ -54,6 +67,7 @@ import { Periodo } from './periodo/entity/periodo.entity'; Participante, EventoParticipante, Usuario, + /* Agregadas el 29 de febrero */ Miembro, InscripcionArea, InscripcionDSC, @@ -62,11 +76,30 @@ import { Periodo } from './periodo/entity/periodo.entity'; Area, TipoMiembro, Carrera, - Periodo + Periodo, + /* Agregadas el 1 de marzo */ + MiembroProyecto, + MiembroContacto, + Proyecto, + Contacto, + Equipo, + EquipoEvento, + EquipoMiembro, ], synchronize: true, }), }), + SybaseModule.forRootAsync({ + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + return { + host: configService.get('DB_HOST_DSC'), + database: configService.get('DB_NAME_DSC'), + username: configService.get('DB_USER_DSC'), + password: configService.get('DB_PASS_DSC'), + }; + }, + }), EventosModule, ParticipanteModule, EventoParticipanteModule, @@ -80,6 +113,11 @@ import { Periodo } from './periodo/entity/periodo.entity'; PeriodoModule, InscripcionUsuarioModule, MiembroModule, + MiembroProyectoModule, + MiembroContactoModule, + ProyectoModule, + ProyectoActividadModule, + ActividadModule, ], controllers: [ AppController, diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index be20860..b32c96c 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -47,11 +47,11 @@ export class AuthService { if (!checkPassword) throw new HttpException('Contraseña incorrecta', 403); - const payload = { id_usuario: usuario.id_usuario, name: usuario.name }; + const payload = { id_usuario: usuario.id_usuario, name: usuario.nombre }; const token = this.jwtService.sign(payload); //firma el token const data = { - usuario: usuario.name, + usuario: usuario.nombre, id: usuario.id_usuario, email: usuario.email, token, diff --git a/src/config/db.ts b/src/config/db.ts new file mode 100644 index 0000000..b6a612f --- /dev/null +++ b/src/config/db.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@nestjs/common'; +import * as mysql from 'mysql2/promise'; + +@Injectable() +export class MysqlService { + private mysqlPool: mysql.Pool; + private mysqlConnection: mysql.Connection; + private mysqlConnectionDscConfirmation: mysql.Connection; + + constructor() { +/* this.mysqlPool = mysql.createPool({ + connectionLimit: 20, + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, + }); + + this.mysqlConnection = mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, + }); + + this.mysqlConnectionDscConfirmation = mysql.createPool({ + connectionLimit: 20, + host: process.env.DB_HOST_DSC, + user: process.env.DB_USER_DSC, + password: process.env.DB_PASS_DSC, + database: process.env.DB_NAME_DSC, + }); */ + + /* this.mysqlConnection.connect((err) => { + if (err) console.log(err); + else console.log('base conectada'); + }); */ + } + + getMysqlConnection(): mysql.Connection { + return this.mysqlConnection; + } + + getMysqlPool(): mysql.Pool { + return this.mysqlPool; + } + + getMysqlConnectionDscConfirmation(): mysql.Connection { + return this.mysqlConnectionDscConfirmation; + } +} \ No newline at end of file diff --git a/src/contacto/entity/contacto.entity.ts b/src/contacto/entity/contacto.entity.ts new file mode 100644 index 0000000..854cd13 --- /dev/null +++ b/src/contacto/entity/contacto.entity.ts @@ -0,0 +1,27 @@ +import { MiembroContacto } from "src/miembro-contacto/entity/miembro_contacto.entity"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; + + +@Entity() +export class Contacto { + @PrimaryGeneratedColumn() + id_contacto: number + + @Column({nullable:false}) + correo: string + + @Column() + horario: string + + @Column({nullable:true}) + facebook: string + + @Column({nullable: true}) + linkedin: string + + @ManyToOne( + () => MiembroContacto, (miembroContacto) => miembroContacto.contacto + ) + @JoinColumn({name: "id_contacto"}) + miembroContacto: MiembroContacto +} \ No newline at end of file diff --git a/src/equipo-evento/entity/equipo_evento.entity.ts b/src/equipo-evento/entity/equipo_evento.entity.ts new file mode 100644 index 0000000..2d1d2aa --- /dev/null +++ b/src/equipo-evento/entity/equipo_evento.entity.ts @@ -0,0 +1,27 @@ +import { Equipo } from "src/equipo/entity/equipo.entity"; +import { Evento } from "src/eventos/evento.entity"; +import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class EquipoEvento { + @PrimaryGeneratedColumn() + id_equipo_evento: number + + @Column() + id_equipo: number + + @Column() + id_evento: number + + @ManyToOne( + () => Equipo, (equipo) => equipo.equipoEvento + ) + @JoinColumn({name: "id_equipo"}) + equipo: Equipo[] + + @ManyToOne( + () => Evento, (evento) => evento.equipoEvento + ) + @JoinColumn({name: "id_evento"}) + evento: Evento +} \ No newline at end of file diff --git a/src/equipo-miembro/entity/equipo_miembro.entity.ts b/src/equipo-miembro/entity/equipo_miembro.entity.ts new file mode 100644 index 0000000..031808d --- /dev/null +++ b/src/equipo-miembro/entity/equipo_miembro.entity.ts @@ -0,0 +1,27 @@ +import { Equipo } from "src/equipo/entity/equipo.entity"; +import { Miembro } from "src/miembro/entity/miembro.entity"; +import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class EquipoMiembro { + @PrimaryGeneratedColumn() + id_equipo_miembro:number + + @Column() + id_equipo:number + + @Column() + id_miembro:number + + @ManyToOne( + () => Miembro, (miembro) => miembro.equipoMiembro + ) + @JoinColumn({name:"id_miembro"}) + miembro: Miembro[] + + @ManyToOne( + () => Equipo,(equipo) => equipo.equipoMiembro + ) + @JoinColumn({name: "id_equipo"}) + equipo: Equipo[] +} \ No newline at end of file diff --git a/src/equipo/entity/equipo.entity.ts b/src/equipo/entity/equipo.entity.ts new file mode 100644 index 0000000..687cbad --- /dev/null +++ b/src/equipo/entity/equipo.entity.ts @@ -0,0 +1,25 @@ +import { EquipoEvento } from "src/equipo-evento/entity/equipo_evento.entity"; +import { EquipoMiembro } from "src/equipo-miembro/entity/equipo_miembro.entity"; +import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class Equipo{ + @PrimaryGeneratedColumn() + id_equipo: number + + @Column({length:50, nullable:true}) + nombre: string + + @Column({length:250}) + descripcion:string + + @OneToMany( + () => EquipoMiembro, (equipoMiembro) => equipoMiembro.miembro + ) + equipoMiembro: EquipoMiembro + + @OneToMany( + () => EquipoEvento, (equipoEvento) => equipoEvento.evento + ) + equipoEvento: EquipoEvento +} \ No newline at end of file diff --git a/src/eventos/evento.entity.ts b/src/eventos/evento.entity.ts index 061b1ea..5d2639c 100644 --- a/src/eventos/evento.entity.ts +++ b/src/eventos/evento.entity.ts @@ -1,8 +1,10 @@ +import { EquipoEvento } from 'src/equipo-evento/entity/equipo_evento.entity'; import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; import { Column, Entity, JoinColumn, + ManyToOne, OneToMany, PrimaryGeneratedColumn, } from 'typeorm'; @@ -68,4 +70,10 @@ export class Evento { (eventoParticipante) => eventoParticipante.evento, ) eventoParticipantes: EventoParticipante[]; + + @OneToMany( + () => EquipoEvento, (equipoEvento) => equipoEvento.evento + ) + equipoEvento: EquipoEvento + } diff --git a/src/inscripcion-area/entity/inscripcion_area.entity.ts b/src/inscripcion-area/entity/inscripcion_area.entity.ts index d9523b7..73aeec3 100644 --- a/src/inscripcion-area/entity/inscripcion_area.entity.ts +++ b/src/inscripcion-area/entity/inscripcion_area.entity.ts @@ -26,5 +26,6 @@ export class InscripcionArea { @ManyToOne( () => InscripcionDSC, (inscripcionDsc) => inscripcionDsc.inscripcionArea ) + @JoinColumn({name:"id_inscripcion"}) inscripcionDsc: InscripcionDSC } diff --git a/src/inscripcion-dsc/inscripcion-dsc.controller.ts b/src/inscripcion-dsc/inscripcion-dsc.controller.ts index b73f68f..fbecd37 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.controller.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.controller.ts @@ -1,4 +1,74 @@ -import { Controller } from '@nestjs/common'; +import { + Body, + Controller, + Get, + Param, + ParseIntPipe, + Post, +} from '@nestjs/common'; +import { InscripcionDscService } from './inscripcion-dsc.service'; @Controller('inscripcion-dsc') -export class InscripcionDscController {} +export class InscripcionDscController { + constructor(private readonly inscripcionService: InscripcionDscService) {} + + @Post('confirmacion') + async confirmacionDsc(@Body() body: any) { + const { accountNumber } = body; + +/* this.inscripcionService + .userVerification({ accountNumber }) + .then((res) => { + console.log(res); + }) + .catch((err) => { + return(err) + }); */ + + try { + const userVerificationResponse = + await this.inscripcionService.userVerification({ + accountNumber, + }); + console.log(userVerificationResponse) + if (userVerificationResponse.length === 0) { + return { + error: true, + msj: 'El usuario no se encuentra inscrito', + desc: '', + }; + } + const [userInformation] = userVerificationResponse; + console.log(userInformation); + if (userInformation.confirmacion) { + return { + error: true, + msj: 'El usuario ya hizo la confirmación anteriormente', + desc: '', + }; + } + } catch (err) { + return console.log(err); + } + try { + const confirmationResponse = + await this.inscripcionService.userConfirmation({ accountNumber }); + return { + error: false, + msj: 'Usuario confirmado exitosamente', + data: confirmationResponse, + }; + } catch (err) { + return { + error: true, + msj: `No se pudo realizar la confirmación del usuario`, + desc: `${err}`, + }; + } + } + + /* @Get(":id") + getUsuarioById(@Param('id', ParseIntPipe)id: number){ + + } */ +} diff --git a/src/inscripcion-dsc/inscripcion-dsc.service.ts b/src/inscripcion-dsc/inscripcion-dsc.service.ts index 1c8f67d..b89674c 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.service.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.service.ts @@ -1,4 +1,64 @@ import { Injectable } from '@nestjs/common'; +import { SybaseService } from 'src/sybase/sybase.service'; @Injectable() -export class InscripcionDscService {} +export class InscripcionDscService { + constructor(private sybaseService: SybaseService) {} + + async userVerification(data: { accountNumber: string }): Promise { + const { accountNumber } = data; + /* console.log(accountNumber) */ + + try { + + this.validarNumeroCuenta(accountNumber); //valida que el numero de cuenta sea string y menor a 9 digitos + + } catch (error) { + + throw error; + } + + const userInformationQuery = `SELECT A.id_cuenta, nombre, if(AI.platica=true,1,0) as confirmacion FROM alumno A + JOIN alumno_inscrito AI ON (A.id_cuenta = AI.id_cuenta) + JOIN periodo P ON (P.id_periodo = AI.id_periodo) + WHERE A.id_cuenta = "${accountNumber}" and P.activo=true`; + + try { + const responseUserInformation = await this.sybaseService.queryDsc( + userInformationQuery, + ); + console.log(responseUserInformation) + return responseUserInformation; + + } catch (error) { + throw error; + } + } + + validarNumeroCuenta = (numeroCuenta) => { + if (typeof numeroCuenta !== 'string' || numeroCuenta.length > 9) + return numeroCuenta; + }; + + async userConfirmation(data: { accountNumber: string }): Promise { + const { accountNumber } = data; + + try { + this.validarNumeroCuenta(accountNumber); + } catch (error) { + throw error; + } + + let userConfirmationQuery = `UPDATE alumno_inscrito SET platica=true + WHERE id_cuenta="${accountNumber}" and id_periodo=(SELECT id_periodo FROM periodo WHERE activo=true)`; + + try { + const responseUserConfirmation = await this.sybaseService.queryDsc( + userConfirmationQuery, + ); + return responseUserConfirmation; + } catch (error) { + throw error; + } + } +} diff --git a/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts b/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts index 5be8a77..558dc3d 100644 --- a/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts +++ b/src/inscripcion-usuario/entity/inscripcion_usuario.entity.ts @@ -9,7 +9,7 @@ export class InscripcionUsuario { id_inscripcion_usuario: number @Column({nullable: false}) - id_usuario: number + id_miembro: number @Column({nullable: false}) id_inscripcion: number @@ -23,7 +23,7 @@ export class InscripcionUsuario { @ManyToOne( () => Miembro, (miebro) => miebro.inscripcionUsuario ) - @JoinColumn({name: "id_usuario"}) + @JoinColumn({name: "id_miembro"}) miembro: Miembro[] } \ No newline at end of file diff --git a/src/miembro-contacto/entity/miembro_contacto.entity.ts b/src/miembro-contacto/entity/miembro_contacto.entity.ts new file mode 100644 index 0000000..3632f98 --- /dev/null +++ b/src/miembro-contacto/entity/miembro_contacto.entity.ts @@ -0,0 +1,26 @@ +import { Contacto } from "src/contacto/entity/contacto.entity"; +import { Miembro } from "src/miembro/entity/miembro.entity"; +import { Column, Entity, JoinColumn, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class MiembroContacto { + @PrimaryGeneratedColumn() + id_miembro_contacto: number + + @Column() + id_miembro: number + + @Column() + id_contacto: number + + @OneToMany( + () => Miembro, (miembro) => miembro.miembroContacto + ) + miembro: Miembro[] + + @OneToMany( + () => Contacto, (contacto) => contacto.miembroContacto + ) + @JoinColumn({name: "id_contacto"}) + contacto: Contacto +} \ No newline at end of file diff --git a/src/miembro-contacto/miembro-contacto.controller.spec.ts b/src/miembro-contacto/miembro-contacto.controller.spec.ts new file mode 100644 index 0000000..8dd6494 --- /dev/null +++ b/src/miembro-contacto/miembro-contacto.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MiembroContactoController } from './miembro-contacto.controller'; + +describe('MiembroContactoController', () => { + let controller: MiembroContactoController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MiembroContactoController], + }).compile(); + + controller = module.get(MiembroContactoController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/miembro-contacto/miembro-contacto.controller.ts b/src/miembro-contacto/miembro-contacto.controller.ts new file mode 100644 index 0000000..13a2a1e --- /dev/null +++ b/src/miembro-contacto/miembro-contacto.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('miembro-contacto') +export class MiembroContactoController {} diff --git a/src/miembro-contacto/miembro-contacto.module.ts b/src/miembro-contacto/miembro-contacto.module.ts new file mode 100644 index 0000000..b7c7953 --- /dev/null +++ b/src/miembro-contacto/miembro-contacto.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { MiembroContactoController } from './miembro-contacto.controller'; +import { MiembroContactoService } from './miembro-contacto.service'; + +@Module({ + controllers: [MiembroContactoController], + providers: [MiembroContactoService] +}) +export class MiembroContactoModule {} diff --git a/src/miembro-contacto/miembro-contacto.service.spec.ts b/src/miembro-contacto/miembro-contacto.service.spec.ts new file mode 100644 index 0000000..48b4a0d --- /dev/null +++ b/src/miembro-contacto/miembro-contacto.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MiembroContactoService } from './miembro-contacto.service'; + +describe('MiembroContactoService', () => { + let service: MiembroContactoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [MiembroContactoService], + }).compile(); + + service = module.get(MiembroContactoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/miembro-contacto/miembro-contacto.service.ts b/src/miembro-contacto/miembro-contacto.service.ts new file mode 100644 index 0000000..5640c78 --- /dev/null +++ b/src/miembro-contacto/miembro-contacto.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class MiembroContactoService {} diff --git a/src/miembro-proyecto/entity/miembro_proyecto.entity.ts b/src/miembro-proyecto/entity/miembro_proyecto.entity.ts new file mode 100644 index 0000000..fe85695 --- /dev/null +++ b/src/miembro-proyecto/entity/miembro_proyecto.entity.ts @@ -0,0 +1,26 @@ +import { Miembro } from "src/miembro/entity/miembro.entity"; +import { Proyecto } from "src/proyecto/entity/proyecto.entity"; +import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class MiembroProyecto { + @PrimaryGeneratedColumn() + id_miembro_proyecto: number + + @Column() + id_proyecto: number + + @Column() + id_miembro: number + + @ManyToOne( + () => Miembro, (miembro) => miembro.miembroProyecto + ) + @JoinColumn({name: "id_miembro"}) + miembro: Miembro[] + + @OneToMany( + () => Proyecto, (proyecto) => proyecto.miembroProyecto + ) + proyecto: Proyecto[] +} \ No newline at end of file diff --git a/src/miembro-proyecto/miembro-proyecto.controller.spec.ts b/src/miembro-proyecto/miembro-proyecto.controller.spec.ts new file mode 100644 index 0000000..b5cbc40 --- /dev/null +++ b/src/miembro-proyecto/miembro-proyecto.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MiembroProyectoController } from './miembro-proyecto.controller'; + +describe('MiembroProyectoController', () => { + let controller: MiembroProyectoController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MiembroProyectoController], + }).compile(); + + controller = module.get(MiembroProyectoController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/miembro-proyecto/miembro-proyecto.controller.ts b/src/miembro-proyecto/miembro-proyecto.controller.ts new file mode 100644 index 0000000..7b64551 --- /dev/null +++ b/src/miembro-proyecto/miembro-proyecto.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('miembro-proyecto') +export class MiembroProyectoController {} diff --git a/src/miembro-proyecto/miembro-proyecto.module.ts b/src/miembro-proyecto/miembro-proyecto.module.ts new file mode 100644 index 0000000..a11354c --- /dev/null +++ b/src/miembro-proyecto/miembro-proyecto.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { MiembroProyectoController } from './miembro-proyecto.controller'; +import { MiembroProyectoService } from './miembro-proyecto.service'; + +@Module({ + controllers: [MiembroProyectoController], + providers: [MiembroProyectoService] +}) +export class MiembroProyectoModule {} diff --git a/src/miembro-proyecto/miembro-proyecto.service.spec.ts b/src/miembro-proyecto/miembro-proyecto.service.spec.ts new file mode 100644 index 0000000..230292a --- /dev/null +++ b/src/miembro-proyecto/miembro-proyecto.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MiembroProyectoService } from './miembro-proyecto.service'; + +describe('MiembroProyectoService', () => { + let service: MiembroProyectoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [MiembroProyectoService], + }).compile(); + + service = module.get(MiembroProyectoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/miembro-proyecto/miembro-proyecto.service.ts b/src/miembro-proyecto/miembro-proyecto.service.ts new file mode 100644 index 0000000..ae0c642 --- /dev/null +++ b/src/miembro-proyecto/miembro-proyecto.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class MiembroProyectoService {} diff --git a/src/miembro/entity/miembro.entity.ts b/src/miembro/entity/miembro.entity.ts index 01a436e..e4ee23a 100644 --- a/src/miembro/entity/miembro.entity.ts +++ b/src/miembro/entity/miembro.entity.ts @@ -1,7 +1,10 @@ import { IsEmail } from 'class-validator'; import { Carrera } from 'src/catalogos/carrera.entity'; import { TipoMiembro } from 'src/catalogos/tipo-miembro.entity'; +import { EquipoMiembro } from 'src/equipo-miembro/entity/equipo_miembro.entity'; import { InscripcionUsuario } from 'src/inscripcion-usuario/entity/inscripcion_usuario.entity'; +import { MiembroContacto } from 'src/miembro-contacto/entity/miembro_contacto.entity'; +import { MiembroProyecto } from 'src/miembro-proyecto/entity/miembro_proyecto.entity'; import { Column, Entity, @@ -14,7 +17,7 @@ import { @Entity() export class Miembro { @PrimaryGeneratedColumn() - id_usuario: number; + id_miembro: number; @Column({ nullable: false, length: 50 }) nombre: string; @@ -60,4 +63,20 @@ export class Miembro { @ManyToOne(() => Carrera, (carrera) => carrera.miembro) @JoinColumn({ name: 'id_carrera' }) carrera: Carrera; + + @ManyToOne( + () => MiembroContacto, (miembroContacto) => miembroContacto.miembro + ) + @JoinColumn({name: "id_miembro"}) + miembroContacto: MiembroContacto + + @OneToMany( + () => MiembroProyecto, (miembroProyecto) => miembroProyecto.miembro + ) + miembroProyecto: MiembroProyecto + + @OneToMany( + () => EquipoMiembro, (equipoMiembro) => equipoMiembro.miembro + ) + equipoMiembro: EquipoMiembro } diff --git a/src/proyecto-actividad/proyecto-actividad.controller.spec.ts b/src/proyecto-actividad/proyecto-actividad.controller.spec.ts new file mode 100644 index 0000000..bec3d0e --- /dev/null +++ b/src/proyecto-actividad/proyecto-actividad.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProyectoActividadController } from './proyecto-actividad.controller'; + +describe('ProyectoActividadController', () => { + let controller: ProyectoActividadController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ProyectoActividadController], + }).compile(); + + controller = module.get(ProyectoActividadController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/proyecto-actividad/proyecto-actividad.controller.ts b/src/proyecto-actividad/proyecto-actividad.controller.ts new file mode 100644 index 0000000..1dd347e --- /dev/null +++ b/src/proyecto-actividad/proyecto-actividad.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('proyecto-actividad') +export class ProyectoActividadController {} diff --git a/src/proyecto-actividad/proyecto-actividad.module.ts b/src/proyecto-actividad/proyecto-actividad.module.ts new file mode 100644 index 0000000..18f9a43 --- /dev/null +++ b/src/proyecto-actividad/proyecto-actividad.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ProyectoActividadController } from './proyecto-actividad.controller'; +import { ProyectoActividadService } from './proyecto-actividad.service'; + +@Module({ + controllers: [ProyectoActividadController], + providers: [ProyectoActividadService] +}) +export class ProyectoActividadModule {} diff --git a/src/proyecto-actividad/proyecto-actividad.service.spec.ts b/src/proyecto-actividad/proyecto-actividad.service.spec.ts new file mode 100644 index 0000000..ba6f2b1 --- /dev/null +++ b/src/proyecto-actividad/proyecto-actividad.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProyectoActividadService } from './proyecto-actividad.service'; + +describe('ProyectoActividadService', () => { + let service: ProyectoActividadService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ProyectoActividadService], + }).compile(); + + service = module.get(ProyectoActividadService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/proyecto-actividad/proyecto-actividad.service.ts b/src/proyecto-actividad/proyecto-actividad.service.ts new file mode 100644 index 0000000..ee94bfb --- /dev/null +++ b/src/proyecto-actividad/proyecto-actividad.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ProyectoActividadService {} diff --git a/src/proyecto/entity/proyecto.entity.ts b/src/proyecto/entity/proyecto.entity.ts new file mode 100644 index 0000000..8a2a880 --- /dev/null +++ b/src/proyecto/entity/proyecto.entity.ts @@ -0,0 +1,29 @@ +import { MiembroProyecto } from 'src/miembro-proyecto/entity/miembro_proyecto.entity'; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class Proyecto { + @PrimaryGeneratedColumn() + id_proyecto: number; + + @Column({ length: 50 }) + nombre: string; + + @Column() + activo: boolean; + + @Column({ length: 200 }) + mision: string; + + @Column({ length: 200 }) + vision: string; + + @Column({ length: 200 }) + descripcion: string; + + @ManyToOne( + () => MiembroProyecto, (miembroProyecto) => miembroProyecto.proyecto + ) + @JoinColumn({name: "id_proyecto"}) + miembroProyecto: MiembroProyecto +} diff --git a/src/proyecto/proyecto.controller.spec.ts b/src/proyecto/proyecto.controller.spec.ts new file mode 100644 index 0000000..2152990 --- /dev/null +++ b/src/proyecto/proyecto.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProyectoController } from './proyecto.controller'; + +describe('ProyectoController', () => { + let controller: ProyectoController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ProyectoController], + }).compile(); + + controller = module.get(ProyectoController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/proyecto/proyecto.controller.ts b/src/proyecto/proyecto.controller.ts new file mode 100644 index 0000000..34c7313 --- /dev/null +++ b/src/proyecto/proyecto.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('proyecto') +export class ProyectoController {} diff --git a/src/proyecto/proyecto.module.ts b/src/proyecto/proyecto.module.ts new file mode 100644 index 0000000..ef9e017 --- /dev/null +++ b/src/proyecto/proyecto.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ProyectoController } from './proyecto.controller'; +import { ProyectoService } from './proyecto.service'; + +@Module({ + controllers: [ProyectoController], + providers: [ProyectoService] +}) +export class ProyectoModule {} diff --git a/src/proyecto/proyecto.service.spec.ts b/src/proyecto/proyecto.service.spec.ts new file mode 100644 index 0000000..beb9439 --- /dev/null +++ b/src/proyecto/proyecto.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProyectoService } from './proyecto.service'; + +describe('ProyectoService', () => { + let service: ProyectoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ProyectoService], + }).compile(); + + service = module.get(ProyectoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/proyecto/proyecto.service.ts b/src/proyecto/proyecto.service.ts new file mode 100644 index 0000000..6173b74 --- /dev/null +++ b/src/proyecto/proyecto.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ProyectoService {} diff --git a/src/sybase/sybase.config.ts b/src/sybase/sybase.config.ts new file mode 100644 index 0000000..46ecc65 --- /dev/null +++ b/src/sybase/sybase.config.ts @@ -0,0 +1,10 @@ +export interface SybaseConfig { + + database: string; + + host: string; + + password: string; + + username: string; + } \ No newline at end of file diff --git a/src/sybase/sybase.module-definition.ts b/src/sybase/sybase.module-definition.ts new file mode 100644 index 0000000..0e4a1c6 --- /dev/null +++ b/src/sybase/sybase.module-definition.ts @@ -0,0 +1,7 @@ +import { ConfigurableModuleBuilder } from '@nestjs/common'; +import { SybaseConfig } from './sybase.config'; + +export const { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } = + new ConfigurableModuleBuilder() + .setClassMethodName('forRoot') + .build(); diff --git a/src/sybase/sybase.module.ts b/src/sybase/sybase.module.ts new file mode 100644 index 0000000..7a4be12 --- /dev/null +++ b/src/sybase/sybase.module.ts @@ -0,0 +1,7 @@ +import { Global, Module } from '@nestjs/common'; +import { ConfigurableModuleClass } from './sybase.module-definition'; +import { SybaseService } from './sybase.service'; + +@Global() +@Module({ providers: [SybaseService], exports: [SybaseService] }) +export class SybaseModule extends ConfigurableModuleClass {} diff --git a/src/sybase/sybase.service.ts b/src/sybase/sybase.service.ts new file mode 100644 index 0000000..e96657d --- /dev/null +++ b/src/sybase/sybase.service.ts @@ -0,0 +1,35 @@ +import * as Sybase from 'sybase'; +import { + Inject, + Injectable, + InternalServerErrorException, +} from '@nestjs/common'; +import { SybaseConfig } from './sybase.config'; +import { MODULE_OPTIONS_TOKEN } from './sybase.module-definition'; + +@Injectable() +export class SybaseService { + private db; + + constructor(@Inject(MODULE_OPTIONS_TOKEN) private options: SybaseConfig) { + this.db = new Sybase( + options.host, + options.database, + options.username, + options.password, + ); + } + + queryDsc(consulta: string): Promise { + return new Promise((resolve, reject) => { + this.db.query(consulta, (err, data) => { + console.log(consulta); + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + } +} diff --git a/src/usuario/usuario.entity.ts b/src/usuario/usuario.entity.ts index ba268cc..fb343c8 100644 --- a/src/usuario/usuario.entity.ts +++ b/src/usuario/usuario.entity.ts @@ -6,7 +6,7 @@ export class Usuario { id_usuario: number; @Column({ nullable: false }) - name: string; + nombre: string; @Column({ nullable: false }) password: string; -- 2.43.0 From d7af96e7caf83bbc5a60cb65ef4603c1a2904c83 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Mon, 6 Mar 2023 17:04:20 -0600 Subject: [PATCH 10/37] trabajando en confirmacion --- src/app.module.ts | 12 ----- src/config/db.ts | 51 ------------------- .../inscripcion-dsc.controller.ts | 25 +++------ .../inscripcion-dsc.service.ts | 42 ++++++++++++--- src/sybase/sybase.config.ts | 10 ---- src/sybase/sybase.module-definition.ts | 7 --- src/sybase/sybase.module.ts | 7 --- src/sybase/sybase.service.ts | 35 ------------- 8 files changed, 41 insertions(+), 148 deletions(-) delete mode 100644 src/config/db.ts delete mode 100644 src/sybase/sybase.config.ts delete mode 100644 src/sybase/sybase.module-definition.ts delete mode 100644 src/sybase/sybase.module.ts delete mode 100644 src/sybase/sybase.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index dae2cf4..fd39777 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -44,7 +44,6 @@ import { Contacto } from './contacto/entity/contacto.entity'; import { Equipo } from './equipo/entity/equipo.entity'; import { EquipoEvento } from './equipo-evento/entity/equipo_evento.entity'; import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; -import { SybaseModule } from './sybase/sybase.module'; @Module({ imports: [ @@ -89,17 +88,6 @@ import { SybaseModule } from './sybase/sybase.module'; synchronize: true, }), }), - SybaseModule.forRootAsync({ - inject: [ConfigService], - useFactory: (configService: ConfigService) => { - return { - host: configService.get('DB_HOST_DSC'), - database: configService.get('DB_NAME_DSC'), - username: configService.get('DB_USER_DSC'), - password: configService.get('DB_PASS_DSC'), - }; - }, - }), EventosModule, ParticipanteModule, EventoParticipanteModule, diff --git a/src/config/db.ts b/src/config/db.ts deleted file mode 100644 index b6a612f..0000000 --- a/src/config/db.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import * as mysql from 'mysql2/promise'; - -@Injectable() -export class MysqlService { - private mysqlPool: mysql.Pool; - private mysqlConnection: mysql.Connection; - private mysqlConnectionDscConfirmation: mysql.Connection; - - constructor() { -/* this.mysqlPool = mysql.createPool({ - connectionLimit: 20, - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASS, - database: process.env.DB_NAME, - }); - - this.mysqlConnection = mysql.createConnection({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASS, - database: process.env.DB_NAME, - }); - - this.mysqlConnectionDscConfirmation = mysql.createPool({ - connectionLimit: 20, - host: process.env.DB_HOST_DSC, - user: process.env.DB_USER_DSC, - password: process.env.DB_PASS_DSC, - database: process.env.DB_NAME_DSC, - }); */ - - /* this.mysqlConnection.connect((err) => { - if (err) console.log(err); - else console.log('base conectada'); - }); */ - } - - getMysqlConnection(): mysql.Connection { - return this.mysqlConnection; - } - - getMysqlPool(): mysql.Pool { - return this.mysqlPool; - } - - getMysqlConnectionDscConfirmation(): mysql.Connection { - return this.mysqlConnectionDscConfirmation; - } -} \ No newline at end of file diff --git a/src/inscripcion-dsc/inscripcion-dsc.controller.ts b/src/inscripcion-dsc/inscripcion-dsc.controller.ts index fbecd37..85a14e8 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.controller.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.controller.ts @@ -16,21 +16,13 @@ export class InscripcionDscController { async confirmacionDsc(@Body() body: any) { const { accountNumber } = body; -/* this.inscripcionService - .userVerification({ accountNumber }) - .then((res) => { - console.log(res); - }) - .catch((err) => { - return(err) - }); */ + const verificado = await this.inscripcionService.userVerification(accountNumber) + console.log(verificado) - try { + /* try { const userVerificationResponse = - await this.inscripcionService.userVerification({ - accountNumber, - }); - console.log(userVerificationResponse) + await this.inscripcionService.userVerification(accountNumber); + console.log(userVerificationResponse); if (userVerificationResponse.length === 0) { return { error: true, @@ -64,11 +56,6 @@ export class InscripcionDscController { msj: `No se pudo realizar la confirmación del usuario`, desc: `${err}`, }; - } + } */ } - - /* @Get(":id") - getUsuarioById(@Param('id', ParseIntPipe)id: number){ - - } */ } diff --git a/src/inscripcion-dsc/inscripcion-dsc.service.ts b/src/inscripcion-dsc/inscripcion-dsc.service.ts index b89674c..fbbd72e 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.service.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.service.ts @@ -1,13 +1,32 @@ import { Injectable } from '@nestjs/common'; -import { SybaseService } from 'src/sybase/sybase.service'; @Injectable() export class InscripcionDscService { - constructor(private sybaseService: SybaseService) {} + async userVerification(accountNumber: string): Promise { - async userVerification(data: { accountNumber: string }): Promise { - const { accountNumber } = data; - /* console.log(accountNumber) */ + const mysql = require('mysql2'); + + const connection = mysql.createConnection({ + host: process.env.DB_HOST_DSC, + user: process.env.DB_USER_DSC, + password: process.env.DB_PASS_DSC, + database: process.env.DB_NAME_DSC, + }); + + const userInformationQuery = `SELECT A.id_cuenta, nombre, if(AI.platica=true,1,0) as confirmacion FROM alumno A + JOIN alumno_inscrito AI ON (A.id_cuenta = AI.id_cuenta) + JOIN periodo P ON (P.id_periodo = AI.id_periodo) + WHERE A.id_cuenta = "${accountNumber}" and P.activo=true`; + + console.log(userInformationQuery); + + connection.connect(); + connection.query(userInformationQuery, function (error, results, fields) { + if (error) throw error; + console.log('The solution is: ', results); + }); + connection.end(); + /* try { @@ -32,7 +51,7 @@ export class InscripcionDscService { } catch (error) { throw error; - } + } */ } validarNumeroCuenta = (numeroCuenta) => { @@ -41,6 +60,15 @@ export class InscripcionDscService { }; async userConfirmation(data: { accountNumber: string }): Promise { + const mysql = require('mysql2'); + + const connection = mysql.createConnection({ + host: process.env.DB_HOST_DSC, + user: process.env.DB_USER_DSC, + password: process.env.DB_PASS_DSC, + database: process.env.DB_NAME_DSC, + }); + const { accountNumber } = data; try { @@ -53,7 +81,7 @@ export class InscripcionDscService { WHERE id_cuenta="${accountNumber}" and id_periodo=(SELECT id_periodo FROM periodo WHERE activo=true)`; try { - const responseUserConfirmation = await this.sybaseService.queryDsc( + const responseUserConfirmation = await connection.query( userConfirmationQuery, ); return responseUserConfirmation; diff --git a/src/sybase/sybase.config.ts b/src/sybase/sybase.config.ts deleted file mode 100644 index 46ecc65..0000000 --- a/src/sybase/sybase.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface SybaseConfig { - - database: string; - - host: string; - - password: string; - - username: string; - } \ No newline at end of file diff --git a/src/sybase/sybase.module-definition.ts b/src/sybase/sybase.module-definition.ts deleted file mode 100644 index 0e4a1c6..0000000 --- a/src/sybase/sybase.module-definition.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ConfigurableModuleBuilder } from '@nestjs/common'; -import { SybaseConfig } from './sybase.config'; - -export const { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } = - new ConfigurableModuleBuilder() - .setClassMethodName('forRoot') - .build(); diff --git a/src/sybase/sybase.module.ts b/src/sybase/sybase.module.ts deleted file mode 100644 index 7a4be12..0000000 --- a/src/sybase/sybase.module.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Global, Module } from '@nestjs/common'; -import { ConfigurableModuleClass } from './sybase.module-definition'; -import { SybaseService } from './sybase.service'; - -@Global() -@Module({ providers: [SybaseService], exports: [SybaseService] }) -export class SybaseModule extends ConfigurableModuleClass {} diff --git a/src/sybase/sybase.service.ts b/src/sybase/sybase.service.ts deleted file mode 100644 index e96657d..0000000 --- a/src/sybase/sybase.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as Sybase from 'sybase'; -import { - Inject, - Injectable, - InternalServerErrorException, -} from '@nestjs/common'; -import { SybaseConfig } from './sybase.config'; -import { MODULE_OPTIONS_TOKEN } from './sybase.module-definition'; - -@Injectable() -export class SybaseService { - private db; - - constructor(@Inject(MODULE_OPTIONS_TOKEN) private options: SybaseConfig) { - this.db = new Sybase( - options.host, - options.database, - options.username, - options.password, - ); - } - - queryDsc(consulta: string): Promise { - return new Promise((resolve, reject) => { - this.db.query(consulta, (err, data) => { - console.log(consulta); - if (err) { - reject(err); - } else { - resolve(data); - } - }); - }); - } -} -- 2.43.0 From fdd2dc679c11b2166fd4f53c6eb041abee3ea50d Mon Sep 17 00:00:00 2001 From: JorgeMike <119615322+JorgeMike@users.noreply.github.com> Date: Mon, 6 Mar 2023 21:55:25 -0600 Subject: [PATCH 11/37] arreglo en tablas y controllers --- .env | 2 +- src/contacto/entity/contacto.entity.ts | 2 +- .../dto/registrarParticipanteDto.dto.ts | 2 +- .../evento-participante/evento-participante.service.ts | 8 ++++---- src/eventos/dto/crearEvento.dto.ts | 1 + src/eventos/evento.entity.ts | 3 +++ src/inscripcion-dsc/inscripcion-dsc.controller.ts | 3 +-- src/inscripcion-dsc/inscripcion-dsc.service.ts | 4 +--- src/miembro/entity/miembro.entity.ts | 2 +- src/participante/participante.entity.ts | 2 +- src/participante/participante.service.ts | 6 +++--- 11 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.env b/.env index cc0937e..2980646 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ PORT=5089 DB_HOST=localhost DB_USER=root -DB_PASSWORD=password +DB_PASSWORD=Dosmiluno2001 DB_NAME=cedetec_proyectos DB_PORT=3306 diff --git a/src/contacto/entity/contacto.entity.ts b/src/contacto/entity/contacto.entity.ts index 854cd13..9ce9207 100644 --- a/src/contacto/entity/contacto.entity.ts +++ b/src/contacto/entity/contacto.entity.ts @@ -8,7 +8,7 @@ export class Contacto { id_contacto: number @Column({nullable:false}) - correo: string + email: string @Column() horario: string diff --git a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts index 7ab0048..04ebcf5 100644 --- a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts +++ b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts @@ -18,5 +18,5 @@ export class RegistrarParticipanteDto { carrera: string; @IsEmail() - correo: string; + email: string; } diff --git a/src/evento-participante/evento-participante/evento-participante.service.ts b/src/evento-participante/evento-participante/evento-participante.service.ts index 2908175..327d555 100644 --- a/src/evento-participante/evento-participante/evento-participante.service.ts +++ b/src/evento-participante/evento-participante/evento-participante.service.ts @@ -19,8 +19,8 @@ export class EventoParticipanteService { private eventoParticipanteRepository: Repository, ) {} - participanteExiste(correo: string) { - return this.participanteRepository.findOne({ where: { correo } }); + participanteExiste(email: string) { + return this.participanteRepository.findOne({ where: { email } }); } async registrarEnEvento( @@ -28,7 +28,7 @@ export class EventoParticipanteService { registrarParticipanteDto: RegistrarParticipanteDto, ) { const participante = await this.participanteExiste( - registrarParticipanteDto.correo, + registrarParticipanteDto.email, ); /* console.log(id_evento); console.log(participante); */ @@ -48,7 +48,7 @@ export class EventoParticipanteService { ) { /* console.log(id_evento); console.log(registrarParticipanteDto); */ - return this.participanteExiste(registrarParticipanteDto.correo).then( + return this.participanteExiste(registrarParticipanteDto.email).then( (res) => { if (res) { this.registrarEnEvento(id_evento, res); diff --git a/src/eventos/dto/crearEvento.dto.ts b/src/eventos/dto/crearEvento.dto.ts index 14b499b..51e66fe 100644 --- a/src/eventos/dto/crearEvento.dto.ts +++ b/src/eventos/dto/crearEvento.dto.ts @@ -5,6 +5,7 @@ export class crearEventoDto { proyecto: string[]; modalidad: string[]; lugar: string; + cupo: number; requisitos: string; cuota_inscripcion: number; patrocinador: string; diff --git a/src/eventos/evento.entity.ts b/src/eventos/evento.entity.ts index 5d2639c..7b46a7e 100644 --- a/src/eventos/evento.entity.ts +++ b/src/eventos/evento.entity.ts @@ -32,6 +32,9 @@ export class Evento { @Column({ nullable: false }) lugar: string; + @Column({nullable: false}) + cupo: number; + @Column({ nullable: false }) requisitos: string; diff --git a/src/inscripcion-dsc/inscripcion-dsc.controller.ts b/src/inscripcion-dsc/inscripcion-dsc.controller.ts index 85a14e8..23419ed 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.controller.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.controller.ts @@ -16,8 +16,7 @@ export class InscripcionDscController { async confirmacionDsc(@Body() body: any) { const { accountNumber } = body; - const verificado = await this.inscripcionService.userVerification(accountNumber) - console.log(verificado) + this.inscripcionService.userVerification(accountNumber) /* try { const userVerificationResponse = diff --git a/src/inscripcion-dsc/inscripcion-dsc.service.ts b/src/inscripcion-dsc/inscripcion-dsc.service.ts index fbbd72e..5daa0b9 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.service.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.service.ts @@ -18,10 +18,8 @@ export class InscripcionDscService { JOIN periodo P ON (P.id_periodo = AI.id_periodo) WHERE A.id_cuenta = "${accountNumber}" and P.activo=true`; - console.log(userInformationQuery); - connection.connect(); - connection.query(userInformationQuery, function (error, results, fields) { + connection.query('SELECT * FROM alumno;', function (error, results, fields) { if (error) throw error; console.log('The solution is: ', results); }); diff --git a/src/miembro/entity/miembro.entity.ts b/src/miembro/entity/miembro.entity.ts index e4ee23a..a1e5807 100644 --- a/src/miembro/entity/miembro.entity.ts +++ b/src/miembro/entity/miembro.entity.ts @@ -33,7 +33,7 @@ export class Miembro { @Column({ nullable: false }) @IsEmail() - correo: string; + email: string; @Column({ nullable: false, length: 40 }) password: string; diff --git a/src/participante/participante.entity.ts b/src/participante/participante.entity.ts index 59774af..8df05e5 100644 --- a/src/participante/participante.entity.ts +++ b/src/participante/participante.entity.ts @@ -19,7 +19,7 @@ export class Participante { telefono: string; @Column({ nullable: false }) - correo: string; + email: string; @Column({ nullable: true }) // password: string; diff --git a/src/participante/participante.service.ts b/src/participante/participante.service.ts index 4f1ae5c..1112e1f 100644 --- a/src/participante/participante.service.ts +++ b/src/participante/participante.service.ts @@ -11,16 +11,16 @@ export class ParticipanteService { private participanteRepository: Repository, ) {} - async participanteExiste(correo: string): Promise { + async participanteExiste(email: string): Promise { /* const participante = await this.participanteRepository.findOne({ where: { correo: correo }, }); return participante !== undefined; */ - return this.participanteRepository.findOne({ where: { correo } }); + return this.participanteRepository.findOne({ where: { email } }); } async registrarParticipante(registrarParticipanteDto: RegistrarParticipanteDto) { - return this.participanteExiste(registrarParticipanteDto.correo).then( + return this.participanteExiste(registrarParticipanteDto.email).then( (participante) => { if (participante) { throw new ConflictException('Este usuario ya está registrado'); -- 2.43.0 From 6618e79a860913ba3bda8bc5f955f172967160a4 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 7 Mar 2023 17:39:55 -0600 Subject: [PATCH 12/37] Se completo la confirmacion =) yupi --- .env | 2 +- .../inscripcion-dsc.controller.ts | 39 +++--- .../inscripcion-dsc.service.ts | 119 +++++++++--------- 3 files changed, 76 insertions(+), 84 deletions(-) diff --git a/.env b/.env index 2980646..cc0937e 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ PORT=5089 DB_HOST=localhost DB_USER=root -DB_PASSWORD=Dosmiluno2001 +DB_PASSWORD=password DB_NAME=cedetec_proyectos DB_PORT=3306 diff --git a/src/inscripcion-dsc/inscripcion-dsc.controller.ts b/src/inscripcion-dsc/inscripcion-dsc.controller.ts index 23419ed..1ad0e64 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.controller.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.controller.ts @@ -1,9 +1,6 @@ import { Body, Controller, - Get, - Param, - ParseIntPipe, Post, } from '@nestjs/common'; import { InscripcionDscService } from './inscripcion-dsc.service'; @@ -16,22 +13,23 @@ export class InscripcionDscController { async confirmacionDsc(@Body() body: any) { const { accountNumber } = body; - this.inscripcionService.userVerification(accountNumber) + const userVerification = await this.inscripcionService.userVerification(accountNumber); +/* console.log(userVerification) */ + if(!userVerification){ + return { + error: true, + msj: 'El usuario no se encuentra inscrito', + desc: '', + }; + } - /* try { - const userVerificationResponse = - await this.inscripcionService.userVerification(accountNumber); - console.log(userVerificationResponse); - if (userVerificationResponse.length === 0) { - return { - error: true, - msj: 'El usuario no se encuentra inscrito', - desc: '', - }; - } - const [userInformation] = userVerificationResponse; - console.log(userInformation); - if (userInformation.confirmacion) { + const userInformation = userVerification; +/* console.log(userInformation[0].confirmacion) */ + + + try{ +/* console.log("verificando confirmacion:", userInformation); + */ if (userInformation[0].confirmacion) { return { error: true, msj: 'El usuario ya hizo la confirmación anteriormente', @@ -41,9 +39,10 @@ export class InscripcionDscController { } catch (err) { return console.log(err); } + try { const confirmationResponse = - await this.inscripcionService.userConfirmation({ accountNumber }); + await this.inscripcionService.userConfirmation(accountNumber); return { error: false, msj: 'Usuario confirmado exitosamente', @@ -55,6 +54,6 @@ export class InscripcionDscController { msj: `No se pudo realizar la confirmación del usuario`, desc: `${err}`, }; - } */ + } } } diff --git a/src/inscripcion-dsc/inscripcion-dsc.service.ts b/src/inscripcion-dsc/inscripcion-dsc.service.ts index 5daa0b9..4f17f90 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.service.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.service.ts @@ -1,90 +1,83 @@ import { Injectable } from '@nestjs/common'; +import { createConnection } from 'mysql2/promise'; @Injectable() export class InscripcionDscService { - async userVerification(accountNumber: string): Promise { - - const mysql = require('mysql2'); - - const connection = mysql.createConnection({ - host: process.env.DB_HOST_DSC, - user: process.env.DB_USER_DSC, - password: process.env.DB_PASS_DSC, - database: process.env.DB_NAME_DSC, - }); - - const userInformationQuery = `SELECT A.id_cuenta, nombre, if(AI.platica=true,1,0) as confirmacion FROM alumno A - JOIN alumno_inscrito AI ON (A.id_cuenta = AI.id_cuenta) - JOIN periodo P ON (P.id_periodo = AI.id_periodo) - WHERE A.id_cuenta = "${accountNumber}" and P.activo=true`; - - connection.connect(); - connection.query('SELECT * FROM alumno;', function (error, results, fields) { - if (error) throw error; - console.log('The solution is: ', results); - }); - connection.end(); - /* - + async userVerification(accountNumber: string) { try { + const connection = await createConnection({ + host: process.env.DB_HOST_DSC, + user: process.env.DB_USER_DSC, + password: process.env.DB_PASS_DSC, + database: process.env.DB_NAME_DSC, + }); - this.validarNumeroCuenta(accountNumber); //valida que el numero de cuenta sea string y menor a 9 digitos + const userInformationQuery = `SELECT A.id_cuenta, nombre, if(AI.platica=true,1,0) as confirmacion FROM alumno A + JOIN alumno_inscrito AI ON (A.id_cuenta = AI.id_cuenta) + JOIN periodo P ON (P.id_periodo = AI.id_periodo) + WHERE A.id_cuenta = "${accountNumber}" and P.activo=true`; + const qryEjemplo = `SELECT * FROM alumno WHERE id_cuenta="${accountNumber}";`; + + const [results] = await connection.query(userInformationQuery); + const resultsArray = JSON.parse(JSON.stringify(results)); + if (resultsArray.length === 0) return null; + /* console.log('The solution is: ', resultsArray); */ + + return results; } catch (error) { - throw error; } - - const userInformationQuery = `SELECT A.id_cuenta, nombre, if(AI.platica=true,1,0) as confirmacion FROM alumno A - JOIN alumno_inscrito AI ON (A.id_cuenta = AI.id_cuenta) - JOIN periodo P ON (P.id_periodo = AI.id_periodo) - WHERE A.id_cuenta = "${accountNumber}" and P.activo=true`; - + } + + async userConfirmation(accountNumber: string): Promise { try { - const responseUserInformation = await this.sybaseService.queryDsc( - userInformationQuery, - ); - console.log(responseUserInformation) - return responseUserInformation; + const connection = await createConnection({ + host: process.env.DB_HOST_DSC, + user: process.env.DB_USER_DSC, + password: process.env.DB_PASS_DSC, + database: process.env.DB_NAME_DSC, + }); + const userInformationQuery = `UPDATE alumno_inscrito SET platica=true + WHERE id_cuenta="${accountNumber}" and id_periodo=(SELECT id_periodo FROM periodo WHERE activo=true)`; + + const qryEjemplo = `select platica from alumno_inscrito WHERE id_cuenta="${accountNumber}"`; + + const [results] = await connection.query(qryEjemplo); + const resultsArray = JSON.parse(JSON.stringify(results)); + if (resultsArray.length === 0) return null; + /* console.log('The solution is: ', resultsArray); */ + + return results; } catch (error) { throw error; - } */ - } - - validarNumeroCuenta = (numeroCuenta) => { - if (typeof numeroCuenta !== 'string' || numeroCuenta.length > 9) - return numeroCuenta; - }; - - async userConfirmation(data: { accountNumber: string }): Promise { - const mysql = require('mysql2'); - - const connection = mysql.createConnection({ - host: process.env.DB_HOST_DSC, - user: process.env.DB_USER_DSC, - password: process.env.DB_PASS_DSC, - database: process.env.DB_NAME_DSC, - }); - - const { accountNumber } = data; + } + + /* const { accountNumber } = data; try { this.validarNumeroCuenta(accountNumber); } catch (error) { throw error; } - + let userConfirmationQuery = `UPDATE alumno_inscrito SET platica=true - WHERE id_cuenta="${accountNumber}" and id_periodo=(SELECT id_periodo FROM periodo WHERE activo=true)`; + WHERE id_cuenta="${accountNumber}" and id_periodo=(SELECT id_periodo FROM periodo WHERE activo=true)`; try { const responseUserConfirmation = await connection.query( userConfirmationQuery, - ); - return responseUserConfirmation; - } catch (error) { - throw error; - } + ); + return responseUserConfirmation; + } catch (error) { + throw error; + } + } */ } + + validarNumeroCuenta = (numeroCuenta) => { + if (typeof numeroCuenta !== 'string' || numeroCuenta.length > 9) + return numeroCuenta; + }; } -- 2.43.0 From 5348a329d577616163ca3fa251615187d72c8c1b Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Wed, 8 Mar 2023 15:28:54 -0600 Subject: [PATCH 13/37] Se corrigio el login --- sql/01-tipo_miembro.sql | 2 ++ src/auth/auth.controller.ts | 5 +-- src/auth/auth.module.ts | 12 +++---- src/auth/auth.service.ts | 35 ++++++++++--------- src/auth/dto/loginMiembro.dto.ts | 11 ++++++ src/auth/dto/registrarMiembro.dto.ts | 33 +++++++++++++++++ .../entity/miembro_contacto.entity.ts | 4 +-- src/miembro/entity/miembro.entity.ts | 12 +++---- src/miembro/miembro.controller.ts | 16 +++++++-- src/miembro/miembro.module.ts | 3 ++ src/miembro/miembro.service.ts | 21 ++++++++++- 11 files changed, 118 insertions(+), 36 deletions(-) create mode 100644 sql/01-tipo_miembro.sql create mode 100644 src/auth/dto/loginMiembro.dto.ts create mode 100644 src/auth/dto/registrarMiembro.dto.ts diff --git a/sql/01-tipo_miembro.sql b/sql/01-tipo_miembro.sql new file mode 100644 index 0000000..1e87c8f --- /dev/null +++ b/sql/01-tipo_miembro.sql @@ -0,0 +1,2 @@ +INSERT INTO tipo_miembro(tipo_miembro) VALUES("Admin"); +INSERT INTO tipo_miembro(tipo_miembro) VALUES("Alumno"); diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 4b43b6c..30fadac 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -5,6 +5,7 @@ import { Usuario } from 'src/usuario/usuario.entity'; import { Repository } from 'typeorm'; import { AuthService } from './auth.service'; import { LoginUsuarioDto } from './dto/loginUsuario.dto'; +import { RegistrarMiembroDto } from './dto/registrarMiembro.dto'; import { RegistrarUsuarioDto } from './dto/registrarUsuario.dto'; @Controller('auth') @@ -14,8 +15,8 @@ export class AuthController { ) /* @InjectRepository(Usuario) private usuarioRepository: Repository */ {} @Post('registro') - registrarUsuario(@Body() registrarUsuario: RegistrarUsuarioDto) { - return this.authService.registrar(registrarUsuario); + registrarUsuario(@Body() registrarMiembro: RegistrarMiembroDto) { + return this.authService.registrar(registrarMiembro); } @Post('login') diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 2e3c76d..28f3f79 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -1,26 +1,26 @@ import { Module } from '@nestjs/common'; import { PassportModule } from '@nestjs/passport'; -import { UsuarioModule } from 'src/usuario/usuario.module'; import { AuthService } from './auth.service'; import { jwtStrategy } from './jwt.strategy'; import { AuthController } from './auth.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { Usuario } from 'src/usuario/usuario.entity'; -import { UsuarioService } from 'src/usuario/usuario.service'; import { JwtModule } from '@nestjs/jwt'; import { jwtConstants } from './jwt.constants'; +import { MiembroModule } from 'src/miembro/miembro.module'; +import { MiembroService } from 'src/miembro/miembro.service'; +import { Miembro } from 'src/miembro/entity/miembro.entity'; @Module({ imports: [ - UsuarioModule, + MiembroModule, PassportModule, - TypeOrmModule.forFeature([Usuario]), + TypeOrmModule.forFeature([Miembro]), JwtModule.register({ secret: jwtConstants.secret, signOptions: { expiresIn: '5h' }, }), ], - providers: [AuthService, jwtStrategy, UsuarioService, jwtStrategy], + providers: [AuthService, jwtStrategy, MiembroService, jwtStrategy], controllers: [AuthController], }) export class AuthModule {} diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index b32c96c..8504a60 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,45 +1,44 @@ import { HttpException, Injectable } from '@nestjs/common'; -import { UsuarioService } from 'src/usuario/usuario.service'; import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcrypt'; -import { RegistrarUsuarioDto } from './dto/registrarUsuario.dto'; import { hash } from 'bcrypt'; import { InjectRepository } from '@nestjs/typeorm'; -import { Usuario } from 'src/usuario/usuario.entity'; import { Repository } from 'typeorm'; -import { LoginUsuarioDto } from './dto/loginUsuario.dto'; import { compare } from 'bcrypt'; import { jwtConstants } from './jwt.constants'; +import { LoginMiembroDto } from './dto/loginMiembro.dto'; +import { Miembro } from 'src/miembro/entity/miembro.entity'; +import { RegistrarMiembroDto } from './dto/registrarMiembro.dto'; @Injectable() export class AuthService { constructor( private jwtService: JwtService, - private readonly usuarioService: UsuarioService, - @InjectRepository(Usuario) private usuarioRepository: Repository, + @InjectRepository(Miembro) private miembroRepository: Repository, + ) {} - async registrar(registrarUsuario: RegistrarUsuarioDto) { + async registrar(registrarMiembro: RegistrarMiembroDto) { - const { email, password } = registrarUsuario; + const { email, password } = registrarMiembro; const plainToHash = await hash(password, 10); - if (await this.usuarioRepository.findOne({ where: { email } })) + if (await this.miembroRepository.findOne({ where: { email } })) throw new HttpException('usuario existe', 403); - registrarUsuario = { ...registrarUsuario, password: plainToHash }; + registrarMiembro = { ...registrarMiembro, password: plainToHash }; - return this.usuarioRepository.save( - this.usuarioRepository.create(registrarUsuario), + return this.miembroRepository.save( + this.miembroRepository.create(registrarMiembro), ); } - async login(loginUsuario: LoginUsuarioDto) { - const { email, password } = loginUsuario; + async login(loginMiembro: LoginMiembroDto) { + const { email, password } = loginMiembro; - const usuario = await this.usuarioRepository.findOne({ where: { email } }); + const usuario = await this.miembroRepository.findOne({ where: { email } }); if (!usuario) throw new HttpException('Usuario no encontrado', 404); @@ -47,12 +46,14 @@ export class AuthService { if (!checkPassword) throw new HttpException('Contraseña incorrecta', 403); - const payload = { id_usuario: usuario.id_usuario, name: usuario.nombre }; + const payload = { id_usuario: usuario.id_miembro,id_tipoMiembro: usuario.id_tipo_miembro, name: usuario.nombre }; + console.log(payload) const token = this.jwtService.sign(payload); //firma el token + console.log(token) const data = { usuario: usuario.nombre, - id: usuario.id_usuario, + id: usuario.id_miembro, email: usuario.email, token, }; diff --git a/src/auth/dto/loginMiembro.dto.ts b/src/auth/dto/loginMiembro.dto.ts new file mode 100644 index 0000000..f8f9780 --- /dev/null +++ b/src/auth/dto/loginMiembro.dto.ts @@ -0,0 +1,11 @@ +import { IsEmail, MaxLength, MinLength } from "class-validator" + + +export class LoginMiembroDto { + @IsEmail() + email: string + + @MinLength(10) + @MaxLength(15) + password: string +} \ No newline at end of file diff --git a/src/auth/dto/registrarMiembro.dto.ts b/src/auth/dto/registrarMiembro.dto.ts new file mode 100644 index 0000000..bc2c341 --- /dev/null +++ b/src/auth/dto/registrarMiembro.dto.ts @@ -0,0 +1,33 @@ +import { PartialType } from '@nestjs/swagger'; +import { IsEmail, IsNotEmpty, MaxLength, MinLength } from 'class-validator'; +import { LoginUsuarioDto } from './loginUsuario.dto'; + +export class RegistrarMiembroDto extends PartialType(LoginUsuarioDto) { + @IsNotEmpty() + nombre: string; + + @IsNotEmpty() + apellido_paterno: string; + + @IsNotEmpty() + apellido_materno: string; + + @IsNotEmpty() + id_tipo_miembro: number; + + @MinLength(10) + @MaxLength(15) + password: string; + + descripcion: string + + id_carrera: number + + semestre: string + + @IsNotEmpty() + cuenta: number + + @IsEmail() + email: string; +} diff --git a/src/miembro-contacto/entity/miembro_contacto.entity.ts b/src/miembro-contacto/entity/miembro_contacto.entity.ts index 3632f98..7b5a77f 100644 --- a/src/miembro-contacto/entity/miembro_contacto.entity.ts +++ b/src/miembro-contacto/entity/miembro_contacto.entity.ts @@ -13,10 +13,10 @@ export class MiembroContacto { @Column() id_contacto: number - @OneToMany( +/* @OneToMany( () => Miembro, (miembro) => miembro.miembroContacto ) - miembro: Miembro[] + miembro: Miembro[] */ @OneToMany( () => Contacto, (contacto) => contacto.miembroContacto diff --git a/src/miembro/entity/miembro.entity.ts b/src/miembro/entity/miembro.entity.ts index a1e5807..2ccff7e 100644 --- a/src/miembro/entity/miembro.entity.ts +++ b/src/miembro/entity/miembro.entity.ts @@ -35,16 +35,16 @@ export class Miembro { @IsEmail() email: string; - @Column({ nullable: false, length: 40 }) + @Column({ nullable: false }) password: string; - @Column({ length: 260, nullable: false }) + @Column({ length: 260, nullable:true}) descripcion: string; - @Column({ nullable: false }) + @Column({nullable: true}) id_carrera: number; - @Column({ length: 40 }) + @Column({ length: 40, nullable:true}) semestre: string; @Column({ nullable: false }) @@ -64,11 +64,11 @@ export class Miembro { @JoinColumn({ name: 'id_carrera' }) carrera: Carrera; - @ManyToOne( +/* @ManyToOne( () => MiembroContacto, (miembroContacto) => miembroContacto.miembro ) @JoinColumn({name: "id_miembro"}) - miembroContacto: MiembroContacto + miembroContacto: MiembroContacto */ @OneToMany( () => MiembroProyecto, (miembroProyecto) => miembroProyecto.miembro diff --git a/src/miembro/miembro.controller.ts b/src/miembro/miembro.controller.ts index 464fcf5..35d28cb 100644 --- a/src/miembro/miembro.controller.ts +++ b/src/miembro/miembro.controller.ts @@ -1,4 +1,16 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; +import { Miembro } from './entity/miembro.entity'; +import { MiembroService } from './miembro.service'; @Controller('miembro') -export class MiembroController {} +export class MiembroController { + + constructor(private readonly miembroService: MiembroService){} + + @UseGuards(JwtAuthGuard) + @Get() + getUsuarios(): Promise{ + return this.miembroService.getUsuarios() + } +} diff --git a/src/miembro/miembro.module.ts b/src/miembro/miembro.module.ts index d68d418..73ffcb3 100644 --- a/src/miembro/miembro.module.ts +++ b/src/miembro/miembro.module.ts @@ -1,8 +1,11 @@ import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Miembro } from './entity/miembro.entity'; import { MiembroController } from './miembro.controller'; import { MiembroService } from './miembro.service'; @Module({ + imports:[TypeOrmModule.forFeature([Miembro])], controllers: [MiembroController], providers: [MiembroService] }) diff --git a/src/miembro/miembro.service.ts b/src/miembro/miembro.service.ts index 9caed0f..1878615 100644 --- a/src/miembro/miembro.service.ts +++ b/src/miembro/miembro.service.ts @@ -1,4 +1,23 @@ import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Miembro } from './entity/miembro.entity'; @Injectable() -export class MiembroService {} +export class MiembroService { + constructor( + @InjectRepository(Miembro) private miembroRepository: Repository, + ) {} + + getUsuarios(){ + return this.miembroRepository.find() + } + + getUsuario(email: string) { + return this.miembroRepository.findOne({ + where: { + email, + }, + }); + } +} -- 2.43.0 From d95c666648b60f70f54db5bb128d66891b4030fc Mon Sep 17 00:00:00 2001 From: JorgeMike <119615322+JorgeMike@users.noreply.github.com> Date: Wed, 8 Mar 2023 22:07:47 -0600 Subject: [PATCH 14/37] =?UTF-8?q?se=20a=C3=B1adio=20sql=20para=20primer=20?= =?UTF-8?q?usuario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- sql/00-admin.sql | 3 ++- src/auth/auth.service.ts | 24 +++++++++++++----------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.env b/.env index cc0937e..2980646 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ PORT=5089 DB_HOST=localhost DB_USER=root -DB_PASSWORD=password +DB_PASSWORD=Dosmiluno2001 DB_NAME=cedetec_proyectos DB_PORT=3306 diff --git a/sql/00-admin.sql b/sql/00-admin.sql index 0755541..bd2d9d4 100644 --- a/sql/00-admin.sql +++ b/sql/00-admin.sql @@ -1 +1,2 @@ -INSERT INTO usuario (nombre, password, email) VALUES("jorge", "Canela1108", "admin@unam.com"); \ No newline at end of file +INSERT INTO miembro (nombre, apellido_paterno, apellido_materno, id_tipo_miembro, email, password, descripcion, semestre, cuenta) +VALUES ('Jorge', 'Alvarado', 'Reyes', 1, 'Admin@unam.com', '$2b$10$1ExBjP1J1PET5N4m9Thv7O0l0nNjPsMYQW6.TZveaCFz0OkLh06Dy', 'Estudiante de Ingeniería en Sistemas', '4', 421010301); diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 8504a60..64d2f2b 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -15,17 +15,16 @@ export class AuthService { constructor( private jwtService: JwtService, @InjectRepository(Miembro) private miembroRepository: Repository, - ) {} async registrar(registrarMiembro: RegistrarMiembroDto) { - const { email, password } = registrarMiembro; - const plainToHash = await hash(password, 10); + if (await this.miembroRepository.findOne({ where: { email } })) { + throw new HttpException('El usuario ya existe', 403); + } - if (await this.miembroRepository.findOne({ where: { email } })) - throw new HttpException('usuario existe', 403); + const plainToHash = await hash(password, 10); registrarMiembro = { ...registrarMiembro, password: plainToHash }; @@ -34,22 +33,25 @@ export class AuthService { ); } - async login(loginMiembro: LoginMiembroDto) { const { email, password } = loginMiembro; const usuario = await this.miembroRepository.findOne({ where: { email } }); - + if (!usuario) throw new HttpException('Usuario no encontrado', 404); const checkPassword = await compare(password, (await usuario).password); if (!checkPassword) throw new HttpException('Contraseña incorrecta', 403); - const payload = { id_usuario: usuario.id_miembro,id_tipoMiembro: usuario.id_tipo_miembro, name: usuario.nombre }; - console.log(payload) + const payload = { + id_usuario: usuario.id_miembro, + id_tipoMiembro: usuario.id_tipo_miembro, + name: usuario.nombre, + }; + console.log(payload); const token = this.jwtService.sign(payload); //firma el token - console.log(token) + console.log(token); const data = { usuario: usuario.nombre, @@ -58,6 +60,6 @@ export class AuthService { token, }; - return data; + return data; } } -- 2.43.0 From 69fb4d1b3f180e4add450a8ec50aa71bd489bde2 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Thu, 9 Mar 2023 10:18:14 -0600 Subject: [PATCH 15/37] se comentaron algunos console.log y se cambiaron los sql --- .env | 2 +- sql/{01-tipo_miembro.sql => 00-tipo_miembro.sql} | 0 sql/{00-admin.sql => 01-admin.sql} | 0 src/auth/auth.service.ts | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) rename sql/{01-tipo_miembro.sql => 00-tipo_miembro.sql} (100%) rename sql/{00-admin.sql => 01-admin.sql} (100%) diff --git a/.env b/.env index 2980646..cc0937e 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ PORT=5089 DB_HOST=localhost DB_USER=root -DB_PASSWORD=Dosmiluno2001 +DB_PASSWORD=password DB_NAME=cedetec_proyectos DB_PORT=3306 diff --git a/sql/01-tipo_miembro.sql b/sql/00-tipo_miembro.sql similarity index 100% rename from sql/01-tipo_miembro.sql rename to sql/00-tipo_miembro.sql diff --git a/sql/00-admin.sql b/sql/01-admin.sql similarity index 100% rename from sql/00-admin.sql rename to sql/01-admin.sql diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 64d2f2b..2943e37 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -49,9 +49,9 @@ export class AuthService { id_tipoMiembro: usuario.id_tipo_miembro, name: usuario.nombre, }; - console.log(payload); + /* console.log(payload); */ const token = this.jwtService.sign(payload); //firma el token - console.log(token); + /* console.log(token); */ const data = { usuario: usuario.nombre, -- 2.43.0 From 97e17354818ffb6a6f2a4be39f8b09899f200cd1 Mon Sep 17 00:00:00 2001 From: Jorge Miguel Alvarado Reyes <421010301@pcpuma.acatlan.unam.mx> Date: Thu, 9 Mar 2023 21:29:26 +0000 Subject: [PATCH 16/37] Eliminar '.env' --- .env | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index cc0937e..0000000 --- a/.env +++ /dev/null @@ -1,12 +0,0 @@ -PORT=5089 - -DB_HOST=localhost -DB_USER=root -DB_PASSWORD=password -DB_NAME=cedetec_proyectos -DB_PORT=3306 - -DB_HOST_DSC = 132.248.180.82 -DB_USER_DSC = sites_user -DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat \ No newline at end of file -- 2.43.0 From ca3e4c42bda333cf9ac8213c26477d586e1e29d0 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 10 Mar 2023 09:10:57 -0600 Subject: [PATCH 17/37] controlador para mostrar cupo en eventos --- src/catalogos/tipo-miembro.entity.ts | 2 +- src/eventos/eventos.controller.ts | 8 ++++++++ src/eventos/eventos.service.ts | 13 +++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/catalogos/tipo-miembro.entity.ts b/src/catalogos/tipo-miembro.entity.ts index e736c22..01f4303 100644 --- a/src/catalogos/tipo-miembro.entity.ts +++ b/src/catalogos/tipo-miembro.entity.ts @@ -12,5 +12,5 @@ export class TipoMiembro { @OneToMany( () => Miembro, (miembro) => miembro.tipoMiembro ) - miembro: Miembro + miembro: Miembro[] } \ No newline at end of file diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index 9f9f74f..e3f9b99 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -1,4 +1,7 @@ import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; +import { Repository } from 'typeorm'; import { actualizarEventoDto } from './dto/actualizarEvento.dto'; import { crearEventoDto } from './dto/crearEvento.dto'; import { Evento } from './evento.entity'; @@ -33,4 +36,9 @@ export class EventosController { deleteEvento(@Param('id', ParseIntPipe)id: number){ return this.eventoService.deleteEventoParticipante(id) } + + @Get(':id/participantes') + async getCupos(@Param('id', ParseIntPipe)id: number){ + return this.eventoService.getCupos(id) + } } diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index 72aa66d..c308f04 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -60,4 +60,17 @@ export class EventosService { await queryRunner.release(); } } + + async getCupos(id: number){ + const evento = this.getEventosPorId(id) + if(!evento) throw new Error(`El evento con id:${id} no existe`) + const registrados = await this.eventoParticipanteRepository + .createQueryBuilder('ep') + .select('COUNT(ep.id_evento)', 'count') + .where('ep.id_evento = :eventoId', { eventoId: (await evento).id_evento }) + .getRawOne(); + const cupoOriginal = (await evento).cupo; + const cupoDisponible = cupoOriginal - registrados.count; + return { registrados: registrados.count, cupoDisponible, cupoOriginal}; + } } -- 2.43.0 From 7556fec38303445ea4a9ca254b60e2a0cc15473a Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 10 Mar 2023 09:52:59 -0600 Subject: [PATCH 18/37] se agrego el envExample --- .env | 10 +++++----- .env.example | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 .env.example diff --git a/.env b/.env index cc0937e..2a1e147 100644 --- a/.env +++ b/.env @@ -1,10 +1,10 @@ PORT=5089 -DB_HOST=localhost -DB_USER=root -DB_PASSWORD=password -DB_NAME=cedetec_proyectos -DB_PORT=3306 +DB_HOST=132.248.180.82 +DB_USER=user_cedetec +DB_PASSWORD=c3t3d3c +DB_NAME=Betelgeuse_Cedetec_Prueba +DB_PORT= DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..caca0c6 --- /dev/null +++ b/.env.example @@ -0,0 +1,11 @@ +PORT= + +DB_HOST= +DB_USER= +DB_PASSWORD= +DB_NAME= + +DB_HOST_DSC= +DB_USER_DSC= +DB_PASS_DSC= +DB_NAME_DSC= \ No newline at end of file -- 2.43.0 From a46ba72fe437c187aecd37dfdd3e9fd857890e8a Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 10 Mar 2023 09:58:48 -0600 Subject: [PATCH 19/37] env example --- .env.example | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..caca0c6 --- /dev/null +++ b/.env.example @@ -0,0 +1,11 @@ +PORT= + +DB_HOST= +DB_USER= +DB_PASSWORD= +DB_NAME= + +DB_HOST_DSC= +DB_USER_DSC= +DB_PASS_DSC= +DB_NAME_DSC= \ No newline at end of file -- 2.43.0 From b8daadd0e3e0b6194ad834afce072f550eed2ef9 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 10 Mar 2023 10:01:24 -0600 Subject: [PATCH 20/37] eliminar el env --- .env | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 2a1e147..0000000 --- a/.env +++ /dev/null @@ -1,12 +0,0 @@ -PORT=5089 - -DB_HOST=132.248.180.82 -DB_USER=user_cedetec -DB_PASSWORD=c3t3d3c -DB_NAME=Betelgeuse_Cedetec_Prueba -DB_PORT= - -DB_HOST_DSC = 132.248.180.82 -DB_USER_DSC = sites_user -DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat \ No newline at end of file -- 2.43.0 From 498e70e589ba7bc1b4fddf4241530f146e5fe3c5 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 15:26:00 -0600 Subject: [PATCH 21/37] sending email is already in the project --- .env | 22 +++++++++---- package-lock.json | 14 ++++++++ package.json | 1 + sql/00-tipo_miembro.sql | 2 +- src/app.module.ts | 4 +++ src/email/dto/emailDto.dto.ts | 8 +++++ src/email/email.controller.spec.ts | 18 +++++++++++ src/email/email.controller.ts | 16 +++++++++ src/email/email.module.ts | 13 ++++++++ src/email/email.service.spec.ts | 18 +++++++++++ src/email/email.service.ts | 52 ++++++++++++++++++++++++++++++ src/eventos/eventos.controller.ts | 7 +++- src/eventos/eventos.module.ts | 3 +- src/eventos/eventos.service.ts | 31 ++++++++++++------ src/miembro/miembro.controller.ts | 7 +++- src/miembro/miembro.service.ts | 8 +++++ 16 files changed, 205 insertions(+), 19 deletions(-) create mode 100644 src/email/dto/emailDto.dto.ts create mode 100644 src/email/email.controller.spec.ts create mode 100644 src/email/email.controller.ts create mode 100644 src/email/email.module.ts create mode 100644 src/email/email.service.spec.ts create mode 100644 src/email/email.service.ts diff --git a/.env b/.env index 2a1e147..f90c7ad 100644 --- a/.env +++ b/.env @@ -1,12 +1,22 @@ PORT=5089 -DB_HOST=132.248.180.82 -DB_USER=user_cedetec -DB_PASSWORD=c3t3d3c -DB_NAME=Betelgeuse_Cedetec_Prueba -DB_PORT= +# DB_HOST=132.248.180.82 +# DB_USER=user_cedetec +# DB_PASSWORD=c3t3d3c +# DB_NAME=Betelgeuse_Cedetec_Prueba +# DB_PORT= + + DB_HOST=localhost + DB_USER=root + DB_PASSWORD=password + DB_NAME=cedetec_proyectos + DB_PORT= DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat \ No newline at end of file +DB_NAME_DSC = sat + +NODEMAILER_SERVICE = gmail +NODEMAILER_USER = cidwa1@pcpuma.acatlan.unam.mx +NODEMAILER_PASWORD = cidwaxd1, \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 48642b8..87cae60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "class-validator": "^0.14.0", "moment": "^2.29.4", "mysql2": "^3.1.2", + "nodemailer": "^6.9.1", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -6980,6 +6981,14 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "node_modules/nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -14913,6 +14922,11 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==" + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", diff --git a/package.json b/package.json index 4b5be02..3ac1600 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "class-validator": "^0.14.0", "moment": "^2.29.4", "mysql2": "^3.1.2", + "nodemailer": "^6.9.1", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", diff --git a/sql/00-tipo_miembro.sql b/sql/00-tipo_miembro.sql index 1e87c8f..b42aae8 100644 --- a/sql/00-tipo_miembro.sql +++ b/sql/00-tipo_miembro.sql @@ -1,2 +1,2 @@ INSERT INTO tipo_miembro(tipo_miembro) VALUES("Admin"); -INSERT INTO tipo_miembro(tipo_miembro) VALUES("Alumno"); +INSERT INTO tipo_miembro(tipo_miembro) VALUES("Miembro"); diff --git a/src/app.module.ts b/src/app.module.ts index fd39777..21f3362 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -44,6 +44,9 @@ import { Contacto } from './contacto/entity/contacto.entity'; import { Equipo } from './equipo/entity/equipo.entity'; import { EquipoEvento } from './equipo-evento/entity/equipo_evento.entity'; import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; +import { EmailService } from './email/email.service'; +import { EmailController } from './email/email.controller'; +import { EmailModule } from './email/email.module'; @Module({ imports: [ @@ -106,6 +109,7 @@ import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; ProyectoModule, ProyectoActividadModule, ActividadModule, + EmailModule, ], controllers: [ AppController, diff --git a/src/email/dto/emailDto.dto.ts b/src/email/dto/emailDto.dto.ts new file mode 100644 index 0000000..a6c6129 --- /dev/null +++ b/src/email/dto/emailDto.dto.ts @@ -0,0 +1,8 @@ +import { IsEmail } from "class-validator" + +export class EmailDto { + + subject:string + + text:string +} \ No newline at end of file diff --git a/src/email/email.controller.spec.ts b/src/email/email.controller.spec.ts new file mode 100644 index 0000000..9470aa8 --- /dev/null +++ b/src/email/email.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EmailController } from './email.controller'; + +describe('EmailController', () => { + let controller: EmailController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [EmailController], + }).compile(); + + controller = module.get(EmailController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/email/email.controller.ts b/src/email/email.controller.ts new file mode 100644 index 0000000..1593154 --- /dev/null +++ b/src/email/email.controller.ts @@ -0,0 +1,16 @@ +import { Body, Controller, Param, ParseIntPipe, Post } from '@nestjs/common'; +import { EmailDto } from './dto/emailDto.dto'; +import { EmailService } from './email.service'; + +@Controller('email') +export class EmailController { + constructor(private readonly emailService: EmailService) {} + + @Post('/evento/:id') + async sendEmail( + @Param('id', ParseIntPipe) id: number, + @Body() emailDto: EmailDto, + ): Promise { + return this.emailService.sendEmail(id, emailDto); + } +} diff --git a/src/email/email.module.ts b/src/email/email.module.ts new file mode 100644 index 0000000..39df2ed --- /dev/null +++ b/src/email/email.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { EventosModule } from 'src/eventos/eventos.module'; +import { Participante } from 'src/participante/participante.entity'; +import { EmailController } from './email.controller'; +import { EmailService } from './email.service'; + +@Module({ + imports:[TypeOrmModule.forFeature([Participante])], + controllers:[EmailController], + providers:[EmailService] +}) +export class EmailModule {} diff --git a/src/email/email.service.spec.ts b/src/email/email.service.spec.ts new file mode 100644 index 0000000..27719da --- /dev/null +++ b/src/email/email.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EmailService } from './email.service'; + +describe('EmailService', () => { + let service: EmailService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [EmailService], + }).compile(); + + service = module.get(EmailService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/email/email.service.ts b/src/email/email.service.ts new file mode 100644 index 0000000..f8a7852 --- /dev/null +++ b/src/email/email.service.ts @@ -0,0 +1,52 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { InjectRepository } from '@nestjs/typeorm'; +import * as nodemailer from 'nodemailer'; +import { EventosService } from 'src/eventos/eventos.service'; +import { Participante } from 'src/participante/participante.entity'; +import { Repository } from 'typeorm'; +import { EmailDto } from './dto/emailDto.dto'; + +@Injectable() +export class EmailService { + private transporter; + + constructor( + @InjectRepository(Participante) + private participanteRepository: Repository, + private configService: ConfigService, + ) { + this.transporter = nodemailer.createTransport({ + service: this.configService.get('NODEMAILER_SERVICE'), + auth: { + user: this.configService.get('NODEMAILER_USER'), + pass: this.configService.get('NODEMAILER_PASWORD'), + }, + }); + } + + async sendEmail(id: number, message: EmailDto) { + const participantes = await this.getEmailDeParticipantes(id); + participantes.map((res) => { + const emailDestinatario = res.email; + this.transporter.sendMail({ + to: emailDestinatario, + subject: message.subject, + text: message.text, + }); + /*console.log("Email enviado a: ", res)*/ + }); + } + + async getEmailDeParticipantes(idEvento: number) { + const participantes = await this.participanteRepository + .createQueryBuilder('participante') + .innerJoin('participante.eventosParticipante', 'eventoParticipante') + .innerJoin('eventoParticipante.evento', 'evento') + .where('evento.id_evento = :idEvento', { idEvento }) + .select(['participante.email']) + .getMany(); + + return participantes; + } +} diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index e3f9b99..5abbe20 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -37,8 +37,13 @@ export class EventosController { return this.eventoService.deleteEventoParticipante(id) } - @Get(':id/participantes') + @Get(':id/cupos') async getCupos(@Param('id', ParseIntPipe)id: number){ return this.eventoService.getCupos(id) } + + @Get(':id/participante') + async getParticipnates(@Param('id', ParseIntPipe)id:number){ + return this.eventoService.getParticipantes(id) + } } diff --git a/src/eventos/eventos.module.ts b/src/eventos/eventos.module.ts index 52755c1..a165de0 100644 --- a/src/eventos/eventos.module.ts +++ b/src/eventos/eventos.module.ts @@ -1,12 +1,13 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; +import { Participante } from 'src/participante/participante.entity'; import { Evento } from './evento.entity'; import { EventosController } from './eventos.controller'; import { EventosService } from './eventos.service'; @Module({ - imports:[TypeOrmModule.forFeature([Evento, EventoParticipante])], + imports:[TypeOrmModule.forFeature([Evento, EventoParticipante, Participante])], controllers:[EventosController], providers:[EventosService] }) diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index c308f04..8777106 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -13,6 +13,7 @@ export class EventosService { @InjectRepository(Evento) private eventoRepository: Repository, @InjectRepository(EventoParticipante) private eventoParticipanteRepository: Repository, + @InjectRepository(Participante) private participanteRepository:Repository ) {} getEventos() { @@ -61,16 +62,28 @@ export class EventosService { } } - async getCupos(id: number){ - const evento = this.getEventosPorId(id) - if(!evento) throw new Error(`El evento con id:${id} no existe`) + async getCupos(id: number) { + const evento = this.getEventosPorId(id); + if (!evento) throw new Error(`El evento con id:${id} no existe`); const registrados = await this.eventoParticipanteRepository - .createQueryBuilder('ep') - .select('COUNT(ep.id_evento)', 'count') - .where('ep.id_evento = :eventoId', { eventoId: (await evento).id_evento }) - .getRawOne(); + .createQueryBuilder('ep') + .select('COUNT(ep.id_evento)', 'count') + .where('ep.id_evento = :eventoId', { eventoId: (await evento).id_evento }) + .getRawOne(); const cupoOriginal = (await evento).cupo; - const cupoDisponible = cupoOriginal - registrados.count; - return { registrados: registrados.count, cupoDisponible, cupoOriginal}; + const cupoDisponible = cupoOriginal - registrados.count; + return { registrados: registrados.count, cupoDisponible, cupoOriginal }; + } + + async getParticipantes(idEvento: number) { + const participantes = await this.participanteRepository + .createQueryBuilder('participante') + .innerJoin('participante.eventosParticipante', 'eventoParticipante') + .innerJoin('eventoParticipante.evento', 'evento') + .where('evento.id_evento = :idEvento', { idEvento }) + .select(['participante.nombre','participante.apellido_paterno','participante.carrera', 'participante.email']) + .getMany(); + + return participantes; } } diff --git a/src/miembro/miembro.controller.ts b/src/miembro/miembro.controller.ts index 35d28cb..50b9cda 100644 --- a/src/miembro/miembro.controller.ts +++ b/src/miembro/miembro.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, UseGuards } from '@nestjs/common'; +import { Controller, Get, Param, ParseIntPipe, UseGuards } from '@nestjs/common'; import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; import { Miembro } from './entity/miembro.entity'; import { MiembroService } from './miembro.service'; @@ -13,4 +13,9 @@ export class MiembroController { getUsuarios(): Promise{ return this.miembroService.getUsuarios() } + + @Get(':tipo') + getMiembros(@Param('tipo', ParseIntPipe)tipo: number): Promise{ + return this.miembroService.getMiembros(tipo) + } } diff --git a/src/miembro/miembro.service.ts b/src/miembro/miembro.service.ts index 1878615..dbd0c57 100644 --- a/src/miembro/miembro.service.ts +++ b/src/miembro/miembro.service.ts @@ -20,4 +20,12 @@ export class MiembroService { }, }); } + + getMiembros(tipo: number){ + return this.miembroRepository.find({ + where:{ + id_tipo_miembro: tipo + } + }) + } } -- 2.43.0 From e29aacfc8f7e86857b6a24aa504081034cc3acf2 Mon Sep 17 00:00:00 2001 From: Jorge Miguel Alvarado Reyes <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 21:38:33 +0000 Subject: [PATCH 22/37] Actualizar '.env.example' --- .env.example | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index caca0c6..ce26c2b 100644 --- a/.env.example +++ b/.env.example @@ -8,4 +8,8 @@ DB_NAME= DB_HOST_DSC= DB_USER_DSC= DB_PASS_DSC= -DB_NAME_DSC= \ No newline at end of file +DB_NAME_DSC= + +NODEMAILER_SERVICE= +NODEMAILER_USER= +NODEMAILER_PASWORD= \ No newline at end of file -- 2.43.0 From 0158b6af9845ede9693b9484e2215668c3e03714 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 15:41:02 -0600 Subject: [PATCH 23/37] add new info in env --- .env.example | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index caca0c6..ce26c2b 100644 --- a/.env.example +++ b/.env.example @@ -8,4 +8,8 @@ DB_NAME= DB_HOST_DSC= DB_USER_DSC= DB_PASS_DSC= -DB_NAME_DSC= \ No newline at end of file +DB_NAME_DSC= + +NODEMAILER_SERVICE= +NODEMAILER_USER= +NODEMAILER_PASWORD= \ No newline at end of file -- 2.43.0 From 4a69baa07ecba3d67a0494eb559607f3c957cf10 Mon Sep 17 00:00:00 2001 From: Jorge Miguel Alvarado Reyes <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 21:46:05 +0000 Subject: [PATCH 24/37] Actualizar '.env.example' --- .env.example | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.env.example b/.env.example index ce26c2b..caca0c6 100644 --- a/.env.example +++ b/.env.example @@ -8,8 +8,4 @@ DB_NAME= DB_HOST_DSC= DB_USER_DSC= DB_PASS_DSC= -DB_NAME_DSC= - -NODEMAILER_SERVICE= -NODEMAILER_USER= -NODEMAILER_PASWORD= \ No newline at end of file +DB_NAME_DSC= \ No newline at end of file -- 2.43.0 From 89066bc769a86dd358dceba2e5daa45ffb868c66 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 15:56:05 -0600 Subject: [PATCH 25/37] removed .env original and added new variables --- .env | 22 ---------------------- .env.example | 6 +++++- 2 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index f90c7ad..0000000 --- a/.env +++ /dev/null @@ -1,22 +0,0 @@ -PORT=5089 - -# DB_HOST=132.248.180.82 -# DB_USER=user_cedetec -# DB_PASSWORD=c3t3d3c -# DB_NAME=Betelgeuse_Cedetec_Prueba -# DB_PORT= - - DB_HOST=localhost - DB_USER=root - DB_PASSWORD=password - DB_NAME=cedetec_proyectos - DB_PORT= - -DB_HOST_DSC = 132.248.180.82 -DB_USER_DSC = sites_user -DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat - -NODEMAILER_SERVICE = gmail -NODEMAILER_USER = cidwa1@pcpuma.acatlan.unam.mx -NODEMAILER_PASWORD = cidwaxd1, \ No newline at end of file diff --git a/.env.example b/.env.example index caca0c6..ce26c2b 100644 --- a/.env.example +++ b/.env.example @@ -8,4 +8,8 @@ DB_NAME= DB_HOST_DSC= DB_USER_DSC= DB_PASS_DSC= -DB_NAME_DSC= \ No newline at end of file +DB_NAME_DSC= + +NODEMAILER_SERVICE= +NODEMAILER_USER= +NODEMAILER_PASWORD= \ No newline at end of file -- 2.43.0 From 569dbca11f4fb9063fdf4fa0d7b8e47b0472e705 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 17 Mar 2023 13:38:37 -0600 Subject: [PATCH 26/37] se modifico la base de datos y se agrego los excel --- .env | 20 +- package-lock.json | 2404 +++++++++-------- package.json | 2 + sql/01-admin.sql | 2 +- src/app.module.ts | 4 - src/auth/auth.controller.ts | 6 +- src/auth/dto/loginMiembro.dto.ts | 2 +- src/auth/dto/loginUsuario.dto.ts | 10 - src/auth/dto/registrarMiembro.dto.ts | 4 +- src/auth/dto/registrarUsuario.dto.ts | 18 - src/catalogos/area.entity.ts | 2 +- src/catalogos/carrera.entity.ts | 2 +- src/catalogos/tipo-miembro.entity.ts | 2 +- src/contacto/entity/contacto.entity.ts | 6 +- src/equipo/entity/equipo.entity.ts | 2 +- .../dto/registrarParticipanteDto.dto.ts | 5 + src/eventos/dto/actualizarEvento.dto.ts | 6 +- src/eventos/dto/crearEvento.dto.ts | 8 +- src/eventos/evento.entity.ts | 35 +- src/eventos/eventos.controller.ts | 10 +- src/eventos/eventos.service.ts | 82 +- src/miembro/entity/miembro.entity.ts | 12 +- src/miembro/miembro.controller.ts | 8 +- src/miembro/miembro.service.ts | 4 + src/participante/participante.entity.ts | 21 +- src/usuario/usuario.entity.ts | 16 - src/usuario/usuario.module.ts | 12 - src/usuario/usuario.service.ts | 23 - src/usuario/usuarios.controller.ts | 18 - 29 files changed, 1501 insertions(+), 1245 deletions(-) delete mode 100644 src/auth/dto/loginUsuario.dto.ts delete mode 100644 src/auth/dto/registrarUsuario.dto.ts delete mode 100644 src/usuario/usuario.entity.ts delete mode 100644 src/usuario/usuario.module.ts delete mode 100644 src/usuario/usuario.service.ts delete mode 100644 src/usuario/usuarios.controller.ts diff --git a/.env b/.env index f90c7ad..17d9caa 100644 --- a/.env +++ b/.env @@ -1,16 +1,16 @@ PORT=5089 -# DB_HOST=132.248.180.82 -# DB_USER=user_cedetec -# DB_PASSWORD=c3t3d3c -# DB_NAME=Betelgeuse_Cedetec_Prueba -# DB_PORT= + DB_HOST=132.248.180.82 + DB_USER=user_cedetec + DB_PASSWORD=c3t3d3c + DB_NAME=Betelgeuse_Cedetec_Prueba + DB_PORT= - DB_HOST=localhost - DB_USER=root - DB_PASSWORD=password - DB_NAME=cedetec_proyectos - DB_PORT= +# DB_HOST=localhost +# DB_USER=root +# DB_PASSWORD=password +# DB_NAME=cedetec_proyectos +# DB_PORT= DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user diff --git a/package-lock.json b/package-lock.json index 87cae60..d67e221 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "exceljs": "^4.3.0", "moment": "^2.29.4", "mysql2": "^3.1.2", "nodemailer": "^6.9.1", @@ -34,6 +35,7 @@ "typeorm": "^0.3.12" }, "devDependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", @@ -72,9 +74,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.4.tgz", - "integrity": "sha512-PW5MRmd9DHJR4FaXchwQtj9pXnsghSTnwRvfZeCRNYgU2sv0DKyTV+YTSJB+kNXnoPNG1Je6amDEkiXecpspXg==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.4.tgz", + "integrity": "sha512-yl+0j1bMwJLKShsyCXw77tbJG8Sd21+itisPLL2MgEpLNAO252kr9zG4TLlFRJyKVftm2l1h78KjqvM5nbOXNg==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -116,14 +118,14 @@ "dev": true }, "node_modules/@angular-devkit/schematics": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.1.4.tgz", - "integrity": "sha512-jpddxo9Qd2yRQ1t9FLhAx5S+luz6HkyhDytq0LFKbxf9ikf1J4oy9riPBFl4pRmrNARWcHZ6GbD20/Ky8PjmXQ==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.4.tgz", + "integrity": "sha512-/W7/vvn59PAVLzhcvD4/N/E8RDhub8ny1A7I96LTRjC5o+yvVV16YJ4YJzolrRrIEN01KmLVQJ9A58VCaweMgw==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.1.4", + "@angular-devkit/core": "15.2.4", "jsonc-parser": "3.2.0", - "magic-string": "0.27.0", + "magic-string": "0.29.0", "ora": "5.4.1", "rxjs": "6.6.7" }, @@ -134,13 +136,13 @@ } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-15.1.4.tgz", - "integrity": "sha512-qkM5Mfs28jZzNcJnSM6RlyrKkYvzhQmWFTxBXnn15k5T4EnSs1gI6O054Xn7jo/senfwNNt7h2Mlz2OmBLo6+w==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-15.2.4.tgz", + "integrity": "sha512-QTTKEH5HOkxvQtCxb2Lna2wubehkaIzA6DKUBISijPQliLomw74tzc7lXCywmMqRTbQPVRLG3kBK97hR4x67nA==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", + "@angular-devkit/core": "15.2.4", + "@angular-devkit/schematics": "15.2.4", "ansi-colors": "4.1.3", "inquirer": "8.2.4", "symbol-observable": "4.0.0", @@ -155,22 +157,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@angular-devkit/schematics-cli/node_modules/inquirer": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", @@ -891,6 +877,43 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/format/node_modules/@types/node": { + "version": "14.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.38.tgz", + "integrity": "sha512-zMRIidN2Huikv/+/U7gRPFYsXDR/7IGqFZzTLnCEj5+gkrQjsowfamaxEnyvArct5hxGA3bTxMXlYhH78V6Cew==" + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@fast-csv/parse/node_modules/@types/node": { + "version": "14.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.38.tgz", + "integrity": "sha512-zMRIidN2Huikv/+/U7gRPFYsXDR/7IGqFZzTLnCEj5+gkrQjsowfamaxEnyvArct5hxGA3bTxMXlYhH78V6Cew==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -1049,22 +1072,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/core": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.2.tgz", @@ -1112,22 +1119,6 @@ } } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/environment": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.2.tgz", @@ -1243,22 +1234,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/schemas": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.2.tgz", @@ -1341,22 +1316,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/types": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.2.tgz", @@ -1374,22 +1333,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -1488,47 +1431,33 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@nestjs/cli": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", - "integrity": "sha512-6B1IjDcJbrOu55oMF67L1x5lDUOZ3Zs9l7bKCBH9D78965m8wq/2rlEWl/gJto5TABLQWy3hVvV/s8VzUlRMxw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.3.0.tgz", + "integrity": "sha512-v/E8Y3zFk30+FljETvPgpoGIUiOfWuOe6WUFw3ExGfDeWrF/A8ceupDHPWNknBAqvNtz2kVrWu5mwsZUEKGIgg==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", - "@angular-devkit/schematics-cli": "15.1.4", - "@nestjs/schematics": "^9.0.0", - "chalk": "3.0.0", + "@angular-devkit/core": "15.2.4", + "@angular-devkit/schematics": "15.2.4", + "@angular-devkit/schematics-cli": "15.2.4", + "@nestjs/schematics": "^9.0.4", + "chalk": "4.1.2", "chokidar": "3.5.3", "cli-table3": "0.6.3", "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "7.3.0", - "inquirer": "7.3.3", + "fork-ts-checker-webpack-plugin": "8.0.0", + "inquirer": "8.2.5", "node-emoji": "1.11.0", "ora": "5.4.1", "os-name": "4.0.1", - "rimraf": "4.1.2", + "rimraf": "4.4.0", "shelljs": "0.8.5", "source-map-support": "0.5.21", "tree-kill": "1.2.2", "tsconfig-paths": "4.1.2", - "tsconfig-paths-webpack-plugin": "4.0.0", + "tsconfig-paths-webpack-plugin": "4.0.1", "typescript": "4.9.5", - "webpack": "5.75.0", + "webpack": "5.76.2", "webpack-node-externals": "3.0.0" }, "bin": { @@ -1538,6 +1467,66 @@ "node": ">= 12.9.0" } }, + "node_modules/@nestjs/cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nestjs/cli/node_modules/glob": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", + "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/minimatch": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", + "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/rimraf": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz", + "integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@nestjs/cli/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -1945,21 +1934,6 @@ "npm": ">=5.0.0" } }, - "node_modules/@nuxtjs/opencollective/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/@sinclair/typebox": { "version": "0.25.21", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", @@ -2851,6 +2825,56 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -2907,6 +2931,11 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2934,22 +2963,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -3057,6 +3070,26 @@ "node": ">= 10.0.0" } }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3070,7 +3103,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3081,7 +3113,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3091,6 +3122,11 @@ "node": ">= 6" } }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -3201,7 +3237,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -3221,6 +3256,14 @@ "ieee754": "^1.1.13" } }, + "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-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -3231,6 +3274,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -3239,6 +3290,14 @@ "node": ">=4" } }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -3304,17 +3363,30 @@ } ] }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -3444,21 +3516,6 @@ "npm": ">=5.0.0" } }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/cli-highlight/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3619,6 +3676,33 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3725,6 +3809,42 @@ "node": ">=10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -3757,6 +3877,11 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3930,6 +4055,14 @@ "node": ">=12" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -3978,7 +4111,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -4190,22 +4322,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/eslint/node_modules/eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -4353,6 +4469,49 @@ "node": ">=0.8.x" } }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/exceljs/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/exceljs/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4474,6 +4633,18 @@ "node": ">=4" } }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4644,21 +4815,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -4666,9 +4822,9 @@ "dev": true }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -4690,29 +4846,7 @@ }, "peerDependencies": { "typescript": ">3.6.0", - "vue-template-compiler": "*", "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { @@ -4774,6 +4908,11 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -4840,6 +4979,31 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "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", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4998,8 +5162,7 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -5140,6 +5303,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5199,63 +5367,31 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -5569,22 +5705,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-cli": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.2.tgz", @@ -5619,22 +5739,6 @@ } } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-config": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.2.tgz", @@ -5680,22 +5784,6 @@ } } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-diff": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.2.tgz", @@ -5711,22 +5799,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-docblock": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.2.tgz", @@ -5755,22 +5827,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-environment-node": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.2.tgz", @@ -5850,22 +5906,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-message-util": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.2.tgz", @@ -5886,22 +5926,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-mock": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.2.tgz", @@ -5975,22 +5999,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-runner": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.2.tgz", @@ -6023,22 +6031,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-runner/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6092,22 +6084,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-snapshot": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.2.tgz", @@ -6143,22 +6119,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-util": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.2.tgz", @@ -6176,22 +6136,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-validate": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.2.tgz", @@ -6221,22 +6165,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-watcher": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.2.tgz", @@ -6256,22 +6184,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-worker": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.2.tgz", @@ -6427,6 +6339,17 @@ "npm": ">=6" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -6455,6 +6378,17 @@ "node": ">=6" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6482,12 +6416,25 @@ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz", "integrity": "sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==" }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -6517,6 +6464,61 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -6529,6 +6531,16 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -6545,22 +6557,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/long": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", @@ -6576,9 +6572,9 @@ } }, "node_modules/macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "dev": true, "engines": { "node": ">=6" @@ -6588,9 +6584,9 @@ } }, "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" @@ -6756,9 +6752,9 @@ } }, "node_modules/minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", "engines": { "node": ">=8" } @@ -7007,7 +7003,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7125,22 +7120,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/os-name": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", @@ -7210,6 +7189,11 @@ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7343,6 +7327,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", + "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "dev": true, + "dependencies": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/path-to-regexp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", @@ -7772,6 +7781,33 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7910,15 +7946,14 @@ } }, "node_modules/rimraf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.1.2.tgz", - "integrity": "sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==", - "dev": true, - "bin": { - "rimraf": "dist/cjs/src/bin.js" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" }, - "engines": { - "node": ">=14" + "bin": { + "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7993,6 +8028,17 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -8146,6 +8192,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8538,6 +8589,34 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "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/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -8737,6 +8816,14 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -8808,22 +8895,6 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -8882,33 +8953,40 @@ } }, "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.0.0" + "tsconfig-paths": "^4.1.2" }, "engines": { "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", + "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { @@ -9134,21 +9212,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/typeorm/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/typeorm/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -9241,6 +9304,23 @@ "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -9376,9 +9456,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.76.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", + "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -9597,6 +9677,11 @@ "node": ">=4.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9673,6 +9758,32 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } } }, "dependencies": { @@ -9687,9 +9798,9 @@ } }, "@angular-devkit/core": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.4.tgz", - "integrity": "sha512-PW5MRmd9DHJR4FaXchwQtj9pXnsghSTnwRvfZeCRNYgU2sv0DKyTV+YTSJB+kNXnoPNG1Je6amDEkiXecpspXg==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.4.tgz", + "integrity": "sha512-yl+0j1bMwJLKShsyCXw77tbJG8Sd21+itisPLL2MgEpLNAO252kr9zG4TLlFRJyKVftm2l1h78KjqvM5nbOXNg==", "dev": true, "requires": { "ajv": "8.12.0", @@ -9717,14 +9828,14 @@ } }, "@angular-devkit/schematics": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.1.4.tgz", - "integrity": "sha512-jpddxo9Qd2yRQ1t9FLhAx5S+luz6HkyhDytq0LFKbxf9ikf1J4oy9riPBFl4pRmrNARWcHZ6GbD20/Ky8PjmXQ==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.4.tgz", + "integrity": "sha512-/W7/vvn59PAVLzhcvD4/N/E8RDhub8ny1A7I96LTRjC5o+yvVV16YJ4YJzolrRrIEN01KmLVQJ9A58VCaweMgw==", "dev": true, "requires": { - "@angular-devkit/core": "15.1.4", + "@angular-devkit/core": "15.2.4", "jsonc-parser": "3.2.0", - "magic-string": "0.27.0", + "magic-string": "0.29.0", "ora": "5.4.1", "rxjs": "6.6.7" }, @@ -9747,29 +9858,19 @@ } }, "@angular-devkit/schematics-cli": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-15.1.4.tgz", - "integrity": "sha512-qkM5Mfs28jZzNcJnSM6RlyrKkYvzhQmWFTxBXnn15k5T4EnSs1gI6O054Xn7jo/senfwNNt7h2Mlz2OmBLo6+w==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-15.2.4.tgz", + "integrity": "sha512-QTTKEH5HOkxvQtCxb2Lna2wubehkaIzA6DKUBISijPQliLomw74tzc7lXCywmMqRTbQPVRLG3kBK97hR4x67nA==", "dev": true, "requires": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", + "@angular-devkit/core": "15.2.4", + "@angular-devkit/schematics": "15.2.4", "ansi-colors": "4.1.3", "inquirer": "8.2.4", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "inquirer": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", @@ -10315,6 +10416,47 @@ } } }, + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.38.tgz", + "integrity": "sha512-zMRIidN2Huikv/+/U7gRPFYsXDR/7IGqFZzTLnCEj5+gkrQjsowfamaxEnyvArct5hxGA3bTxMXlYhH78V6Cew==" + } + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.38.tgz", + "integrity": "sha512-zMRIidN2Huikv/+/U7gRPFYsXDR/7IGqFZzTLnCEj5+gkrQjsowfamaxEnyvArct5hxGA3bTxMXlYhH78V6Cew==" + } + } + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -10433,18 +10575,6 @@ "jest-message-util": "^29.4.2", "jest-util": "^29.4.2", "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jest/core": { @@ -10481,18 +10611,6 @@ "pretty-format": "^29.4.2", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jest/environment": { @@ -10582,18 +10700,6 @@ "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jest/schemas": { @@ -10661,18 +10767,6 @@ "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jest/types": { @@ -10687,18 +10781,6 @@ "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jridgewell/gen-mapping": { @@ -10781,48 +10863,77 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } } }, "@nestjs/cli": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", - "integrity": "sha512-6B1IjDcJbrOu55oMF67L1x5lDUOZ3Zs9l7bKCBH9D78965m8wq/2rlEWl/gJto5TABLQWy3hVvV/s8VzUlRMxw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.3.0.tgz", + "integrity": "sha512-v/E8Y3zFk30+FljETvPgpoGIUiOfWuOe6WUFw3ExGfDeWrF/A8ceupDHPWNknBAqvNtz2kVrWu5mwsZUEKGIgg==", "dev": true, "requires": { - "@angular-devkit/core": "15.1.4", - "@angular-devkit/schematics": "15.1.4", - "@angular-devkit/schematics-cli": "15.1.4", - "@nestjs/schematics": "^9.0.0", - "chalk": "3.0.0", + "@angular-devkit/core": "15.2.4", + "@angular-devkit/schematics": "15.2.4", + "@angular-devkit/schematics-cli": "15.2.4", + "@nestjs/schematics": "^9.0.4", + "chalk": "4.1.2", "chokidar": "3.5.3", "cli-table3": "0.6.3", "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "7.3.0", - "inquirer": "7.3.3", + "fork-ts-checker-webpack-plugin": "8.0.0", + "inquirer": "8.2.5", "node-emoji": "1.11.0", "ora": "5.4.1", "os-name": "4.0.1", - "rimraf": "4.1.2", + "rimraf": "4.4.0", "shelljs": "0.8.5", "source-map-support": "0.5.21", "tree-kill": "1.2.2", "tsconfig-paths": "4.1.2", - "tsconfig-paths-webpack-plugin": "4.0.0", + "tsconfig-paths-webpack-plugin": "4.0.1", "typescript": "4.9.5", - "webpack": "5.75.0", + "webpack": "5.76.2", "webpack-node-externals": "3.0.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", + "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", + "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "rimraf": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz", + "integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==", + "dev": true, + "requires": { + "glob": "^9.2.0" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -11056,17 +11167,6 @@ "chalk": "^4.1.0", "consola": "^2.15.0", "node-fetch": "^2.6.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@sinclair/typebox": { @@ -11812,6 +11912,49 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -11861,6 +12004,11 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -11880,18 +12028,6 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "babel-plugin-istanbul": { @@ -11968,6 +12104,20 @@ "node-addon-api": "^5.0.0" } }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -11978,7 +12128,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -11989,7 +12138,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11998,6 +12146,11 @@ } } }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -12084,12 +12237,16 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -12100,11 +12257,21 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + }, "buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -12145,11 +12312,18 @@ "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12243,15 +12417,6 @@ "yargs": "^16.0.0" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -12372,6 +12537,29 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -12460,6 +12648,32 @@ "yaml": "^1.10.0" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -12482,6 +12696,11 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -12604,6 +12823,14 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==" }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + } + }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -12643,7 +12870,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -12748,16 +12974,6 @@ "uri-js": "^4.2.2" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -12914,6 +13130,42 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, + "exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -13019,6 +13271,15 @@ "tmp": "^0.0.33" } }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13161,17 +13422,6 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "flatted": { @@ -13181,9 +13431,9 @@ "dev": true }, "fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -13200,16 +13450,6 @@ "tapable": "^2.2.1" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -13256,6 +13496,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -13308,6 +13553,27 @@ "dev": true, "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -13424,8 +13690,7 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "grapheme-splitter": { "version": "1.0.4", @@ -13519,6 +13784,11 @@ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -13560,51 +13830,26 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" } }, "interpret": { @@ -13833,18 +14078,6 @@ "pretty-format": "^29.4.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-cli": { @@ -13865,18 +14098,6 @@ "jest-validate": "^29.4.2", "prompts": "^2.0.1", "yargs": "^17.3.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-config": { @@ -13907,18 +14128,6 @@ "pretty-format": "^29.4.2", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-diff": { @@ -13931,18 +14140,6 @@ "diff-sequences": "^29.4.2", "jest-get-type": "^29.4.2", "pretty-format": "^29.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-docblock": { @@ -13965,18 +14162,6 @@ "jest-get-type": "^29.4.2", "jest-util": "^29.4.2", "pretty-format": "^29.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-environment-node": { @@ -14039,18 +14224,6 @@ "jest-diff": "^29.4.2", "jest-get-type": "^29.4.2", "pretty-format": "^29.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-message-util": { @@ -14068,18 +14241,6 @@ "pretty-format": "^29.4.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-mock": { @@ -14121,18 +14282,6 @@ "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-resolve-dependencies": { @@ -14174,16 +14323,6 @@ "source-map-support": "0.5.13" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -14231,18 +14370,6 @@ "semver": "^7.3.5", "slash": "^3.0.0", "strip-bom": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-snapshot": { @@ -14275,18 +14402,6 @@ "natural-compare": "^1.4.0", "pretty-format": "^29.4.2", "semver": "^7.3.5" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-util": { @@ -14301,18 +14416,6 @@ "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-validate": { @@ -14334,16 +14437,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } } } }, @@ -14361,18 +14454,6 @@ "emittery": "^0.13.1", "jest-util": "^29.4.2", "string-length": "^4.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-worker": { @@ -14489,6 +14570,17 @@ "semver": "^7.3.8" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -14514,6 +14606,14 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -14535,12 +14635,25 @@ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz", "integrity": "sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==" }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -14561,6 +14674,61 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -14573,6 +14741,16 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -14581,18 +14759,6 @@ "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "long": { @@ -14610,15 +14776,15 @@ } }, "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "dev": true }, "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.4.13" @@ -14738,9 +14904,9 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==" + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==" }, "minizlib": { "version": "2.1.2", @@ -14938,8 +15104,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npm-run-path": { "version": "4.0.1", @@ -15025,18 +15190,6 @@ "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "os-name": { @@ -15084,6 +15237,11 @@ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -15185,6 +15343,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", + "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "dev": true, + "requires": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + } + } + }, "path-to-regexp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", @@ -15497,6 +15673,32 @@ } } }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -15594,10 +15796,12 @@ "dev": true }, "rimraf": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.1.2.tgz", - "integrity": "sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } }, "run-async": { "version": "2.4.1", @@ -15637,6 +15841,14 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -15770,6 +15982,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -16079,6 +16296,30 @@ } } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "terser": { "version": "5.16.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", @@ -16212,6 +16453,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -16244,18 +16490,6 @@ "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "ts-node": { @@ -16299,24 +16533,31 @@ } }, "tsconfig-paths-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.0.0" + "tsconfig-paths": "^4.1.2" }, "dependencies": { - "chalk": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", + "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } } } @@ -16419,15 +16660,6 @@ "ieee754": "^1.2.1" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -16485,6 +16717,23 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -16588,9 +16837,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.76.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", + "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -16745,6 +16994,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -16797,6 +17051,28 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } } } } diff --git a/package.json b/package.json index 3ac1600..37af02d 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "exceljs": "^4.3.0", "moment": "^2.29.4", "mysql2": "^3.1.2", "nodemailer": "^6.9.1", @@ -45,6 +46,7 @@ "typeorm": "^0.3.12" }, "devDependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", diff --git a/sql/01-admin.sql b/sql/01-admin.sql index bd2d9d4..20d10b7 100644 --- a/sql/01-admin.sql +++ b/sql/01-admin.sql @@ -1,2 +1,2 @@ INSERT INTO miembro (nombre, apellido_paterno, apellido_materno, id_tipo_miembro, email, password, descripcion, semestre, cuenta) -VALUES ('Jorge', 'Alvarado', 'Reyes', 1, 'Admin@unam.com', '$2b$10$1ExBjP1J1PET5N4m9Thv7O0l0nNjPsMYQW6.TZveaCFz0OkLh06Dy', 'Estudiante de Ingeniería en Sistemas', '4', 421010301); +VALUES ('Jorge', 'Alvarado', 'Reyes', 1, 'Admin@unam.com', '$2b$10$1ExBjP1J1PET5N4m9Thv7O0l0nNjPsMYQW6.TZveaCFz0OkLh06Dy', 'Estudiante de Ingeniería en Sistemas', '4', 123456789); diff --git a/src/app.module.ts b/src/app.module.ts index 21f3362..99abe42 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,14 +7,12 @@ import { EventosModule } from './eventos/eventos.module'; import { ParticipanteController } from './participante/participante.controller'; import { ParticipanteModule } from './participante/participante.module'; import { EventoParticipanteModule } from './evento-participante/evento-participante/evento-participante.module'; -import { UsuarioModule } from './usuario/usuario.module'; import { AuthModule } from './auth/auth.module'; import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs/jwt'; import { Evento } from './eventos/evento.entity'; import { Participante } from './participante/participante.entity'; import { EventoParticipante } from './evento-participante/evento-participante/eventoParticipante.entity'; -import { Usuario } from './usuario/usuario.entity'; import { InscripcionDscModule } from './inscripcion-dsc/inscripcion-dsc.module'; import { InscripcionAreaModule } from './inscripcion-area/inscripcion-area.module'; import { InscripcionStatusService } from './inscripcion-status/inscripcion-status.service'; @@ -68,7 +66,6 @@ import { EmailModule } from './email/email.module'; Evento, Participante, EventoParticipante, - Usuario, /* Agregadas el 29 de febrero */ Miembro, InscripcionArea, @@ -94,7 +91,6 @@ import { EmailModule } from './email/email.module'; EventosModule, ParticipanteModule, EventoParticipanteModule, - UsuarioModule, AuthModule, PassportModule, JwtModule.register({}), diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 30fadac..158331e 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -1,12 +1,10 @@ import { Body, Controller, Post, Request, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { InjectRepository } from '@nestjs/typeorm'; -import { Usuario } from 'src/usuario/usuario.entity'; import { Repository } from 'typeorm'; import { AuthService } from './auth.service'; -import { LoginUsuarioDto } from './dto/loginUsuario.dto'; +import { LoginMiembroDto } from './dto/loginMiembro.dto'; import { RegistrarMiembroDto } from './dto/registrarMiembro.dto'; -import { RegistrarUsuarioDto } from './dto/registrarUsuario.dto'; @Controller('auth') export class AuthController { @@ -20,7 +18,7 @@ export class AuthController { } @Post('login') - login(@Body() LoginUsuario: LoginUsuarioDto) { + login(@Body() LoginUsuario: LoginMiembroDto) { return this.authService.login(LoginUsuario); } } diff --git a/src/auth/dto/loginMiembro.dto.ts b/src/auth/dto/loginMiembro.dto.ts index f8f9780..a3db451 100644 --- a/src/auth/dto/loginMiembro.dto.ts +++ b/src/auth/dto/loginMiembro.dto.ts @@ -5,7 +5,7 @@ export class LoginMiembroDto { @IsEmail() email: string - @MinLength(10) + @MinLength(5) @MaxLength(15) password: string } \ No newline at end of file diff --git a/src/auth/dto/loginUsuario.dto.ts b/src/auth/dto/loginUsuario.dto.ts deleted file mode 100644 index c327256..0000000 --- a/src/auth/dto/loginUsuario.dto.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IsEmail, MaxLength, MinLength } from "class-validator"; - -export class LoginUsuarioDto { - @IsEmail() - email: string - - @MinLength(10) - @MaxLength(15) - password: string -} \ No newline at end of file diff --git a/src/auth/dto/registrarMiembro.dto.ts b/src/auth/dto/registrarMiembro.dto.ts index bc2c341..8031d2f 100644 --- a/src/auth/dto/registrarMiembro.dto.ts +++ b/src/auth/dto/registrarMiembro.dto.ts @@ -1,8 +1,8 @@ import { PartialType } from '@nestjs/swagger'; import { IsEmail, IsNotEmpty, MaxLength, MinLength } from 'class-validator'; -import { LoginUsuarioDto } from './loginUsuario.dto'; +import { LoginMiembroDto } from './loginMiembro.dto'; -export class RegistrarMiembroDto extends PartialType(LoginUsuarioDto) { +export class RegistrarMiembroDto extends PartialType(LoginMiembroDto) { @IsNotEmpty() nombre: string; diff --git a/src/auth/dto/registrarUsuario.dto.ts b/src/auth/dto/registrarUsuario.dto.ts deleted file mode 100644 index eafb987..0000000 --- a/src/auth/dto/registrarUsuario.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { PartialType } from '@nestjs/swagger'; -import { IsEmail, IsNotEmpty, MaxLength, MinLength } from 'class-validator'; -import { LoginUsuarioDto } from './loginUsuario.dto'; - -export class RegistrarUsuarioDto extends PartialType(LoginUsuarioDto) { - @IsNotEmpty() - name: string; - - @IsNotEmpty() - lastName: string; - - @IsEmail() - email: string; - - @MinLength(10) - @MaxLength(15) - password: string; -} diff --git a/src/catalogos/area.entity.ts b/src/catalogos/area.entity.ts index 9e47ab6..bbb7a9c 100644 --- a/src/catalogos/area.entity.ts +++ b/src/catalogos/area.entity.ts @@ -6,7 +6,7 @@ export class Area { @PrimaryGeneratedColumn() id_area: number - @Column({length:60, nullable:false}) + @Column({length:20, nullable:false}) area: string @OneToMany( diff --git a/src/catalogos/carrera.entity.ts b/src/catalogos/carrera.entity.ts index cd27751..b14e7cb 100644 --- a/src/catalogos/carrera.entity.ts +++ b/src/catalogos/carrera.entity.ts @@ -6,7 +6,7 @@ export class Carrera { @PrimaryGeneratedColumn() id_carrera: number - @Column({ length:70, nullable: false}) + @Column({ length:40, nullable: false}) carrera: string @OneToMany( diff --git a/src/catalogos/tipo-miembro.entity.ts b/src/catalogos/tipo-miembro.entity.ts index 01f4303..050c8ec 100644 --- a/src/catalogos/tipo-miembro.entity.ts +++ b/src/catalogos/tipo-miembro.entity.ts @@ -6,7 +6,7 @@ export class TipoMiembro { @PrimaryGeneratedColumn() id_tipo_miembro: number - @Column({length:60, nullable:false}) + @Column({length:15, nullable:false}) tipo_miembro: string @OneToMany( diff --git a/src/contacto/entity/contacto.entity.ts b/src/contacto/entity/contacto.entity.ts index 9ce9207..3ab0c30 100644 --- a/src/contacto/entity/contacto.entity.ts +++ b/src/contacto/entity/contacto.entity.ts @@ -10,13 +10,13 @@ export class Contacto { @Column({nullable:false}) email: string - @Column() + @Column({length: 40}) horario: string - @Column({nullable:true}) + @Column({length: 75, nullable:true}) facebook: string - @Column({nullable: true}) + @Column({length: 60, nullable: true}) linkedin: string @ManyToOne( diff --git a/src/equipo/entity/equipo.entity.ts b/src/equipo/entity/equipo.entity.ts index 687cbad..e5b5bad 100644 --- a/src/equipo/entity/equipo.entity.ts +++ b/src/equipo/entity/equipo.entity.ts @@ -10,7 +10,7 @@ export class Equipo{ @Column({length:50, nullable:true}) nombre: string - @Column({length:250}) + @Column({length:100}) descripcion:string @OneToMany( diff --git a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts index 04ebcf5..1b76610 100644 --- a/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts +++ b/src/evento-participante/evento-participante/dto/registrarParticipanteDto.dto.ts @@ -17,6 +17,11 @@ export class RegistrarParticipanteDto { @IsNotEmpty() carrera: string; + @IsString() + @IsNotEmpty() + institucion_procedencia: string; + + @IsEmail() email: string; } diff --git a/src/eventos/dto/actualizarEvento.dto.ts b/src/eventos/dto/actualizarEvento.dto.ts index 7532801..dbdbe7e 100644 --- a/src/eventos/dto/actualizarEvento.dto.ts +++ b/src/eventos/dto/actualizarEvento.dto.ts @@ -1,9 +1,9 @@ export class actualizarEventoDto { nombre?: string; tipo_evento?: string; - organizadores?: string[]; - proyecto?: string[]; - modalidad?: string[]; + organizadores?: string; + proyecto?: string; + modalidad?: string; lugar?: string; requisitos?: string; cuota_inscripcion?: number; diff --git a/src/eventos/dto/crearEvento.dto.ts b/src/eventos/dto/crearEvento.dto.ts index 51e66fe..53387e3 100644 --- a/src/eventos/dto/crearEvento.dto.ts +++ b/src/eventos/dto/crearEvento.dto.ts @@ -1,16 +1,16 @@ export class crearEventoDto { nombre: string; tipo_evento: string; - organizadores: string[]; - proyecto: string[]; - modalidad: string[]; + organizadores: string; + proyecto: string; + modalidad: string; lugar: string; cupo: number; requisitos: string; cuota_inscripcion: number; patrocinador: string; tipo_acreditacion: string; - descripcion: string; + objetivo: string; fecha_inicio: Date; fecha_fin: Date; fecha_limite_inscripcion: Date; diff --git a/src/eventos/evento.entity.ts b/src/eventos/evento.entity.ts index 7b46a7e..0b8bedd 100644 --- a/src/eventos/evento.entity.ts +++ b/src/eventos/evento.entity.ts @@ -14,41 +14,41 @@ export class Evento { @PrimaryGeneratedColumn() id_evento: number; - @Column({ nullable: false }) + @Column({length: 70, nullable: false }) nombre: string; - @Column({ nullable: false }) + @Column({length: 15, nullable: false }) tipo_evento: string; - @Column("simple-array", {nullable: false}) - organizadores: string[] + @Column({length: 100,nullable: false}) + organizadores: string - @Column("simple-array", {nullable: false}) - proyecto: string[] + @Column({length:30 ,nullable: true}) + proyecto: string - @Column("simple-array", {nullable: false}) - modalidad: string[] + @Column({length: 40,nullable: false}) + modalidad: string - @Column({ nullable: false }) + @Column({length: 60,nullable: false }) lugar: string; @Column({nullable: false}) cupo: number; - @Column({ nullable: false }) + @Column({length: 60, nullable: false }) requisitos: string; - @Column({ nullable: true }) + @Column({type:'decimal', precision: 7, scale: 2, nullable: true }) cuota_inscripcion: number; - @Column({ nullable: true }) + @Column({length: 50, nullable: true }) patrocinador: string; - @Column({ nullable: true }) + @Column({length: 40, nullable: true }) tipo_acreditacion: string; - @Column({nullable: false}) - descripcion: string + @Column({length: 200 ,nullable: false}) + objetivo: string @Column({ nullable: false, type: 'datetime' }) fecha_inicio: Date; @@ -59,10 +59,7 @@ export class Evento { @Column({ nullable: false, type: 'datetime' }) fecha_limite_inscripcion: Date; - @Column({ nullable: true }) - evento_identificador: string; - - @Column({ nullable: true }) + @Column({length:40 ,nullable: true }) horario: string; @Column({ nullable: true }) diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index 5abbe20..3580989 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -1,4 +1,5 @@ -import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, Res } from '@nestjs/common'; +import { Response } from 'express'; import { InjectRepository } from '@nestjs/typeorm'; import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; import { Repository } from 'typeorm'; @@ -46,4 +47,11 @@ export class EventosController { async getParticipnates(@Param('id', ParseIntPipe)id:number){ return this.eventoService.getParticipantes(id) } + + @Get(':id/exportExcel') + async exportarExcel (@Param('id', ParseIntPipe)id:number ,@Res() res: Response){ + const filePath = await this.eventoService.exportarParticipantes(id); + res.download(filePath); + } + } diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index 8777106..8f0e075 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -6,6 +6,7 @@ import { Repository } from 'typeorm'; import { actualizarEventoDto } from './dto/actualizarEvento.dto'; import { crearEventoDto } from './dto/crearEvento.dto'; import { Evento } from './evento.entity'; +import * as ExcelJS from 'exceljs'; @Injectable() export class EventosService { @@ -13,7 +14,8 @@ export class EventosService { @InjectRepository(Evento) private eventoRepository: Repository, @InjectRepository(EventoParticipante) private eventoParticipanteRepository: Repository, - @InjectRepository(Participante) private participanteRepository:Repository + @InjectRepository(Participante) + private participanteRepository: Repository, ) {} getEventos() { @@ -77,13 +79,77 @@ export class EventosService { async getParticipantes(idEvento: number) { const participantes = await this.participanteRepository - .createQueryBuilder('participante') - .innerJoin('participante.eventosParticipante', 'eventoParticipante') - .innerJoin('eventoParticipante.evento', 'evento') - .where('evento.id_evento = :idEvento', { idEvento }) - .select(['participante.nombre','participante.apellido_paterno','participante.carrera', 'participante.email']) - .getMany(); + .createQueryBuilder('participante') + .innerJoin('participante.eventosParticipante', 'eventoParticipante') + .innerJoin('eventoParticipante.evento', 'evento') + .where('evento.id_evento = :idEvento', { idEvento }) + .select([ + 'participante.nombre', + 'participante.apellido_paterno', + 'participante.apellido_materno', + 'participante.carrera', + 'participante.email', + 'participante.institucion_procedencia', + ]) + .getMany(); + return participantes; + } - return participantes; + async exportarParticipantes(idEvento: number): Promise { + const participantes: Participante[] = await this.getParticipantes(idEvento); + /* console.log(participantes); + */ + // Crear el workbook y la worksheet + const workbook = new ExcelJS.Workbook(); + const worksheet = workbook.addWorksheet('Participantes'); + + // Definir estilos + const headerStyle = { + font: { bold: true }, + alignment: { horizontal: 'center' }, + border: { bottom: { style: 'medium' } }, + }; + + const dataStyle = { + alignment: { horizontal: 'left' }, + }; + + // Definir las columnas + worksheet.columns = [ + { header: 'Asistencia', key: 'asistencia', width: 10, style: {alignment: {horizontal: 'center'}}}, + { header: 'Nombre', key: 'nombre', width: 20, style: {alignment: {horizontal: 'center'}} }, + { header: 'Apellido Paterno', key: 'apellido_paterno', width: 20, style: {alignment: {horizontal: 'center'}} }, + { header: 'Apellido Materno', key: 'apellido_materno', width: 20, style: {alignment: {horizontal: 'center'}} }, + { header: 'Carrera', key: 'carrera', width: 20, style: {alignment: {horizontal: 'center'}} }, + { header: 'Email', key: 'email', width: 35, style: {alignment: {horizontal: 'center'}} }, + { + header: 'Institución Procedencia', + key: 'institucion_procedencia', + width: 30, + style: {alignment: {horizontal: 'center'}} + }, + ]; + // Agregar los datos a la worksheet + participantes.forEach((participante) => { + worksheet.addRow({ + asistencia: '', + nombre: participante.nombre, + apellido_paterno: participante.apellido_paterno, + apellido_materno: participante.apellido_materno, + carrera: participante.carrera, + email: participante.email, + institucion_procedencia: participante.institucion_procedencia, + }); + }); + + console.log(workbook.description); + + // Generar el archivo Excel y guardarlo en el servidor + const fileName = `participantes-${idEvento}.xlsx`; + const filePath = `./${fileName}`; + await workbook.xlsx.writeFile(filePath); + + // Devolver la ruta del archivo para que el cliente pueda descargarlo + return filePath; } } diff --git a/src/miembro/entity/miembro.entity.ts b/src/miembro/entity/miembro.entity.ts index 2ccff7e..848dbc3 100644 --- a/src/miembro/entity/miembro.entity.ts +++ b/src/miembro/entity/miembro.entity.ts @@ -19,26 +19,26 @@ export class Miembro { @PrimaryGeneratedColumn() id_miembro: number; - @Column({ nullable: false, length: 50 }) + @Column({ nullable: false, length: 40 }) nombre: string; - @Column({ nullable: false, length: 50 }) + @Column({ nullable: false, length: 30 }) apellido_paterno: string; - @Column({ nullable: false, length: 50 }) + @Column({ nullable: false, length: 30 }) apellido_materno: string; @Column({ nullable: false }) id_tipo_miembro: number; - @Column({ nullable: false }) + @Column({length: 40, nullable: false }) @IsEmail() email: string; - @Column({ nullable: false }) + @Column({length: 180, nullable: false }) password: string; - @Column({ length: 260, nullable:true}) + @Column({ length: 200, nullable:true}) descripcion: string; @Column({nullable: true}) diff --git a/src/miembro/miembro.controller.ts b/src/miembro/miembro.controller.ts index 50b9cda..cc4177f 100644 --- a/src/miembro/miembro.controller.ts +++ b/src/miembro/miembro.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Param, ParseIntPipe, UseGuards } from '@nestjs/common'; +import { Controller, Delete, Get, Param, ParseIntPipe, UseGuards } from '@nestjs/common'; import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; import { Miembro } from './entity/miembro.entity'; import { MiembroService } from './miembro.service'; @@ -8,7 +8,6 @@ export class MiembroController { constructor(private readonly miembroService: MiembroService){} - @UseGuards(JwtAuthGuard) @Get() getUsuarios(): Promise{ return this.miembroService.getUsuarios() @@ -18,4 +17,9 @@ export class MiembroController { getMiembros(@Param('tipo', ParseIntPipe)tipo: number): Promise{ return this.miembroService.getMiembros(tipo) } + + @Delete(':id') + deleteMiembro(@Param('id', ParseIntPipe)id: number){ + return this.miembroService.deleteMiembro(id) + } } diff --git a/src/miembro/miembro.service.ts b/src/miembro/miembro.service.ts index dbd0c57..0584e8a 100644 --- a/src/miembro/miembro.service.ts +++ b/src/miembro/miembro.service.ts @@ -28,4 +28,8 @@ export class MiembroService { } }) } + + deleteMiembro(id: number){ + return this.miembroRepository.delete({id_miembro: id}) + } } diff --git a/src/participante/participante.entity.ts b/src/participante/participante.entity.ts index 8df05e5..3f2ff3e 100644 --- a/src/participante/participante.entity.ts +++ b/src/participante/participante.entity.ts @@ -6,34 +6,31 @@ export class Participante { @PrimaryGeneratedColumn() id_participante: number; - @Column({ type: String, nullable: false, length: 100 }) + @Column({ type: String, nullable: false, length: 40 }) nombre: string; - @Column({ nullable: false }) + @Column({ nullable: false, length: 30 }) apellido_paterno: string; - @Column({ nullable: false }) + @Column({ nullable: false, length: 30 }) apellido_materno: string; - @Column({ nullable: true }) + @Column({ nullable: true, length: 12 }) telefono: string; - @Column({ nullable: false }) + @Column({ nullable: false, length: 40 }) email: string; - @Column({ nullable: true }) // + @Column({ nullable: true, length: 180}) // password: string; - @Column({ nullable: true }) // + @Column({length:20, nullable: true }) // tipo: string; - @Column({ nullable: true }) // - estado: string; - - @Column({ nullable: true }) + @Column({ nullable: true, length: 50}) institucion_procedencia: string; - @Column({ nullable: true }) + @Column({ nullable: true, length:50}) carrera: string; @OneToMany( diff --git a/src/usuario/usuario.entity.ts b/src/usuario/usuario.entity.ts deleted file mode 100644 index fb343c8..0000000 --- a/src/usuario/usuario.entity.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; - -@Entity() -export class Usuario { - @PrimaryGeneratedColumn() - id_usuario: number; - - @Column({ nullable: false }) - nombre: string; - - @Column({ nullable: false }) - password: string; - - @Column({nullable:false}) - email:string -} diff --git a/src/usuario/usuario.module.ts b/src/usuario/usuario.module.ts deleted file mode 100644 index 02216b9..0000000 --- a/src/usuario/usuario.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { UsuarioService } from './usuario.service'; -import { UsuarioController } from './usuarios.controller'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { Usuario } from './usuario.entity'; - -@Module({ - imports:[TypeOrmModule.forFeature([Usuario])], - providers: [UsuarioService], - controllers: [UsuarioController] -}) -export class UsuarioModule {} diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts deleted file mode 100644 index 4b3680c..0000000 --- a/src/usuario/usuario.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { Usuario } from './usuario.entity'; - -@Injectable() -export class UsuarioService { - constructor( - @InjectRepository(Usuario) private usuarioRepository: Repository, - ) {} - - getUsuarios(){ - return this.usuarioRepository.find() - } - - getUsuario(email: string) { - return this.usuarioRepository.findOne({ - where: { - email, - }, - }); - } -} diff --git a/src/usuario/usuarios.controller.ts b/src/usuario/usuarios.controller.ts deleted file mode 100644 index f5aa574..0000000 --- a/src/usuario/usuarios.controller.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Controller, Get, UseGuards } from '@nestjs/common'; -import { ApiBearerAuth } from '@nestjs/swagger'; -import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; -import { Usuario } from './usuario.entity'; -import { UsuarioService } from './usuario.service'; - -@ApiBearerAuth() -@Controller('usuarios') -export class UsuarioController { - - constructor(private readonly usuarioService: UsuarioService){} - - @UseGuards(JwtAuthGuard) - @Get() - getUsuarios(): Promise{ - return this.usuarioService.getUsuarios() - } -} -- 2.43.0 From 4d6435ac8a9c71dcfc765301c779a8516f5cf13d Mon Sep 17 00:00:00 2001 From: JorgeMike <119615322+JorgeMike@users.noreply.github.com> Date: Mon, 20 Mar 2023 20:00:10 -0600 Subject: [PATCH 27/37] se agrego controller para traer solo eventos disponibles y no todos --- .env | 20 ++++++++++---------- .gitignore | 2 +- participantes-7.xlsx | Bin 0 -> 6691 bytes src/eventos/eventos.controller.ts | 5 +++++ src/eventos/eventos.service.ts | 26 ++++++++++++-------------- 5 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 participantes-7.xlsx diff --git a/.env b/.env index 17d9caa..c8879e3 100644 --- a/.env +++ b/.env @@ -1,16 +1,16 @@ PORT=5089 - DB_HOST=132.248.180.82 - DB_USER=user_cedetec - DB_PASSWORD=c3t3d3c - DB_NAME=Betelgeuse_Cedetec_Prueba - DB_PORT= +# DB_HOST=132.248.180.82 +# DB_USER=user_cedetec +# DB_PASSWORD=c3t3d3c +# DB_NAME=Betelgeuse_Cedetec_Prueba +# DB_PORT= -# DB_HOST=localhost -# DB_USER=root -# DB_PASSWORD=password -# DB_NAME=cedetec_proyectos -# DB_PORT= + DB_HOST=localhost + DB_USER=root + DB_PASSWORD=Dosmiluno2001 + DB_NAME=cedetec_proyectos + DB_PORT=3306 DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user diff --git a/.gitignore b/.gitignore index ea48d65..0fade4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.env # compiled output /dist /node_modules @@ -34,4 +35,3 @@ lerna-debug.log* !.vscode/launch.json !.vscode/extensions.json -.env \ No newline at end of file diff --git a/participantes-7.xlsx b/participantes-7.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fb33d275a939c03853f1b99b7b24ea7a25b13aa1 GIT binary patch literal 6691 zcmai32UL^W(hUlP4xxic5tIZF5Ru-S^xmtKNa#qDDn&Ykjvxq1RjQN#7wLl11Ja~Q z?_fZr3it=PsLy-f|IS*;%1UORnYCxm%=vcIl`doA0RR9TfMKGWZu~?ut^o!Bu!RW# zkfFadl6G=*gF3pIX?rp^RrE9q~Y2uut$h22(aQe-~?3fSY3JOp-q56`DVW~DJFUcVvM{bx4E`HK}>+EBW z3^>e^)`(am`lWtLSK9)#J9c045-n-xj_GKH3&y7_CQ=J;jE#1~66kSg9(vFgR=vc) z4;E2?u`gqUH9pK#?#D}{2|mCkELs@pfa7;_Ek7B9CXzu+bXG}|+4Tr(tQIZ@Wz*i` zyRkk}jNt%0IaXD!Fp}dZa`}qt1ReU#pL+WRBlCgs53J)HMfZ@1SYv64UC?EQ=yc%0 zrr&I$iJ8LUsZ9W(7SbUpuX09Y8$@{U-Q@IHOSSN>eK6BncaA9O*wI?Kg)n=_8m5tl zc=6m7^}jO#_>l=T`9Bvn`jeRp)ZUfr!sa|%U!E(BucCibx=|Fq#evn)wyQElZW zkU;s$E__RKl*h@+t7FWay1^^f%;I>Z3ZB#U_%kXZPJ#e#1B`jFv25MF-YWuMgKO^5 z5pWdIl4Erv!;sD0r#26W+3>N$n1MXbxdiD;_fM3W6$?5WVht$dJFvau4_>%ei>jou z$B=iab=ycm`i54+J(^>_7M7yijyeODf(xpV660^KzdE@!aL3-!$Z0ix(>$Be+VHpw zY^8iPBG79H^(<6xDT__Lf7wL$W8Jan%S`$HtQXbKU?8mm)wyoNCU?3C6Wry#XeFtd z@3nMkAwkR!4R9@wc?MYd`+WfyjQo?e%V@XGfMJq#5g@ve|SW261c!H8;Qdj%N3!^ytR6?rga6#*IWVWASdVj1E0q=cnUc zzUtz~60afxaqiicRpcSMt0Eh|vZHck;FVzaQ0J>&(}!R^=poDCh@=u zZiH=tbkIcdpzE0WAGSXrx6b%X)^3Rz=O$^`XXluv3X`}e89eM^0Lv@Yt}@!Srwh|x zx4JgbJn$OThHIk`r^q$))C=`)=l$N?tmwxDM!1f8o0|X*I6fpmhN3R@)YD{oO3UIZ z7ino$+$~WBC59&qly|wE_!0*|ombz9v%N~F{jkD{oVksd-ve846vwIHtiaxsC?{2yX@;iO|qAFpU-KJ}^ zsA`&&VB8~)!sGTWD&O3nO^vFoCiebPONz~r>lonDEB8&bZ!|h53Z1w@RX1G>I2&_MwMgnwJg}ggd~k+mA9H;9SZ=w~ z=6Z=lodvDzFe@f(-Cv=!Fw3&?ckD=PNcQa!qb%n@2n; z;0NBkz58z04wz>)t1%tas^uNS<9j2wARBZY5+DpL9y#HhYGk=bp7zQ zG&@ZId~cn?)R@*WPrj$2w};-noPs>ayLZdLBn9wVwQ!Ohv7bjYvHyPh`ChHrDfUI# zo_9ULCie`)N_3C+^HTKS_L)eWWuLj5kCCrTKjp-2m} zuBrLW)jaYxY~lG!QjqDu1;gj$G8_YJnh@a9wj#t9xD{H#eJOuIP{v6BUarS0$9MX>vA*&TR4X|-mMDj3g?xUs>f5N6$MJ6Jlg!}FV0uP( zu`m^#zWBp2|A>N_VRwHL>QXaBWjy1}3h(4U?4Z)(%IrVR&&=Vm|Ne;n{l0~MzUKI%r49?6@UFDaU=ue91?rW_r{86OCLl~+Qvg_2?= zsLoCF(*p^pM+oZ(MjgV;jRGl0^S<2~6SBYB-&CeI5(Y`PeRg9?ol#KW+O7zSYI^^= zjakzJIvzLq;9QY4{oSHF`0*W!^zh>tcYlGu2CCz<1-@|4gI4vmu9aL#XE15M!p6uX zDG|GX{aHUyb34>Qi7LOmzRQxdrS29LlP))T<0h^zriJucP@+-cBO< zoRY0Fxm6J^tA5xF@d=eQDG`1T^R!#xf9gmRFFpYPLkh z=%k+*@V(d+gcq>Ak-OS+>SC+9O+*XPImihzVnB?%cId0(<++IsYnn#wuDcdMFzYxE zOw2-Sus6MH;)+`btRIJ(_7+r8g5Nw@;(<0yYznPI6}55@PavD)hIU07`3T-f%dNb+ z;q{VaNQ|6;Q9eOw$!oMdgySBskp2ypB2hDhAgpKX=ItE9XpeX%TI7f(cOs~uE1F=N znG-ueK82p0mgx?>le#WoW7e4koN3c?1=H?zg`gg1-*vorH!QeL`w`1~burhT^c3+1 zuR}WYYhz(MDzUvOQ^d>V%K;VH4rPpQ#^F&I*Z0HEx4-W1pv=Ti-UKnazhw~jKmF!p zro)&Vv%5*lTRctikO zsXZNasZSXe_c1*b1Vf225%|nsmKHQRKb=S@liy)-0-EF2whFGhnD4E6WUKDmkRDPT zy^{fcHur^TPaEkkp0b2a=F4R@1SBa>LCdyASwR|LuXbXbTif)ShLI>DcdQiO;(qDK zH>qitZ|5>Y?@whjar6(tn2Wt3Qo_XQDYtWi99;B6r9$rACs)*mr15Xd%=X*gA$m&G z@L1;_ubV&Hq~=UsknBG0{3{d)0?+laFyuMp3+00%1FrHBcB^Nt1cJPQuBFm7hmu^) z=JwU;a)Csr`t%a-EfC$wV??HgL2lA{UsuVEX$`~KDwv+WT97v+Aes@1+F?q zod}-B>}n9n{a_?4oYOzfCHzgwdOBzmsjm@rQcrpi=&|h}65)ZX-329UvY$&)Id-5p z6*H_EDRwyN$W+8DBHps>8f{GDak-nHVH%YF32=Y#L$ux`?HqvKH4mE0wPhcGsrOuy zVgo3EZL+Hk=W;!4l)07S3@tCD$knsNJMFuXF~@`NS?uvw3X)%`W>QL1=qpsg<+itZyk0+G0ulSotY0xaatl zWi8u|d&s!S*GCQ4R@d&l96zkc)R(V)gqM@6`BahmR81GxJ)Im4~%F)=l%KPcC!d{Sp}P)d^}~z`0W&K-r|) z#g1Po&}<-y*iDkhU42o;e05E3Tt}?FQmq$%x3l&uWctuVfQ-LktP&rH6{wN$_G%P9 zg)_|Lfy7i`K&5OUXhT|ED8eTEx>*q`U!ru$RGwzV=M|uB?2)`WES`-dc%!gqesE#< zN}dTnRdP*!?Jy6LUTz_-%v^KDPJx?)d|{I{Rx#4pP<}!`nAv{|gD%k!RUg|sT!pO8 ztNuDAJ)u3)=hSIiSC@~_n0?gh)va1x4{vwgmFxs=0JQ&77G@5D*+ljJic|Iiq=Sj^Mhg#8aJ5}wBmaj}|7V0JsMWCMQPL*wbv4+V|T=FD%Xe>~{&}=mlG73S&4+YsNYU+i4sP_oVWz0gg%V?H5x0fZ2 zeUFp3&5TV>u`$r--Zyskv90A!82gf?J>K5{$W!6Yp|K4b4VDh2^iG!f(z9YnwTCAk z!HJhy{?U-iN)pD$gRwc08WetDu6N+A1B2Qnt>#qp``vqpm(r)`uU9bPa*wLY6lw^2 z%#mwBbR$5k^Br!3di+d3MhVFXMuIfE;nrOs<|d77Sb#9w!6#>60;hD{P;+;PKoQ;p zV6k4mb9c02i)2HCunwbK3(SqzVNyI>Nm@;kT7?LKzc6K&*b0t0p?45T_erwxEfvHo2=W*u0Eg*B43^B~CD?-#h&Y8{t^R=Yx^D!45mlf~WaBGWQ3rRb z456G3xLS~S9kHe|4=UDJzx1^K`be0&dNty@+$`gF_`ilIMssQjH)kKs(Z8@geGu1~E;&GzGjX0Ly`S5(X8ul(bQ4ZGf z$G&Fff(JQY>EqkipjAQKb@EN~CB@7+fZ5bq1+jZT{P|^P6PizyKvsX@@|@ltX~MWD zI(W1Uqve7#tBb5CAOR4iV*CJad-dZVI6&!QGA z8~7=B{K)TmrpNT_#>gOQUqVjL;x>@NPd-Aun75l(?22E{v4B-0i!#6KA&Bm8-R-Nh?D007dbd)H zfqXs`JCZArH9I%a@s2*2U1?>RV>5{DFjJivr?rRg9+}PX zPT}2FCJHP6EYaPkV1!4`)qLW|piDkAZeVt~CWTv<`I6NIdFwQpKkl<$~H z0JAdFm>EtQc*u*V6SAC!%`Z-FuSoWY5XBak-{NnHqo_A!OGja5?q}h$(>X2afPrZn6NEUs?`~vpr8?2`Gqn<;3YUJFZ+mW|dC0IOV z(UWlbSprJ0^!rb_;k-lb6>#R8qBAy+?oy!NGiK@J0zFSz_nBB$zt4Vc`tgoBC{ikJ zJW?y3ExAy~sk9+L$--!FAg<~44r4%9K}|-+*tXa+t{5Gf;{bQfBEbk&5U#|7o4Mo2 z&IxZCr2I@Aq(!mho+_=gmB!@aq?NIeXZd)5EH3AkTo-h*r<3S|RgzHSP7&ZxCNI>xGu+!w(MH1fa>(gJ5)3W<52n3`FIQ|-c! zFSI0OpkPlhnUvX~;pgT;KH@G~FsQorEq1ki?Xc>~ouon&3ZUjfkoDvxX@@BOD!n(l zf(;#2B8nVYD+AIi%nuKauw(qZF~uln{z}F^$?*QdHrrPomOr8^&}W*pr%7O5+v}{K$s?6i%8&&9^j4`+2&BnAM-mJ z+w;}&=PM4qd%Ee#L%mdYl=AM62M}w`mb|lMc%qX*d_FFIS8L!2N@{3DtR3YW34S>8 zgb;hskOfn|?#0!Bx|BCXRrN`^KE6Jaj{-+bjFNZM1sAc$qJtRtj6U%VX zwqio_kzeDqm?DU5lonB`-$f>OXgtM1%(=mb+{A33(C^~A-qca?%8-|Y6`2E7n-2Z~G-XO^)>FzyzLITWYwXW!W#e}Bl|8T)PN zPE8k0UpS$S;!6y+5RItekvD)Vy*dn0-{O1P*%3?>#%?NU+-ujq6n?ta7ddC_Qe`hc zzhAq4ss1})(E5WWEPS;jKiC~2_|gM-Y>AWMzbe18Xp^P})jd(QxGDoDbQAKcD2zwm z_DfxqWx{%?Og$2~_d?bFvn9}dyCTZmWVk_XRPqC@)HPXp`?=bE2Bva%wfMhoa@?0Z z7AjsdAnuk+yHujD(nN^xil6Qcqskds1F9=wTp|bjcOe;_kKfk6$jZMq_-D^N(?8GG zSzC-m=lDXi`%kBT>Y*1X0HE|I=7(ta|2aF84bRt^v*xq=$C-$D;pv~zoymyj>kKe^ z4*2%~|CALkfN1$0?H29l9QJ$J{?B;N)VK3><{p9;?$P`FhZc7c`gza#Q;oYo0{}Yz z!2Z(aei3lK%b!BZuU%%)*+NI~4_W2c4*!cna-1JKT!;++8NSCKGQ%&&!oS0Qi4MQ~ zo=5)Yt@76fa5R-?k^j77{(}Cmkaf}B|L3^=1v~fn=Uo5g(eHQI-&6ii^q({47n%$G t56w@f7Zc}C_@7 Date: Mon, 20 Mar 2023 20:01:29 -0600 Subject: [PATCH 28/37] eliminacion de excel --- participantes-7.xlsx | Bin 6691 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 participantes-7.xlsx diff --git a/participantes-7.xlsx b/participantes-7.xlsx deleted file mode 100644 index fb33d275a939c03853f1b99b7b24ea7a25b13aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6691 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 t56w@f7Zc}C_@7 Date: Tue, 21 Mar 2023 14:23:35 -0600 Subject: [PATCH 29/37] El excel ya no se guarda en el servidor --- .env | 20 ++++----- src/eventos/eventos.controller.ts | 3 +- src/eventos/eventos.service.ts | 74 +++++++++++++++++++++++-------- 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/.env b/.env index c8879e3..d989a38 100644 --- a/.env +++ b/.env @@ -1,16 +1,16 @@ PORT=5089 -# DB_HOST=132.248.180.82 -# DB_USER=user_cedetec -# DB_PASSWORD=c3t3d3c -# DB_NAME=Betelgeuse_Cedetec_Prueba -# DB_PORT= + DB_HOST=132.248.180.82 + DB_USER=user_cedetec + DB_PASSWORD=c3t3d3c + DB_NAME=Betelgeuse_Cedetec_Prueba + DB_PORT= - DB_HOST=localhost - DB_USER=root - DB_PASSWORD=Dosmiluno2001 - DB_NAME=cedetec_proyectos - DB_PORT=3306 +# DB_HOST=localhost +# DB_USER=root +# DB_PASSWORD=Dosmiluno2001 +# DB_NAME=cedetec_proyectos +# DB_PORT=3306 DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index c58b340..398b30c 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -50,8 +50,7 @@ export class EventosController { @Get(':id/exportExcel') async exportarExcel (@Param('id', ParseIntPipe)id:number ,@Res() res: Response){ - const filePath = await this.eventoService.exportarParticipantes(id); - res.download(filePath); + this.eventoService.exportarParticipantes(id, res) } @Post('disponibles') diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index ef40c0b..b8bf1ef 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -7,6 +7,7 @@ import { actualizarEventoDto } from './dto/actualizarEvento.dto'; import { crearEventoDto } from './dto/crearEvento.dto'; import { Evento } from './evento.entity'; import * as ExcelJS from 'exceljs'; +import { Response } from 'express'; @Injectable() export class EventosService { @@ -95,27 +96,57 @@ export class EventosService { return participantes; } - async exportarParticipantes(idEvento: number): Promise { + async exportarParticipantes(idEvento: number, res: Response): Promise { const participantes: Participante[] = await this.getParticipantes(idEvento); - /* console.log(participantes); - */ + /*console.log(participantes);*/ + // Crear el workbook y la worksheet const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Participantes'); // Definir las columnas worksheet.columns = [ - { header: 'Asistencia', key: 'asistencia', width: 10, style: {alignment: {horizontal: 'center'}}}, - { header: 'Nombre', key: 'nombre', width: 20, style: {alignment: {horizontal: 'center'}} }, - { header: 'Apellido Paterno', key: 'apellido_paterno', width: 20, style: {alignment: {horizontal: 'center'}} }, - { header: 'Apellido Materno', key: 'apellido_materno', width: 20, style: {alignment: {horizontal: 'center'}} }, - { header: 'Carrera', key: 'carrera', width: 20, style: {alignment: {horizontal: 'center'}} }, - { header: 'Email', key: 'email', width: 35, style: {alignment: {horizontal: 'center'}} }, + { + header: 'Asistencia', + key: 'asistencia', + width: 10, + style: { alignment: { horizontal: 'center' } }, + }, + { + header: 'Nombre', + key: 'nombre', + width: 20, + style: { alignment: { horizontal: 'center' } }, + }, + { + header: 'Apellido Paterno', + key: 'apellido_paterno', + width: 20, + style: { alignment: { horizontal: 'center' } }, + }, + { + header: 'Apellido Materno', + key: 'apellido_materno', + width: 20, + style: { alignment: { horizontal: 'center' } }, + }, + { + header: 'Carrera', + key: 'carrera', + width: 20, + style: { alignment: { horizontal: 'center' } }, + }, + { + header: 'Email', + key: 'email', + width: 35, + style: { alignment: { horizontal: 'center' } }, + }, { header: 'Institución Procedencia', key: 'institucion_procedencia', width: 30, - style: {alignment: {horizontal: 'center'}} + style: { alignment: { horizontal: 'center' } }, }, ]; // Agregar los datos a la worksheet @@ -135,19 +166,24 @@ export class EventosService { // Generar el archivo Excel y guardarlo en el servidor const fileName = `participantes-${idEvento}.xlsx`; - const filePath = `./${fileName}`; -/* await workbook.xlsx.writeFile(filePath); - */ - // Devolver la ruta del archivo para que el cliente pueda descargarlo - return filePath; + // Configurar la respuesta HTTP para descargar el archivo + res.setHeader( + 'Content-Type', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ); + res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`); + + // Escribir el archivo Excel en la respuesta HTTP + const buffer = await workbook.xlsx.writeBuffer(); + res.send(buffer); } - getEventosDisponibles(){ + getEventosDisponibles() { const hoy = new Date(); return this.eventoRepository.find({ where: { - fecha_fin: MoreThanOrEqual(hoy) - } - }) + fecha_fin: MoreThanOrEqual(hoy), + }, + }); } } -- 2.43.0 From 291a2ff75e313f4d0867501c447cc9c3c3c408fd Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 21 Mar 2023 14:38:54 -0600 Subject: [PATCH 30/37] deleted .env --- .env | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index f90c7ad..0000000 --- a/.env +++ /dev/null @@ -1,22 +0,0 @@ -PORT=5089 - -# DB_HOST=132.248.180.82 -# DB_USER=user_cedetec -# DB_PASSWORD=c3t3d3c -# DB_NAME=Betelgeuse_Cedetec_Prueba -# DB_PORT= - - DB_HOST=localhost - DB_USER=root - DB_PASSWORD=password - DB_NAME=cedetec_proyectos - DB_PORT= - -DB_HOST_DSC = 132.248.180.82 -DB_USER_DSC = sites_user -DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat - -NODEMAILER_SERVICE = gmail -NODEMAILER_USER = cidwa1@pcpuma.acatlan.unam.mx -NODEMAILER_PASWORD = cidwaxd1, \ No newline at end of file -- 2.43.0 From e098a52fd8f8313c27ee939773a18aea29c29f0a Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Fri, 24 Mar 2023 15:00:03 -0600 Subject: [PATCH 31/37] =?UTF-8?q?envio=20de=20constancias=20pdf,=20se=20a?= =?UTF-8?q?=C3=B1adio=20banner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 2800 +++++++++++++++++++++- package.json | 11 +- public/1366_2000.jpg | Bin 0 -> 33018 bytes public/cedetec_1.webp | Bin 0 -> 59294 bytes src/app.module.ts | 11 +- src/carousel/carousel.controller.spec.ts | 18 + src/carousel/carousel.controller.ts | 60 + src/carousel/carousel.service.spec.ts | 18 + src/carousel/carousel.service.ts | 9 + src/email/dto/rowInterface.interface.ts | 9 + src/email/email.controller.ts | 27 +- src/email/email.service.ts | 85 +- src/eventos/eventos.controller.ts | 5 + src/eventos/eventos.service.ts | 10 +- src/main.ts | 8 +- 15 files changed, 3002 insertions(+), 69 deletions(-) create mode 100644 public/1366_2000.jpg create mode 100644 public/cedetec_1.webp create mode 100644 src/carousel/carousel.controller.spec.ts create mode 100644 src/carousel/carousel.controller.ts create mode 100644 src/carousel/carousel.service.spec.ts create mode 100644 src/carousel/carousel.service.ts create mode 100644 src/email/dto/rowInterface.interface.ts diff --git a/package-lock.json b/package-lock.json index d67e221..21ca84b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,24 +15,32 @@ "@nestjs/jwt": "^10.0.2", "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", + "@nestjs/serve-static": "^3.0.1", "@nestjs/swagger": "^6.2.1", "@nestjs/typeorm": "^9.0.1", + "@types/multer": "^1.4.7", "bcrypt": "^5.1.0", + "blob-stream": "^0.1.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "exceljs": "^4.3.0", "moment": "^2.29.4", + "multer": "^1.4.5-lts.1", "mysql2": "^3.1.2", "nodemailer": "^6.9.1", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "pdf-lib": "^1.17.1", + "pdfkit": "^0.13.0", "pg": "^8.9.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "swagger-ui-express": "^4.6.1", "sybase": "^1.2.3", - "typeorm": "^0.3.12" + "typeorm": "^0.3.12", + "uuid": "^9.0.0", + "xlsx": "^0.18.5" }, "devDependencies": { "@jridgewell/sourcemap-codec": "^1.4.14", @@ -50,6 +58,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "jest": "29.3.1", + "pdfmake": "^0.2.7", "prettier": "^2.3.2", "source-map-support": "^0.5.20", "supertest": "^6.1.3", @@ -914,6 +923,59 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.38.tgz", "integrity": "sha512-zMRIidN2Huikv/+/U7gRPFYsXDR/7IGqFZzTLnCEj5+gkrQjsowfamaxEnyvArct5hxGA3bTxMXlYhH78V6Cew==" }, + "node_modules/@foliojs-fork/fontkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz", + "integrity": "sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==", + "dev": true, + "dependencies": { + "@foliojs-fork/restructure": "^2.0.2", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz", + "integrity": "sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==", + "dev": true, + "dependencies": { + "base64-js": "1.3.1", + "brfs": "^2.0.2", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak/node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "node_modules/@foliojs-fork/pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==", + "dev": true, + "dependencies": { + "@foliojs-fork/fontkit": "^1.9.1", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.0.0", + "png-js": "^1.0.0" + } + }, + "node_modules/@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "dev": true + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -1598,14 +1660,6 @@ "rxjs": "^6.0.0 || ^7.2.0" } }, - "node_modules/@nestjs/config/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@nestjs/core": { "version": "9.3.7", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.7.tgz", @@ -1703,6 +1757,23 @@ "@nestjs/core": "^9.0.0" } }, + "node_modules/@nestjs/platform-express/node_modules/multer": { + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/@nestjs/schematics": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.0.4.tgz", @@ -1809,6 +1880,37 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/@nestjs/serve-static": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-3.0.1.tgz", + "integrity": "sha512-i766UJPYOqvQ2BbRKh0/+Mmq5NkJnmKcShjWV1i5qpXyeM0KDZTn0n7g7ykWq/3LbQgjpMzrhYtGv35GX7GVQw==", + "dependencies": { + "path-to-regexp": "0.2.5" + }, + "peerDependencies": { + "@fastify/static": "^6.5.0", + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "express": "^4.18.1", + "fastify": "^4.7.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "express": { + "optional": true + }, + "fastify": { + "optional": true + } + } + }, + "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + }, "node_modules/@nestjs/swagger": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.2.1.tgz", @@ -1882,6 +1984,14 @@ "typeorm": "^0.3.0" } }, + "node_modules/@nestjs/typeorm/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1934,6 +2044,22 @@ "npm": ">=5.0.0" } }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "dependencies": { + "pako": "^1.0.10" + } + }, "node_modules/@sinclair/typebox": { "version": "0.25.21", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", @@ -1963,6 +2089,14 @@ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" }, + "node_modules/@swc/helpers": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz", + "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -2032,7 +2166,6 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2042,7 +2175,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -2083,7 +2215,6 @@ "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2095,7 +2226,6 @@ "version": "4.17.33", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2162,8 +2292,15 @@ "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dependencies": { + "@types/express": "*" + } }, "node_modules/@types/node": { "version": "18.11.18", @@ -2215,14 +2352,12 @@ "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/semver": { "version": "7.3.13", @@ -2234,7 +2369,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, "dependencies": { "@types/mime": "*", "@types/node": "*" @@ -2678,6 +2812,38 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -2687,6 +2853,14 @@ "node": ">=0.4.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -2731,6 +2905,16 @@ } } }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -2916,6 +3100,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2931,6 +3121,39 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==", + "dev": true, + "dependencies": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + } + }, + "node_modules/ast-transform/node_modules/esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -2942,6 +3165,17 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-jest": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.2.tgz", @@ -3122,6 +3356,19 @@ "node": ">= 6" } }, + "node_modules/blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha512-YRc9zvVz4wNaxcXmiSgb9LAg7YYwqQ2xd0Sj6osfA7k/PKmIGVlnOYs3wOFdkRC9/JpQu8sGt/zHgJV7xzerfg==" + }, + "node_modules/blob-stream": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/blob-stream/-/blob-stream-0.1.3.tgz", + "integrity": "sha512-xXwyhgVmPsFVFFvtM5P0syI17/oae+MIjLn5jGhuD86mmSJ61EWMWmbPrV/0+bdcH9jQ2CzIhmTQKNUJL7IPog==", + "dependencies": { + "blob": "0.0.4" + } + }, "node_modules/bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", @@ -3184,6 +3431,55 @@ "node": ">=8" } }, + "node_modules/brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "dev": true, + "dependencies": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" + }, + "bin": { + "brfs": "bin/cmd.js" + } + }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==", + "dev": true, + "dependencies": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -3264,6 +3560,15 @@ "node": "*" } }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -3363,6 +3668,18 @@ } ] }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -3619,6 +3936,14 @@ "node": ">= 0.12.0" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -3865,6 +4190,27 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + }, "node_modules/date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", @@ -3904,6 +4250,23 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "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-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3931,6 +4294,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3997,6 +4375,11 @@ "wrappy": "1" } }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -4137,12 +4520,109 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "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", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-set/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4168,6 +4648,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==", + "dev": true, + "dependencies": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.4.0" + }, + "optionalDependencies": { + "source-map": "~0.1.30" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/escodegen/node_modules/esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/eslint": { "version": "8.33.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", @@ -4443,6 +4988,12 @@ "node": ">=4.0" } }, + "node_modules/estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -4460,6 +5011,16 @@ "node": ">= 0.6" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -4512,6 +5073,14 @@ "node": ">=8.17.0" } }, + "node_modules/exceljs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4619,6 +5188,21 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -4821,6 +5405,70 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/fontkit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz", + "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==", + "dependencies": { + "@swc/helpers": "^0.3.13", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "deep-equal": "^2.0.5", + "dfa": "^1.2.0", + "restructure": "^2.0.1", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.3.1", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/fontkit/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fontkit/node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fontkit/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", @@ -4900,6 +5548,14 @@ "node": ">= 0.6" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5009,6 +5665,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -5045,6 +5709,12 @@ "node": ">=6.9.0" } }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5159,6 +5829,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -5181,6 +5862,14 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5189,6 +5878,17 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -5200,6 +5900,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "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", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -5392,6 +6106,19 @@ "node": ">=12.0.0" } }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -5409,12 +6136,51 @@ "node": ">= 0.10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "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-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -5427,6 +6193,32 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -5439,6 +6231,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5486,6 +6292,14 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5495,6 +6309,20 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -5509,6 +6337,40 @@ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "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-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -5521,6 +6383,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "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", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -5533,6 +6441,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6424,6 +7352,23 @@ "immediate": "~3.0.5" } }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -6657,6 +7602,24 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6812,9 +7775,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -6926,6 +7889,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -7046,6 +8015,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "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", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -7371,6 +8380,60 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-AW79eHU5eLd2vgRDS9z3bSoi0FA+gYm+100LLosrQQMLUzOBGVOhG7ABcMFpJu7Bpg+MT74XYHi4k9EuU/9EZw==", + "dependencies": { + "crypto-js": "^4.0.0", + "fontkit": "^1.8.1", + "linebreak": "^1.0.2", + "png-js": "^1.0.0" + } + }, + "node_modules/pdfmake": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.7.tgz", + "integrity": "sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==", + "dev": true, + "dependencies": { + "@foliojs-fork/linebreak": "^1.1.1", + "@foliojs-fork/pdfkit": "^0.13.0", + "iconv-lite": "^0.6.3", + "xmldoc": "^1.1.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pdfmake/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pg": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", @@ -7545,6 +8608,11 @@ "node": ">=4" } }, + "node_modules/png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -7725,6 +8793,20 @@ } ] }, + "node_modules/quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "dev": true, + "dependencies": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "bin": { + "quote-stream": "bin/cmd.js" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7837,6 +8919,22 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -7935,6 +9033,11 @@ "node": ">=8" } }, + "node_modules/restructure": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz", + "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8088,6 +9191,21 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "dev": true, + "dependencies": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, "node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -8214,6 +9332,12 @@ "sha.js": "bin.js" } }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8342,6 +9466,17 @@ "node": ">= 0.6" } }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -8363,6 +9498,218 @@ "node": ">=8" } }, + "node_modules/static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "dev": true, + "dependencies": { + "escodegen": "^1.11.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "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/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" + } + }, + "node_modules/static-module/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/static-module/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-module/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-module/node_modules/magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.1" + } + }, + "node_modules/static-module/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "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/static-module/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-module/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-module/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -8371,6 +9718,17 @@ "node": ">= 0.8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -8764,6 +10122,21 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9024,6 +10397,12 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9255,14 +10634,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/typeorm/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -9287,6 +10658,29 @@ "node": ">=8" } }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -9370,9 +10764,9 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } @@ -9544,6 +10938,54 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "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-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -9614,6 +11056,22 @@ "node": ">=8.12.0" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -9657,6 +11115,26 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -9682,6 +11160,15 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "node_modules/xmldoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", + "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", + "dev": true, + "dependencies": { + "sax": "^1.2.4" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -10457,6 +11944,61 @@ } } }, + "@foliojs-fork/fontkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz", + "integrity": "sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==", + "dev": true, + "requires": { + "@foliojs-fork/restructure": "^2.0.2", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "@foliojs-fork/linebreak": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz", + "integrity": "sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==", + "dev": true, + "requires": { + "base64-js": "1.3.1", + "brfs": "^2.0.2", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + } + } + }, + "@foliojs-fork/pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==", + "dev": true, + "requires": { + "@foliojs-fork/fontkit": "^1.9.1", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.0.0", + "png-js": "^1.0.0" + } + }, + "@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -10972,13 +12514,6 @@ "dotenv-expand": "10.0.0", "lodash": "4.17.21", "uuid": "9.0.0" - }, - "dependencies": { - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - } } }, "@nestjs/core": { @@ -11025,6 +12560,22 @@ "express": "4.18.2", "multer": "1.4.4-lts.1", "tslib": "2.5.0" + }, + "dependencies": { + "multer": { + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + } } }, "@nestjs/schematics": { @@ -11104,6 +12655,21 @@ } } }, + "@nestjs/serve-static": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-3.0.1.tgz", + "integrity": "sha512-i766UJPYOqvQ2BbRKh0/+Mmq5NkJnmKcShjWV1i5qpXyeM0KDZTn0n7g7ykWq/3LbQgjpMzrhYtGv35GX7GVQw==", + "requires": { + "path-to-regexp": "0.2.5" + }, + "dependencies": { + "path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + } + } + }, "@nestjs/swagger": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.2.1.tgz", @@ -11131,6 +12697,13 @@ "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", "requires": { "uuid": "8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } } }, "@nodelib/fs.scandir": { @@ -11169,6 +12742,22 @@ "node-fetch": "^2.6.1" } }, + "@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "requires": { + "pako": "^1.0.6" + } + }, + "@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "requires": { + "pako": "^1.0.10" + } + }, "@sinclair/typebox": { "version": "0.25.21", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", @@ -11198,6 +12787,14 @@ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" }, + "@swc/helpers": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz", + "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==", + "requires": { + "tslib": "^2.4.0" + } + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -11267,7 +12864,6 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -11277,7 +12873,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -11318,7 +12913,6 @@ "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -11330,7 +12924,6 @@ "version": "4.17.33", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -11397,8 +12990,15 @@ "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "requires": { + "@types/express": "*" + } }, "@types/node": { "version": "18.11.18", @@ -11450,14 +13050,12 @@ "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/semver": { "version": "7.3.13", @@ -11469,7 +13067,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, "requires": { "@types/mime": "*", "@types/node": "*" @@ -11811,12 +13408,42 @@ "dev": true, "requires": {} }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } + } + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true }, + "adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -11846,6 +13473,13 @@ "ajv": "^8.0.0" } }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true + }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -11992,6 +13626,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -12004,6 +13644,31 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==", + "dev": true, + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true + } + } + }, + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==", + "dev": true + }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -12015,6 +13680,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, "babel-jest": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.2.tgz", @@ -12146,6 +13816,19 @@ } } }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha512-YRc9zvVz4wNaxcXmiSgb9LAg7YYwqQ2xd0Sj6osfA7k/PKmIGVlnOYs3wOFdkRC9/JpQu8sGt/zHgJV7xzerfg==" + }, + "blob-stream": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/blob-stream/-/blob-stream-0.1.3.tgz", + "integrity": "sha512-xXwyhgVmPsFVFFvtM5P0syI17/oae+MIjLn5jGhuD86mmSJ61EWMWmbPrV/0+bdcH9jQ2CzIhmTQKNUJL7IPog==", + "requires": { + "blob": "0.0.4" + } + }, "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", @@ -12203,6 +13886,54 @@ "fill-range": "^7.0.1" } }, + "brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "dev": true, + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" + } + }, + "brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "requires": { + "base64-js": "^1.1.2" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + } + } + }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==", + "dev": true, + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -12247,6 +13978,12 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "dev": true + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -12312,6 +14049,15 @@ "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", "dev": true }, + "cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "requires": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + } + }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -12492,6 +14238,11 @@ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, + "codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -12691,6 +14442,27 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + }, "date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", @@ -12715,6 +14487,20 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "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" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -12736,6 +14522,15 @@ "clone": "^1.0.2" } }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12783,6 +14578,11 @@ "wrappy": "1" } }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -12893,12 +14693,103 @@ "is-arrayish": "^0.2.1" } }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -12915,6 +14806,48 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==", + "dev": true, + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==", + "dev": true + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "eslint": { "version": "8.33.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", @@ -13113,6 +15046,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -13124,6 +15063,16 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -13163,6 +15112,11 @@ "requires": { "rimraf": "^3.0.0" } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, @@ -13260,6 +15214,23 @@ } } }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -13430,6 +15401,66 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "fontkit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz", + "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==", + "requires": { + "@swc/helpers": "^0.3.13", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "deep-equal": "^2.0.5", + "dfa": "^1.2.0", + "restructure": "^2.0.1", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.3.1", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", @@ -13491,6 +15522,11 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -13579,6 +15615,11 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, "gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -13609,6 +15650,12 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -13687,6 +15734,14 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -13706,16 +15761,37 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -13852,6 +15928,16 @@ "wrap-ansi": "^7.0.0" } }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -13863,12 +15949,39 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -13878,6 +15991,20 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -13887,6 +16014,14 @@ "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -13919,12 +16054,25 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -13936,18 +16084,82 @@ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -14643,6 +16855,22 @@ "immediate": "~3.0.5" } }, + "linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "requires": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==" + } + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -14839,6 +17067,23 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -14951,9 +17196,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", "requires": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -15048,6 +17293,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -15136,6 +17387,31 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -15377,6 +17653,58 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "requires": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-AW79eHU5eLd2vgRDS9z3bSoi0FA+gYm+100LLosrQQMLUzOBGVOhG7ABcMFpJu7Bpg+MT74XYHi4k9EuU/9EZw==", + "requires": { + "crypto-js": "^4.0.0", + "fontkit": "^1.8.1", + "linebreak": "^1.0.2", + "png-js": "^1.0.0" + } + }, + "pdfmake": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.7.tgz", + "integrity": "sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==", + "dev": true, + "requires": { + "@foliojs-fork/linebreak": "^1.1.1", + "@foliojs-fork/pdfkit": "^0.13.0", + "iconv-lite": "^0.6.3", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "pg": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", @@ -15504,6 +17832,11 @@ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, "postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -15621,6 +17954,17 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -15722,6 +18066,16 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -15789,6 +18143,11 @@ "signal-exit": "^3.0.2" } }, + "restructure": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz", + "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -15887,6 +18246,21 @@ } } }, + "scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "dev": true, + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -16001,6 +18375,12 @@ "safe-buffer": "^5.0.1" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -16100,6 +18480,14 @@ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "requires": { + "frac": "~1.1.2" + } + }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -16117,11 +18505,187 @@ } } }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "dev": true, + "requires": { + "escodegen": "^1.11.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -16413,6 +18977,21 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -16584,6 +19163,12 @@ } } }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16684,11 +19269,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==" - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" } } }, @@ -16706,6 +19286,31 @@ "@lukeed/csprng": "^1.0.0" } }, + "unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + } + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -16764,9 +19369,9 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -16898,6 +19503,42 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "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" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -16949,6 +19590,16 @@ } } }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -16980,6 +19631,20 @@ "signal-exit": "^3.0.7" } }, + "xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "requires": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -16999,6 +19664,15 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmldoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", + "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", + "dev": true, + "requires": { + "sax": "^1.2.4" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 37af02d..d3d3bd6 100644 --- a/package.json +++ b/package.json @@ -26,24 +26,32 @@ "@nestjs/jwt": "^10.0.2", "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", + "@nestjs/serve-static": "^3.0.1", "@nestjs/swagger": "^6.2.1", "@nestjs/typeorm": "^9.0.1", + "@types/multer": "^1.4.7", "bcrypt": "^5.1.0", + "blob-stream": "^0.1.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "exceljs": "^4.3.0", "moment": "^2.29.4", + "multer": "^1.4.5-lts.1", "mysql2": "^3.1.2", "nodemailer": "^6.9.1", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "pdf-lib": "^1.17.1", + "pdfkit": "^0.13.0", "pg": "^8.9.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "swagger-ui-express": "^4.6.1", "sybase": "^1.2.3", - "typeorm": "^0.3.12" + "typeorm": "^0.3.12", + "uuid": "^9.0.0", + "xlsx": "^0.18.5" }, "devDependencies": { "@jridgewell/sourcemap-codec": "^1.4.14", @@ -61,6 +69,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "jest": "29.3.1", + "pdfmake": "^0.2.7", "prettier": "^2.3.2", "source-map-support": "^0.5.20", "supertest": "^6.1.3", diff --git a/public/1366_2000.jpg b/public/1366_2000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0dde5efbb28842c8eef5777d6e8465ee327ec302 GIT binary patch literal 33018 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 z

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 literal 0 HcmV?d00001 diff --git a/src/app.module.ts b/src/app.module.ts index 99abe42..2ca6c5c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -45,6 +45,11 @@ import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; import { EmailService } from './email/email.service'; import { EmailController } from './email/email.controller'; import { EmailModule } from './email/email.module'; +import { MulterModule } from '@nestjs/platform-express'; +import { CarouselController } from './carousel/carousel.controller'; +import { CarouselService } from './carousel/carousel.service'; +import { ServeStaticModule } from '@nestjs/serve-static'; +import { join } from 'path'; @Module({ imports: [ @@ -106,13 +111,17 @@ import { EmailModule } from './email/email.module'; ProyectoActividadModule, ActividadModule, EmailModule, + MulterModule.register({ + dest: './uploads', // directorio de destino para guardar los archivos cargados + }), ], controllers: [ AppController, ParticipanteController, InscripcionStatusController, + CarouselController, ], - providers: [AppService, InscripcionStatusService], + providers: [AppService, InscripcionStatusService, CarouselService], }) export class AppModule { static port: number; diff --git a/src/carousel/carousel.controller.spec.ts b/src/carousel/carousel.controller.spec.ts new file mode 100644 index 0000000..8a06408 --- /dev/null +++ b/src/carousel/carousel.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CarouselController } from './carousel.controller'; + +describe('CarouselController', () => { + let controller: CarouselController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [CarouselController], + }).compile(); + + controller = module.get(CarouselController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/carousel/carousel.controller.ts b/src/carousel/carousel.controller.ts new file mode 100644 index 0000000..ce22973 --- /dev/null +++ b/src/carousel/carousel.controller.ts @@ -0,0 +1,60 @@ +import { + Controller, + Delete, + Get, + HttpException, + HttpStatus, + Param, + Post, + Res, + UploadedFile, + UseInterceptors, +} from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { Response } from 'express'; +import * as fs from 'fs'; +import { diskStorage } from 'multer'; +import * as path from 'path'; + +@Controller('carousel') +export class CarouselController { + private images: string[] = []; + + @Post('/imagenes') + @UseInterceptors( + FileInterceptor('file', { + storage: diskStorage({ + destination: './public', + filename: function (req, file, cb) { + cb(null, file.originalname); + }, + }), + }), + ) + async addImage(@UploadedFile() file) { + return {msg: 'Imagen guardada con exito :)'} + } + + @Delete('/imagenes/:nombreArchivo') + async deleteImage(@Param('nombreArchivo') nombreArchivo: string) { + try { + await fs.promises.unlink(`./public/${nombreArchivo}`); + return { message: 'Imagen eliminada exitosamente' }; + } catch (err) { + throw new Error('Error al eliminar la imagen'); + } + } + + @Get('/imagenes') + async getImages(@Res() res: Response) { + // Leer el directorio 'public' para obtener el nombre de todos los archivos + const fileNames = await fs.promises.readdir('./public'); + // Generar la URL para cada archivo y agregarla a un arreglo + const baseUrl = 'http://localhost:5089'; // reemplaza con la URL de tu servidor + const imageUrls = fileNames.map( + (fileName) => `${baseUrl}/public/${fileName}`, + ); + // Devolver el arreglo de URLs como respuesta + return res.json(imageUrls); + } +} diff --git a/src/carousel/carousel.service.spec.ts b/src/carousel/carousel.service.spec.ts new file mode 100644 index 0000000..56b5090 --- /dev/null +++ b/src/carousel/carousel.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CarouselService } from './carousel.service'; + +describe('CarouselService', () => { + let service: CarouselService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [CarouselService], + }).compile(); + + service = module.get(CarouselService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/carousel/carousel.service.ts b/src/carousel/carousel.service.ts new file mode 100644 index 0000000..b7c996a --- /dev/null +++ b/src/carousel/carousel.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class CarouselService { + + uploadImage(file){ + console.log(file) + } +} diff --git a/src/email/dto/rowInterface.interface.ts b/src/email/dto/rowInterface.interface.ts new file mode 100644 index 0000000..e83f5f9 --- /dev/null +++ b/src/email/dto/rowInterface.interface.ts @@ -0,0 +1,9 @@ +interface Row { + Asistencia: number + Nombre: string + 'Apellido Paterno': string + 'Apellido Materno': string + Carrera: string + 'Institución Procedencia': string + Email: string +} \ No newline at end of file diff --git a/src/email/email.controller.ts b/src/email/email.controller.ts index 1593154..78b49b0 100644 --- a/src/email/email.controller.ts +++ b/src/email/email.controller.ts @@ -1,6 +1,21 @@ -import { Body, Controller, Param, ParseIntPipe, Post } from '@nestjs/common'; +import { + Body, + Controller, + HttpException, + HttpStatus, + Param, + ParseIntPipe, + Post, + Res, + UploadedFile, + UseInterceptors, +} from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; import { EmailDto } from './dto/emailDto.dto'; import { EmailService } from './email.service'; +import { Response } from 'express'; +import * as xlsx from 'xlsx'; + @Controller('email') export class EmailController { @@ -13,4 +28,14 @@ export class EmailController { ): Promise { return this.emailService.sendEmail(id, emailDto); } + + @Post('constancias') + @UseInterceptors(FileInterceptor('file')) + async sendConstancias(@UploadedFile() file, @Body('nombreEvento') nombreEvento: string,) { + if(!file) { + throw new HttpException("No se ha cargado ningun archivo", HttpStatus.BAD_REQUEST) + } + console.log(file) + return this.emailService.sendConstancias(file, nombreEvento); + } } diff --git a/src/email/email.service.ts b/src/email/email.service.ts index f8a7852..e2363d9 100644 --- a/src/email/email.service.ts +++ b/src/email/email.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Inject, Injectable, Res, UploadedFile } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { InjectRepository } from '@nestjs/typeorm'; import * as nodemailer from 'nodemailer'; @@ -6,6 +6,13 @@ import { EventosService } from 'src/eventos/eventos.service'; import { Participante } from 'src/participante/participante.entity'; import { Repository } from 'typeorm'; import { EmailDto } from './dto/emailDto.dto'; +import * as xlsx from 'xlsx'; +import * as pdfMake from 'pdfmake/build/pdfmake'; +import * as pdfFonts from 'pdfmake/build/vfs_fonts'; +/* import * as PDFDocument from 'pdfkit'; */ +import * as fs from 'fs'; +import * as path from 'path'; +import { PDFDocument, StandardFonts, rgb } from 'pdf-lib'; @Injectable() export class EmailService { @@ -49,4 +56,80 @@ export class EmailService { return participantes; } + + async sendConstancias(file, nombreEvento) { + console.log(file) + const workbook = xlsx.read(file.buffer); + const worksheet = workbook.Sheets[workbook.SheetNames[0]]; + const data = xlsx.utils.sheet_to_json(worksheet); + + for (const row of data as Row[]) { + const pdfDoc = await PDFDocument.create(); + const page = pdfDoc.addPage(); + page.setSize(792, 612); + + page.drawRectangle({ + x: 0, + y: page.getHeight() - 60, + width: page.getWidth(), + height: 60, + color: rgb(0 / 255, 61 / 255, 121 / 255), + }); + + page.drawRectangle({ + x: 0, + y: 0, + width: page.getWidth(), + height: 60, + color: rgb(213 / 255, 159 / 255, 15 / 255), + }); + + const font = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + const fontSize = 30; + const text = 'Constancia de asistencia'; + const textWidth = font.widthOfTextAtSize(text, fontSize); + const textHeight = font.heightAtSize(fontSize); + + page.drawText(text, { + x: (page.getWidth() - textWidth) / 2, + y: (page.getHeight() - textHeight) / 2, + size: fontSize, + font: font, + color: rgb(0/255, 0/255, 0/255), + }); + + const { width, height } = page.getSize(); + page.drawText( + `Se le otorga la constancia por su asistencia al evento: ${nombreEvento}`, + { + x: 50, + y: height - 50, + size: 12, + font: await pdfDoc.embedFont('Helvetica'), + }, + ); + page.drawText( + `A ${row['Apellido Paterno']} ${row['Apellido Materno']} ${row.Nombre}`, + { + x: 50, + y: height - 80, + size: 12, + font: await pdfDoc.embedFont('Helvetica'), + }, + ); + const pdfBytes = await pdfDoc.save(); + const attachment = { + filename: `Constancia ${nombreEvento} - ${row.Nombre}_${row['Apellido Paterno']}.pdf`, + content: pdfBytes, + }; + /* const blob = new Blob([pdfBytes], { type: 'application/pdf' }); + const url = URL.createObjectURL(blob); */ + this.transporter.sendMail({ + to: row.Email, + subject: 'Constancia de asistencia', + text: 'Hola', + attachments: [attachment], + }); + } + } } diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index 398b30c..858b073 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -58,4 +58,9 @@ export class EventosController { return this.eventoService.getEventosDisponibles() } + @Post('disponibles/pendientesDconstancia') + getEventosDisponiblesPendientes(){ + return this.eventoService.geteventosDisponiblesMasDosDias() + } + } diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index b8bf1ef..dd41556 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; import { Participante } from 'src/participante/participante.entity'; -import { MoreThanOrEqual, Repository } from 'typeorm'; +import { Between, MoreThanOrEqual, Repository } from 'typeorm'; import { actualizarEventoDto } from './dto/actualizarEvento.dto'; import { crearEventoDto } from './dto/crearEvento.dto'; import { Evento } from './evento.entity'; @@ -186,4 +186,12 @@ export class EventosService { }, }); } + + geteventosDisponiblesMasDosDias(){ + const hoy = new Date(); + return this.eventoRepository.createQueryBuilder("evento") + .where(`DATE_ADD(evento.fecha_fin, INTERVAL 2 DAY) >= :hoy`, { hoy }) + .andWhere('fecha_fin <= :hoy', {hoy}) + .getMany(); + } } diff --git a/src/main.ts b/src/main.ts index 2837580..708d899 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,11 @@ import { NestFactory } from '@nestjs/core'; +import { NestExpressApplication } from '@nestjs/platform-express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { join } from 'path'; import { AppModule } from './app.module'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule); const config = new DocumentBuilder() .addBearerAuth() @@ -14,6 +16,10 @@ async function bootstrap() { const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('api', app, document); + app.useStaticAssets(join(__dirname, '..', 'public'), { + prefix: '/public/', + }); + app.enableCors(); await app.listen(AppModule.port); } -- 2.43.0 From 7a712928bdfee631fea470a11088a983580c5bfc Mon Sep 17 00:00:00 2001 From: JorgeMike <119615322+JorgeMike@users.noreply.github.com> Date: Sun, 26 Mar 2023 19:16:06 -0600 Subject: [PATCH 32/37] the banner edit is ready and name of participant its getting update in eache event --- .env | 20 ++++----- public/1366_2000.jpg | Bin 33018 -> 0 bytes public/cedetec_1.webp | Bin 59294 -> 0 bytes public/index.html | 0 src/app.module.ts | 4 ++ src/carousel/carousel.controller.ts | 42 +++++++++++++++--- src/carousel/carousel.service.ts | 2 +- src/email/email.controller.ts | 2 +- src/email/email.service.ts | 22 ++------- .../evento-participante.service.ts | 19 ++++++-- src/eventos/eventos.service.ts | 4 +- 11 files changed, 74 insertions(+), 41 deletions(-) delete mode 100644 public/1366_2000.jpg delete mode 100644 public/cedetec_1.webp create mode 100644 public/index.html diff --git a/.env b/.env index d989a38..c8879e3 100644 --- a/.env +++ b/.env @@ -1,16 +1,16 @@ PORT=5089 - DB_HOST=132.248.180.82 - DB_USER=user_cedetec - DB_PASSWORD=c3t3d3c - DB_NAME=Betelgeuse_Cedetec_Prueba - DB_PORT= +# DB_HOST=132.248.180.82 +# DB_USER=user_cedetec +# DB_PASSWORD=c3t3d3c +# DB_NAME=Betelgeuse_Cedetec_Prueba +# DB_PORT= -# DB_HOST=localhost -# DB_USER=root -# DB_PASSWORD=Dosmiluno2001 -# DB_NAME=cedetec_proyectos -# DB_PORT=3306 + DB_HOST=localhost + DB_USER=root + DB_PASSWORD=Dosmiluno2001 + DB_NAME=cedetec_proyectos + DB_PORT=3306 DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user diff --git a/public/1366_2000.jpg b/public/1366_2000.jpg deleted file mode 100644 index 0dde5efbb28842c8eef5777d6e8465ee327ec302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33018 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 z

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 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..e69de29 diff --git a/src/app.module.ts b/src/app.module.ts index 2ca6c5c..e89639a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -53,6 +53,10 @@ import { join } from 'path'; @Module({ imports: [ + ServeStaticModule.forRoot({ + rootPath: join(__dirname, '..', 'public'), + exclude: ['/api*'], // Excluir la ruta "/api" de servir archivos estáticos + }), ConfigModule.forRoot({ envFilePath: '.env', isGlobal: true, diff --git a/src/carousel/carousel.controller.ts b/src/carousel/carousel.controller.ts index ce22973..3f670d0 100644 --- a/src/carousel/carousel.controller.ts +++ b/src/carousel/carousel.controller.ts @@ -1,4 +1,5 @@ import { + BadRequestException, Controller, Delete, Get, @@ -26,13 +27,40 @@ export class CarouselController { storage: diskStorage({ destination: './public', filename: function (req, file, cb) { - cb(null, file.originalname); + const directory = './public'; + const filePath = `${directory}/${file.originalname}`; + if (fs.existsSync(filePath)) { + cb( + new BadRequestException( + `Ya existe un archivo con el nombre: '${file.originalname}'. Si está seguro de que no es el mismo, cambie el nombre del archivo.`, + ), + null, + ); + } else { + cb(null, file.originalname); + } }, }), + fileFilter: function (req, file, cb) { + const filetypes = /jpeg|jpg|webp|png/; + const extname = filetypes.test( + path.extname(file.originalname).toLowerCase(), + ); + const mimetype = filetypes.test(file.mimetype); + if (mimetype && extname) { + return cb(null, true); + } + cb( + new BadRequestException( + 'Lo sentimos, para mejorar la calidad de las imagenes en el carousel solo se aceptan imagenes con terminación: .jpeg .jpg .png .webp', + ), + false, + ); + }, }), ) async addImage(@UploadedFile() file) { - return {msg: 'Imagen guardada con exito :)'} + return { msg: 'Imagen guardada con exito :)' }; } @Delete('/imagenes/:nombreArchivo') @@ -48,12 +76,16 @@ export class CarouselController { @Get('/imagenes') async getImages(@Res() res: Response) { // Leer el directorio 'public' para obtener el nombre de todos los archivos + const fileNames = await fs.promises.readdir('./public'); // Generar la URL para cada archivo y agregarla a un arreglo - const baseUrl = 'http://localhost:5089'; // reemplaza con la URL de tu servidor - const imageUrls = fileNames.map( - (fileName) => `${baseUrl}/public/${fileName}`, + + // Filtrar solo las imágenes con las terminaciones "jpg", "webp" y "png" + const imageNames = fileNames.filter((fileName) => + ['.jpg', '.webp', '.png'].includes(path.extname(fileName)), ); + + const imageUrls = imageNames.map((imageName) => `public/${imageName}`); // Devolver el arreglo de URLs como respuesta return res.json(imageUrls); } diff --git a/src/carousel/carousel.service.ts b/src/carousel/carousel.service.ts index b7c996a..a6c6fbb 100644 --- a/src/carousel/carousel.service.ts +++ b/src/carousel/carousel.service.ts @@ -4,6 +4,6 @@ import { Injectable } from '@nestjs/common'; export class CarouselService { uploadImage(file){ - console.log(file) + /* console.log(file) */ } } diff --git a/src/email/email.controller.ts b/src/email/email.controller.ts index 78b49b0..d958447 100644 --- a/src/email/email.controller.ts +++ b/src/email/email.controller.ts @@ -35,7 +35,7 @@ export class EmailController { if(!file) { throw new HttpException("No se ha cargado ningun archivo", HttpStatus.BAD_REQUEST) } - console.log(file) + /* console.log(file) */ return this.emailService.sendConstancias(file, nombreEvento); } } diff --git a/src/email/email.service.ts b/src/email/email.service.ts index e2363d9..3ec96e4 100644 --- a/src/email/email.service.ts +++ b/src/email/email.service.ts @@ -58,7 +58,7 @@ export class EmailService { } async sendConstancias(file, nombreEvento) { - console.log(file) + /* console.log(file) */ const workbook = xlsx.read(file.buffer); const worksheet = workbook.Sheets[workbook.SheetNames[0]]; const data = xlsx.utils.sheet_to_json(worksheet); @@ -68,22 +68,6 @@ export class EmailService { const page = pdfDoc.addPage(); page.setSize(792, 612); - page.drawRectangle({ - x: 0, - y: page.getHeight() - 60, - width: page.getWidth(), - height: 60, - color: rgb(0 / 255, 61 / 255, 121 / 255), - }); - - page.drawRectangle({ - x: 0, - y: 0, - width: page.getWidth(), - height: 60, - color: rgb(213 / 255, 159 / 255, 15 / 255), - }); - const font = await pdfDoc.embedFont(StandardFonts.HelveticaBold); const fontSize = 30; const text = 'Constancia de asistencia'; @@ -126,8 +110,8 @@ export class EmailService { const url = URL.createObjectURL(blob); */ this.transporter.sendMail({ to: row.Email, - subject: 'Constancia de asistencia', - text: 'Hola', + subject: `Constancia de asistencia a "${nombreEvento}"`, + text: `¡Un saludo ${row.Nombre}! Aquí está tu constancia de asistencia por el evento "${nombreEvento}". Agradecemos tu asistencia y constancia, esperamos seguir viéndote en eventos futuros.`, attachments: [attachment], }); } diff --git a/src/evento-participante/evento-participante/evento-participante.service.ts b/src/evento-participante/evento-participante/evento-participante.service.ts index 327d555..c6be9a1 100644 --- a/src/evento-participante/evento-participante/evento-participante.service.ts +++ b/src/evento-participante/evento-participante/evento-participante.service.ts @@ -46,12 +46,25 @@ export class EventoParticipanteService { id_evento: number, registrarParticipanteDto: RegistrarParticipanteDto, ) { -/* console.log(id_evento); - console.log(registrarParticipanteDto); */ return this.participanteExiste(registrarParticipanteDto.email).then( (res) => { if (res) { - this.registrarEnEvento(id_evento, res); + + res.nombre = registrarParticipanteDto.nombre; + res.apellido_paterno = registrarParticipanteDto.apellido_paterno; + res.apellido_materno = registrarParticipanteDto.apellido_materno; + res.carrera = registrarParticipanteDto.carrera; + res.institucion_procedencia = + registrarParticipanteDto.institucion_procedencia; + +//si el correo ya existe en la base de datos solo se le cambia el nombre, apellidos, carrera e institucion + + return this.participanteRepository + .save(res) + .then((participanteActualizado) => { + this.registrarEnEvento(id_evento, participanteActualizado); + return participanteActualizado; + }); } else { this.participanteRepository .save(this.participanteRepository.create(registrarParticipanteDto)) diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index dd41556..e322a52 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -162,7 +162,7 @@ export class EventosService { }); }); - console.log(workbook.description); + /* console.log(workbook.description); */ // Generar el archivo Excel y guardarlo en el servidor const fileName = `participantes-${idEvento}.xlsx`; @@ -190,7 +190,7 @@ export class EventosService { geteventosDisponiblesMasDosDias(){ const hoy = new Date(); return this.eventoRepository.createQueryBuilder("evento") - .where(`DATE_ADD(evento.fecha_fin, INTERVAL 2 DAY) >= :hoy`, { hoy }) + .where(`DATE_ADD(evento.fecha_fin, INTERVAL 3 DAY) >= :hoy`, { hoy }) .andWhere('fecha_fin <= :hoy', {hoy}) .getMany(); } -- 2.43.0 From 537ef3484f4c6261411fd3e909f597132791837e Mon Sep 17 00:00:00 2001 From: JorgeMike <119615322+JorgeMike@users.noreply.github.com> Date: Mon, 27 Mar 2023 09:24:45 -0600 Subject: [PATCH 33/37] .env removed --- .env | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index c8879e3..0000000 --- a/.env +++ /dev/null @@ -1,22 +0,0 @@ -PORT=5089 - -# DB_HOST=132.248.180.82 -# DB_USER=user_cedetec -# DB_PASSWORD=c3t3d3c -# DB_NAME=Betelgeuse_Cedetec_Prueba -# DB_PORT= - - DB_HOST=localhost - DB_USER=root - DB_PASSWORD=Dosmiluno2001 - DB_NAME=cedetec_proyectos - DB_PORT=3306 - -DB_HOST_DSC = 132.248.180.82 -DB_USER_DSC = sites_user -DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat - -NODEMAILER_SERVICE = gmail -NODEMAILER_USER = cidwa1@pcpuma.acatlan.unam.mx -NODEMAILER_PASWORD = cidwaxd1, \ No newline at end of file -- 2.43.0 From 42652f4fc18a30d3861f6857dac5259f4a75b5c3 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Wed, 3 May 2023 13:52:09 -0600 Subject: [PATCH 34/37] ya se ejecuta el query correcto --- src/inscripcion-dsc/inscripcion-dsc.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inscripcion-dsc/inscripcion-dsc.service.ts b/src/inscripcion-dsc/inscripcion-dsc.service.ts index 4f17f90..1d71e6b 100644 --- a/src/inscripcion-dsc/inscripcion-dsc.service.ts +++ b/src/inscripcion-dsc/inscripcion-dsc.service.ts @@ -44,7 +44,7 @@ export class InscripcionDscService { const qryEjemplo = `select platica from alumno_inscrito WHERE id_cuenta="${accountNumber}"`; - const [results] = await connection.query(qryEjemplo); + const [results] = await connection.query(userInformationQuery); const resultsArray = JSON.parse(JSON.stringify(results)); if (resultsArray.length === 0) return null; /* console.log('The solution is: ', resultsArray); */ -- 2.43.0 From 0a70bf2af2b6bc6b5531a7652ea2eb151acf77f7 Mon Sep 17 00:00:00 2001 From: JorgeMike Date: Tue, 6 Jun 2023 14:07:49 -0600 Subject: [PATCH 35/37] Se puede agregar links al carrusel --- public/carrusel/carrusel2.jpg | Bin 0 -> 189514 bytes src/app.module.ts | 5 ++ src/carousel/carousel.controller.spec.ts | 18 ------ src/carousel/carousel.service.spec.ts | 18 ------ src/carrusel/carrusel.controller.ts | 70 +++++++++++++++++++++++ src/carrusel/carrusel.module.ts | 12 ++++ src/carrusel/carrusel.service.ts | 59 +++++++++++++++++++ src/carrusel/dto/carruselDto.dto.ts | 9 +++ src/carrusel/utils.ts | 5 ++ src/entities/carrusel.entity.ts | 15 +++++ 10 files changed, 175 insertions(+), 36 deletions(-) create mode 100644 public/carrusel/carrusel2.jpg delete mode 100644 src/carousel/carousel.controller.spec.ts delete mode 100644 src/carousel/carousel.service.spec.ts create mode 100644 src/carrusel/carrusel.controller.ts create mode 100644 src/carrusel/carrusel.module.ts create mode 100644 src/carrusel/carrusel.service.ts create mode 100644 src/carrusel/dto/carruselDto.dto.ts create mode 100644 src/carrusel/utils.ts create mode 100644 src/entities/carrusel.entity.ts diff --git a/public/carrusel/carrusel2.jpg b/public/carrusel/carrusel2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0ca0deb7576fff72207b772ff6e4fb685368a53 GIT binary patch literal 189514 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ⅈUb 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 ygc10_Bw6WhUb*>h+HkRVy;^ { - let controller: CarouselController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [CarouselController], - }).compile(); - - controller = module.get(CarouselController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/carousel/carousel.service.spec.ts b/src/carousel/carousel.service.spec.ts deleted file mode 100644 index 56b5090..0000000 --- a/src/carousel/carousel.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CarouselService } from './carousel.service'; - -describe('CarouselService', () => { - let service: CarouselService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [CarouselService], - }).compile(); - - service = module.get(CarouselService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/carrusel/carrusel.controller.ts b/src/carrusel/carrusel.controller.ts new file mode 100644 index 0000000..26e8b0b --- /dev/null +++ b/src/carrusel/carrusel.controller.ts @@ -0,0 +1,70 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + ParseIntPipe, + Post, + Res, + UploadedFile, + UseInterceptors, +} from '@nestjs/common'; +import { CarruselService } from './carrusel.service'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { diskStorage } from 'multer'; +import { actualizarContador, contador } from './utils'; +import * as path from 'path'; +import { carruselDto } from './dto/carruselDto.dto'; + +@Controller('carrusel') +export class CarruselController { + constructor(private carruselService: CarruselService) {} + + @Post('addImage') + @UseInterceptors( + FileInterceptor('imagen', { + storage: diskStorage({ + destination: './public/carrusel', + filename: function (req, file, cb) { + actualizarContador(); + const { ext } = path.parse(file.originalname); + const filename = `carrusel${contador}${ext}`; + return cb(null, filename); + }, + }), + fileFilter: function (req, file, cb) { + if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) { + return cb( + new Error( + 'Lo sentimos, para mejorar la calidad de las imagenes en el carousel solo se aceptan imagenes con terminación: .jpeg .jpg .png .webp', + ), + false, + ); + } + cb(null, true); + }, + }), + ) + addImagenToCarrusel( + @Body() carruselDto: carruselDto, + @UploadedFile() file, + @Res() res, + ) { + return this.carruselService.addImagenToCarrusel( + carruselDto, + file.filename, + res, + ); + } + + @Delete('delete/:id') + deleteImagenByRuta(@Param('id', ParseIntPipe) id: number) { + return this.carruselService.deleteImagenByRuta(id); + } + + @Get("imagenes") + getAllImagenes(){ + return this.carruselService.getAllImages() + } +} diff --git a/src/carrusel/carrusel.module.ts b/src/carrusel/carrusel.module.ts new file mode 100644 index 0000000..eb603cd --- /dev/null +++ b/src/carrusel/carrusel.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { CarruselController } from './carrusel.controller'; +import { CarruselService } from './carrusel.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Carrusel } from 'src/entities/carrusel.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([Carrusel])], + controllers: [CarruselController], + providers: [CarruselService], +}) +export class CarruselModule {} diff --git a/src/carrusel/carrusel.service.ts b/src/carrusel/carrusel.service.ts new file mode 100644 index 0000000..2e51d15 --- /dev/null +++ b/src/carrusel/carrusel.service.ts @@ -0,0 +1,59 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Carrusel } from 'src/entities/carrusel.entity'; +import { Repository } from 'typeorm'; +import { carruselDto } from './dto/carruselDto.dto'; +import * as fs from 'fs'; +import { Response } from 'express'; + +@Injectable() +export class CarruselService { + constructor( + @InjectRepository(Carrusel) + private carruselRepository: Repository, + ) {} + + addImagenToCarrusel( + carruselDto: carruselDto, + filename, + res: Response, + ): Promise { + carruselDto.ruta = `/public/carrusel/${filename}`; + const carruselCreate = this.carruselRepository.create(carruselDto); + + return this.carruselRepository + .save(carruselCreate) + .then((carrusel) => { + res + .status(201) + .json({ message: 'Imagen agregada correctamente', carrusel }); + return carrusel; + }) + .catch((error) => { + res.status(500).json({ + message: 'Error al agregar la imagen', + error, + }); + throw error; + }); + } + + async deleteImagenByRuta(id: number) { + try { + const res = await this.carruselRepository.findOne({ + where: { id_imagen_carrusel: id }, + }); + + await fs.promises.unlink(`./${res.ruta}`); + + return this.carruselRepository.delete({ id_imagen_carrusel: id }); + } catch (error) { + console.error('Error:', error); + throw error; + } + } + + getAllImages(): Promise { + return this.carruselRepository.find() + } +} diff --git a/src/carrusel/dto/carruselDto.dto.ts b/src/carrusel/dto/carruselDto.dto.ts new file mode 100644 index 0000000..e0ff309 --- /dev/null +++ b/src/carrusel/dto/carruselDto.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from "class-validator"; + +export class carruselDto { + @IsNotEmpty() + ruta: string + + @IsNotEmpty() + link: string +} \ No newline at end of file diff --git a/src/carrusel/utils.ts b/src/carrusel/utils.ts new file mode 100644 index 0000000..8460fc1 --- /dev/null +++ b/src/carrusel/utils.ts @@ -0,0 +1,5 @@ +export let contador = 0 + +export const actualizarContador = () => { + contador++ +} \ No newline at end of file diff --git a/src/entities/carrusel.entity.ts b/src/entities/carrusel.entity.ts new file mode 100644 index 0000000..7d092e0 --- /dev/null +++ b/src/entities/carrusel.entity.ts @@ -0,0 +1,15 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class Carrusel { + @PrimaryGeneratedColumn() + id_imagen_carrusel: number + + @Column({length: 40}) + ruta: string + /* "/public/carrusel/carrusel1.jpg" */ + + @Column({length: 60}) + link: string + /* "https://www.acatlan.unam.mx/" */ +} \ No newline at end of file -- 2.43.0 From e2afc63e28db4ebcbedd2862dd475877d23b3ef2 Mon Sep 17 00:00:00 2001 From: JorgeMike Date: Mon, 26 Jun 2023 08:33:18 -0600 Subject: [PATCH 36/37] Muchos cambios --- package-lock.json | 48 +++++- package.json | 1 + .../carrusel/{carrusel2.jpg => carrusel1.jpg} | Bin src/app.module.ts | 5 +- src/auth/auth.service.ts | 8 +- src/carousel/carousel.controller.ts | 92 ----------- src/carousel/carousel.service.ts | 9 -- src/email/DisenoConstancia.pdf | Bin 0 -> 79897 bytes src/email/email.controller.ts | 26 +++- src/email/email.module.ts | 7 +- src/email/email.service.ts | 146 ++++++++++++------ src/eventos/eventos.controller.ts | 10 +- src/eventos/eventos.service.ts | 2 +- 13 files changed, 184 insertions(+), 170 deletions(-) rename public/carrusel/{carrusel2.jpg => carrusel1.jpg} (100%) delete mode 100644 src/carousel/carousel.controller.ts delete mode 100644 src/carousel/carousel.service.ts create mode 100644 src/email/DisenoConstancia.pdf diff --git a/package-lock.json b/package-lock.json index 21ca84b..eb25f65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "blob-stream": "^0.1.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "date-fns": "^2.30.0", "exceljs": "^4.3.0", "moment": "^2.29.4", "multer": "^1.4.5-lts.1", @@ -745,6 +746,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", @@ -4212,9 +4224,12 @@ "dev": true }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -8919,6 +8934,11 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -11784,6 +11804,14 @@ "@babel/helper-plugin-utils": "^7.19.0" } }, + "@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, "@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", @@ -14464,9 +14492,12 @@ "dev": true }, "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } }, "dayjs": { "version": "1.11.7", @@ -18066,6 +18097,11 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", diff --git a/package.json b/package.json index d3d3bd6..655206f 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "blob-stream": "^0.1.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "date-fns": "^2.30.0", "exceljs": "^4.3.0", "moment": "^2.29.4", "multer": "^1.4.5-lts.1", diff --git a/public/carrusel/carrusel2.jpg b/public/carrusel/carrusel1.jpg similarity index 100% rename from public/carrusel/carrusel2.jpg rename to public/carrusel/carrusel1.jpg diff --git a/src/app.module.ts b/src/app.module.ts index 98eab76..52a4042 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -46,8 +46,6 @@ import { EmailService } from './email/email.service'; import { EmailController } from './email/email.controller'; import { EmailModule } from './email/email.module'; import { MulterModule } from '@nestjs/platform-express'; -import { CarouselController } from './carousel/carousel.controller'; -import { CarouselService } from './carousel/carousel.service'; import { ServeStaticModule } from '@nestjs/serve-static'; import { join } from 'path'; import { CarruselModule } from './carrusel/carrusel.module'; @@ -128,9 +126,8 @@ import { Carrusel } from './entities/carrusel.entity'; AppController, ParticipanteController, InscripcionStatusController, - CarouselController, ], - providers: [AppService, InscripcionStatusService, CarouselService], + providers: [AppService, InscripcionStatusService], }) export class AppModule { static port: number; diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 2943e37..5b2b25a 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -54,9 +54,11 @@ export class AuthService { /* console.log(token); */ const data = { - usuario: usuario.nombre, - id: usuario.id_miembro, - email: usuario.email, + user: { + usuario: usuario.nombre, + id: usuario.id_miembro, + email: usuario.email, + }, token, }; diff --git a/src/carousel/carousel.controller.ts b/src/carousel/carousel.controller.ts deleted file mode 100644 index 3f670d0..0000000 --- a/src/carousel/carousel.controller.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - BadRequestException, - Controller, - Delete, - Get, - HttpException, - HttpStatus, - Param, - Post, - Res, - UploadedFile, - UseInterceptors, -} from '@nestjs/common'; -import { FileInterceptor } from '@nestjs/platform-express'; -import { Response } from 'express'; -import * as fs from 'fs'; -import { diskStorage } from 'multer'; -import * as path from 'path'; - -@Controller('carousel') -export class CarouselController { - private images: string[] = []; - - @Post('/imagenes') - @UseInterceptors( - FileInterceptor('file', { - storage: diskStorage({ - destination: './public', - filename: function (req, file, cb) { - const directory = './public'; - const filePath = `${directory}/${file.originalname}`; - if (fs.existsSync(filePath)) { - cb( - new BadRequestException( - `Ya existe un archivo con el nombre: '${file.originalname}'. Si está seguro de que no es el mismo, cambie el nombre del archivo.`, - ), - null, - ); - } else { - cb(null, file.originalname); - } - }, - }), - fileFilter: function (req, file, cb) { - const filetypes = /jpeg|jpg|webp|png/; - const extname = filetypes.test( - path.extname(file.originalname).toLowerCase(), - ); - const mimetype = filetypes.test(file.mimetype); - if (mimetype && extname) { - return cb(null, true); - } - cb( - new BadRequestException( - 'Lo sentimos, para mejorar la calidad de las imagenes en el carousel solo se aceptan imagenes con terminación: .jpeg .jpg .png .webp', - ), - false, - ); - }, - }), - ) - async addImage(@UploadedFile() file) { - return { msg: 'Imagen guardada con exito :)' }; - } - - @Delete('/imagenes/:nombreArchivo') - async deleteImage(@Param('nombreArchivo') nombreArchivo: string) { - try { - await fs.promises.unlink(`./public/${nombreArchivo}`); - return { message: 'Imagen eliminada exitosamente' }; - } catch (err) { - throw new Error('Error al eliminar la imagen'); - } - } - - @Get('/imagenes') - async getImages(@Res() res: Response) { - // Leer el directorio 'public' para obtener el nombre de todos los archivos - - const fileNames = await fs.promises.readdir('./public'); - // Generar la URL para cada archivo y agregarla a un arreglo - - // Filtrar solo las imágenes con las terminaciones "jpg", "webp" y "png" - const imageNames = fileNames.filter((fileName) => - ['.jpg', '.webp', '.png'].includes(path.extname(fileName)), - ); - - const imageUrls = imageNames.map((imageName) => `public/${imageName}`); - // Devolver el arreglo de URLs como respuesta - return res.json(imageUrls); - } -} diff --git a/src/carousel/carousel.service.ts b/src/carousel/carousel.service.ts deleted file mode 100644 index a6c6fbb..0000000 --- a/src/carousel/carousel.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class CarouselService { - - uploadImage(file){ - /* console.log(file) */ - } -} diff --git a/src/email/DisenoConstancia.pdf b/src/email/DisenoConstancia.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5918a99bbcd23843b065863ccfb4bc3d0dcce180 GIT binary patch literal 79897 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 L4g { - return this.emailService.sendEmail(id, emailDto); + return this.emailService.sendEmail(id, emailDto, res); } - @Post('constancias') + @UseGuards(AuthGuard('jwt')) + @Post('constancias/:id') @UseInterceptors(FileInterceptor('file')) - async sendConstancias(@UploadedFile() file, @Body('nombreEvento') nombreEvento: string,) { - if(!file) { - throw new HttpException("No se ha cargado ningun archivo", HttpStatus.BAD_REQUEST) + async sendConstancias( + @UploadedFile() file, + @Param('id', ParseIntPipe) id: number, + @Res() res, + ) { + if (!file) { + throw new HttpException( + 'No se ha cargado ningun archivo', + HttpStatus.BAD_REQUEST, + ); } - /* console.log(file) */ - return this.emailService.sendConstancias(file, nombreEvento); + return this.emailService.sendConstancias(file, id, res); } } diff --git a/src/email/email.module.ts b/src/email/email.module.ts index 39df2ed..941deba 100644 --- a/src/email/email.module.ts +++ b/src/email/email.module.ts @@ -4,10 +4,13 @@ import { EventosModule } from 'src/eventos/eventos.module'; import { Participante } from 'src/participante/participante.entity'; import { EmailController } from './email.controller'; import { EmailService } from './email.service'; +import { EventosService } from 'src/eventos/eventos.service'; +import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; +import { Evento } from 'src/eventos/evento.entity'; @Module({ - imports:[TypeOrmModule.forFeature([Participante])], + imports:[TypeOrmModule.forFeature([Participante, EventoParticipante, Evento])], controllers:[EmailController], - providers:[EmailService] + providers:[EmailService, EventosService] }) export class EmailModule {} diff --git a/src/email/email.service.ts b/src/email/email.service.ts index 3ec96e4..8cb0f14 100644 --- a/src/email/email.service.ts +++ b/src/email/email.service.ts @@ -1,4 +1,11 @@ -import { HttpException, HttpStatus, Inject, Injectable, Res, UploadedFile } from '@nestjs/common'; +import { + HttpException, + HttpStatus, + Inject, + Injectable, + Res, + UploadedFile, +} from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { InjectRepository } from '@nestjs/typeorm'; import * as nodemailer from 'nodemailer'; @@ -13,6 +20,8 @@ import * as pdfFonts from 'pdfmake/build/vfs_fonts'; import * as fs from 'fs'; import * as path from 'path'; import { PDFDocument, StandardFonts, rgb } from 'pdf-lib'; +import { Response } from 'express'; +import { format } from 'date-fns'; @Injectable() export class EmailService { @@ -22,6 +31,7 @@ export class EmailService { @InjectRepository(Participante) private participanteRepository: Repository, private configService: ConfigService, + private readonly eventoService: EventosService, ) { this.transporter = nodemailer.createTransport({ service: this.configService.get('NODEMAILER_SERVICE'), @@ -32,7 +42,7 @@ export class EmailService { }); } - async sendEmail(id: number, message: EmailDto) { + async sendEmail(id: number, message: EmailDto, res: Response) { const participantes = await this.getEmailDeParticipantes(id); participantes.map((res) => { const emailDestinatario = res.email; @@ -41,8 +51,8 @@ export class EmailService { subject: message.subject, text: message.text, }); - /*console.log("Email enviado a: ", res)*/ }); + return res.status(201).json({ message: 'Correos enviados con exito' }); } async getEmailDeParticipantes(idEvento: number) { @@ -57,63 +67,113 @@ export class EmailService { return participantes; } - async sendConstancias(file, nombreEvento) { - /* console.log(file) */ + async sendConstancias(file, id_evento, res: Response) { + //traemos la info del evento + const evento = await this.eventoService.getEventosPorId(id_evento); + const workbook = xlsx.read(file.buffer); const worksheet = workbook.Sheets[workbook.SheetNames[0]]; const data = xlsx.utils.sheet_to_json(worksheet); - for (const row of data as Row[]) { - const pdfDoc = await PDFDocument.create(); - const page = pdfDoc.addPage(); - page.setSize(792, 612); + // Carga el PDF pre-diseñado + const existingPdfBytes = fs.readFileSync('src/email/DisenoConstancia.pdf'); - const font = await pdfDoc.embedFont(StandardFonts.HelveticaBold); - const fontSize = 30; - const text = 'Constancia de asistencia'; - const textWidth = font.widthOfTextAtSize(text, fontSize); - const textHeight = font.heightAtSize(fontSize); + for (let i = 0; i < data.length; i++) { + const row = data[i] as Row; - page.drawText(text, { - x: (page.getWidth() - textWidth) / 2, - y: (page.getHeight() - textHeight) / 2, + if(row.Email == undefined){ + return res.status(400).json({ message: `El correo del renglon ${ i + 2} puede estar vacio o ser undefined`, solucion: `Seleccione el renglon donde ocurre el problema y borre todo lo de este renglon, Aunque parezca que el renglon esta vacio puede que haya un espacio en algun campo y esto genera que el sistema haga la lectura de este renglon`}); + } + + // Carga el PDF pre-diseñado en un documento PDF editable + const pdfDoc = await PDFDocument.load(existingPdfBytes); + + const pagina = pdfDoc.getPages(); + const primeraPagina = pagina[0]; + + // Obtén el ancho y alto de la página + const { width, height } = primeraPagina.getSize(); + + // Obtén la fuente del texto + const font = await pdfDoc.embedFont(StandardFonts.Helvetica); + + // Configura el tamaño del texto + const fontSize = 26; + + const nombreParticipante = `${row['Apellido Paterno']} ${row['Apellido Materno']} ${row.Nombre}`; + + // Calcula la anchura del texto del nombre del participante + const textWidth = font.widthOfTextAtSize(nombreParticipante, fontSize); + + const centerX = (width - textWidth) / 2; + const centerY = (height - fontSize) / 2; + + // Dibuja el texto centrado en la página + primeraPagina.drawText(nombreParticipante, { + x: centerX, + y: centerY + 70, size: fontSize, - font: font, - color: rgb(0/255, 0/255, 0/255), + color: rgb(0, 0, 0), }); - const { width, height } = page.getSize(); - page.drawText( - `Se le otorga la constancia por su asistencia al evento: ${nombreEvento}`, - { - x: 50, - y: height - 50, - size: 12, - font: await pdfDoc.embedFont('Helvetica'), - }, - ); - page.drawText( - `A ${row['Apellido Paterno']} ${row['Apellido Materno']} ${row.Nombre}`, - { - x: 50, - y: height - 80, - size: 12, - font: await pdfDoc.embedFont('Helvetica'), - }, - ); + const nombreCurso = `${evento.nombre}`; + + // Calcula la anchura del texto del nombre del evento + const nombreCursoWidth = font.widthOfTextAtSize(nombreCurso, fontSize); + + const centerXNombreCurso = (width - nombreCursoWidth) / 2; + const centerYNombreCurso = (height - fontSize) / 2; + + primeraPagina.drawText(nombreCurso, { + x: centerXNombreCurso, + y: centerYNombreCurso - 17, + size: fontSize, + color: rgb(0, 0, 0), + }); + + const fechaCurso = `del ${this.formatoFecha( + evento.fecha_inicio, + )} al ${this.formatoFecha(evento.fecha_fin)}`; + + // Calcula la anchura del texto del nombre del participante + const fechaCursoWidth = font.widthOfTextAtSize(fechaCurso, 20); + + const centerXFechaCurso = (width - fechaCursoWidth) / 2; + const centerYFechaCurso = (height - 20) / 2; + + primeraPagina.drawText(fechaCurso, { + x: centerXFechaCurso, + y: centerYFechaCurso - 55, + size: 20, + color: rgb(0, 0, 0), + }); + + // Guarda el PDF modificado en forma de bytes const pdfBytes = await pdfDoc.save(); + + // Crea el objeto de adjunto con el nombre y contenido del PDF const attachment = { - filename: `Constancia ${nombreEvento} - ${row.Nombre}_${row['Apellido Paterno']}.pdf`, + filename: `Constancia ${evento.nombre} - ${row.Nombre}_${row['Apellido Paterno']}.pdf`, content: pdfBytes, }; - /* const blob = new Blob([pdfBytes], { type: 'application/pdf' }); - const url = URL.createObjectURL(blob); */ + + // Crea el objeto Blob y la URL para el PDF + const blob = new Blob([pdfBytes], { type: 'application/pdf' }); + + // Envía el correo electrónico con la constancia adjunta this.transporter.sendMail({ to: row.Email, - subject: `Constancia de asistencia a "${nombreEvento}"`, - text: `¡Un saludo ${row.Nombre}! Aquí está tu constancia de asistencia por el evento "${nombreEvento}". Agradecemos tu asistencia y constancia, esperamos seguir viéndote en eventos futuros.`, + subject: `Constancia de asistencia a "${evento.nombre}"`, + text: `¡Un saludo ${row.Nombre}! Aquí está tu constancia de asistencia por el evento "${evento.nombre}". Agradecemos tu asistencia y constancia, esperamos seguir viéndote en eventos futuros.`, attachments: [attachment], }); } + + return res.status(200).json({ message: 'Constancias enviadas con éxito' }); + } + + formatoFecha(fecha: Date) { + const fechaLimpia = format(fecha, 'dd/MM/yyyy'); + return fechaLimpia; } } diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index 858b073..a484583 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, Res, UseGuards } from '@nestjs/common'; import { Response } from 'express'; import { InjectRepository } from '@nestjs/typeorm'; import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; @@ -7,6 +7,7 @@ import { actualizarEventoDto } from './dto/actualizarEvento.dto'; import { crearEventoDto } from './dto/crearEvento.dto'; import { Evento } from './evento.entity'; import { EventosService } from './eventos.service'; +import { AuthGuard } from '@nestjs/passport'; @Controller('eventos') export class EventosController { @@ -23,16 +24,19 @@ export class EventosController { return this.eventoService.getEventosPorId(id) } + @UseGuards(AuthGuard('jwt')) @Post() postEvento(@Body() nuevoEvento: crearEventoDto){ return this.eventoService.postEvento(nuevoEvento) } + @UseGuards(AuthGuard('jwt')) @Patch(':id') patchEvento(@Param('id', ParseIntPipe)id:number, @Body() actualizacion: actualizarEventoDto){ return this.eventoService.updateEvento(id,actualizacion) } - + + @UseGuards(AuthGuard('jwt')) @Delete(':id') deleteEvento(@Param('id', ParseIntPipe)id: number){ return this.eventoService.deleteEventoParticipante(id) @@ -43,11 +47,13 @@ export class EventosController { return this.eventoService.getCupos(id) } + @UseGuards(AuthGuard('jwt')) @Get(':id/participante') async getParticipnates(@Param('id', ParseIntPipe)id:number){ return this.eventoService.getParticipantes(id) } + @UseGuards(AuthGuard('jwt')) @Get(':id/exportExcel') async exportarExcel (@Param('id', ParseIntPipe)id:number ,@Res() res: Response){ this.eventoService.exportarParticipantes(id, res) diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index e322a52..394fbe6 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -23,7 +23,7 @@ export class EventosService { return this.eventoRepository.find(); } - getEventosPorId(id: number) { + public getEventosPorId(id: number) { return this.eventoRepository.findOne({ where: { id_evento: id, -- 2.43.0 From e4a56184d5c234bb44766497d3dbacaff9c624dc Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Mon, 26 Jun 2023 12:51:29 -0600 Subject: [PATCH 37/37] Carrusel envia mensaje de error enlugar de detener el servicio --- public/carrusel/carrusel1.jpg | Bin 189514 -> 0 bytes src/carrusel/carrusel.controller.ts | 18 ++++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) delete mode 100644 public/carrusel/carrusel1.jpg diff --git a/public/carrusel/carrusel1.jpg b/public/carrusel/carrusel1.jpg deleted file mode 100644 index e0ca0deb7576fff72207b772ff6e4fb685368a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189514 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ⅈUb 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 ygc10_Bw6WhUb*>h+HkRVy;^