diff --git a/service/data-hub/data-connector/Dockerfile b/service/data-hub/data-connector/Dockerfile new file mode 100644 index 0000000..ed1efde --- /dev/null +++ b/service/data-hub/data-connector/Dockerfile @@ -0,0 +1,21 @@ +FROM node:20.15.1-alpine as builder + +WORKDIR /app/builder + +COPY . . + +RUN npm install \ + && npm run build + +FROM node:20.15.1-alpine + +WORKDIR /app + +COPY --from=builder /app/builder/node_modules ./node_modules +COPY --from=builder /app/builder/prisma ./prisma +COPY --from=builder /app/builder/dist . +COPY --from=builder /app/builder/docker-entrypoint.sh . + +ENTRYPOINT [ "./docker-entrypoint.sh" ] + +CMD [ "node", "./src/main.js" ] \ No newline at end of file diff --git a/service/data-hub/data-connector/docker-compose.yaml b/service/data-hub/data-connector/docker-compose.yaml index d9b61a9..4651052 100644 --- a/service/data-hub/data-connector/docker-compose.yaml +++ b/service/data-hub/data-connector/docker-compose.yaml @@ -1,6 +1,29 @@ version: '3' services: + + avicenna-data: + image: thedevilisdero/avic-data-connector + ports: + - 3000:3000 + env_file: .env + environment: + DATABASE_PORT: ${DATABASE_PORT} + DATABASE_HOST: ${DATABASE_HOST} + DATABASE_USERNAME: ${DATABASE_USERNAME} + DATABASE_PASSWORD: ${DATABASE_PASSWORD} + DATABASE_DATABASE: ${DATABASE_DATABASE} + DATABASE_URL: ${DATABASE_URL} + DISPO_LIVE_BASE_URL: ${DISPO_LIVE_BASE_URL} + DISPO_LIVE_USERNAME: ${DISPO_LIVE_USERNAME} + DISPO_LIVE_PASSWORD: ${DISPO_LIVE_PASSWORD} + DYFLEXIS_V0_BASE_URL: ${DYFLEXIS_V0_BASE_URL} + DYFLEXIS_V2_BASE_URL: ${DYFLEXIS_V2_BASE_URL} + DYFLEXIS_V0_API_KEY: ${DYFLEXIS_V0_API_KEY} + DYFLEXIS_V2_API_KEY: ${DYFLEXIS_V2_API_KEY} + networks: + - avic + avicenna-db: image: postgres:16.3 ports: @@ -14,6 +37,11 @@ services: PG_DATA: /var/lib/postgresql/data volumes: - ./.local/pgdata:/var/lib/postgresql/data + networks: + - avic volumes: pgdata: + +networks: + avic: \ No newline at end of file diff --git a/service/data-hub/data-connector/docker-entrypoint.sh b/service/data-hub/data-connector/docker-entrypoint.sh new file mode 100755 index 0000000..0c8f786 --- /dev/null +++ b/service/data-hub/data-connector/docker-entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/sh +npx prisma generate + +exec "$@" \ No newline at end of file diff --git a/service/data-hub/data-connector/libs/api/data-access-database/src/lib/types.ts b/service/data-hub/data-connector/libs/api/data-access-database/src/lib/types.ts new file mode 100644 index 0000000..ec7880c --- /dev/null +++ b/service/data-hub/data-connector/libs/api/data-access-database/src/lib/types.ts @@ -0,0 +1,535 @@ +import type { ColumnType } from "kysely"; +export type Generated = T extends ColumnType + ? ColumnType + : ColumnType; +export type Timestamp = ColumnType; + +export const TicketState = { + CREATED: "CREATED", + APPROVAL_REQUIRED: "APPROVAL_REQUIRED", + READY: "READY", + DONE: "DONE", + BILLABLE: "BILLABLE", + ARCHIVED: "ARCHIVED" +} as const; +export type TicketState = (typeof TicketState)[keyof typeof TicketState]; +export const TicketValidationState = { + CREATED: "CREATED", + USER_INTERACTION_REQUIRED: "USER_INTERACTION_REQUIRED", + TD_UNCERTAIN: "TD_UNCERTAIN", + DOCUMENTS_MISSING: "DOCUMENTS_MISSING", + ARCHIVED: "ARCHIVED" +} as const; +export type TicketValidationState = (typeof TicketValidationState)[keyof typeof TicketValidationState]; +export const ApprovalState = { + UNKNOWN: "UNKNOWN", + FREE: "FREE", + REQUIRED: "REQUIRED", + REQUESTED: "REQUESTED", + APPROVED: "APPROVED" +} as const; +export type ApprovalState = (typeof ApprovalState)[keyof typeof ApprovalState]; +export const CostTypeVariant = { + NACHTZUSCHLAG: "NACHTZUSCHLAG", + WOCHENENDZUSCHLAG: "WOCHENENDZUSCHLAG", + FEIERTAGSZUSCHLAG: "FEIERTAGSZUSCHLAG", + DESINFEKTIONSZUSCHLAG: "DESINFEKTIONSZUSCHLAG", + KILOMETERZUSCHLAG: "KILOMETERZUSCHLAG", + FAHRZEUGZUSCHLAG: "FAHRZEUGZUSCHLAG", + TSWDIFFERENZIERUNG: "TSWDIFFERENZIERUNG", + GRUNDPREIS: "GRUNDPREIS" +} as const; +export type CostTypeVariant = (typeof CostTypeVariant)[keyof typeof CostTypeVariant]; +export type Anomaly = { + id: string; + type: string; + description: string; + groupKey: string; + groupDescription: string; + workedOnBy: string; + sleepTimer: number; + sleepSince: Timestamp | null; + resolvedAt: Timestamp | null; + manuallyResolved: Generated; + createdAt: Generated; +}; +export type AttendanceRegistration = { + attendanceRegistrationId: number; + employeeId: number; + personnelNumber: string; + dateTime: Timestamp; + event: string; +}; +export type AttendanceRegistrationSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + attendanceRegistrationId: string | null; + employeeId: string | null; + personnelNumber: string | null; + dateTime: string | null; + event: string | null; +}; +export type AttendanceRegistrationStaging = { + internalId: Generated; + attendanceRegistrationId: number; + employeeId: number; + dateTime: Timestamp; + event: string; +}; +export type AvicennaTenant = { + id: Generated; + healthInsuranceNumber: string; + name: string; +}; +export type AvicennaTenantToTariffGroup = { + A: string; + B: string; +}; +export type CostType = { + id: Generated; + description: string; + variant: CostTypeVariant; + costAmount: number; + timeRange: string | null; + kmInclusive: number | null; + excludeCarNames: string[]; + infectionType: string | null; + tariffId: string | null; +}; +export type DyflexisEmployee = { + id: number; + firstname: string; + surname: string; + contractStart: Timestamp; + contractEnd: Timestamp | null; + contractHoursWeek: number; + contractSalaryHour: number; +}; +export type Employee = { + id: string; + name: string; + surname: string; + personnelNumber: string | null; + mobile: string | null; + qualification: string | null; + occuptationalHealthExamination: Timestamp | null; + personTransportCertificate: Timestamp | null; +}; +export type EmployeeDispoLiveSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + pScheinAblaufDatum: string | null; + name: string | null; + surname: string | null; + persId: string | null; + importPersId: string | null; + qualifikation: string | null; +}; +export type EmployeeDispoLiveStaging = { + internalId: Generated; + id: string; + name: string | null; + surname: string | null; + personnelNumber: string | null; + qualification: string | null; + personTransportCertificate: Timestamp | null; +}; +export type EmployeeDyflexisSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + firstname: string | null; + surname: string | null; + contract_id: string | null; + contract_start: string | null; + contract_end: string | null; + contract_hours_week: string | null; + contract_salary_hour: string | null; +}; +export type EmployeeDyflexisStaging = { + internalId: Generated; + id: number; + firstname: string; + surname: string; + contractStart: Timestamp; + contractEnd: Timestamp; + contractHoursWeek: number; + contractSalaryHour: number; +}; +export type Patient = { + id: string; + surname: string | null; + name: string | null; + street: string | null; + zip: string | null; + city: string | null; + birthday: Timestamp | null; + healthinsuranceId: string | null; + healthinsurance: string | null; + careDegree: string | null; + disabilityMark1: string | null; + disabilityMark2: string | null; +}; +export type PatientSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + surname: string | null; + name: string | null; + street: string | null; + zip: string | null; + city: string | null; + birthday: string | null; + kkId: string | null; + krankenkasse: string | null; + pflegestufe: string | null; + behinderung1: string | null; + behinderung2: string | null; +}; +export type PatientStaging = { + internalId: Generated; + id: string | null; + surname: string | null; + name: string | null; + street: string | null; + zip: string | null; + city: string | null; + birthday: Timestamp | null; + healthinsuranceId: string | null; + healthinsurance: string | null; + careDegree: string | null; + disabilityMark1: string | null; + disabilityMark2: string | null; +}; +export type PlannedTime = { + id: string; + userId: string; + firstname: string | null; + surname: string | null; + startDate: Timestamp | null; + endDate: Timestamp | null; + department: string | null; + pause: number; + duration: number; + note: string | null; +}; +export type PlannedTimeSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + user_id: string | null; + firstname: string | null; + surname: string | null; + department_id: string | null; + department_name: string | null; + start_date: string | null; + end_date: string | null; + pauze: string | null; + duration: string | null; + deleted: string | null; + mark: string | null; +}; +export type PlannedTimeStaging = { + internalId: Generated; + id: number; + employeeId: number; + firstname: string | null; + surname: string | null; + departmentName: string | null; + startDate: Timestamp; + endDate: Timestamp; + deleted: boolean; + mark: string | null; +}; +export type SolutionTarget = { + id: Generated; + name: string; + anomalyId: string | null; +}; +export type SolutionTargetStep = { + id: Generated; + description: string; + solutionTargetId: string | null; +}; +export type Tariff = { + id: Generated; + validFrom: Timestamp | null; + validTo: Timestamp | null; + tariffGroupId: string | null; +}; +export type TariffGroup = { + id: Generated; + description: string; + ordinanceType: string; +}; +export type Ticket = { + id: Generated; + currentState: TicketValidationState; + notes: string[]; + errors: string[]; + isUrgent: Generated; + urgency: Generated; + approvalState: ApprovalState | null; + documentInfo: Generated; + createdAt: Generated; +}; +export type TicketStateHistory = { + id: Generated; + state: TicketValidationState; + createdAt: Generated; + ticketId: string; +}; +export type Tour = { + id: Generated; + done: boolean; + direction: string; + carName: string | null; + operationId: string; + driverId: string | null; + driverName: string | null; + codriverId: string | null; + codriverName: string | null; + patientId: string | null; + patientName: string | null; + patientSurname: string | null; + patientStreet: string | null; + patientZip: string | null; + patientCity: string | null; + healthInsurance: string | null; + healthInsuranceNumber: string | null; + type: string | null; + category: string | null; + transportType: string | null; + ordinanceType: string | null; + rangeEndDate: Timestamp | null; + startInstitution: string | null; + startStreet: string | null; + startZip: string | null; + startCity: string | null; + targetInstitution: string | null; + targetStreet: string | null; + targetZip: string | null; + targetCity: string | null; + startDate: Timestamp; + check: Generated; + occupiedKm: number | null; + totalKm: number | null; + startBegin: string | null; + startEnd: string | null; + target: string | null; + targetBegin: string | null; + empty: string | null; + hasInfection: Generated; + infectionName: string | null; + revenueDispoLive: number | null; + billDate: Timestamp | null; + billNumber: string | null; + revenue: Generated; + consumptionCosts: Generated; + revenueDeviation: Generated; + createdAt: Timestamp | null; + deletedAt: Timestamp | null; + ticketId: string | null; +}; +export type TourSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + check: string | null; + createTime: string | null; + empfangenVonId: string | null; + endgen: string | null; + serienId: string | null; + serienKategorName: string | null; + serienKategorie: string | null; + zadStatus: string | null; + abrDate: string | null; + abrNum: string | null; + abrTime: string | null; + ausrueckZeit: string | null; + startTime: string | null; + startDate: string | null; + date: string | null; + date_iso: string | null; + dauergenehmigung: string | null; + direction: string | null; + distanceValue: string | null; + besetztKm: string | null; + gefahren: string | null; + gesamtPreis: string | null; + infektion: string | null; + itDesc: string | null; + itKrz: string | null; + itName: string | null; + kkId: string | null; + krankenkasse: string | null; + patId: string | null; + patName: string | null; + patSurname: string | null; + patStreet: string | null; + patZip: string | null; + patCity: string | null; + startInstitution: string | null; + startStreet: string | null; + startZip: string | null; + startCity: string | null; + targetInstitution: string | null; + targetStreet: string | null; + targetZip: string | null; + targetCity: string | null; + transportKrz: string | null; + transportName: string | null; + transportart: string | null; + verordnungsId: string | null; + verordnungsName: string | null; + type: string | null; + startBegin: string | null; + startEnd: string | null; + frei: string | null; + ziel: string | null; + zielBegin: string | null; + endTime: string | null; + endDate: string | null; + einsatzNummer: string | null; + carName: string | null; + carNo: string | null; + beifahrerName: string | null; + beifahrer: string | null; + fahrerName: string | null; + fahrer: string | null; + color: string | null; +}; +export type TourStaging = { + internalId: Generated; + id: string | null; + done: boolean | null; + direction: string | null; + carName: string | null; + operationId: string | null; + driverId: string | null; + driverName: string | null; + codriverId: string | null; + codriverName: string | null; + patientId: string | null; + patientName: string | null; + patientSurname: string | null; + patientStreet: string | null; + patientZip: string | null; + patientCity: string | null; + healthInsurance: string | null; + healthInsuranceNumber: string | null; + type: string | null; + category: string | null; + transportType: string | null; + ordinanceType: string | null; + rangeEndDate: Timestamp | null; + startInstitution: string | null; + startStreet: string | null; + startZip: string | null; + startCity: string | null; + targetInstitution: string | null; + targetStreet: string | null; + targetZip: string | null; + targetCity: string | null; + startDate: Timestamp | null; + check: Generated; + occupiedKm: number | null; + totalKm: number | null; + startBegin: string | null; + startEnd: string | null; + target: string | null; + targetBegin: string | null; + empty: string | null; + hasInfection: Generated; + infectionName: string | null; + revenueDispoLive: number | null; + billDate: Timestamp | null; + billNumber: string | null; + revenue: Generated; + revenueDeviation: Generated; + consumptionCosts: Generated; + createdAt: Timestamp | null; +}; +export type Trace = { + id: Generated; + type: string; + entityKey: string; + createdAt: Generated; +}; +export type WorkTime = { + id: string; + userId: string; + firstname: string; + surname: string; + startDate: Timestamp | null; + endDate: Timestamp | null; + department: string | null; + pause: number; + duration: number; +}; +export type WorkTimeSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + user_id: string | null; + firstname: string | null; + surname: string | null; + department_id: string | null; + department_name: string | null; + start_date: string | null; + end_date: string | null; + pauze: string | null; + duration: string | null; +}; +export type WorkTimeStaging = { + internalId: Generated; + id: number; + employeeId: number; + firstname: string; + surname: string; + departmentName: string | null; + startDate: Timestamp; + endDate: Timestamp; +}; +export type DB = { + _AvicennaTenantToTariffGroup: AvicennaTenantToTariffGroup; + Anomaly: Anomaly; + AttendanceRegistration: AttendanceRegistration; + AttendanceRegistrationSource: AttendanceRegistrationSource; + AttendanceRegistrationStaging: AttendanceRegistrationStaging; + AvicennaTenant: AvicennaTenant; + CostType: CostType; + DyflexisEmployee: DyflexisEmployee; + Employee: Employee; + EmployeeDispoLiveSource: EmployeeDispoLiveSource; + EmployeeDispoLiveStaging: EmployeeDispoLiveStaging; + EmployeeDyflexisSource: EmployeeDyflexisSource; + EmployeeDyflexisStaging: EmployeeDyflexisStaging; + Patient: Patient; + PatientSource: PatientSource; + PatientStaging: PatientStaging; + PlannedTime: PlannedTime; + PlannedTimeSource: PlannedTimeSource; + PlannedTimeStaging: PlannedTimeStaging; + SolutionTarget: SolutionTarget; + SolutionTargetStep: SolutionTargetStep; + Tariff: Tariff; + TariffGroup: TariffGroup; + Ticket: Ticket; + TicketStateHistory: TicketStateHistory; + Tour: Tour; + TourSource: TourSource; + TourStaging: TourStaging; + Trace: Trace; + WorkTime: WorkTime; + WorkTimeSource: WorkTimeSource; + WorkTimeStaging: WorkTimeStaging; +}; diff --git a/service/data-hub/data-connector/package-lock.json b/service/data-hub/data-connector/package-lock.json index 47d8453..67151a5 100644 --- a/service/data-hub/data-connector/package-lock.json +++ b/service/data-hub/data-connector/package-lock.json @@ -1,7 +1,7 @@ { "name": "data-connector", "version": "0.0.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -19,6 +19,9 @@ "@prisma/client": "^5.16.2", "date-fns": "^3.6.0", "date-fns-tz": "^3.1.3", + "kysely": "^0.27.4", + "pg": "^8.12.0", + "prisma-kysely": "^1.8.0", "reflect-metadata": "^0.2.0", "rxjs": "^7.8.1" }, @@ -192,11 +195,24 @@ "node": ">=0.12.0" } }, + "node_modules/@antfu/ni": { + "version": "0.21.8", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.8.tgz", + "integrity": "sha512-90X8pU2szlvw0AJo9EZMbYc2eQKkmO7mAdC4tD4r5co2Mm56MT37MIG8EyB7p4WRheuzGxuLDxJ63mF6+Zajiw==", + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nu": "bin/nu.mjs", + "nun": "bin/nun.mjs" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -409,7 +425,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -440,7 +455,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -455,7 +469,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -467,7 +480,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -481,7 +493,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -489,14 +500,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -505,7 +514,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -514,7 +522,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -775,6 +782,35 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz", + "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==", + "dependencies": { + "@chevrotain/gast": "10.5.0", + "@chevrotain/types": "10.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", + "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", + "dependencies": { + "@chevrotain/types": "10.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/@chevrotain/types": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", + "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==" + }, + "node_modules/@chevrotain/utils": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", + "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -1567,6 +1603,18 @@ "node": ">=8" } }, + "node_modules/@mrleebo/prisma-ast": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.7.0.tgz", + "integrity": "sha512-GTPkYf1meO2UXXIrz/SIDFWz+P4kXo2PTt36LYh/oNxV1PieYi7ZgenQk4IV0ut71Je3Z8ZoNZ8Tr7v2c1X1pg==", + "dependencies": { + "chevrotain": "^10.5.0", + "lilconfig": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@nestjs/axios": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.2.tgz", @@ -1812,7 +1860,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1825,7 +1872,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1834,7 +1880,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1860,6 +1905,14 @@ "npm": ">=5.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1935,6 +1988,51 @@ "@prisma/get-platform": "5.16.2" } }, + "node_modules/@prisma/generator-helper": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-5.3.1.tgz", + "integrity": "sha512-zrYS0iHLgPlOJjYnd5KvVMMvSS+ktOL39EwooS5EnyvfzwfzxlKCeOUgxTfiKYs0WUWqzEvyNAYtramYgSknsQ==", + "dependencies": { + "@prisma/debug": "5.3.1", + "@types/cross-spawn": "6.0.2", + "cross-spawn": "7.0.3", + "kleur": "4.1.5" + } + }, + "node_modules/@prisma/generator-helper/node_modules/@prisma/debug": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.3.1.tgz", + "integrity": "sha512-eYrxqslEKf+wpMFIIHgbcNYuZBXUdiJLA85Or3TwOhgPIN1ZoXT9CwJph3ynW8H1Xg0LkdYLwVmuULCwiMoU5A==", + "dependencies": { + "@types/debug": "4.1.8", + "debug": "4.3.4", + "strip-ansi": "6.0.1" + } + }, + "node_modules/@prisma/generator-helper/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@prisma/generator-helper/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/@prisma/get-platform": { "version": "5.16.2", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", @@ -1944,6 +2042,194 @@ "@prisma/debug": "5.16.2" } }, + "node_modules/@prisma/internals": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-5.3.1.tgz", + "integrity": "sha512-zkW73hPHHNrMD21PeYgCTBfMu71vzJf+WtfydtJbS0JVJKyLfOel0iWSQg7wjNeQfccKp+NdHJ/5rTJ4NEUzgA==", + "dependencies": { + "@antfu/ni": "0.21.8", + "@opentelemetry/api": "1.4.1", + "@prisma/debug": "5.3.1", + "@prisma/engines": "5.3.1", + "@prisma/fetch-engine": "5.3.1", + "@prisma/generator-helper": "5.3.1", + "@prisma/get-platform": "5.3.1", + "@prisma/prisma-schema-wasm": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59", + "archiver": "5.3.2", + "arg": "5.0.2", + "checkpoint-client": "1.1.27", + "cli-truncate": "2.1.0", + "dotenv": "16.0.3", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "find-up": "5.0.0", + "fp-ts": "2.16.1", + "fs-extra": "11.1.1", + "fs-jetpack": "5.1.0", + "global-dirs": "3.0.1", + "globby": "11.1.0", + "indent-string": "4.0.0", + "is-windows": "1.0.2", + "is-wsl": "2.2.0", + "kleur": "4.1.5", + "new-github-issue-url": "0.2.1", + "node-fetch": "2.7.0", + "npm-packlist": "5.1.3", + "open": "7.4.2", + "p-map": "4.0.0", + "prompts": "2.4.2", + "read-pkg-up": "7.0.1", + "replace-string": "3.1.0", + "resolve": "1.22.4", + "string-width": "4.2.3", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "temp-dir": "2.0.0", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "tmp": "0.2.1", + "ts-pattern": "4.3.0" + } + }, + "node_modules/@prisma/internals/node_modules/@prisma/debug": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.3.1.tgz", + "integrity": "sha512-eYrxqslEKf+wpMFIIHgbcNYuZBXUdiJLA85Or3TwOhgPIN1ZoXT9CwJph3ynW8H1Xg0LkdYLwVmuULCwiMoU5A==", + "dependencies": { + "@types/debug": "4.1.8", + "debug": "4.3.4", + "strip-ansi": "6.0.1" + } + }, + "node_modules/@prisma/internals/node_modules/@prisma/engines": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.3.1.tgz", + "integrity": "sha512-6QkILNyfeeN67BNEPEtkgh3Xo2tm6D7V+UhrkBbRHqKw9CTaz/vvTP/ROwYSP/3JT2MtIutZm/EnhxUiuOPVDA==", + "hasInstallScript": true + }, + "node_modules/@prisma/internals/node_modules/@prisma/fetch-engine": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.3.1.tgz", + "integrity": "sha512-w1yk1YiK8N82Pobdq58b85l6e8akyrkxuzwV9DoiUTRf3gpsuhJJesHc4Yi0WzUC9/3znizl1UfCsI6dhkj3Vw==", + "dependencies": { + "@prisma/debug": "5.3.1", + "@prisma/get-platform": "5.3.1", + "execa": "5.1.1", + "find-cache-dir": "3.3.2", + "fs-extra": "11.1.1", + "hasha": "5.2.2", + "http-proxy-agent": "7.0.0", + "https-proxy-agent": "7.0.2", + "kleur": "4.1.5", + "node-fetch": "2.7.0", + "p-filter": "2.1.0", + "p-map": "4.0.0", + "p-retry": "4.6.2", + "progress": "2.0.3", + "rimraf": "3.0.2", + "temp-dir": "2.0.0", + "tempy": "1.0.1" + } + }, + "node_modules/@prisma/internals/node_modules/@prisma/get-platform": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.3.1.tgz", + "integrity": "sha512-3IiZY2BUjKnAuZ0569zppZE6/rZbVAM09//c2nvPbbkGG9MqrirA8fbhhF7tfVmhyVfdmVCHnf/ujWPHJ8B46Q==", + "dependencies": { + "@prisma/debug": "5.3.1", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "fs-jetpack": "5.1.0", + "kleur": "4.1.5", + "replace-string": "3.1.0", + "strip-ansi": "6.0.1", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "ts-pattern": "4.3.0" + } + }, + "node_modules/@prisma/internals/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/@prisma/internals/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@prisma/internals/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/@prisma/internals/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@prisma/internals/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/internals/node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@prisma/internals/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/@prisma/prisma-schema-wasm": { + "version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59", + "resolved": "https://registry.npmjs.org/@prisma/prisma-schema-wasm/-/prisma-schema-wasm-5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59.tgz", + "integrity": "sha512-+zUI7NQDXfcNnU8HgrAj4jRMv8yRfITLzcfv0Urf0adKimM+hkkVG4rX38i9zWMlxekkEBw7NLFx3Gxxy8d3iQ==" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -2058,6 +2344,22 @@ "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", "dev": true }, + "node_modules/@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -2180,15 +2482,24 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.14.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, "node_modules/@types/qs": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", @@ -2201,6 +2512,11 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -2667,6 +2983,29 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -2713,7 +3052,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -2728,7 +3066,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -2740,7 +3077,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" } @@ -2789,6 +3125,96 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "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-utils/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -2816,7 +3242,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -2827,6 +3252,19 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2962,14 +3400,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", @@ -3001,7 +3437,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", @@ -3012,7 +3447,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3062,7 +3496,6 @@ "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" } @@ -3071,7 +3504,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -3136,7 +3568,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", @@ -3156,6 +3587,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-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3266,6 +3705,78 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/checkpoint-client": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.27.tgz", + "integrity": "sha512-xstymfUalJOv6ZvTtmkwP4ORJN36ikT4PvrIoLe3wstbYf87XIXCcZrSmbFQOjyB0v1qbBnCsAscDpfdZlCkFA==", + "dependencies": { + "ci-info": "3.8.0", + "env-paths": "2.2.1", + "make-dir": "4.0.0", + "ms": "2.1.3", + "node-fetch": "2.6.12", + "uuid": "9.0.0" + } + }, + "node_modules/checkpoint-client/node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/checkpoint-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/checkpoint-client/node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/checkpoint-client/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/chevrotain": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", + "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", + "dependencies": { + "@chevrotain/cst-dts-gen": "10.5.0", + "@chevrotain/gast": "10.5.0", + "@chevrotain/types": "10.5.0", + "@chevrotain/utils": "10.5.0", + "lodash": "4.17.21", + "regexp-to-ast": "0.5.0" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3320,6 +3831,14 @@ "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3359,6 +3878,21 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -3476,6 +4010,11 @@ "node": ">= 6" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -3485,11 +4024,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "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", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3597,6 +4162,42 @@ } } }, + "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.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "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-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -3637,7 +4238,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3647,6 +4247,14 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, "node_modules/date-fns": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", @@ -3668,7 +4276,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -3738,6 +4345,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3804,7 +4432,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -3875,8 +4502,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", @@ -3886,6 +4512,14 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "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==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", @@ -3899,11 +4533,18 @@ "node": ">=10.13.0" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -3951,7 +4592,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -4238,7 +4878,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -4260,8 +4899,7 @@ "node_modules/execa/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/exit": { "version": "0.1.2", @@ -4377,7 +5015,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4410,7 +5047,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -4464,7 +5100,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4502,11 +5137,48 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4659,6 +5331,11 @@ "node": ">= 0.6" } }, + "node_modules/fp-ts": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.1.tgz", + "integrity": "sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA==" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4667,6 +5344,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": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -4681,6 +5363,25 @@ "node": ">=12" } }, + "node_modules/fs-jetpack": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", + "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/fs-jetpack/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/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -4690,8 +5391,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.3", @@ -4764,7 +5464,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -4799,7 +5498,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4813,6 +5511,20 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -4832,7 +5544,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -4862,8 +5573,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -4921,6 +5631,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -4941,6 +5674,11 @@ "node": ">=8" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4962,11 +5700,34 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -4986,7 +5747,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", @@ -5006,11 +5766,32 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, "engines": { "node": ">= 4" } }, + "node_modules/ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ignore-walk/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/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5055,12 +5836,19 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5071,6 +5859,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -5108,8 +5904,7 @@ "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 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5127,7 +5922,6 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -5138,11 +5932,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5151,7 +5958,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" } @@ -5169,7 +5975,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5190,16 +5995,22 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5208,7 +6019,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -5228,6 +6038,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5236,8 +6065,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -6015,8 +6843,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -6051,8 +6878,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -6088,7 +6914,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -6109,11 +6934,29 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/kysely": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.27.4.tgz", + "integrity": "sha512-dyNKv2KRvYOQPLCAOCjjQuCk4YFd33BvGdf/o5bC7FiW+BB6snA81Zt+2wT9QDFzKqxKa5rrOmvlK/anehCcgA==", + "engines": { + "node": ">=14.0.0" + } + }, + "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", @@ -6136,11 +6979,18 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, "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 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -6155,7 +7005,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6171,6 +7020,26 @@ "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.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.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.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -6183,6 +7052,11 @@ "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/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -6232,7 +7106,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, "dependencies": { "semver": "^7.5.3" }, @@ -6286,14 +7159,12 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -6310,7 +7181,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -6323,7 +7193,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6365,11 +7234,18 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6416,8 +7292,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", @@ -6462,6 +7337,14 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/new-github-issue-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", + "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==", + "engines": { + "node": ">=10" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -6508,20 +7391,103 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/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, "engines": { "node": ">=0.10.0" } }, + "node_modules/npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/npm-packlist/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/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -6563,7 +7529,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" } @@ -6572,7 +7537,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6583,6 +7547,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6632,11 +7611,29 @@ "node": ">=0.10.0" } }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6651,7 +7648,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -6662,11 +7658,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -6693,7 +7714,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6719,7 +7739,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -6728,7 +7747,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" } @@ -6737,7 +7755,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6745,8 +7762,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -6782,16 +7798,95 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + }, + "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.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "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.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "4.0.1", @@ -6818,7 +7913,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -6830,7 +7924,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6843,7 +7936,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -6855,7 +7947,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -6870,7 +7961,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -6887,6 +7977,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", @@ -6965,16 +8090,38 @@ "node": ">=16.13" } }, + "node_modules/prisma-kysely": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/prisma-kysely/-/prisma-kysely-1.8.0.tgz", + "integrity": "sha512-VpNpolZ8RXRgfU+j4R+fPZmX8EE95w3vJ2tt7+FwuiQc0leNTfLK5QLf3KbbPDes2rfjh3g20AjDxefQIo5GIA==", + "dependencies": { + "@mrleebo/prisma-ast": "^0.7.0", + "@prisma/generator-helper": "5.3.1", + "@prisma/internals": "5.3.1", + "typescript": "^5.2.2", + "zod": "^3.22.2" + }, + "bin": { + "prisma-kysely": "dist/bin.js" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -7044,7 +8191,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -7097,6 +8243,100 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -7116,6 +8356,25 @@ "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.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.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", @@ -7145,6 +8404,11 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -7154,6 +8418,17 @@ "node": ">=0.10" } }, + "node_modules/replace-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", + "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7176,7 +8451,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7247,11 +8521,18 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7262,7 +8543,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -7277,7 +8557,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" @@ -7288,7 +8567,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7308,7 +8586,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" }, @@ -7329,7 +8606,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -7433,7 +8709,6 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -7530,7 +8805,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7542,7 +8816,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -7579,14 +8852,25 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { "node": ">=8" } @@ -7619,6 +8903,42 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "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", @@ -7692,7 +9012,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", @@ -7721,7 +9040,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" }, @@ -7755,11 +9073,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7828,11 +9156,22 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7874,6 +9213,86 @@ "node": ">=6" } }, + "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/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.31.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", @@ -8061,7 +9480,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -8213,6 +9631,11 @@ } } }, + "node_modules/ts-pattern": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", + "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" + }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -8309,7 +9732,6 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8332,14 +9754,23 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -8436,6 +9867,15 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -8580,7 +10020,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8635,8 +10074,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", @@ -8720,6421 +10158,106 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } }, - "@angular-devkit/core": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", - "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", - "dev": true, - "requires": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - } - }, - "@angular-devkit/schematics": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", - "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", - "dev": true, - "requires": { - "@angular-devkit/core": "17.3.8", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.8", - "ora": "5.4.1", - "rxjs": "7.8.1" - } - }, - "@angular-devkit/schematics-cli": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.3.8.tgz", - "integrity": "sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==", - "dev": true, - "requires": { - "@angular-devkit/core": "17.3.8", - "@angular-devkit/schematics": "17.3.8", - "ansi-colors": "4.1.3", - "inquirer": "9.2.15", - "symbol-observable": "4.0.0", - "yargs-parser": "21.1.1" - }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", "dependencies": { - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true - }, - "cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true - }, - "inquirer": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", - "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", - "dev": true, - "requires": { - "@ljharb/through": "^2.3.12", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^3.2.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - } - }, - "mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true - }, - "run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true - } - } - }, - "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", - "dev": true - }, - "@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">= 10" } }, - "@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@cspotcode/source-map-support": { - "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, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "brace-expansion": { - "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" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "minimatch": { - "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" - } - } - } - }, - "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "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" - } - }, - "minimatch": { - "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" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "brace-expansion": { - "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" - } - }, - "glob": { - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "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" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7" - } - }, - "@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==" - }, - "@nestjs/axios": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.2.tgz", - "integrity": "sha512-Z6GuOUdNQjP7FX+OuV2Ybyamse+/e0BFdTWBX5JxpBDKA+YkdLynDgG6HTF04zy6e9zPa19UX0WA2VDoehwhXQ==", - "requires": {} - }, - "@nestjs/cli": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.2.tgz", - "integrity": "sha512-fQexIfLHfp6GUgX+CO4fOg+AEwV5ox/LHotQhyZi9wXUQDyIqS0NTTbumr//62EcX35qV4nU0359nYnuEdzG+A==", - "dev": true, - "requires": { - "@angular-devkit/core": "17.3.8", - "@angular-devkit/schematics": "17.3.8", - "@angular-devkit/schematics-cli": "17.3.8", - "@nestjs/schematics": "^10.0.1", - "chalk": "4.1.2", - "chokidar": "3.6.0", - "cli-table3": "0.6.5", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.4.2", - "inquirer": "8.2.6", - "node-emoji": "1.11.0", - "ora": "5.4.1", - "tree-kill": "1.2.2", - "tsconfig-paths": "4.2.0", - "tsconfig-paths-webpack-plugin": "4.1.0", - "typescript": "5.3.3", - "webpack": "5.92.1", - "webpack-node-externals": "3.0.0" - }, - "dependencies": { - "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true - } - } - }, - "@nestjs/common": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.10.tgz", - "integrity": "sha512-H8k0jZtxk1IdtErGDmxFRy0PfcOAUg41Prrqpx76DQusGGJjsaovs1zjXVD1rZWaVYchfT1uczJ6L4Kio10VNg==", - "requires": { - "iterare": "1.2.1", - "tslib": "2.6.3", - "uid": "2.0.2" - } - }, - "@nestjs/config": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.2.3.tgz", - "integrity": "sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w==", - "requires": { - "dotenv": "16.4.5", - "dotenv-expand": "10.0.0", - "lodash": "4.17.21" - } - }, - "@nestjs/core": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.10.tgz", - "integrity": "sha512-ZbQ4jovQyzHtCGCrzK5NdtW1SYO2fHSsgSY1+/9WdruYCUra+JDkWEXgZ4M3Hv480Dl3OXehAmY1wCOojeMyMQ==", - "requires": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "3.2.0", - "tslib": "2.6.3", - "uid": "2.0.2" - } - }, - "@nestjs/event-emitter": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-2.0.4.tgz", - "integrity": "sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==", - "requires": { - "eventemitter2": "6.4.9" - } - }, - "@nestjs/platform-express": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.10.tgz", - "integrity": "sha512-wK2ow3CZI2KFqWeEpPmoR300OB6BcBLxARV1EiClJLCj4S1mZsoCmS0YWgpk3j1j6mo0SI8vNLi/cC2iZPEPQA==", - "requires": { - "body-parser": "1.20.2", - "cors": "2.8.5", - "express": "4.19.2", - "multer": "1.4.4-lts.1", - "tslib": "2.6.3" - } - }, - "@nestjs/schedule": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.1.0.tgz", - "integrity": "sha512-WEc96WTXZW+VI/Ng+uBpiBUwm6TWtAbQ4RKWkfbmzKvmbRGzA/9k/UyAWDS9k0pp+ZcbC+MaZQtt7TjQHrwX6g==", - "requires": { - "cron": "3.1.7", - "uuid": "10.0.0" - } - }, - "@nestjs/schematics": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.2.tgz", - "integrity": "sha512-S0bMtZM5U4mAiqkhRyZkXgjmOHBS5P/lp/vEydgMR4F7csOShc3jFeKVs1Eghd9xCFezGKy3SHy7hFT6dpPhWQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "17.3.8", - "@angular-devkit/schematics": "17.3.8", - "comment-json": "4.2.3", - "jsonc-parser": "3.3.1", - "pluralize": "8.0.0" - }, - "dependencies": { - "jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - } - } - }, - "@nestjs/testing": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.10.tgz", - "integrity": "sha512-i3HAtVQJijxNxJq1k39aelyJlyEIBRONys7IipH/4r8W0J+M1V+y5EKDOyi4j1SdNSb/vmNyWpZ2/ewZjl3kRA==", - "dev": true, - "requires": { - "tslib": "2.6.3" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true - }, - "@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", - "requires": {} - }, - "@prisma/debug": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", - "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", - "devOptional": true - }, - "@prisma/engines": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", - "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", - "devOptional": true, - "requires": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/fetch-engine": "5.16.2", - "@prisma/get-platform": "5.16.2" - } - }, - "@prisma/engines-version": { - "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", - "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", - "devOptional": true - }, - "@prisma/fetch-engine": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", - "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", - "devOptional": true, - "requires": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/get-platform": "5.16.2" - } - }, - "@prisma/get-platform": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", - "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", - "devOptional": true, - "requires": { - "@prisma/debug": "5.16.2" - } - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": 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 - }, - "@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 - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true - }, - "@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { + "node_modules/zip-stream/node_modules/archiver-utils": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/luxon": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", - "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==" - }, - "@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "@types/superagent": { - "version": "8.1.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.7.tgz", - "integrity": "sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==", - "dev": true, - "requires": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*" - } - }, - "@types/supertest": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", - "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", - "dev": true, - "requires": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" - } - }, - "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", - "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/type-utils": "7.16.0", - "@typescript-eslint/utils": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/typescript-estree": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", - "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", - "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.16.0", - "@typescript-eslint/utils": "7.16.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", - "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", - "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", - "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/typescript-estree": "7.16.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", - "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.16.0", - "eslint-visitor-keys": "^3.4.3" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true - }, - "acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "requires": { - "acorn": "^8.11.0" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "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 - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "dependencies": { - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - } - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": 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 - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "peer": true, - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "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 - }, - "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 - }, - "binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true - }, - "bl": { - "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", - "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==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "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" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "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-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001640", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", - "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", - "dev": true - }, - "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" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true - }, - "cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "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", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "wrap-ansi": { - "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", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "comment-json": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", - "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", - "dev": true, - "requires": { - "array-timsort": "^1.0.3", - "core-util-is": "^1.0.3", - "esprima": "^4.0.1", - "has-own-prop": "^2.0.0", - "repeat-string": "^1.6.1" - } - }, - "component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - } - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "create-require": { - "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 - }, - "cron": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.7.tgz", - "integrity": "sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==", - "requires": { - "@types/luxon": "~3.4.0", - "luxon": "~3.4.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==" - }, - "date-fns-tz": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.1.3.tgz", - "integrity": "sha512-ZfbMu+nbzW0mEzC8VZrLiSWvUIaI3aRHeq33mTe7Y38UctKukgqPR4nTDwcwS4d64Gf8GghnVsroBuMY3eiTeA==", - "requires": {} - }, - "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "requires": {} - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" - }, - "dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==" - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.820", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.820.tgz", - "integrity": "sha512-kK/4O/YunacfboFEk/BDf7VO1HoPmDudLTJAU9NmXIOSjsV7qVIX3OrI4REZo0VmdqhcpUcncQc6N8Q3aEXlHg==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "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 - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "brace-expansion": { - "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" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "minimatch": { - "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" - } - } - } - }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "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 - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "peer": true - }, - "foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - } - }, - "fork-ts-checker-webpack-plugin": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", - "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^8.2.0", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "dependencies": { - "brace-expansion": { - "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" - } - }, - "minimatch": { - "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" - } - } - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", - "dev": true, - "requires": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { + "glob": "^7.2.3", "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.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": "^3.6.0" + }, + "engines": { + "node": ">= 10" } }, - "fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true - }, - "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 - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "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 - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "node_modules/zip-stream/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "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.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "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-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "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": { + "node_modules/zip-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "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.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "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-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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 - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "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-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "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-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 - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "path-is-absolute": "^1.0.0" }, - "dependencies": { - "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 - } - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" - }, - "jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "engines": { + "node": "*" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/zip-stream/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "brace-expansion": { - "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" - } - }, - "glob": { - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "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" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "brace-expansion": "^1.1.7" }, - "dependencies": { - "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 - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } + "engines": { + "node": "*" } }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "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" }, - "dependencies": { - "brace-expansion": { - "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" - } - }, - "glob": { - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "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" - } - } + "engines": { + "node": ">= 6" } }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "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" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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 - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" - }, - "magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.4" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "dependencies": { - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "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 - }, - "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" - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "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 - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "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" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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 - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.2.tgz", - "integrity": "sha512-voV4dDrdVZVNz84n39LFKDaRzfwhdzJ7akpyXfTMxCgRUp07U3lcJUXRlhTKP17rgt09sUzLi5iCitpEAr+6ug==", - "dev": true - } - } - }, - "path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "picomatch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", - "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", - "devOptional": true, - "requires": { - "@prisma/engines": "5.16.2" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "peer": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - }, - "dependencies": { - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - } - } - }, - "reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "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 - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "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 - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "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" - }, - "dependencies": { - "brace-expansion": { - "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" - } - }, - "glob": { - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "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" - } - } - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "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", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@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", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "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" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@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" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "superagent": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", - "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^3.5.1", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0" - }, - "dependencies": { - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - } - } - }, - "supertest": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", - "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^9.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true - }, - "synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "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" - } - }, - "glob": { - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "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" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "requires": {} - }, - "ts-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.0.tgz", - "integrity": "sha512-eFmkE9MG0+oT6nqSOcUwL+2UUmK2IvhhUV8hFDsCHnc++v2WCCbQQZh5vvjsa8sgOY/g9T0325hmkEmi6rninA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - } - }, - "ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "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-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "dev": true - }, - "uid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", - "requires": { - "@lukeed/csprng": "^1.0.0" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" - }, - "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 - }, - "v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@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", - "strip-ansi": "^6.0.0" - } - }, - "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 - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "dependencies": { - "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 - } - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "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 - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff --git a/service/data-hub/data-connector/package.json b/service/data-hub/data-connector/package.json index a0b4857..8289a40 100644 --- a/service/data-hub/data-connector/package.json +++ b/service/data-hub/data-connector/package.json @@ -19,6 +19,9 @@ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" }, + "prisma": { + "seed": "ts-node prisma/seed/seed.ts" + }, "dependencies": { "@nestjs/axios": "^3.0.2", "@nestjs/common": "^10.0.0", @@ -30,6 +33,9 @@ "@prisma/client": "^5.16.2", "date-fns": "^3.6.0", "date-fns-tz": "^3.1.3", + "kysely": "^0.27.4", + "pg": "^8.12.0", + "prisma-kysely": "^1.8.0", "reflect-metadata": "^0.2.0", "rxjs": "^7.8.1" }, diff --git a/service/data-hub/data-connector/prisma/migrations/20240715105118_business_models/migration.sql b/service/data-hub/data-connector/prisma/migrations/20240715105118_business_models/migration.sql new file mode 100644 index 0000000..39eeab4 --- /dev/null +++ b/service/data-hub/data-connector/prisma/migrations/20240715105118_business_models/migration.sql @@ -0,0 +1,184 @@ +/* + Warnings: + + - You are about to drop the `EmployeeStaging` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- CreateEnum +CREATE TYPE "CostTypeVariant" AS ENUM ('NACHTZUSCHLAG', 'WOCHENENDZUSCHLAG', 'FEIERTAGSZUSCHLAG', 'DESINFEKTIONSZUSCHLAG', 'KILOMETERZUSCHLAG', 'FAHRZEUGZUSCHLAG', 'TSWDIFFERENZIERUNG', 'GRUNDPREIS'); + +-- DropTable +DROP TABLE "EmployeeStaging"; + +-- CreateTable +CREATE TABLE "EmployeeDyflexisStaging" ( + "internalId" UUID NOT NULL DEFAULT gen_random_uuid(), + "id" INTEGER NOT NULL, + "firstname" TEXT NOT NULL, + "surname" TEXT NOT NULL, + "contractStart" TIMESTAMP(3) NOT NULL, + "contractEnd" TIMESTAMP(3) NOT NULL, + "contractHoursWeek" DOUBLE PRECISION NOT NULL, + "contractSalaryHour" DOUBLE PRECISION NOT NULL, + + CONSTRAINT "EmployeeDyflexisStaging_pkey" PRIMARY KEY ("internalId") +); + +-- CreateTable +CREATE TABLE "EmployeeDispoLiveStaging" ( + "internalId" UUID NOT NULL DEFAULT gen_random_uuid(), + "id" TEXT NOT NULL, + "name" TEXT, + "surname" TEXT, + "personnelNumber" TEXT, + "qualification" TEXT, + "personTransportCertificate" TIMESTAMP(3), + + CONSTRAINT "EmployeeDispoLiveStaging_pkey" PRIMARY KEY ("internalId") +); + +-- CreateTable +CREATE TABLE "Employee" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "surname" TEXT NOT NULL, + "personnelNumber" TEXT, + "mobile" TEXT, + "qualification" TEXT, + "occuptationalHealthExamination" TIMESTAMP(3), + "personTransportCertificate" TIMESTAMP(3), + + CONSTRAINT "Employee_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DyflexisEmployee" ( + "id" INTEGER NOT NULL, + "firstname" TEXT NOT NULL, + "surname" TEXT NOT NULL, + "contractStart" TIMESTAMP(3) NOT NULL, + "contractEnd" TIMESTAMP(3), + "contractHoursWeek" DOUBLE PRECISION NOT NULL, + "contractSalaryHour" INTEGER NOT NULL, + + CONSTRAINT "DyflexisEmployee_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AvicennaTenant" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "healthInsuranceNumber" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "AvicennaTenant_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TariffGroup" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "description" TEXT NOT NULL, + "ordinanceType" TEXT NOT NULL, + + CONSTRAINT "TariffGroup_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Tariff" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "validFrom" TIMESTAMP(3), + "validTo" TIMESTAMP(3), + "tariffGroupId" UUID, + + CONSTRAINT "Tariff_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CostType" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "description" TEXT NOT NULL, + "variant" "CostTypeVariant" NOT NULL, + "costAmount" INTEGER NOT NULL, + "timeRange" TEXT, + "kmInclusive" INTEGER, + "excludeCarNames" TEXT[], + "infectionType" TEXT, + "tariffId" UUID +); + +-- CreateTable +CREATE TABLE "Trace" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "type" TEXT NOT NULL, + "entityKey" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Trace_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Anomaly" ( + "id" TEXT NOT NULL, + "type" TEXT NOT NULL, + "description" TEXT NOT NULL, + "groupKey" TEXT NOT NULL, + "groupDescription" TEXT NOT NULL, + "workedOnBy" TEXT NOT NULL, + "sleepTimer" INTEGER NOT NULL, + "sleepSince" TIMESTAMP(3), + "resolvedAt" TIMESTAMP(3), + "manuallyResolved" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Anomaly_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SolutionTarget" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "name" TEXT NOT NULL, + "anomalyId" TEXT, + + CONSTRAINT "SolutionTarget_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SolutionTargetStep" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "description" TEXT NOT NULL, + "solutionTargetId" UUID, + + CONSTRAINT "SolutionTargetStep_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_AvicennaTenantToTariffGroup" ( + "A" UUID NOT NULL, + "B" UUID NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "CostType_id_key" ON "CostType"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "_AvicennaTenantToTariffGroup_AB_unique" ON "_AvicennaTenantToTariffGroup"("A", "B"); + +-- CreateIndex +CREATE INDEX "_AvicennaTenantToTariffGroup_B_index" ON "_AvicennaTenantToTariffGroup"("B"); + +-- AddForeignKey +ALTER TABLE "Tariff" ADD CONSTRAINT "Tariff_tariffGroupId_fkey" FOREIGN KEY ("tariffGroupId") REFERENCES "TariffGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CostType" ADD CONSTRAINT "CostType_tariffId_fkey" FOREIGN KEY ("tariffId") REFERENCES "Tariff"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SolutionTarget" ADD CONSTRAINT "SolutionTarget_anomalyId_fkey" FOREIGN KEY ("anomalyId") REFERENCES "Anomaly"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SolutionTargetStep" ADD CONSTRAINT "SolutionTargetStep_solutionTargetId_fkey" FOREIGN KEY ("solutionTargetId") REFERENCES "SolutionTarget"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_AvicennaTenantToTariffGroup" ADD CONSTRAINT "_AvicennaTenantToTariffGroup_A_fkey" FOREIGN KEY ("A") REFERENCES "AvicennaTenant"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_AvicennaTenantToTariffGroup" ADD CONSTRAINT "_AvicennaTenantToTariffGroup_B_fkey" FOREIGN KEY ("B") REFERENCES "TariffGroup"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/service/data-hub/data-connector/prisma/schema.prisma b/service/data-hub/data-connector/prisma/schema.prisma index a150860..ad96c8c 100644 --- a/service/data-hub/data-connector/prisma/schema.prisma +++ b/service/data-hub/data-connector/prisma/schema.prisma @@ -6,7 +6,15 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["postgresqlExtensions", "fieldReference"] + previewFeatures = ["postgresqlExtensions"] +} + +generator kysely { + provider = "prisma-kysely" + previewFeatures = ["postgresqlExtensions"] + + output = "../libs/api/data-access-database/src/lib" + fileName = "types.ts" } datasource db { @@ -303,18 +311,27 @@ model WorkTimeStaging { endDate DateTime } -model EmployeeStaging { +model EmployeeDyflexisStaging { internalId String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid - id Int - firstname String - surname String - contractStart DateTime - contractEnd DateTime - contractHoursWeek Float - contractSalaryHour Float - personTransportCertificate DateTime? - qualification String? + id Int + firstname String + surname String + contractStart DateTime + contractEnd DateTime + contractHoursWeek Float + contractSalaryHour Float +} + +model EmployeeDispoLiveStaging { + internalId String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + + id String + name String? + surname String? + personnelNumber String? // Personal ID aus Dyflexis + qualification String? // ID + personTransportCertificate DateTime? // yyyy-MM-dd } model Tour { @@ -478,3 +495,114 @@ model PlannedTime { duration Int note String? } + +model Employee { + id String @id + name String + surname String + personnelNumber String? + mobile String? + qualification String? + occuptationalHealthExamination DateTime? + personTransportCertificate DateTime? +} + +model DyflexisEmployee { + id Int @id + firstname String + surname String + contractStart DateTime + contractEnd DateTime? + contractHoursWeek Float + contractSalaryHour Int +} + +enum CostTypeVariant { + NACHTZUSCHLAG + WOCHENENDZUSCHLAG + FEIERTAGSZUSCHLAG + DESINFEKTIONSZUSCHLAG + KILOMETERZUSCHLAG + FAHRZEUGZUSCHLAG + TSWDIFFERENZIERUNG + GRUNDPREIS +} + +model AvicennaTenant { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + healthInsuranceNumber String + name String + + tariffGroups TariffGroup[] +} + +model TariffGroup { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + description String + ordinanceType String + + tenants AvicennaTenant[] + tariffs Tariff[] +} + +model Tariff { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + validFrom DateTime? + validTo DateTime? + + costTypes CostType[] + tariffGroup TariffGroup? @relation(fields: [tariffGroupId], references: [id]) + tariffGroupId String? @db.Uuid +} + +model CostType { + id String @unique @default(dbgenerated("gen_random_uuid()")) @db.Uuid + description String + variant CostTypeVariant + costAmount Int + timeRange String? + kmInclusive Int? + excludeCarNames String[] + infectionType String? + + tariff Tariff? @relation(fields: [tariffId], references: [id]) + tariffId String? @db.Uuid +} + +model Trace { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + type String + entityKey String + + createdAt DateTime @default(now()) +} + +model Anomaly { + id String @id + type String + description String + groupKey String + groupDescription String + workedOnBy String + sleepTimer Int + sleepSince DateTime? + solution SolutionTarget[] @relation() + resolvedAt DateTime? + manuallyResolved Boolean @default(false) + createdAt DateTime @default(now()) +} + +model SolutionTarget { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + name String + steps SolutionTargetStep[] @relation() + anomaly Anomaly? @relation(fields: [anomalyId], references: [id]) + anomalyId String? +} + +model SolutionTargetStep { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + description String + solutionTarget SolutionTarget? @relation(fields: [solutionTargetId], references: [id]) + solutionTargetId String? @db.Uuid +} diff --git a/service/data-hub/data-connector/prisma/seed/seed.ts b/service/data-hub/data-connector/prisma/seed/seed.ts new file mode 100644 index 0000000..76f0962 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/seed.ts @@ -0,0 +1,1747 @@ +import { PrismaClient } from '@prisma/client'; +import { BTW_AOK_TARIFFS } from './tariffs/btw-aok'; +import { BTW_DAK_VDEK_TARIFFS } from './tariffs/btw-dak-vdek'; +import { BTW_PRIVAT_TARIFFS } from './tariffs/btw-privat'; +import { KTW_AOK_TARIFFS } from './tariffs/ktw-aok'; +import { KTW_DAK_TARIFFS } from './tariffs/ktw-dak'; +import { KTW_PRIVAT_TARIFFS } from './tariffs/ktw-privat'; +import { KTW_VDEK_TARIFFS } from './tariffs/ktw-vdek'; +import { TSW_AOK_TARIFFS } from './tariffs/tsw-aok'; +import { TSW_DAK_VDEK_TARIFFS } from './tariffs/tsw-dak-vdek'; +import { TSW_PRIVAT_TARIFFS } from './tariffs/tsw-privat'; + +const TARIFF_GROUPS = [ + { + id: 1, + ordinanceType: 'KTW', + description: 'DAK KTW', + }, + { + id: 2, + ordinanceType: 'KTW', + description: 'VDEK KTW', + }, + { + id: 3, + ordinanceType: 'KTW', + description: 'AOK/BKK/IKK/Knappschaft KTW', + }, + { + id: 4, + ordinanceType: 'KTW', + description: 'Privat KTW', + }, + { + id: 5, + ordinanceType: 'TSW', + description: 'DAK + VDEK TSW', + }, + { + id: 6, + ordinanceType: 'TSW', + description: 'AOK/BKK/IKK/Knappschaft TSW', + }, + { + id: 7, + ordinanceType: 'TSW', + description: 'Privat TSW', + }, + { + id: 8, + ordinanceType: 'BTW', + description: 'DAK + VDEK BTW', + }, + { + id: 9, + ordinanceType: 'BTW', + description: 'AOK/BKK/IKK/Knappschaft BTW', + }, + { + id: 10, + ordinanceType: 'BTW', + description: 'Privat BTW', + }, +]; + +const TARIFFS = [ + ...KTW_DAK_TARIFFS, + ...KTW_VDEK_TARIFFS, + ...KTW_AOK_TARIFFS, + ...KTW_PRIVAT_TARIFFS, + ...TSW_DAK_VDEK_TARIFFS, + ...TSW_AOK_TARIFFS, + ...TSW_PRIVAT_TARIFFS, + ...BTW_DAK_VDEK_TARIFFS, + ...BTW_AOK_TARIFFS, + ...BTW_PRIVAT_TARIFFS, +]; + +const prisma = new PrismaClient(); + +async function main() { + await Promise.all([ + prisma.avicennaTenant.deleteMany(), + prisma.tariffGroup.deleteMany(), + prisma.tariff.deleteMany(), + prisma.costType.deleteMany(), + ]); + for (const tariffGroup of TARIFF_GROUPS) { + await prisma.tariffGroup.create({ + data: { + ordinanceType: tariffGroup.ordinanceType, + description: tariffGroup.description, + }, + }); + } + + for (const tariff of TARIFFS) { + const { description, costTypes, ...tariffData } = tariff; + const tariffGroup = await prisma.tariffGroup.findFirst({ + where: { description: tariff.description }, + }); + await prisma.tariff.create({ + data: { + ...tariffData, + costTypes: { + create: costTypes, + }, + tariffGroup: { + connect: { + id: tariffGroup?.id, + }, + }, + }, + }); + } + + for (const tenant of TENANTS) { + const tariffs = await Promise.all( + tenant.tariffs.split(',').map((id) => { + const tariff = TARIFF_GROUPS.find((t) => t.id === +id); + return prisma.tariffGroup.findFirst({ + where: { + description: tariff?.description, + }, + }); + }) + ); + await prisma.avicennaTenant.create({ + data: { + healthInsuranceNumber: `${tenant.ktnr}`, + name: tenant.name, + tariffGroups: { + connect: tariffs.map((t) => ({ id: t?.id })), + }, + }, + include: { + tariffGroups: true, + }, + }); + } +} + +main() + .then(async () => await prisma.$disconnect()) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); + +const TENANTS = [ + { + ktnr: 108018007, + name: 'AOK - BADEN-WÜRTEMBERG', + tariffs: '9,6,3', + }, + { + ktnr: 108910473, + name: 'AOK BAYERN', + tariffs: '9,6,3', + }, + { + ktnr: 108310400, + name: 'AOK BAYERN', + tariffs: '9,6,3', + }, + { + ktnr: 103119199, + name: 'AOK BREMEN/BREMERHAVEN', + tariffs: '9,6,3', + }, + { + ktnr: 107815772, + name: 'AOK Baden - Württemberg', + tariffs: '9,6,3', + }, + { + ktnr: 105313145, + name: 'AOK HESSEN', + tariffs: '9,6,3', + }, + { + ktnr: 102114819, + name: 'AOK NIEDERSACHSEN', + tariffs: '9,6,3', + }, + { + ktnr: 100395611, + name: 'AOK NORDOST', + tariffs: '9,6,3', + }, + { + ktnr: 109519016, + name: 'AOK NORDOST', + tariffs: '9,6,3', + }, + { + ktnr: 109519005, + name: 'AOK NORDOST Berlin', + tariffs: '9,6,3', + }, + { + ktnr: 100696012, + name: 'AOK NORDOST Brandenburg', + tariffs: '9,6,3', + }, + { + ktnr: 101317004, + name: 'AOK NORDWEST', + tariffs: '9,6,3', + }, + { + ktnr: 103411401, + name: 'AOK NORDWEST', + tariffs: '9,6,3', + }, + { + ktnr: 107299005, + name: 'AOK PLUS', + tariffs: '9,6,3', + }, + { + ktnr: 105998018, + name: 'AOK PLUS Thüringen', + tariffs: '9,6,3', + }, + { + ktnr: 104212505, + name: 'AOK RHEINLAND / HAMBURG', + tariffs: '9,6,3', + }, + { + ktnr: 107310373, + name: 'AOK RHEINLAND PFALZ/SAARLAND', + tariffs: '9,6,3', + }, + { + ktnr: 109319309, + name: 'AOK RHEINLAND-PFALZ/SAARLAND', + tariffs: '9,6,3', + }, + { + ktnr: 104212516, + name: 'AOK RHEINLAND/HAMBURG', + tariffs: '9,6,3', + }, + { + ktnr: 101519213, + name: 'AOK RHEINLAND/HAMBURG', + tariffs: '9,6,3', + }, + { + ktnr: 101097008, + name: 'AOK SACHSEN-ANHALT', + tariffs: '9,6,3', + }, + { + ktnr: 103121013, + name: 'ATLAS BKK AHLMANN', + tariffs: '9,6,3', + }, + { + ktnr: 108534160, + name: 'AUDI BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108837428, + name: 'AUDI BKK', + tariffs: '9,6,3', + }, + { + ktnr: 109920569, + name: 'BAHN-BKK', + tariffs: '9,6,3', + }, + { + ktnr: 109938503, + name: 'BAHN-BKK', + tariffs: '9,6,3', + }, + { + ktnr: 104940005, + name: 'BARMER GEK', + tariffs: '5,8,2', + }, + { + ktnr: 103725342, + name: 'BERTELSMANN BKK', + tariffs: '9,6,3', + }, + { + ktnr: 103720893, + name: 'BERTELSMANN BKK/OST', + tariffs: '9,6,3', + }, + { + ktnr: 20355700, + name: 'BG Bau Hamburg', + tariffs: '4,7,10', + }, + { + ktnr: 22089700, + name: 'BG Gesundheit und Wohlfahrtspflege', + tariffs: '4,7,10', + }, + { + ktnr: 22767700, + name: 'BG Handel und Warendistribution Hamburg', + tariffs: '4,7,10', + }, + { + ktnr: 103501091, + name: 'BIG DIREKT GESUND', + tariffs: '9,6,3', + }, + { + ktnr: 103501080, + name: 'BIG DIREKT GESUND', + tariffs: '9,6,3', + }, + { + ktnr: 102122660, + name: 'BKK 24', + tariffs: '9,6,3', + }, + { + ktnr: 102732316, + name: 'BKK 24 OST', + tariffs: '9,6,3', + }, + { + ktnr: 108732171, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 108591503, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 108739441, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 108729018, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 108591499, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 108734355, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 108732525, + name: 'BKK A.T.U', + tariffs: '9,6,3', + }, + { + ktnr: 103525909, + name: 'BKK ACHENBACH BUSCHHÜTTEN', + tariffs: '9,6,3', + }, + { + ktnr: 108029306, + name: 'BKK ADVITA', + tariffs: '9,6,3', + }, + { + ktnr: 108031297, + name: 'BKK ADVITA', + tariffs: '9,6,3', + }, + { + ktnr: 107536171, + name: 'BKK AESCULAP', + tariffs: '9,6,3', + }, + { + ktnr: 108833355, + name: 'BKK AKZO NOBEL -BAYERN-', + tariffs: '9,6,3', + }, + { + ktnr: 104626889, + name: 'BKK BASELL', + tariffs: '9,6,3', + }, + { + ktnr: 101532301, + name: 'BKK BEIERSDORF', + tariffs: '9,6,3', + }, + { + ktnr: 109021685, + name: 'BKK BMW -OST-', + tariffs: '9,6,3', + }, + { + ktnr: 109034270, + name: 'BKK BMW ZENTRALE', + tariffs: '9,6,3', + }, + { + ktnr: 104626903, + name: 'BKK BPW BERGISCHE ACHSEN KG', + tariffs: '9,6,3', + }, + { + ktnr: 105530422, + name: 'BKK BRAUN MELSUNGEN', + tariffs: '9,6,3', + }, + { + ktnr: 105330157, + name: 'BKK BRAUN-GILLETTE', + tariffs: '9,6,3', + }, + { + ktnr: 105328415, + name: 'BKK BRAUN-GILLETTE / OST', + tariffs: '9,6,3', + }, + { + ktnr: 104424794, + name: 'BKK DEMAG KRAUSS-MAFFEI', + tariffs: '9,6,3', + }, + { + ktnr: 104428480, + name: 'BKK DEMAG KRAUSS-MAFFEI/OST', + tariffs: '9,6,3', + }, + { + ktnr: 104224634, + name: 'BKK DER DEUTSCHEN BANK AG', + tariffs: '9,6,3', + }, + { + ktnr: 104220878, + name: 'BKK DER DEUTSCHEN BANK AG/OST', + tariffs: '9,6,3', + }, + { + ktnr: 105928809, + name: 'BKK DER THÜRINGER ENERGIEVERS.', + tariffs: '9,6,3', + }, + { + ktnr: 103724294, + name: 'BKK DIAKONIE', + tariffs: '9,6,3', + }, + { + ktnr: 103729701, + name: 'BKK DIAKONIE/OST', + tariffs: '9,6,3', + }, + { + ktnr: 104926702, + name: 'BKK DIE BERGISCHE KRANKENKASSE', + tariffs: '9,6,3', + }, + { + ktnr: 101523297, + name: 'BKK DIE CONTINENTALE', + tariffs: '9,6,3', + }, + { + ktnr: 103724249, + name: 'BKK DÜRKOPP ADLER', + tariffs: '9,6,3', + }, + { + ktnr: 105732324, + name: 'BKK ERNST & YOUNG', + tariffs: '9,6,3', + }, + { + ktnr: 107531405, + name: 'BKK ESSANELLE', + tariffs: '9,6,3', + }, + { + ktnr: 109129662, + name: 'BKK ESSANELLE', + tariffs: '9,6,3', + }, + { + ktnr: 109139915, + name: 'BKK ESSANELLE', + tariffs: '9,6,3', + }, + { + ktnr: 109139926, + name: 'BKK ESSANELLE OST', + tariffs: '9,6,3', + }, + { + ktnr: 104125509, + name: 'BKK EUREGIO', + tariffs: '9,6,3', + }, + { + ktnr: 102429648, + name: 'BKK EWE', + tariffs: '9,6,3', + }, + { + ktnr: 102429659, + name: 'BKK EWE/OST', + tariffs: '9,6,3', + }, + { + ktnr: 102131320, + name: 'BKK EXKLUSIV OST', + tariffs: '9,6,3', + }, + { + ktnr: 102122557, + name: 'BKK EXKLUSIV WEST', + tariffs: '9,6,3', + }, + { + ktnr: 109033393, + name: 'BKK FABER-CASTELL & PARTNER', + tariffs: '9,6,3', + }, + { + ktnr: 105830539, + name: 'BKK FAMILY', + tariffs: '9,6,3', + }, + { + ktnr: 103121137, + name: 'BKK FIRMUS', + tariffs: '9,6,3', + }, + { + ktnr: 102529638, + name: 'BKK FIRMUS', + tariffs: '9,6,3', + }, + { + ktnr: 107036370, + name: 'BKK FREUDENBERG', + tariffs: '9,6,3', + }, + { + ktnr: 103724272, + name: 'BKK GILDEMEISTER SEIDENSTICKER', + tariffs: '9,6,3', + }, + { + ktnr: 103791489, + name: 'BKK GILDEMEISTER SEIDENSTICKER', + tariffs: '9,6,3', + }, + { + ktnr: 103726092, + name: 'BKK GILDEMEISTER SEIDENSTICKER', + tariffs: '9,6,3', + }, + { + ktnr: 104424830, + name: 'BKK GRILLO-WERKE AG', + tariffs: '9,6,3', + }, + { + ktnr: 107835071, + name: 'BKK GROZ-BECKERT', + tariffs: '9,6,3', + }, + { + ktnr: 105230101, + name: 'BKK HEAG', + tariffs: '9,6,3', + }, + { + ktnr: 105530364, + name: 'BKK HENSCHEL PLUS', + tariffs: '9,6,3', + }, + { + ktnr: 103725547, + name: 'BKK HERFORD MINDEN RAVENSBERG', + tariffs: '9,6,3', + }, + { + ktnr: 105530331, + name: 'BKK HERKULES', + tariffs: '9,6,3', + }, + { + ktnr: 105330431, + name: 'BKK KARL MAYER', + tariffs: '9,6,3', + }, + { + ktnr: 108633433, + name: 'BKK KASSANA', + tariffs: '9,6,3', + }, + { + ktnr: 108831386, + name: 'BKK KBA', + tariffs: '9,6,3', + }, + { + ktnr: 108891608, + name: 'BKK KBA', + tariffs: '9,6,3', + }, + { + ktnr: 108833674, + name: 'BKK KBA', + tariffs: '9,6,3', + }, + { + ktnr: 106331593, + name: 'BKK KEVAG', + tariffs: '9,6,3', + }, + { + ktnr: 108934142, + name: 'BKK KRONES', + tariffs: '9,6,3', + }, + { + ktnr: 107335009, + name: 'BKK LANDESBERBAND SÜD', + tariffs: '9,6,3', + }, + { + ktnr: 108332509, + name: 'BKK LANDESVERBAND BAYERN', + tariffs: '9,6,3', + }, + { + ktnr: 109538008, + name: 'BKK LANDESVERBAND MITTE', + tariffs: '9,6,3', + }, + { + ktnr: 105130008, + name: 'BKK LANDESVERBAND SÜD', + tariffs: '9,6,3', + }, + { + ktnr: 105830517, + name: 'BKK LINDE', + tariffs: '9,6,3', + }, + { + ktnr: 105821242, + name: 'BKK LINDE / OST', + tariffs: '9,6,3', + }, + { + ktnr: 108036145, + name: 'BKK MAHLE', + tariffs: '9,6,3', + }, + { + ktnr: 107923192, + name: 'BKK MEDICUS OST', + tariffs: '9,6,3', + }, + { + ktnr: 107934550, + name: 'BKK MEDICUS WEST', + tariffs: '9,6,3', + }, + { + ktnr: 102822634, + name: 'BKK MELITTA PLUS', + tariffs: '9,6,3', + }, + { + ktnr: 103726081, + name: 'BKK MELITTA PLUS', + tariffs: '9,6,3', + }, + { + ktnr: 106020600, + name: 'BKK MEM', + tariffs: '9,6,3', + }, + { + ktnr: 105230076, + name: 'BKK MERCK', + tariffs: '9,6,3', + }, + { + ktnr: 103723317, + name: 'BKK MIELE', + tariffs: '9,6,3', + }, + { + ktnr: 108737074, + name: 'BKK MIELE', + tariffs: '9,6,3', + }, + { + ktnr: 103725364, + name: 'BKK MIELE', + tariffs: '9,6,3', + }, + { + ktnr: 101520078, + name: 'BKK MOBIL', + tariffs: '9,6,3', + }, + { + ktnr: 107835333, + name: 'BKK MTU FRIEDRICHSHAFEN GMBH', + tariffs: '9,6,3', + }, + { + ktnr: 106431572, + name: 'BKK PFAFF', + tariffs: '9,6,3', + }, + { + ktnr: 106420977, + name: 'BKK PFAFF/OST', + tariffs: '9,6,3', + }, + { + ktnr: 106423630, + name: 'BKK PFALZ', + tariffs: '9,6,3', + }, + { + ktnr: 106431663, + name: 'BKK PFALZ', + tariffs: '9,6,3', + }, + { + ktnr: 106431652, + name: 'BKK PFALZ', + tariffs: '9,6,3', + }, + { + ktnr: 106437453, + name: 'BKK PFALZ', + tariffs: '9,6,3', + }, + { + ktnr: 107835743, + name: 'BKK PFALZ', + tariffs: '9,6,3', + }, + { + ktnr: 101931440, + name: 'BKK PUBLIK', + tariffs: '9,6,3', + }, + { + ktnr: 105792190, + name: 'BKK PWC', + tariffs: '9,6,3', + }, + { + ktnr: 105723301, + name: 'BKK PWC', + tariffs: '9,6,3', + }, + { + ktnr: 108591499, + name: 'BKK Provita', + tariffs: '9,6,3', + }, + { + ktnr: 105823051, + name: 'BKK R + V / OST', + tariffs: '9,6,3', + }, + { + ktnr: 105823040, + name: 'BKK R+V', + tariffs: '9,6,3', + }, + { + ktnr: 107532042, + name: 'BKK RIEKER RICOSTA WEISSER', + tariffs: '9,6,3', + }, + { + ktnr: 102131240, + name: 'BKK RWE', + tariffs: '9,6,3', + }, + { + ktnr: 101922757, + name: 'BKK SALZGITTER', + tariffs: '9,6,3', + }, + { + ktnr: 108736814, + name: 'BKK SALZGITTER', + tariffs: '9,6,3', + }, + { + ktnr: 101921814, + name: 'BKK SALZGITTER/OST', + tariffs: '9,6,3', + }, + { + ktnr: 108035576, + name: 'BKK SCHEUFELEN', + tariffs: '9,6,3', + }, + { + ktnr: 107531187, + name: 'BKK SCHWARZWALD-BAAR-HEUBERG', + tariffs: '9,6,3', + }, + { + ktnr: 109132678, + name: 'BKK STADT AUGSBURG', + tariffs: '9,6,3', + }, + { + ktnr: 108538051, + name: 'BKK STADT AUGSBURG', + tariffs: '9,6,3', + }, + { + ktnr: 102031410, + name: 'BKK TECHNOFORM', + tariffs: '9,6,3', + }, + { + ktnr: 108632900, + name: 'BKK TEXTILGRUPPE HOF', + tariffs: '9,6,3', + }, + { + ktnr: 102137985, + name: 'BKK TUI', + tariffs: '9,6,3', + }, + { + ktnr: 109723913, + name: 'BKK VBU', + tariffs: '9,6,3', + }, + { + ktnr: 109737010, + name: 'BKK VBU', + tariffs: '9,6,3', + }, + { + ktnr: 103526615, + name: 'BKK VDN', + tariffs: '9,6,3', + }, + { + ktnr: 103532065, + name: 'BKK VDN/OST', + tariffs: '9,6,3', + }, + { + ktnr: 107832012, + name: 'BKK VERBUNDPLUS', + tariffs: '9,6,3', + }, + { + ktnr: 107832023, + name: 'BKK VERBUNDPLUS', + tariffs: '9,6,3', + }, + { + ktnr: 104229606, + name: 'BKK VICTORIA - D.A.S.', + tariffs: '9,6,3', + }, + { + ktnr: 109531476, + name: 'BKK VICTORIA - D.A.S.', + tariffs: '9,6,3', + }, + { + ktnr: 104229582, + name: 'BKK VICTORIA - D.A.S. (OST)', + tariffs: '9,6,3', + }, + { + ktnr: 106432038, + name: 'BKK VITAL', + tariffs: '9,6,3', + }, + { + ktnr: 103525954, + name: 'BKK VOR ORT', + tariffs: '9,6,3', + }, + { + ktnr: 104526376, + name: 'BKK VOR ORT', + tariffs: '9,6,3', + }, + { + ktnr: 104529255, + name: 'BKK VOR ORT OST', + tariffs: '9,6,3', + }, + { + ktnr: 108031424, + name: 'BKK VORALB HELLER LEUZE TRAUB', + tariffs: '9,6,3', + }, + { + ktnr: 105530126, + name: 'BKK WERRA-MEISSNER', + tariffs: '9,6,3', + }, + { + ktnr: 107839894, + name: 'BKK WIELAND', + tariffs: '9,6,3', + }, + { + ktnr: 107836243, + name: 'BKK WIELAND', + tariffs: '9,6,3', + }, + { + ktnr: 109139904, + name: 'BKK WIELAND', + tariffs: '9,6,3', + }, + { + ktnr: 105734543, + name: 'BKK WIRTSCHAFT UND FINANZEN', + tariffs: '9,6,3', + }, + { + ktnr: 105792123, + name: 'BKK WIRTSCHAFT UND FINANZEN', + tariffs: '9,6,3', + }, + { + ktnr: 108036577, + name: 'BKK WÜRTH', + tariffs: '9,6,3', + }, + { + ktnr: 108023140, + name: 'BKK WÜRTH / OST', + tariffs: '9,6,3', + }, + { + ktnr: 107829563, + name: 'BKK ZF & PARTNER', + tariffs: '9,6,3', + }, + { + ktnr: 106329862, + name: 'BKK ZF & PARTNER', + tariffs: '9,6,3', + }, + { + ktnr: 106329793, + name: 'BKK ZF & PARTNER', + tariffs: '9,6,3', + }, + { + ktnr: 109331908, + name: 'BKK ZF & PARTNER', + tariffs: '9,6,3', + }, + { + ktnr: 107829574, + name: 'BKK ZF & PARTNER OST', + tariffs: '9,6,3', + }, + { + ktnr: 108036123, + name: 'BOSCH BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108023388, + name: 'BOSCH BKK', + tariffs: '9,6,3', + }, + { + ktnr: 100820488, + name: 'BRANDENBURGISCHE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 103523440, + name: 'CONTINENTALE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 103523565, + name: 'CONTINENTALE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108030775, + name: 'DAIMLER BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108038078, + name: 'DAIMLER BKK OST', + tariffs: '9,6,3', + }, + { + ktnr: 101560000, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 104124029, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 101520103, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 104131368, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 107135212, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 105830016, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 105836717, + name: 'DAK GESUNDHEIT', + tariffs: '1,5,8', + }, + { + ktnr: 106329225, + name: 'DEBEKA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 106329236, + name: 'DEBEKA BKK OST', + tariffs: '9,6,3', + }, + { + ktnr: 109939003, + name: 'DEUTSCHE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 109921296, + name: 'DEUTSCHE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 104525057, + name: 'E.ON BKK', + tariffs: '9,6,3', + }, + { + ktnr: 102129930, + name: 'ENERGIE-BKK', + tariffs: '9,6,3', + }, + { + ktnr: 102129974, + name: 'ENERGIE-BKK OST', + tariffs: '9,6,3', + }, + { + ktnr: 101520329, + name: 'ESSO BKK', + tariffs: '9,6,3', + }, + { + ktnr: 101521547, + name: 'ESSO BKK / OST', + tariffs: '9,6,3', + }, + { + ktnr: 103170002, + name: 'HANDELSKRANKENKASSE (HKK)', + tariffs: '5,8,2', + }, + { + ktnr: 101570104, + name: 'HANSEATISCHE KRANKENKASSE (HEK)', + tariffs: '5,8,2', + }, + { + ktnr: 103724238, + name: 'HEIMAT KRANKENKASSE', + tariffs: '9,6,3', + }, + { + ktnr: 103723896, + name: 'HEIMAT KRANKENKASSE', + tariffs: '9,6,3', + }, + { + ktnr: 109500297, + name: 'IKK BRANDENBURG UND BERLIN', + tariffs: '9,6,3', + }, + { + ktnr: 100602360, + name: 'IKK BRANDENBURG UND BERLIN', + tariffs: '9,6,3', + }, + { + ktnr: 101003005, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 101500154, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 105903116, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 105801603, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 108701890, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 103500706, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 107202793, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 103500693, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 106801672, + name: 'IKK CLASSIC', + tariffs: '9,6,3', + }, + { + ktnr: 103100201, + name: 'IKK GESUND PLUS', + tariffs: '9,6,3', + }, + { + ktnr: 101202961, + name: 'IKK GESUND PLUS', + tariffs: '9,6,3', + }, + { + ktnr: 100202549, + name: 'IKK NORD', + tariffs: '9,6,3', + }, + { + ktnr: 101300129, + name: 'IKK NORD', + tariffs: '9,6,3', + }, + { + ktnr: 109303301, + name: 'IKK SÜDWEST', + tariffs: '9,6,3', + }, + { + ktnr: 106201379, + name: 'IKK SÜDWEST', + tariffs: '9,6,3', + }, + { + ktnr: 102171012, + name: 'KKH ALLIANZ', + tariffs: '5,8,2', + }, + { + ktnr: 101505002, + name: 'KNAPPSCHAFT HAUPTVERW.', + tariffs: '9,6,3', + }, + { + ktnr: 100705002, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 101305000, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 106305001, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 101005007, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 105505001, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 106505003, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 107705007, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 103105002, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 109705001, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 108005002, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 106205000, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 106905007, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 109905003, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 103505006, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 104405007, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 100105006, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 102105000, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 107405004, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 106005008, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 107805008, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 108405006, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 106405002, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 109505009, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 109305007, + name: 'KNAPPSCHAFT HAUPTVERWALTUNG', + tariffs: '9,6,3', + }, + { + ktnr: 0, + name: 'KOSTENTRÄGER PATIENT', + tariffs: '4,7,10', + }, + { + ktnr: 108035612, + name: 'MHPLUS BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108034508, + name: 'MHPLUS BKK / OST', + tariffs: '9,6,3', + }, + { + ktnr: 107429785, + name: 'MHPLUS KRANKENKASSE', + tariffs: '9,6,3', + }, + { + ktnr: 104491707, + name: 'NOVITAS BKK', + tariffs: '9,6,3', + }, + { + ktnr: 101520181, + name: 'NOVITAS BKK', + tariffs: '9,6,3', + }, + { + ktnr: 101532152, + name: 'NOVITAS BKK', + tariffs: '9,6,3', + }, + { + ktnr: 104491718, + name: 'NOVITAS BKK / OST', + tariffs: '9,6,3', + }, + { + ktnr: 103600024, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600079, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600104, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600046, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600160, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600115, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600120, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600159, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600251, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600295, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600089, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600239, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600035, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600091, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600148, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600013, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600217, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600273, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 103600182, + name: 'PBEAKK Postbeamtenkrankenkasse', + tariffs: '4,7,10', + }, + { + ktnr: 106492406, + name: 'PRONOVA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 106492393, + name: 'PRONOVA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 105330168, + name: 'SALUS BKK', + tariffs: '9,6,3', + }, + { + ktnr: 105321269, + name: 'SALUS BKK OST', + tariffs: '9,6,3', + }, + { + ktnr: 108433248, + name: 'SBK Siemens Bkk', + tariffs: '9,6,3', + }, + { + ktnr: 108223858, + name: 'SBK Siemens Bkk', + tariffs: '9,6,3', + }, + { + ktnr: 108537403, + name: 'SECURVITA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108537163, + name: 'SECURVITA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 101320032, + name: 'SECURVITA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108737052, + name: 'SECURVITA BKK', + tariffs: '9,6,3', + }, + { + ktnr: 101320942, + name: 'SECURVITA BKK/OST', + tariffs: '9,6,3', + }, + { + ktnr: 101520147, + name: 'SHELL BKK / LIFE', + tariffs: '9,6,3', + }, + { + ktnr: 101520352, + name: 'SHELL BKK / LIFE', + tariffs: '9,6,3', + }, + { + ktnr: 108537470, + name: 'SHELL BKK / LIFE', + tariffs: '9,6,3', + }, + { + ktnr: 108736723, + name: 'SHELL BKK / LIFE', + tariffs: '9,6,3', + }, + { + ktnr: 103525567, + name: 'SIEMAG BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108623102, + name: 'SKD BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108833505, + name: 'SKD-BKK', + tariffs: '9,6,3', + }, + { + ktnr: 100609049, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 103708773, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 108008880, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 108209075, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 106408802, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 108808844, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 109008837, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 109308818, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 108608820, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 108508863, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 105508787, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 106908874, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 101308719, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 102108731, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 102408723, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 109108850, + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaften Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 106936311, + name: 'SÜDZUCKER-BKK', + tariffs: '9,6,3', + }, + { + ktnr: 106928388, + name: 'SÜDZUCKER-BKK / OST', + tariffs: '9,6,3', + }, + { + ktnr: 101577500, + name: 'TECHNIKER KRANKENKASSE (TK)', + tariffs: '5,8,2', + }, + { + ktnr: 101575519, + name: 'TECHNIKER KRANKENKASSE (TK)', + tariffs: '5,8,2', + }, + { + ktnr: 104926494, + name: 'VAILLANT BKK', + tariffs: '9,6,3', + }, + { + ktnr: 104921650, + name: 'VAILLANT BKK', + tariffs: '9,6,3', + }, + { + ktnr: 105330191, + name: 'VEREINIGTE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 105230383, + name: 'VEREINIGTE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 105321236, + name: 'VEREINIGTE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 105330179, + name: 'VEREINIGTE BKK', + tariffs: '9,6,3', + }, + { + ktnr: 104526376, + name: 'Viactiv Krankenkasse', + tariffs: '9,6,3', + }, + { + ktnr: 107536262, + name: 'Vivida BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108036441, + name: 'WMF BKK', + tariffs: '9,6,3', + }, + { + ktnr: 108021400, + name: 'WMF BKK/OST', + tariffs: '9,6,3', + }, + { + ktnr: 'SOZIALVERSICHERUNG FÜR Landwirtschaft, Forsten Und Gartenbau', + name: 'SOZIALVERSICHERUNG FÜR Landwirtschaft, Forsten Und Gartenbau', + tariffs: '9,6,3', + }, + { + ktnr: 'BKK MOBIL OIL', + name: 'BKK MOBIL OIL', + tariffs: '9,6,3', + }, + { + ktnr: 'Barmer', + name: 'Barmer', + tariffs: '5,8,2', + }, + { + ktnr: 'DIE SCHWENNINGER KRANKENKASSE', + name: 'DIE SCHWENNINGER KRANKENKASSE', + tariffs: '9,6,3', + }, + { + ktnr: 'Kath. Marienkrankenhaus gGmbH', + name: 'Kath. Marienkrankenhaus gGmbH', + tariffs: '4,7,10', + }, + { + ktnr: 'BETRIEBSKRANKENKASSE S-H', + name: 'BETRIEBSKRANKENKASSE S-H', + tariffs: '9,6,3', + }, + { + ktnr: 'NOVITAS BKK', + name: 'NOVITAS BKK', + tariffs: '9,6,3', + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/btw-aok.ts b/service/data-hub/data-connector/prisma/seed/tariffs/btw-aok.ts new file mode 100644 index 0000000..dbbe6d7 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/btw-aok.ts @@ -0,0 +1,141 @@ +import { CostTypeVariant } from '@prisma/client'; +import { startOfDay, endOfDay } from 'date-fns'; + +export const BTW_AOK_TARIFFS = [ + { + description: 'AOK/BKK/IKK/Knappschaft BTW', + validFrom: startOfDay(new Date('2021-01-01')), + validTo: endOfDay(new Date('2021-06-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 3400, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 135, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 1665, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 1665, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 1665, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft BTW', + validFrom: startOfDay(new Date('2021-07-01')), + validTo: endOfDay(new Date('2022-08-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 3465, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 135, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 1665, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 1665, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 1665, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft BTW', + validFrom: startOfDay(new Date('2022-09-01')), + validTo: endOfDay(new Date('2023-04-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 3700, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 160, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 1765, + timeRange: '18:00-07:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 1765, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 1765, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft BTW', + validFrom: startOfDay(new Date('2023-05-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 3885, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 180, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 1865, + timeRange: '18:00-07:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 1865, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 1865, + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/btw-dak-vdek.ts b/service/data-hub/data-connector/prisma/seed/tariffs/btw-dak-vdek.ts new file mode 100644 index 0000000..a9abd26 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/btw-dak-vdek.ts @@ -0,0 +1,41 @@ +import { CostTypeVariant } from '@prisma/client'; +import { endOfDay, startOfDay } from 'date-fns'; + +export const BTW_DAK_VDEK_TARIFFS = [ + { + description: 'DAK + VDEK BTW', + validFrom: startOfDay(new Date('2021-01-01')), + validTo: endOfDay(new Date('2023-05-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 3700, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 159, + kmInclusive: 20, + }, + ], + }, + { + description: 'DAK + VDEK BTW', + validFrom: startOfDay(new Date('2023-06-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 4171, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 166, + kmInclusive: 21, + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/btw-privat.ts b/service/data-hub/data-connector/prisma/seed/tariffs/btw-privat.ts new file mode 100644 index 0000000..1747054 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/btw-privat.ts @@ -0,0 +1,44 @@ +import { CostTypeVariant } from '@prisma/client'; +import { startOfDay } from 'date-fns'; + +export const BTW_PRIVAT_TARIFFS = [ + { + description: 'Privat BTW', + validFrom: startOfDay(new Date('2020-01-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 6500, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2000, + }, + { + description: 'ab dem 16. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 250, + kmInclusive: 15, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4000, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4000, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4000, + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/ktw-aok.ts b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-aok.ts new file mode 100644 index 0000000..3fa303b --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-aok.ts @@ -0,0 +1,304 @@ +import { CostTypeVariant } from '@prisma/client'; +import { endOfDay, startOfDay } from 'date-fns'; + +export const KTW_AOK_TARIFFS = [ + { + description: 'AOK/BKK/IKK/Knappschaft KTW', + validFrom: startOfDay(new Date('2019-04-01')), + validTo: endOfDay(new Date('2021-04-22')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8936, + }, + { + description: 'Desinfektionszuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 70, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 286, + kmInclusive: 18, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4003, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4003, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4003, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft KTW', + validFrom: startOfDay(new Date('2021-04-23')), + validTo: endOfDay(new Date('2021-06-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8936, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 177, + }, + { + description: 'Desinfektionszuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 70, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4003, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4003, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4003, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 286, + kmInclusive: 18, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft KTW', + validFrom: startOfDay(new Date('2021-07-01')), + validTo: endOfDay(new Date('2023-04-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 9162, + }, + { + description: 'Desinfektionszuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 72, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 181, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4104, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4104, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4104, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 293, + kmInclusive: 18, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft KTW', + validFrom: startOfDay(new Date('2023-05-01')), + validTo: endOfDay(new Date('2023-12-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 7839, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2006, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.FAHRZEUGZUSCHLAG, + costAmount: 1121, + excludeCarNames: [ + '1/KTW-01', + '1/KTW-02', + '1/KTW-03', + '1/KTW-04', + '1/KTW-05', + '1/KTW-06', + ] + }, + { + description: 'Leitstellenmanagement', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 485, + }, + { + description: 'Ausbildungsbetrieb Rettungssanitäter', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 298, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 320, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 6500, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 6500, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 6500, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 3839, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 15732, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 18191, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 18191, + infectionType: '3.2', + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft KTW', + validFrom: startOfDay(new Date('2024-01-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 6921, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2829, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.FAHRZEUGZUSCHLAG, + costAmount: 1428, + excludeCarNames: [ + '1/KTW-01', + '1/KTW-02', + '1/KTW-03', + '1/KTW-04', + '1/KTW-05-E', + '1/KTW-06', + ] + }, + { + description: 'Leitstellenmanagement', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 665, + }, + { + description: 'Ausbildungsbetrieb Rettungssanitäter', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 305, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 359, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 6919, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 6919, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 6919, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 3935, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 16126, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 18646, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 18646, + infectionType: '3.2', + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/ktw-dak.ts b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-dak.ts new file mode 100644 index 0000000..d01ff2d --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-dak.ts @@ -0,0 +1,300 @@ +import { CostTypeVariant } from '@prisma/client'; +import { startOfDay, endOfDay } from 'date-fns'; + +export const KTW_DAK_TARIFFS = [ + { + description: 'DAK KTW', + validFrom: startOfDay(new Date('2018-02-01')), + validTo: endOfDay(new Date('2021-04-22')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8507, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 284, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4728, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4728, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4728, + }, + ], + }, + { + description: 'DAK KTW', + validFrom: startOfDay(new Date('2021-04-23')), + validTo: endOfDay(new Date('2021-09-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8507, + }, + { + description: 'QMS Zuschlag inkl. Modernes Einsatzfahrzeug', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 790, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 284, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4728, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4728, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4728, + }, + ], + }, + { + description: 'DAK KTW', + validFrom: startOfDay(new Date('2021-10-01')), + validTo: endOfDay(new Date('2022-12-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 7650, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 1380, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 750, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 300, + kmInclusive: 16, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5300, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 5230, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 5230, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 3590, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 14350, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 16500, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 16500, + infectionType: '3.2', + }, + ], + }, + { + description: 'DAK KTW', + validFrom: startOfDay(new Date('2023-01-01')), + validTo: endOfDay(new Date('2023-12-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 7920, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 1430, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 780, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 315, + kmInclusive: 16, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5485, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 5410, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 5410, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 3714, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 14845, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17069, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17069, + infectionType: '3.2', + }, + ], + }, + { + description: 'DAK KTW', + validFrom: startOfDay(new Date('2024-01-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 9000, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2000, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 1000, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 330, + kmInclusive: 16, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5728, + timeRange: '19:00-19:59', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 6644, + timeRange: '20:00-21:59', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 7198, + timeRange: '22:00-04:59', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5728, + timeRange: '05:00-06:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 5410, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 5410, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 3714, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 14845, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17069, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17069, + infectionType: '3.2', + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/ktw-privat.ts b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-privat.ts new file mode 100644 index 0000000..fc76274 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-privat.ts @@ -0,0 +1,68 @@ +import { CostTypeVariant } from '@prisma/client'; +import { startOfDay } from 'date-fns'; + +export const KTW_PRIVAT_TARIFFS = [ + { + description: 'Privat KTW', + validFrom: startOfDay(new Date('2020-01-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 19000, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2500, + }, + { + description: 'ab dem 16. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 390, + kmInclusive: 15, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 8800, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 8800, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 8800, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 8800, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 8800, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17500, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17500, + infectionType: '3.2', + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/ktw-vdek.ts b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-vdek.ts new file mode 100644 index 0000000..9409ff1 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/ktw-vdek.ts @@ -0,0 +1,281 @@ +import { CostTypeVariant } from '@prisma/client'; +import { endOfDay, startOfDay } from 'date-fns'; + +export const KTW_VDEK_TARIFFS = [ + { + description: 'VDEK KTW', + validFrom: startOfDay(new Date('2017-09-01')), + validTo: endOfDay(new Date('2021-04-22')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8150, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 273, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4550, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4550, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4550, + }, + ], + }, + { + description: 'VDEK KTW', + validFrom: startOfDay(new Date('2021-04-23')), + validTo: endOfDay(new Date('2021-06-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8150, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 950, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 273, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 4550, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 4550, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 4550, + }, + ], + }, + { + description: 'VDEK KTW', + validFrom: startOfDay(new Date('2021-07-01')), + validTo: endOfDay(new Date('2021-12-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 8977, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 1037, + }, + { + description: 'ab dem 18. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 295, + kmInclusive: 17, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5028, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 5028, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 5028, + }, + ], + }, + { + description: 'VDEK KTW', + validFrom: startOfDay(new Date('2022-01-01')), + validTo: endOfDay(new Date('2023-04-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 7043, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2790, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 1393, + }, + { + description: 'Leitstellenmanagement', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 649, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 317, + kmInclusive: 16, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5537, + timeRange: '18:30-06:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 6212, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 6212, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 4134, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 16941, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 19590, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 19590, + infectionType: '3.2', + }, + ], + }, + { + description: 'VDEK KTW', + validFrom: startOfDay(new Date('2023-05-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 7325, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2886, + }, + { + description: 'Modernes Einsatzfahrzeug', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 1450, + }, + { + description: 'Leitstellenmanagement', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 671, + }, + { + description: 'ab dem 17. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 349, + kmInclusive: 16, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5728, + timeRange: '19:00-19:59', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 6644, + timeRange: '20:00-21:59', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 7198, + timeRange: '22:00-04:59', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5728, + timeRange: '05:00-06:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 6426, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 6426, + }, + { + description: 'Desinfektionszuschlag 2.A', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 4277, + infectionType: '2.A', + }, + { + description: 'Desinfektionszuschlag 2.B', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 17525, + infectionType: '2.B', + }, + { + description: 'Desinfektionszuschlag 3.1', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 20266, + infectionType: '3.1', + }, + { + description: 'Desinfektionszuschlag 3.2', + variant: CostTypeVariant.DESINFEKTIONSZUSCHLAG, + costAmount: 20266, + infectionType: '3.2', + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/tsw-aok.ts b/service/data-hub/data-connector/prisma/seed/tariffs/tsw-aok.ts new file mode 100644 index 0000000..970bd23 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/tsw-aok.ts @@ -0,0 +1,141 @@ +import { CostTypeVariant } from '@prisma/client'; +import { startOfDay, endOfDay } from 'date-fns'; + +export const TSW_AOK_TARIFFS = [ + { + description: 'AOK/BKK/IKK/Knappschaft TSW', + validFrom: startOfDay(new Date('2021-01-01')), + validTo: endOfDay(new Date('2021-06-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 5000, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 170, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 2445, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 2445, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 2445, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft TSW', + validFrom: startOfDay(new Date('2021-07-01')), + validTo: endOfDay(new Date('2022-08-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 5100, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 170, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 2445, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 2445, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 2445, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft TSW', + validFrom: startOfDay(new Date('2022-09-01')), + validTo: endOfDay(new Date('2023-04-30')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 5450, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 180, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 2600, + timeRange: '18:00-07:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 2600, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 2600, + }, + ], + }, + { + description: 'AOK/BKK/IKK/Knappschaft TSW', + validFrom: startOfDay(new Date('2023-05-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 5800, + }, + { + description: 'ab dem 21. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 190, + kmInclusive: 20, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 2700, + timeRange: '18:00-07:30', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 2700, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 2700, + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/tsw-dak-vdek.ts b/service/data-hub/data-connector/prisma/seed/tariffs/tsw-dak-vdek.ts new file mode 100644 index 0000000..6166f74 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/tsw-dak-vdek.ts @@ -0,0 +1,58 @@ +import { CostTypeVariant } from '@prisma/client'; +import { endOfDay, startOfDay } from 'date-fns'; + +export const TSW_DAK_VDEK_TARIFFS = [ + { + description: 'DAK + VDEK TSW', + validFrom: startOfDay(new Date('2021-01-01')), + validTo: endOfDay(new Date('2023-05-31')), + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 4922, + }, + { + description: 'ab dem 22. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 159, + kmInclusive: 21, + }, + ], + }, + { + description: 'DAK + VDEK TSW', + validFrom: startOfDay(new Date('2023-06-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt (TSW 2)', + variant: CostTypeVariant.TSWDIFFERENZIERUNG, + costAmount: 5880, + }, + { + description: 'Grundpauschale je Fahrt (TSW 1)', + variant: CostTypeVariant.TSWDIFFERENZIERUNG, + costAmount: 4380, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 407, + timeRange: '18:30-20:00', + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 407, + timeRange: '06:00-07:00', + }, + { + description: 'ab dem 22. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 159, + kmInclusive: 21, + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/prisma/seed/tariffs/tsw-privat.ts b/service/data-hub/data-connector/prisma/seed/tariffs/tsw-privat.ts new file mode 100644 index 0000000..3006668 --- /dev/null +++ b/service/data-hub/data-connector/prisma/seed/tariffs/tsw-privat.ts @@ -0,0 +1,44 @@ +import { CostTypeVariant } from '@prisma/client'; +import { startOfDay } from 'date-fns'; + +export const TSW_PRIVAT_TARIFFS = [ + { + description: 'Privat TSW', + validFrom: startOfDay(new Date('2020-01-01')), + validTo: null, + costTypes: [ + { + description: 'Grundpauschale je Fahrt', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 11500, + }, + { + description: 'QMS Zuschlag', + variant: CostTypeVariant.GRUNDPREIS, + costAmount: 2000, + }, + { + description: 'ab dem 16. km', + variant: CostTypeVariant.KILOMETERZUSCHLAG, + costAmount: 250, + kmInclusive: 15, + }, + { + description: 'Nachtzuschlag', + variant: CostTypeVariant.NACHTZUSCHLAG, + costAmount: 5500, + timeRange: '19:00-07:00', + }, + { + description: 'Wochenendzuschlag', + variant: CostTypeVariant.WOCHENENDZUSCHLAG, + costAmount: 5500, + }, + { + description: 'Feiertagszuschlag', + variant: CostTypeVariant.FEIERTAGSZUSCHLAG, + costAmount: 5500, + }, + ], + }, +]; diff --git a/service/data-hub/data-connector/src/app.module.ts b/service/data-hub/data-connector/src/app.module.ts index 833ecd6..ac1fe6d 100644 --- a/service/data-hub/data-connector/src/app.module.ts +++ b/service/data-hub/data-connector/src/app.module.ts @@ -6,14 +6,30 @@ import { AppService } from './app.service'; import { PrismaModule } from './core/database/prisma.module'; import { FeatureImporterModule } from './modules/feat-importers/feature-importer.module'; import { ConfigModule } from './core/config/config.module'; +import { TicketSystemModule } from './modules/feat-tickets/ticket-system.module'; +import { DatabaseModule } from './core/database/database.module'; +import { PostgresDialect } from 'kysely'; +import { Pool } from 'pg'; @Module({ imports: [ ConfigModule, + DatabaseModule.forRoot({ + dialect: new PostgresDialect({ + pool: new Pool({ + host: 'localhost', + port: 5432, + database: 'avicenna', + user: 'johndoe', + password: 'randompassword', + }), + }), + }), PrismaModule.forRoot(), ScheduleModule.forRoot(), EventEmitterModule.forRoot(), FeatureImporterModule, + TicketSystemModule, ], controllers: [AppController], providers: [AppService], diff --git a/service/data-hub/data-connector/src/app.service.ts b/service/data-hub/data-connector/src/app.service.ts index 3b8018a..30ca90b 100644 --- a/service/data-hub/data-connector/src/app.service.ts +++ b/service/data-hub/data-connector/src/app.service.ts @@ -1,8 +1,7 @@ -// import { TicketService } from '@dks/avicenna/api-feature-ticket-system'; import { Injectable, Logger } from '@nestjs/common'; -import { Cron, SchedulerRegistry } from '@nestjs/schedule'; +import { SchedulerRegistry } from '@nestjs/schedule'; import { - Interval, + Interval as TimeInterval, addDays, eachDayOfInterval, endOfDay, @@ -10,15 +9,16 @@ import { set, startOfDay, } from 'date-fns'; -import { concatMap, from, lastValueFrom, take, tap } from 'rxjs'; +import { concatMap, from, lastValueFrom, switchMap, take, tap } from 'rxjs'; import { ImporterService } from './modules/feat-importers/importer.service'; +import { TicketService } from './modules/feat-tickets/tickets.service'; import { chunk } from './utils'; @Injectable() export class AppService { private readonly logger = new Logger(AppService.name); - @Cron('0 */5 2-20 * * *') + // @Cron('0 */5 2-20 * * *') async fetchDataContinously() { const now = new Date(); const fetchInterval = { @@ -34,7 +34,7 @@ export class AppService { `import took ${(Date.now() - now.getTime()) / 1000}s`, ), ), - // switchMap(() => from(this.ticketService.createTickets(fetchInterval))), + switchMap(() => from(this.ticketService.createTickets(fetchInterval))), ) .subscribe(); } @@ -46,7 +46,7 @@ export class AppService { if (timeouts.length) return; const now = new Date(); - const fetchInterval: Interval = { + const fetchInterval: TimeInterval = { start: set(new Date(), { year: now.getFullYear(), month: 0, @@ -70,7 +70,7 @@ export class AppService { from([interval]) .pipe( concatMap((interval) => this.importer.runImport(interval)), - // switchMap(() => from(this.ticketService.createTickets(interval))), + switchMap(() => from(this.ticketService.createTickets(interval))), ) .subscribe(); }; @@ -81,7 +81,7 @@ export class AppService { // @Cron('0 2,7,12,17,22,27,32,37,42,47,52,57 2-20 * * *') async fetchDataSixWeeks() { const now = new Date(); - const fetchInterval: Interval = { + const fetchInterval: TimeInterval = { start: startOfDay(addDays(now, -90)), end: endOfDay(now), }; @@ -111,7 +111,7 @@ export class AppService { // @Cron('* * 0 * * *') async fetchDataYearly() { const now = new Date(); - const fetchInterval: Interval = { + const fetchInterval: TimeInterval = { start: set(new Date(), { year: now.getFullYear(), month: 0, @@ -137,21 +137,21 @@ export class AppService { ), ), ), - // switchMap(() => from(this.ticketService.createTickets(fetchInterval))), + switchMap(() => from(this.ticketService.createTickets(fetchInterval))), ) .subscribe(); } constructor( private readonly importer: ImporterService, - // private readonly ticketService: TicketService, + private readonly ticketService: TicketService, private readonly schedulerRegistry: SchedulerRegistry, ) {} private splitIntervalIntoPeriods( - interval: Interval, + interval: TimeInterval, chunkSize = 30, - ): Interval[] { + ): TimeInterval[] { return chunk(eachDayOfInterval(interval), chunkSize).map((dates) => ({ start: startOfDay(dates.at(0) as Date), end: endOfDay(dates.at(-1) as Date), diff --git a/service/data-hub/data-connector/src/core/base/attendance-registration-events.enum.ts b/service/data-hub/data-connector/src/core/base/attendance-registration-events.enum.ts new file mode 100644 index 0000000..32fd20f --- /dev/null +++ b/service/data-hub/data-connector/src/core/base/attendance-registration-events.enum.ts @@ -0,0 +1,4 @@ +export enum AttendanceRegistrationEvents { + ClockedIn = 'clocked in', + ClockedOut = 'clocked out', +} diff --git a/service/data-hub/data-connector/src/core/base/trace.types.ts b/service/data-hub/data-connector/src/core/base/trace.types.ts new file mode 100644 index 0000000..6d5f0b5 --- /dev/null +++ b/service/data-hub/data-connector/src/core/base/trace.types.ts @@ -0,0 +1,6 @@ +export enum TraceTypes { + AnomalyAccepted = 'anomaly.accepted', + AnomalyIgnored = 'anomaly.ignored', + TourWarning = 'tour.warning', + TourCritical = 'tour.critical', +} diff --git a/service/data-hub/data-connector/src/core/database/constants.ts b/service/data-hub/data-connector/src/core/database/constants.ts index 0ef59f5..8ab0cd8 100644 --- a/service/data-hub/data-connector/src/core/database/constants.ts +++ b/service/data-hub/data-connector/src/core/database/constants.ts @@ -1 +1 @@ -export const PRISMA_SERVICE_OPTIONS = 'PRISMA_SERVICE_OPTIONS'; \ No newline at end of file +export const PRISMA_SERVICE_OPTIONS = 'PRISMA_SERVICE_OPTIONS'; diff --git a/service/data-hub/data-connector/src/core/database/database.module.ts b/service/data-hub/data-connector/src/core/database/database.module.ts new file mode 100644 index 0000000..d691d44 --- /dev/null +++ b/service/data-hub/data-connector/src/core/database/database.module.ts @@ -0,0 +1,19 @@ +import { DynamicModule, Global, Module, Provider } from '@nestjs/common'; +import { KyselyConfig } from 'kysely'; +import { createKyselyProvider } from './kysely-client.factory'; + +export const KYSELY_CLIENT_PROVIDER_TOKEN = 'KyselyClientProviderToken'; + +@Global() +@Module({}) +export class DatabaseModule { + public static forRoot(config: KyselyConfig): DynamicModule { + const provider: Provider = createKyselyProvider(config); + + return { + module: DatabaseModule, + exports: [provider], + providers: [provider], + }; + } +} diff --git a/service/data-hub/data-connector/src/core/database/kysely-client.factory.ts b/service/data-hub/data-connector/src/core/database/kysely-client.factory.ts new file mode 100644 index 0000000..6cd9efe --- /dev/null +++ b/service/data-hub/data-connector/src/core/database/kysely-client.factory.ts @@ -0,0 +1,12 @@ +import { Provider } from '@nestjs/common'; +import { Kysely, KyselyConfig } from 'kysely'; +import { KYSELY_CLIENT_PROVIDER_TOKEN } from './database.module'; + +export const createKyselyClient = (options: KyselyConfig): Kysely => { + return new Kysely(options); +}; + +export const createKyselyProvider = (options: KyselyConfig): Provider => ({ + provide: KYSELY_CLIENT_PROVIDER_TOKEN, + useValue: createKyselyClient(options), +}); diff --git a/service/data-hub/data-connector/src/core/database/types.ts b/service/data-hub/data-connector/src/core/database/types.ts new file mode 100644 index 0000000..2ec6d51 --- /dev/null +++ b/service/data-hub/data-connector/src/core/database/types.ts @@ -0,0 +1,530 @@ +import type { ColumnType } from 'kysely'; +export type Generated = T extends ColumnType + ? ColumnType + : ColumnType; +export type Timestamp = ColumnType; + +export const CostTypeVariant = { + NACHTZUSCHLAG: 'NACHTZUSCHLAG', + WOCHENENDZUSCHLAG: 'WOCHENENDZUSCHLAG', + FEIERTAGSZUSCHLAG: 'FEIERTAGSZUSCHLAG', + DESINFEKTIONSZUSCHLAG: 'DESINFEKTIONSZUSCHLAG', + KILOMETERZUSCHLAG: 'KILOMETERZUSCHLAG', + FAHRZEUGZUSCHLAG: 'FAHRZEUGZUSCHLAG', + TSWDIFFERENZIERUNG: 'TSWDIFFERENZIERUNG', + GRUNDPREIS: 'GRUNDPREIS', +} as const; +export type CostTypeVariant = + (typeof CostTypeVariant)[keyof typeof CostTypeVariant]; +export const TicketState = { + CREATED: 'CREATED', + APPROVAL_REQUIRED: 'APPROVAL_REQUIRED', + READY: 'READY', + DONE: 'DONE', + BILLABLE: 'BILLABLE', + ARCHIVED: 'ARCHIVED', +} as const; +export type TicketState = (typeof TicketState)[keyof typeof TicketState]; +export const TicketValidationState = { + CREATED: 'CREATED', + USER_INTERACTION_REQUIRED: 'USER_INTERACTION_REQUIRED', + TD_UNCERTAIN: 'TD_UNCERTAIN', + DOCUMENTS_MISSING: 'DOCUMENTS_MISSING', + ARCHIVED: 'ARCHIVED', +} as const; +export type TicketValidationState = + (typeof TicketValidationState)[keyof typeof TicketValidationState]; +export const ApprovalState = { + UNKNOWN: 'UNKNOWN', + FREE: 'FREE', + REQUIRED: 'REQUIRED', + REQUESTED: 'REQUESTED', + APPROVED: 'APPROVED', +} as const; +export type ApprovalState = (typeof ApprovalState)[keyof typeof ApprovalState]; +export type Anomaly = { + id: string; + type: string; + description: string; + groupKey: string; + groupDescription: string; + workedOnBy: string; + sleepTimer: number; + sleepSince: Timestamp | null; + resolvedAt: Timestamp | null; + manuallyResolved: Generated; + createdAt: Generated; +}; +export type AttendanceRegistration = { + attendanceRegistrationId: number; + employeeId: number; + personnelNumber: string; + dateTime: Timestamp; + event: string; +}; +export type AttendanceRegistrationSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + attendanceRegistrationId: string | null; + employeeId: string | null; + personnelNumber: string | null; + dateTime: string | null; + event: string | null; +}; +export type AttendanceRegistrationStaging = { + internalId: Generated; + attendanceRegistrationId: number; + employeeId: number; + dateTime: Timestamp; + event: string; +}; +export type AvicennaTenant = { + id: Generated; + healthInsuranceNumber: string; + name: string; +}; +export type AvicennaTenantToTariffGroup = { + A: string; + B: string; +}; +export type CostType = { + id: Generated; + description: string; + variant: CostTypeVariant; + costAmount: number; + timeRange: string | null; + kmInclusive: number | null; + excludeCarNames: string[]; + infectionType: string | null; + tariffId: string | null; +}; +export type DyflexisEmployee = { + id: Generated; + userId: string; + firstname: string; + surname: string; + contractStart: string; + contractEnd: string | null; + contractHoursWeek: number; + contractSalaryHour: number; +}; +export type Employee = { + id: string; + name: string; + surname: string; + personnelNumber: string | null; + mobile: string | null; + qualification: string | null; + occuptationalHealthExamination: Timestamp | null; + personTransportCertificate: Timestamp | null; +}; +export type EmployeeDispoLiveSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + pScheinAblaufDatum: string | null; + name: string | null; + surname: string | null; + persId: string | null; + importPersId: string | null; + qualifikation: string | null; +}; +export type EmployeeDyflexisSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + firstname: string | null; + surname: string | null; + contract_id: string | null; + contract_start: string | null; + contract_end: string | null; + contract_hours_week: string | null; + contract_salary_hour: string | null; +}; +export type EmployeeStaging = { + internalId: Generated; + id: number; + firstname: string; + surname: string; + contractStart: Timestamp; + contractEnd: Timestamp; + contractHoursWeek: number; + contractSalaryHour: number; + personTransportCertificate: Timestamp | null; + qualification: string | null; +}; +export type Patient = { + id: string; + surname: string | null; + name: string | null; + street: string | null; + zip: string | null; + city: string | null; + birthday: Timestamp | null; + healthinsuranceId: string | null; + healthinsurance: string | null; + careDegree: string | null; + disabilityMark1: string | null; + disabilityMark2: string | null; +}; +export type PatientSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + surname: string | null; + name: string | null; + street: string | null; + zip: string | null; + city: string | null; + birthday: string | null; + kkId: string | null; + krankenkasse: string | null; + pflegestufe: string | null; + behinderung1: string | null; + behinderung2: string | null; +}; +export type PatientStaging = { + internalId: Generated; + id: string | null; + surname: string | null; + name: string | null; + street: string | null; + zip: string | null; + city: string | null; + birthday: Timestamp | null; + healthinsuranceId: string | null; + healthinsurance: string | null; + careDegree: string | null; + disabilityMark1: string | null; + disabilityMark2: string | null; +}; +export type PlannedTime = { + id: string; + userId: string; + firstname: string | null; + surname: string | null; + startDate: Timestamp | null; + endDate: Timestamp | null; + department: string | null; + pause: number; + duration: number; + note: string | null; +}; +export type PlannedTimeSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + user_id: string | null; + firstname: string | null; + surname: string | null; + department_id: string | null; + department_name: string | null; + start_date: string | null; + end_date: string | null; + pauze: string | null; + duration: string | null; + deleted: string | null; + mark: string | null; +}; +export type PlannedTimeStaging = { + internalId: Generated; + id: number; + employeeId: number; + firstname: string | null; + surname: string | null; + departmentName: string | null; + startDate: Timestamp; + endDate: Timestamp; + deleted: boolean; + mark: string | null; +}; +export type SolutionTarget = { + id: Generated; + name: string; + anomalyId: string | null; +}; +export type SolutionTargetStep = { + id: Generated; + description: string; + solutionTargetId: string | null; +}; +export type Tariff = { + id: Generated; + validFrom: Timestamp | null; + validTo: Timestamp | null; + tariffGroupId: string | null; +}; +export type TariffGroup = { + id: Generated; + description: string; + ordinanceType: string; +}; +export type Ticket = { + id: Generated; + currentState: TicketValidationState; + notes: string[]; + errors: string[]; + isUrgent: Generated; + urgency: Generated; + approvalState: ApprovalState | null; + documentInfo: Generated; + createdAt: Generated; +}; +export type TicketStateHistory = { + id: Generated; + state: TicketValidationState; + createdAt: Generated; + ticketId: string; +}; +export type Tour = { + id: Generated; + done: boolean; + direction: string; + carName: string | null; + operationId: string; + driverId: string | null; + driverName: string | null; + codriverId: string | null; + codriverName: string | null; + patientId: string | null; + patientName: string | null; + patientSurname: string | null; + patientStreet: string | null; + patientZip: string | null; + patientCity: string | null; + healthInsurance: string | null; + healthInsuranceNumber: string | null; + type: string | null; + category: string | null; + transportType: string | null; + ordinanceType: string | null; + rangeEndDate: Timestamp | null; + startInstitution: string | null; + startStreet: string | null; + startZip: string | null; + startCity: string | null; + targetInstitution: string | null; + targetStreet: string | null; + targetZip: string | null; + targetCity: string | null; + startDate: Timestamp; + check: Generated; + occupiedKm: number | null; + totalKm: number | null; + startBegin: string | null; + startEnd: string | null; + target: string | null; + targetBegin: string | null; + empty: string | null; + hasInfection: Generated; + infectionName: string | null; + revenueDispoLive: number | null; + billDate: Timestamp | null; + billNumber: string | null; + revenue: Generated; + consumptionCosts: Generated; + revenueDeviation: Generated; + createdAt: Timestamp | null; + deletedAt: Timestamp | null; + ticketId: string | null; +}; +export type TourSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + check: string | null; + createTime: string | null; + empfangenVonId: string | null; + endgen: string | null; + serienId: string | null; + serienKategorName: string | null; + serienKategorie: string | null; + zadStatus: string | null; + abrDate: string | null; + abrNum: string | null; + abrTime: string | null; + ausrueckZeit: string | null; + startTime: string | null; + startDate: string | null; + date: string | null; + date_iso: string | null; + dauergenehmigung: string | null; + direction: string | null; + distanceValue: string | null; + besetztKm: string | null; + gefahren: string | null; + gesamtPreis: string | null; + infektion: string | null; + itDesc: string | null; + itKrz: string | null; + itName: string | null; + kkId: string | null; + krankenkasse: string | null; + patId: string | null; + patName: string | null; + patSurname: string | null; + patStreet: string | null; + patZip: string | null; + patCity: string | null; + startInstitution: string | null; + startStreet: string | null; + startZip: string | null; + startCity: string | null; + targetInstitution: string | null; + targetStreet: string | null; + targetZip: string | null; + targetCity: string | null; + transportKrz: string | null; + transportName: string | null; + transportart: string | null; + verordnungsId: string | null; + verordnungsName: string | null; + type: string | null; + startBegin: string | null; + startEnd: string | null; + frei: string | null; + ziel: string | null; + zielBegin: string | null; + endTime: string | null; + endDate: string | null; + einsatzNummer: string | null; + carName: string | null; + carNo: string | null; + beifahrerName: string | null; + beifahrer: string | null; + fahrerName: string | null; + fahrer: string | null; + color: string | null; +}; +export type TourStaging = { + internalId: Generated; + id: string | null; + done: boolean | null; + direction: string | null; + carName: string | null; + operationId: string | null; + driverId: string | null; + driverName: string | null; + codriverId: string | null; + codriverName: string | null; + patientId: string | null; + patientName: string | null; + patientSurname: string | null; + patientStreet: string | null; + patientZip: string | null; + patientCity: string | null; + healthInsurance: string | null; + healthInsuranceNumber: string | null; + type: string | null; + category: string | null; + transportType: string | null; + ordinanceType: string | null; + rangeEndDate: Timestamp | null; + startInstitution: string | null; + startStreet: string | null; + startZip: string | null; + startCity: string | null; + targetInstitution: string | null; + targetStreet: string | null; + targetZip: string | null; + targetCity: string | null; + startDate: Timestamp | null; + check: Generated; + occupiedKm: number | null; + totalKm: number | null; + startBegin: string | null; + startEnd: string | null; + target: string | null; + targetBegin: string | null; + empty: string | null; + hasInfection: Generated; + infectionName: string | null; + revenueDispoLive: number | null; + billDate: Timestamp | null; + billNumber: string | null; + revenue: Generated; + revenueDeviation: Generated; + consumptionCosts: Generated; + createdAt: Timestamp | null; +}; +export type Trace = { + id: Generated; + type: string; + entityKey: string; + createdAt: Generated; +}; +export type WorkTime = { + id: string; + userId: string; + firstname: string; + surname: string; + startDate: Timestamp | null; + endDate: Timestamp | null; + department: string | null; + pause: number; + duration: number; +}; +export type WorkTimeSource = { + internalId: Generated; + insertedAt: Generated; + jobId: string; + id: string | null; + user_id: string | null; + firstname: string | null; + surname: string | null; + department_id: string | null; + department_name: string | null; + start_date: string | null; + end_date: string | null; + pauze: string | null; + duration: string | null; +}; +export type WorkTimeStaging = { + internalId: Generated; + id: number; + employeeId: number; + firstname: string; + surname: string; + departmentName: string | null; + startDate: Timestamp; + endDate: Timestamp; +}; +export type DB = { + _AvicennaTenantToTariffGroup: AvicennaTenantToTariffGroup; + Anomaly: Anomaly; + AttendanceRegistration: AttendanceRegistration; + AttendanceRegistrationSource: AttendanceRegistrationSource; + AttendanceRegistrationStaging: AttendanceRegistrationStaging; + AvicennaTenant: AvicennaTenant; + CostType: CostType; + DyflexisEmployee: DyflexisEmployee; + Employee: Employee; + EmployeeDispoLiveSource: EmployeeDispoLiveSource; + EmployeeDyflexisSource: EmployeeDyflexisSource; + EmployeeStaging: EmployeeStaging; + Patient: Patient; + PatientSource: PatientSource; + PatientStaging: PatientStaging; + PlannedTime: PlannedTime; + PlannedTimeSource: PlannedTimeSource; + PlannedTimeStaging: PlannedTimeStaging; + SolutionTarget: SolutionTarget; + SolutionTargetStep: SolutionTargetStep; + Tariff: Tariff; + TariffGroup: TariffGroup; + Ticket: Ticket; + TicketStateHistory: TicketStateHistory; + Tour: Tour; + TourSource: TourSource; + TourStaging: TourStaging; + Trace: Trace; + WorkTime: WorkTime; + WorkTimeSource: WorkTimeSource; + WorkTimeStaging: WorkTimeStaging; +}; diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomalies.service.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomalies.service.ts new file mode 100644 index 0000000..5a8da84 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomalies.service.ts @@ -0,0 +1,248 @@ +import { Injectable } from '@nestjs/common'; +import { + Anomaly, + Prisma, + SolutionTarget, + SolutionTargetStep, + Tour, +} from '@prisma/client'; +import { Interval } from 'date-fns'; + +import { TraceTypes } from 'src/core/base/trace.types'; +import { PrismaService } from 'src/core/database/prisma.service'; +import { AnomalyDetectorService } from './anomaly-detectors/anomaly-detector.service'; +import { AnomalyTypes } from './anomaly-detectors/anomaly-types.enum'; +import { DriverCertificateDetector } from './anomaly-detectors/driver-certificate.detector'; +import { DriverCodriverSameDetector } from './anomaly-detectors/driver-codriver-same.detector'; +import { EmployeesLoggedInDetector } from './anomaly-detectors/employees-logged-in.detector'; +import { OneTourAtATimeDetector } from './anomaly-detectors/one-tour-at-a-time.detector'; +import { WorkingEmployeeNotInDistributionSystemDetector } from './anomaly-detectors/working-employee-not-in-distribution-system.detector'; + +@Injectable() +export class AnomaliesService { + private detectors = [ + new EmployeesLoggedInDetector(this.anomalyDetectorService), + new DriverCertificateDetector(this.anomalyDetectorService), + new DriverCodriverSameDetector(this.anomalyDetectorService), + new OneTourAtATimeDetector(this.anomalyDetectorService), + new WorkingEmployeeNotInDistributionSystemDetector( + this.anomalyDetectorService, + ), + ]; + + constructor( + private readonly prisma: PrismaService, + private readonly anomalyDetectorService: AnomalyDetectorService, + ) {} + + detectAnomalies(interval: Interval): Promise { + return Promise.all( + this.detectors.map((detector) => detector.detect(interval)), + ).then(async (anomaliesPerDetector) => { + const anomalies = anomaliesPerDetector.flat(); + const anomalyEntities: Anomaly[] = []; + for (const anomaly of anomalies) { + if (anomaly) { + anomalyEntities.push( + await this.prisma.anomaly.upsert({ + where: { + id: anomaly.id, + }, + create: { + ...anomaly, + }, + update: {}, + }), + ); + } + } + return anomalyEntities; + }); + } + + async validateAnomalies(): Promise { + const anomalies = await this.prisma.anomaly.findMany({ + where: { + resolvedAt: null, + }, + }); + + return Promise.all( + anomalies.map((anomaly) => + this.detectors + .find((detector) => detector.type === anomaly.type) + .validate(anomaly), + ), + ).then(async (anomalies) => { + const validatedAnomalies = anomalies.flat(); + const updatedAnomalies: Anomaly[] = []; + for (const anomaly of validatedAnomalies) { + updatedAnomalies.push( + await this.prisma.anomaly.update({ + where: { + id: anomaly.id, + }, + data: { + resolvedAt: anomaly.resolvedAt, + manuallyResolved: false, + }, + }), + ); + } + return updatedAnomalies; + }); + } + + countActiveAnomalies(types: AnomalyTypes[] = []): Promise { + return this.prisma.anomaly.count({ + where: this.getWhereActiveAnomalyQuery(types), + }); + } + + findActiveAnomalies( + skip?: number, + take?: number, + types: AnomalyTypes[] = [], + ): Promise { + return this.prisma.anomaly.findMany({ + ...{ + ...(skip ? { skip, take: 10 } : {}), + ...(take ? { take } : {}), + ...(take && !skip ? { skip: 0 } : {}), + }, + where: this.getWhereActiveAnomalyQuery(types), + orderBy: { + groupKey: 'asc', + }, + include: { + solution: true, + }, + }); + } + + async findActiveAnomaliesGroupedByGroupKey( + skip = 0, + take = 10, + ): Promise<{ + totalCount: number; + anomalies: { key: string; anomalies: Anomaly[] }[]; + }> { + const activeAnomalies = await this.findActiveAnomalies( + undefined, + undefined, + [ + AnomalyTypes.DriverCertificate, + AnomalyTypes.EmployeesLoggedIn, + AnomalyTypes.OneTourAtATime, + ], + ); + + const groupedAnomalies = this.groupAnomaliesByGroupKey(activeAnomalies); + + return { + totalCount: Object.keys(groupedAnomalies).length, + anomalies: Object.entries(groupedAnomalies) + .map(([key, anomalies]) => ({ + key, + anomalies, + })) + .slice(skip, skip + take), + }; + } + + findById(id: string): Promise { + return this.prisma.anomaly.findUnique({ + where: { + id, + }, + }); + } + + findSolutionTargetsByAnomalyId(anomalyId: string): Promise { + return this.prisma.solutionTarget.findMany({ + where: { + anomalyId, + }, + }); + } + + findSolutionTargetStepsBySolutionTargetId( + solutionTargetId: string, + ): Promise { + return this.prisma.solutionTargetStep.findMany({ + where: { + solutionTargetId, + }, + }); + } + + findTourByOperationId(operationId: string): Promise { + return this.prisma.tour.findUnique({ where: { operationId } }); + } + + async setAnomalyToSleep(anomalyId: string): Promise { + await this.prisma.trace.create({ + data: { + entityKey: anomalyId, + type: TraceTypes.AnomalyIgnored, + }, + }); + return this.prisma.anomaly.update({ + where: { + id: anomalyId, + }, + data: { + sleepSince: new Date(), + }, + }); + } + + async acceptAnomaly(anomalyId: string): Promise { + await this.prisma.trace.create({ + data: { + entityKey: anomalyId, + type: TraceTypes.AnomalyAccepted, + }, + }); + return this.prisma.anomaly.update({ + where: { + id: anomalyId, + }, + data: { + resolvedAt: new Date(), + manuallyResolved: true, + }, + }); + } + + private getWhereActiveAnomalyQuery( + types: AnomalyTypes[] = [], + ): Prisma.AnomalyWhereInput { + return { + ...(types.length ? { type: { in: types } } : {}), + resolvedAt: null, + OR: [ + { + sleepSince: null, + }, + { + sleepSince: { + lt: new Date(new Date().getTime() - 60 * 60 * 1000), + }, + }, + ], + }; + } + + private groupAnomaliesByGroupKey( + anomalies: Anomaly[], + ): Record { + return anomalies.reduce( + (grouped, anomaly) => ({ + ...grouped, + [anomaly.groupKey]: [...(grouped[anomaly.groupKey] ?? []), anomaly], + }), + {} as Record, + ); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detection.module.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detection.module.ts new file mode 100644 index 0000000..a2f4aaf --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detection.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/core/database/prisma.module'; +import { AnomaliesService } from './anomalies.service'; +import { AnomalyDetectorService } from './anomaly-detectors/anomaly-detector.service'; + +@Module({ + imports: [PrismaModule], + providers: [AnomaliesService, AnomalyDetectorService], + exports: [AnomaliesService], +}) +export class AnomalyDetectionModule {} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-detector.class.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-detector.class.ts new file mode 100644 index 0000000..ccba2a6 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-detector.class.ts @@ -0,0 +1,36 @@ +import { Anomaly, Prisma } from '@prisma/client'; +import { Interval } from 'date-fns'; + +import { AnomalyDetectorService } from './anomaly-detector.service'; + +export type AnomalySkeleton = Pick< + Prisma.AnomalyCreateInput, + 'createdAt' | 'workedOnBy' | 'sleepTimer' | 'sleepSince' +>; +export abstract class AnomalyDetector { + constructor(protected readonly dataService: AnomalyDetectorService) {} + /** + * Unique identifier of the Anomaly Type which is implemented by the class + * TODO: Make the type typesafe + */ + abstract readonly type: string; + /** + * Generic method call to detect anomalies in the data + */ + abstract detect(inInterval: Interval): Promise; + /** + * Generic method call to validate if an anomaly has been solved + */ + abstract validate(anomaly: Anomaly): Promise; + abstract createDescription(data: unknown): string; + abstract createSolution(data: unknown): Prisma.SolutionTargetCreateInput[]; + + protected getAnomalySkeleton(): AnomalySkeleton { + return { + createdAt: new Date(), + workedOnBy: '', + sleepTimer: 60 * 60 * 1000, + sleepSince: null, + }; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-detector.service.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-detector.service.ts new file mode 100644 index 0000000..47c1dee --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-detector.service.ts @@ -0,0 +1,347 @@ +import { Injectable } from '@nestjs/common'; +import { + AttendanceRegistration, + Employee, + PlannedTime, + Prisma, + Tour, + WorkTime, +} from '@prisma/client'; +import { Interval, addDays, addHours, endOfDay, startOfDay } from 'date-fns'; +import { AttendanceRegistrationEvents } from 'src/core/base/attendance-registration-events.enum'; +import { PrismaService } from 'src/core/database/prisma.service'; + +export type AnomalySkeleton = Pick< + Prisma.AnomalyCreateInput, + | 'createdAt' + | 'workedOnBy' + | 'sleepTimer' + | 'sleepSince' + | 'resolvedAt' + | 'manuallyResolved' +>; + +@Injectable() +export class AnomalyDetectorService { + constructor(private readonly prisma: PrismaService) {} + + /** + * Find a list of tours in a given time interval + * @param interval An interval defining the time range of tours + * @returns + */ + public findToursInInterval( + { start, end }: Interval, + ordinanceTypes: string[] = [], + ): Promise { + return this.prisma.tour.findMany({ + where: { + AND: [ + { + startDate: { + gte: new Date(start), + }, + }, + { + startDate: { + lt: new Date(end), + }, + }, + { + check: { + lte: 2, + }, + }, + ordinanceTypes.length + ? { ordinanceType: { in: ordinanceTypes } } + : {}, + { + OR: [ + { + carName: null, + }, + { + AND: [ + { + carName: { + not: 'Storno', + }, + }, + { + carName: { + not: 'Löschen', + }, + }, + { + carName: { + not: 'Abgabe', + }, + }, + ], + }, + ], + }, + { + deletedAt: null, + }, + { + OR: [ + { + patientId: null, + }, + { + patientId: { + // Pause + not: 'b7424477-a4b2-42f7-b7e7-a4bef24f6979', + }, + }, + { + patientId: { + // Feierabend + not: '3554e1a9-9c07-45e5-b53c-692a77e4fa9a', + }, + }, + ], + }, + ], + }, + }); + } + + public findToursInIntervalWithEmployee( + { start, end }: Interval, + employeeId: string, + ordinanceType?: string, + ): Promise { + return this.prisma.tour.findMany({ + where: { + AND: [ + { + OR: [ + { + driverId: employeeId, + }, + { + codriverId: employeeId, + }, + ], + }, + { + startDate: { + gte: new Date(start), + }, + }, + { + startDate: { + lt: new Date(end), + }, + }, + ...(ordinanceType ? [{ ordinanceType }] : []), + { + OR: [ + { + carName: null, + }, + { + AND: [ + { + carName: { + not: 'Storno', + }, + }, + { + carName: { + not: 'Löschen', + }, + }, + { + carName: { + not: 'Abgabe', + }, + }, + ], + }, + ], + }, + { + deletedAt: null, + }, + { + OR: [ + { + patientId: null, + }, + { + patientId: { + // Pause + not: 'b7424477-a4b2-42f7-b7e7-a4bef24f6979', + }, + }, + { + patientId: { + // Feierabend + not: '3554e1a9-9c07-45e5-b53c-692a77e4fa9a', + }, + }, + ], + }, + ], + }, + }); + } + + public findTourByOperationId(operationId): Promise { + return this.prisma.tour.findUnique({ where: { operationId } }); + } + + public findWorkTimeByPersonnelNumberForDay( + personnelNumber: string, + day: Date, + ): Promise { + let startOfGivenDay: Date; + if (day.getHours() >= 0 && day.getHours() < 3) { + startOfGivenDay = addDays(day, -1); + } else { + startOfGivenDay = startOfDay(day); + } + const endOfGivenDay = endOfDay(startOfGivenDay); + return this.prisma.workTime.findFirst({ + where: { + userId: personnelNumber, + AND: [ + { + startDate: { + gte: startOfGivenDay, + }, + }, + { + startDate: { + lte: endOfGivenDay, + }, + }, + ], + }, + }); + } + + public findAttendanceRegistrationByPersonnelNumberForShift( + personnelNumber: string, + day: Date, + eventTypes: AttendanceRegistrationEvents[] = [ + AttendanceRegistrationEvents.ClockedIn, + AttendanceRegistrationEvents.ClockedOut, + ], + ): Promise { + let startOfGivenDay: Date; + if (day.getHours() >= 0 && day.getHours() < 3) { + startOfGivenDay = addDays(day, -1); + } else { + startOfGivenDay = startOfDay(day); + } + const endOfShift = addHours(day, 12); + return this.prisma.attendanceRegistration.findMany({ + where: { + employeeId: +personnelNumber, + event: { + in: eventTypes, + }, + AND: [ + { + dateTime: { + gte: startOfGivenDay, + }, + }, + { + dateTime: { + lt: endOfShift, + }, + }, + ], + }, + orderBy: { + dateTime: 'asc', + }, + }); + } + + public findPlannedTimeByPersonnelNumberForDay( + personnelNumber: string, + day: Date, + ): Promise { + let startOfGivenDay: Date; + if (day.getHours() >= 0 && day.getHours() < 3) { + startOfGivenDay = addDays(day, -1); + } else { + startOfGivenDay = startOfDay(day); + } + const endOfShift = addHours(day, 12); + return this.prisma.plannedTime.findMany({ + where: { + userId: personnelNumber, + AND: [ + { + startDate: { + gte: startOfGivenDay, + }, + }, + { + startDate: { + lt: endOfShift, + }, + }, + ], + }, + }); + } + + public findAttendanceRegistrationById( + attendanceRegistrationId: number, + ): Promise { + return this.prisma.attendanceRegistration.findUnique({ + where: { + attendanceRegistrationId, + }, + }); + } + + public findAttendanceRegistrationInInterval( + interval: Interval, + eventTypes: AttendanceRegistrationEvents[] = [ + AttendanceRegistrationEvents.ClockedIn, + AttendanceRegistrationEvents.ClockedOut, + ], + ): Promise { + return this.prisma.attendanceRegistration.findMany({ + where: { + event: { + in: eventTypes, + }, + AND: [ + { + dateTime: { + gte: startOfDay(interval.start), + }, + }, + { + dateTime: { + lt: endOfDay(interval.end), + }, + }, + ], + }, + orderBy: { + dateTime: 'asc', + }, + }); + } + + public findEmployeeById(employeeId: string): Promise { + return this.prisma.employee.findUnique({ where: { id: employeeId } }); + } + + public findEmployeeByPersonnelNumber( + personnelNumber: string, + ): Promise { + return this.prisma.employee.findFirst({ where: { personnelNumber } }); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-types.enum.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-types.enum.ts new file mode 100644 index 0000000..5f9a6d7 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/anomaly-types.enum.ts @@ -0,0 +1,7 @@ +export enum AnomalyTypes { + DriverCodriverSame = 'DriverCodriverSame', + DriverCertificate = 'DriverCertificate', + EmployeesLoggedIn = 'EmployeesLoggedIn', + OneTourAtATime = 'OneTourAtATime', + WorkingEmployeeNotInDistributionSystem = 'WorkingEmployeeNotInDistributionSystem', +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/driver-certificate.detector.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/driver-certificate.detector.ts new file mode 100644 index 0000000..8bfd0c0 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/driver-certificate.detector.ts @@ -0,0 +1,174 @@ +import { Logger } from '@nestjs/common'; +import { Anomaly, Prisma } from '@prisma/client'; +import { Interval, format } from 'date-fns'; +import { toZonedTime } from 'date-fns-tz'; + +import { AnomalyDetector } from './anomaly-detector.class'; +import { AnomalyTypes } from './anomaly-types.enum'; + +export class DriverCertificateDetector extends AnomalyDetector { + private readonly logger = new Logger(DriverCertificateDetector.name); + readonly type = AnomalyTypes.DriverCertificate; + + async detect(inInterval: Interval): Promise { + const toursInRange = await this.dataService.findToursInInterval(inInterval); + + const anomalies = await Promise.all( + toursInRange + .filter(({ driverId }) => !!driverId) + .map( + async ({ driverId, startDate, driverName, carName, operationId }) => { + try { + const driverEmployee = + await this.dataService.findEmployeeById(driverId); + if (!driverEmployee) { + return; + return this.createAnomaly( + `${operationId}-${driverId}-${this.type}`, + operationId, + carName, + driverName ?? '', + new Date(startDate), + ); + } + if ( + !this.isPersonTransportCertificateValidAtStartOfTour( + driverEmployee.personTransportCertificate, + startDate, + ) + ) { + return this.createAnomaly( + `${operationId}-${driverId}-${this.type}`, + operationId, + carName, + driverName, + new Date(startDate), + ); + } + } catch (error) { + this.logger.error(error); + return; + } + }, + ), + ); + return anomalies.filter((anomaly) => !!anomaly); + } + + async validate(anomaly: Anomaly): Promise { + const [operationId] = anomaly.id.split('-'); + try { + const tour = await this.dataService.findTourByOperationId(operationId); + if (!tour.driverId) { + return { ...anomaly }; + } + const employee = await this.dataService.findEmployeeById(tour.driverId); + if (!employee) { + return { ...anomaly }; + } + if ( + this.isPersonTransportCertificateValidAtStartOfTour( + employee.personTransportCertificate, + tour.startDate, + ) + ) { + return { + ...anomaly, + resolvedAt: new Date(), + }; + } else { + return { + ...anomaly, + }; + } + } catch (error) { + this.logger.error(error, anomaly.id); + return anomaly; + } + } + + createDescription({ + name, + carName, + }: { + name: string; + carName: string; + }): string { + return `${carName}: ${name} hat keinen gültigen P-Schein`; + } + + createSolution({ + carName, + operationId, + startDate, + }: { + carName: string; + operationId: string; + startDate: Date; + }): Prisma.SolutionTargetCreateInput[] { + return [ + { + name: `Fahrzeug ${carName}`, + steps: { + create: [ + { + description: `Klären Sie ob im Fahrzeug ein Fahrer mit P-Schein sitzt`, + }, + { + description: `Informieren Sie das Team des Fahrzeugs, dass sie sich neu anmelden müssen`, + }, + ], + }, + }, + { + name: 'DispoLive', + steps: { + create: [ + { + description: `Passen Sie den Fahrer und Beifahrer der Tour ${operationId} an. Startzeit: ${format( + startDate, + 'HH:mm dd.MM.yy', + )}`, + }, + ], + }, + }, + ]; + } + + private createAnomaly( + anomalyId: string, + operationId: string, + carName: string, + name: string, + startDate: Date, + ): Prisma.AnomalyCreateInput { + return { + ...this.getAnomalySkeleton(), + id: anomalyId, + type: this.type, + groupKey: `${format( + new Date(startDate), + 'yyyy-MM-dd-HH-mm', + )}-${operationId}`, + groupDescription: `${operationId} - ${format( + toZonedTime(new Date(startDate), 'Europe/Berlin'), + 'HH:mm dd.MM.yy', + )}`, + solution: { + create: this.createSolution({ carName, operationId, startDate }), + }, + description: this.createDescription({ name, carName }), + }; + } + + private isPersonTransportCertificateValidAtStartOfTour( + personTransportCertificateValidUntil: Date, + startDateOfTour: Date, + ): boolean { + return ( + new Date(personTransportCertificateValidUntil).getTime() >= + new Date(startDateOfTour).getTime() + ); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/driver-codriver-same.detector.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/driver-codriver-same.detector.ts new file mode 100644 index 0000000..769cdd2 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/driver-codriver-same.detector.ts @@ -0,0 +1,92 @@ +import { Logger } from '@nestjs/common'; +import { Anomaly, Prisma } from '@prisma/client'; +import { Interval, format } from 'date-fns'; +import { toZonedTime } from 'date-fns-tz'; +import { AnomalyDetector } from './anomaly-detector.class'; +import { AnomalyTypes } from './anomaly-types.enum'; + +export class DriverCodriverSameDetector extends AnomalyDetector { + private readonly logger = new Logger(DriverCodriverSameDetector.name); + readonly type = AnomalyTypes.DriverCodriverSame; + + async detect(inInterval: Interval): Promise { + const toursInRange = await this.dataService.findToursInInterval( + inInterval, + ['KTW'], + ); + + const anomalies = await Promise.all( + toursInRange.map( + ({ operationId, carName, startDate, driverId, codriverId }) => { + if (driverId === codriverId) { + return this.createAnomaly( + `${operationId}-${this.type}`, + operationId, + carName, + startDate, + ); + } + }, + ), + ); + return anomalies.filter((anomaly) => !!anomaly); + } + + async validate(anomaly: Anomaly): Promise { + const [operationId] = anomaly.id.split('-'); + const tour = await this.dataService.findTourByOperationId(operationId); + if (tour?.driverId !== tour?.codriverId) { + return { + ...anomaly, + resolvedAt: new Date(), + }; + } + return { ...anomaly }; + } + + createDescription({ carName }: { carName: string }): string { + return `${carName}: Fahrer und Beifahrer identisch`; + } + + createSolution({ + carName, + }: { + carName: string; + }): Prisma.SolutionTargetCreateInput[] { + return [ + { + name: `Fahrzeug ${carName}`, + steps: { + create: [ + { + description: `Stellen Sie sicher, dass im Fahrzeug zwei Personen sitzen.`, + }, + ], + }, + }, + ]; + } + + private createAnomaly( + anomalyId: string, + operationId: string, + carName: string, + startDate: Date, + ): Prisma.AnomalyCreateInput { + return { + ...this.getAnomalySkeleton(), + id: anomalyId, + type: this.type, + groupKey: `${format( + new Date(startDate), + 'yyyy-MM-dd-HH-mm', + )}-${operationId}`, + groupDescription: `${operationId} - ${format( + toZonedTime(new Date(startDate), 'Europe/Berlin'), + 'HH:mm dd.MM.yy', + )}`, + solution: { create: this.createSolution({ carName }) }, + description: this.createDescription({ carName }), + }; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/employees-logged-in.detector.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/employees-logged-in.detector.ts new file mode 100644 index 0000000..82a4d0d --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/employees-logged-in.detector.ts @@ -0,0 +1,346 @@ +import { Logger } from '@nestjs/common'; +import { Anomaly, Employee, Prisma, Tour } from '@prisma/client'; +import { + Interval, + addMinutes, + format, + isBefore, + isWithinInterval, + set, +} from 'date-fns'; +import { toZonedTime, fromZonedTime } from 'date-fns-tz'; + +import { AnomalyDetector } from './anomaly-detector.class'; +import { AnomalyTypes } from './anomaly-types.enum'; + +export class EmployeesLoggedInDetector extends AnomalyDetector { + private readonly logger = new Logger(EmployeesLoggedInDetector.name); + readonly type = AnomalyTypes.EmployeesLoggedIn; + + async detect(inInterval: Interval): Promise { + const toursInRange = await this.dataService.findToursInInterval(inInterval); + + const anomaliesByTour = await Promise.all( + toursInRange.map(async (tour) => { + return Promise.all([ + this.detectAnomalyForEmployee(tour, 'driver'), + this.detectAnomalyForEmployee(tour, 'codriver'), + ]); + }), + ); + return anomaliesByTour.filter((anomaly) => !!anomaly).flat(); + } + + async validate(anomaly: Anomaly): Promise { + const [operationId, ...remainingIdParts] = anomaly.id.split('-'); + try { + const employeeId = remainingIdParts.slice(0, -1).join('-'); + const tour = await this.dataService.findTourByOperationId(operationId); + const employee = await this.dataService.findEmployeeById(employeeId); + const startOfTour = this.getStartOfTour( + new Date(tour.startDate), + [ + tour.startBegin, + tour.startEnd, + tour.target, + tour.targetBegin, + tour.empty, + ].filter((val) => !!val)[0], + ); + + if (!startOfTour) return anomaly; + + if (this.validateEmployee(employee)) { + const [isEmployeeLoggedIn] = await this.isEmployeeLoggedInAtDateTime( + employee.personnelNumber, + startOfTour, + ); + + if (isEmployeeLoggedIn) { + return { + ...anomaly, + resolvedAt: new Date(), + }; + } else { + return { ...anomaly }; + } + } else { + return anomaly; + } + } catch (error) { + this.logger.error(error, anomaly.id); + return anomaly; + } + } + + createDescription(name: string): string { + return `${name} ist nicht in der Zeiterfassung angemeldet`; + } + + createSolution({ + name, + mobile, + startOfTour, + attendanceInterval, + }: { + name: string; + mobile: string; + startOfTour: Date; + attendanceInterval: Interval; + }): Prisma.SolutionTargetCreateInput[] { + return [ + { + name: 'Mitarbeiter', + steps: { + create: [ + { + description: `Informieren Sie ${name}, dass er sich einstempeln muss. ${ + mobile ? `(${mobile})` : '' + }`, + }, + { + description: `Zeitpunkt der Tour Anfahrt: ${format( + toZonedTime(startOfTour, 'Europe/Berlin'), + 'HH:mm', + )}`, + }, + ...(attendanceInterval + ? [ + { + description: `Registrierte Anwesenheit: ${format( + toZonedTime(attendanceInterval.start, 'Europe/Berlin'), + 'HH:mm', + )}${ + attendanceInterval.end + ? ` - ${format( + toZonedTime( + attendanceInterval.end, + 'Europe/Berlin', + ), + 'HH:mm', + )}` + : '' + }`, + }, + ] + : []), + ], + }, + }, + { + name: 'Dyflexis', + steps: { + create: [ + { + description: `Korrigieren Sie den Zeitstempel auf den Arbeitsbeginn des Mitarbeiters`, + }, + ], + }, + }, + ]; + } + + private async detectAnomalyForEmployee( + { + driverId, + codriverId, + startDate, + startBegin, + startEnd, + target, + targetBegin, + empty, + operationId, + }: Tour, + driverType: 'driver' | 'codriver', + ): Promise { + const employeeId = driverType === 'driver' ? driverId : codriverId; + if (!employeeId) { + return Promise.resolve(undefined); + } + + const employee = await this.dataService.findEmployeeById(employeeId); + if (!employee) return; + + const startOfTour = this.getStartOfTour( + new Date(startDate), + [startBegin, startEnd, target, targetBegin, empty].filter( + (val) => !!val, + )[0], + ); + + if (!startOfTour) return Promise.resolve(undefined); + + if (this.validateEmployee(employee)) { + const [isEmployeeLoggedIn, checkedInterval] = + await this.isEmployeeLoggedInAtDateTime( + employee.personnelNumber, + startOfTour, + ); + + if (!isEmployeeLoggedIn) { + const employeeName = `${employee.name} ${employee.surname}`; + return this.createAnomaly( + `${operationId}-${driverId}-${this.type}`, + operationId, + employeeName, + employee.mobile, + startDate, + startOfTour, + checkedInterval, + ); + } + } + return Promise.resolve(undefined); + } + + private validateEmployee(employee: Employee | undefined) { + if (!employee) { + this.logger.warn(`Employee does not exist`); + return false; + } + if (!employee.personnelNumber) { + this.logger.warn( + `Employee has no personnelNumber`, + employee.id, + employee.surname, + employee.name, + ); + return false; + } + return true; + } + + private createAnomaly( + anomalyId: string, + operationId: string, + name: string, + mobile: string, + startDate: Date, + startOfTour: Date, + attendanceInterval: Interval, + ): Prisma.AnomalyCreateInput { + return { + ...this.getAnomalySkeleton(), + id: anomalyId, + type: this.type, + groupKey: `${format( + new Date(startDate), + 'yyyy-MM-dd-HH-mm', + )}-${operationId}`, + groupDescription: `${operationId} - ${format( + toZonedTime(new Date(startDate), 'Europe/Berlin'), + 'HH:mm dd.MM.yy', + )}`, + solution: { + create: this.createSolution({ + name, + mobile, + startOfTour, + attendanceInterval, + }), + }, + description: this.createDescription(name), + }; + } + + private async isEmployeeLoggedInAtDateTime( + personnelNumber: string, + datetimeToCheck: Date, + ): Promise<[boolean, Interval]> { + const workTime = await this.dataService.findWorkTimeByPersonnelNumberForDay( + personnelNumber, + datetimeToCheck, + ); + const attendanceRegistrations = + await this.dataService.findAttendanceRegistrationByPersonnelNumberForShift( + personnelNumber, + datetimeToCheck, + ); + + const firstClockedIn = attendanceRegistrations.filter( + ({ event }) => event === 'clocked in', + )[0]; + const lastClockedOut = attendanceRegistrations + .filter(({ event }) => event === 'clocked out') + .reverse()[0]; + + const datetimeToCheckWithBuffer = addMinutes(datetimeToCheck, 5); + + if (personnelNumber === '23') { + console.log( + datetimeToCheck, + { + start: new Date(workTime.startDate), + end: new Date(workTime.endDate), + }, + { + start: new Date(firstClockedIn.dateTime), + end: new Date(lastClockedOut.dateTime), + }, + ); + } + try { + if (workTime) { + const interval = { + start: new Date(workTime.startDate), + end: new Date(workTime.endDate), + }; + return [ + isWithinInterval(datetimeToCheckWithBuffer, interval) || + isWithinInterval(datetimeToCheck, interval), + interval, + ]; + } else if ( + firstClockedIn && + lastClockedOut && + isBefore(lastClockedOut.dateTime, firstClockedIn.dateTime) + ) { + return [ + false, + { + start: firstClockedIn.dateTime, + end: undefined, + }, + ]; + } else if (firstClockedIn && lastClockedOut) { + const interval = { + start: new Date(firstClockedIn.dateTime), + end: new Date(lastClockedOut.dateTime), + }; + return [ + isWithinInterval(datetimeToCheckWithBuffer, interval) || + isWithinInterval(datetimeToCheck, interval), + interval, + ]; + } else if (firstClockedIn && !lastClockedOut) { + return [ + isBefore(new Date(firstClockedIn.dateTime), datetimeToCheck) || + isBefore( + new Date(firstClockedIn.dateTime), + datetimeToCheckWithBuffer, + ), + { start: firstClockedIn.dateTime, end: undefined }, + ]; + } else { + return [false, undefined]; + } + } catch (error) { + this.logger.error( + error, + datetimeToCheck.toISOString(), + workTime, + firstClockedIn, + lastClockedOut, + ); + return [false, undefined]; + } + } + + private getStartOfTour(startDate: Date, startBegin: string) { + if (!startBegin) return null; + const zonedTime = toZonedTime(startDate, 'Europe/Berlin'); + const [hours, minutes] = startBegin.split(':').map((v) => +v); + return fromZonedTime(set(zonedTime, { hours, minutes }), 'Europe/Berlin'); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/one-tour-at-a-time.detector.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/one-tour-at-a-time.detector.ts new file mode 100644 index 0000000..b834f65 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/one-tour-at-a-time.detector.ts @@ -0,0 +1,371 @@ +import { Logger } from '@nestjs/common'; +import { Anomaly, Prisma } from '@prisma/client'; +import { + addDays, + areIntervalsOverlapping, + endOfDay, + format, + Interval, + isBefore, + isWithinInterval, + set, + startOfDay, +} from 'date-fns'; +import { toZonedTime, fromZonedTime } from 'date-fns-tz'; + +import { AnomalyDetector } from './anomaly-detector.class'; +import { AnomalyTypes } from './anomaly-types.enum'; + +export class OneTourAtATimeDetector extends AnomalyDetector { + private readonly logger = new Logger(OneTourAtATimeDetector.name); + readonly type = AnomalyTypes.OneTourAtATime; + + async detect(inInterval: Interval): Promise { + const toursInRange = await this.dataService.findToursInInterval(inInterval); + + return toursInRange + .map( + ( + { + operationId, + startDate, + startBegin, + startEnd, + targetBegin, + target, + empty, + carName, + driverId, + driverName, + codriverId, + codriverName, + }, + _, + tours, + ) => { + // somehow startBegin can be after empty, so we use startBegin and startEnd and take the lower value and hope for the best + const [start] = [startBegin, startEnd].sort(); + // somehow empty can be before everything else, so we use targetBegin, target and empty and take the higher value ... + const [end] = [targetBegin, target, empty] + .filter((val) => !!val) + .sort() + .reverse(); + + if (!start || !end) { + if (isBefore(new Date(), startDate)) { + this.logger.warn( + `Tour ${operationId} started in the past, but is missing start or end time`, + ); + } + return []; + } + const tourInterval = this.getTourInterval(start, end, startDate); + + const toursInInterval = tours + .filter((tour) => + isWithinInterval(tour.startDate, { + start: startOfDay(startDate), + end: endOfDay(startDate), + }), + ) + .filter( + ({ + operationId: tourListOperationId, + carName: tourListCarName, + }) => + tourListOperationId !== operationId && + carName !== tourListCarName, + ) + .filter( + ({ + startDate: tourListStartDate, + startBegin: tourListStartBegin, + startEnd: tourListStartEnd, + targetBegin: tourListTargetBegin, + target: tourListTarget, + empty: tourListEmpty, + }) => { + // somehow startBegin can be after empty, so we use startBegin and startEnd and take the lower value and hope for the best + const [tourListStart] = [ + tourListStartBegin, + tourListStartEnd, + ].sort(); + // somehow empty can be before everything else, so we use targetBegin and empty and take the higher value ... + const [tourListEnd] = [ + tourListTargetBegin, + tourListTarget, + tourListEmpty, + ] + .filter((val) => !!val) + .sort() + .reverse(); + + if (!tourListStart || !tourListEnd) { + return false; + } + + const tourListInterval = this.getTourInterval( + tourListStart, + tourListEnd, + tourListStartDate, + ); + try { + return areIntervalsOverlapping( + tourInterval, + tourListInterval, + ); + } catch (error) { + this.logger.error( + 'tourListInterval', + error, + tourListInterval, + tourInterval, + ); + return false; + } + }, + ); + + const toursInIntervalWithDriver = toursInInterval.filter( + ({ driverId: tourListDriverId, codriverId: tourListCodriverId }) => + driverId === tourListDriverId || driverId === tourListCodriverId, + ); + const toursInIntervalWithCodriver = toursInInterval.filter( + ({ driverId: tourListDriverId, codriverId: tourListCodriverId }) => + codriverId === tourListDriverId || + codriverId === tourListCodriverId, + ); + + const overlappingCarsWithDriver = toursInIntervalWithDriver.map( + ({ carName }) => carName, + ); + const overlappingTourInfoWithDriver = toursInIntervalWithDriver.map( + ({ operationId, startDate }) => ({ + startDate: format(new Date(startDate), 'HH:mm dd.MM.yy'), + operationId, + }), + ); + const overlappingCarsWithCodriver = toursInIntervalWithCodriver.map( + ({ carName }) => carName, + ); + const overlappingTourInfoWithCodriver = + toursInIntervalWithCodriver.map(({ operationId, startDate }) => ({ + startDate: format(new Date(startDate), 'HH:mm dd.MM.yy'), + operationId, + })); + return [ + toursInIntervalWithDriver.length + ? this.createAnomaly( + `${operationId}-${driverId}-${this.type}`, + operationId, + driverName, + startDate, + [carName, ...overlappingCarsWithDriver], + [ + { + operationId, + startDate: format(new Date(startDate), 'HH:mm dd.MM.yy'), + }, + ...overlappingTourInfoWithDriver, + ], + ) + : undefined, + toursInIntervalWithCodriver.length + ? this.createAnomaly( + `${operationId}-${codriverId}-${this.type}`, + operationId, + codriverName, + startDate, + [carName, ...overlappingCarsWithCodriver], + [ + { + operationId, + startDate: format(new Date(startDate), 'HH:mm dd.MM.yy'), + }, + ...overlappingTourInfoWithCodriver, + ], + ) + : undefined, + ]; + }, + ) + .flat() + .filter((anomaly) => !!anomaly); + } + + async validate(anomaly: Anomaly): Promise { + const [operationId, ...remainingIdParts] = anomaly.id.split('-'); + const employeeId = remainingIdParts.slice(0, -1).join('-'); + + try { + const tour = await this.dataService.findTourByOperationId(operationId); + const { startBegin, startEnd, target, targetBegin, empty, startDate } = + tour; + + // somehow startBegin can be after empty, so we use startBegin and startEnd and take the lower value and hope for the best + const [start] = [startBegin, startEnd].sort(); + // somehow empty can be before everything else, so we use targetBegin, target and empty and take the higher value ... + const [end] = [targetBegin, target, empty] + .filter((val) => !!val) + .sort() + .reverse(); + + const tourInterval: Interval = this.getTourInterval( + start, + end, + startDate, + ); + const startOfDayWithTour = startOfDay(startDate); + const endOfDayWithTour = endOfDay(startDate); + + const toursWithEmployee = + await this.dataService.findToursInIntervalWithEmployee( + { start: startOfDayWithTour, end: endOfDayWithTour }, + employeeId, + 'KTW', + ); + + if ( + !toursWithEmployee + .filter( + ({ operationId: tourListOperationId }) => + operationId !== tourListOperationId, + ) + .some( + ({ + startDate: tourListStartDate, + startBegin: tourListStartBegin, + startEnd: tourListStartEnd, + targetBegin: tourListTargetBegin, + target: tourListTarget, + empty: tourListEmpty, + }) => { + // somehow startBegin can be after empty, so we use startBegin and startEnd and take the lower value and hope for the best + const [start] = [tourListStartBegin, tourListStartEnd].sort(); + // somehow empty can be before everything else, so we use targetBegin, target and empty and take the higher value ... + const [end] = [tourListTargetBegin, tourListTarget, tourListEmpty] + .filter((val) => !!val) + .sort() + .reverse(); + + const tourListTourInterval = this.getTourInterval( + start, + end, + tourListStartDate, + ); + return areIntervalsOverlapping( + tourInterval, + tourListTourInterval, + ); + }, + ) + ) { + return { + ...anomaly, + resolvedAt: new Date(), + }; + } + return { ...anomaly }; + } catch (error) { + this.logger.error(error, anomaly.id); + return anomaly; + } + } + + createDescription({ name }: { name: string }): string { + return `${name} ist auf mehr als einer Tour gleichzeitig`; + } + + createSolution({ + name, + carNames, + tourInfo, + }: { + name: string; + carNames: string[]; + tourInfo: { operationId: string; startDate: string }[]; + }): Prisma.SolutionTargetCreateInput[] { + return [ + { + name: `Mitarbeiter ${name}`, + steps: { + create: [ + { + description: `Sprechen Sie mit ${name} und klären Sie in welchem Fahrzeug er ist`, + }, + { + description: `Informieren Sie das Team des Fahrzeugs auf dem der Mitarbeiter nicht ist, dass sie sich neu anmelden müssen`, + }, + { + description: `Fahrzeuge mit diesem Mitarbeiter: ${carNames.join( + ', ', + )}`, + }, + ], + }, + }, + { + name: 'DispoLive', + steps: { + create: [ + { + description: `Prüfen Sie ob bei den hier aufgelisteten Touren der Fahrer und Beifahrer richtig eingetragen sind`, + }, + ...tourInfo.map(({ operationId, startDate }) => ({ + description: `Einsatznummer: ${operationId} - ${startDate}`, + })), + ], + }, + }, + ]; + } + + private createAnomaly( + anomalyId: string, + operationId: string, + name: string, + startDate, + carNames: string[], + tourInfo: { operationId: string; startDate: string }[], + ): Prisma.AnomalyCreateInput { + return { + ...this.getAnomalySkeleton(), + id: anomalyId, + type: this.type, + groupKey: `${format( + new Date(startDate), + 'yyyy-MM-dd-HH-mm', + )}-${operationId}`, + groupDescription: `${operationId} - ${format( + toZonedTime(new Date(startDate), 'Europe/Berlin'), + 'HH:mm dd.MM.yy', + )}`, + solution: { + create: this.createSolution({ name, carNames, tourInfo }), + }, + description: this.createDescription({ name }), + }; + } + + private getTourInterval( + startTime: string, + endTime: string, + startDate: Date | string, + ): Interval { + return { + start: this.getStartOfTour(new Date(startDate), startTime), + end: this.getStartOfTour(new Date(startDate), endTime), + }; + } + + private getStartOfTour(startDate: Date, startBegin: string) { + if (!startBegin) return null; + const zonedTime = toZonedTime(startDate, 'Europe/Berlin'); + const [hours, minutes] = startBegin.split(':').map((v) => +v); + let baseDate = new Date(zonedTime); + if (hours >= 0 && hours < 3 && startDate.getHours() > 3) { + baseDate = addDays(baseDate, 1); + } + return fromZonedTime(set(baseDate, { hours, minutes }), 'Europe/Berlin'); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/working-employee-not-in-distribution-system.detector.ts b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/working-employee-not-in-distribution-system.detector.ts new file mode 100644 index 0000000..7b62016 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-anomalies/anomaly-detectors/working-employee-not-in-distribution-system.detector.ts @@ -0,0 +1,171 @@ +import { Logger } from '@nestjs/common'; +import { Anomaly, Prisma } from '@prisma/client'; +import { Interval, endOfDay, format, startOfDay } from 'date-fns'; +import { toZonedTime } from 'date-fns-tz'; + +import { AttendanceRegistrationEvents } from 'src/core/base/attendance-registration-events.enum'; +import { AnomalyDetector } from './anomaly-detector.class'; +import { AnomalyTypes } from './anomaly-types.enum'; + +export class WorkingEmployeeNotInDistributionSystemDetector extends AnomalyDetector { + private readonly logger = new Logger( + WorkingEmployeeNotInDistributionSystemDetector.name, + ); + readonly type = AnomalyTypes.WorkingEmployeeNotInDistributionSystem; + + async detect(inInterval: Interval): Promise { + const attendanceRegistrationInInterval = + await this.dataService.findAttendanceRegistrationInInterval(inInterval, [ + AttendanceRegistrationEvents.ClockedIn, + ]); + + const anomalies = await Promise.all( + attendanceRegistrationInInterval.map( + async ({ + attendanceRegistrationId, + // As worktime and plannedtime use the internal employeeId of dyflexis we use it as the personnelNumber entered in dispoLive + employeeId: personnelNumber, + dateTime, + }) => { + try { + const employee = + await this.dataService.findEmployeeByPersonnelNumber( + `${personnelNumber}`, + ); + if (!employee) return; + + const plannedTime = + await this.dataService.findPlannedTimeByPersonnelNumberForDay( + `${personnelNumber}`, + dateTime, + ); + if ( + plannedTime.find( + ({ department }) => + department.toLowerCase() == 'Büro'.toLowerCase() || + department.toLowerCase() == 'Leitstelle'.toLowerCase(), + ) + ) { + return; + } + const toursWithEmployee = + await this.dataService.findToursInIntervalWithEmployee( + { + start: startOfDay(new Date(dateTime)), + end: endOfDay(new Date(dateTime)), + }, + employee.id, + ); + if (toursWithEmployee.length === 0) { + return this.createAnomaly( + `${attendanceRegistrationId}-${employee.id}`, + format(new Date(dateTime), 'yyyy-MM-dd'), + `${employee.name} ${employee.surname}`, + ); + } + } catch (error) { + this.logger.warn( + `Employee does not exist! PersonnelNumber: ${personnelNumber}`, + error, + ); + return; + } + }, + ), + ); + return anomalies.filter((anomaly) => !!anomaly); + } + + async validate(anomaly: Anomaly): Promise { + const [attendanceRegistrationId, ...employeeIdParts] = + anomaly.id.split('-'); + const attendanceRegistration = + await this.dataService.findAttendanceRegistrationById( + +attendanceRegistrationId, + ); + const employeeId = employeeIdParts.join('-'); + const employee = await this.dataService.findEmployeeById(employeeId); + + const plannedTime = + await this.dataService.findPlannedTimeByPersonnelNumberForDay( + `${employee.personnelNumber}`, + attendanceRegistration.dateTime, + ); + if ( + plannedTime.find( + ({ department }) => + department.toLowerCase() == 'Büro'.toLowerCase() || + department.toLowerCase() == 'Leitstelle'.toLowerCase(), + ) + ) { + return { + ...anomaly, + resolvedAt: new Date(), + }; + } + const toursWithEmployee = + await this.dataService.findToursInIntervalWithEmployee( + { + start: startOfDay(new Date(attendanceRegistration.dateTime)), + end: endOfDay(new Date(attendanceRegistration.dateTime)), + }, + employee.id, + ); + if (toursWithEmployee.length > 0) { + return { + ...anomaly, + resolvedAt: new Date(), + }; + } + return { + ...anomaly, + }; + } + + createDescription(name: string): string { + return `${name} ist keinem Fahrzeug zugewiesen`; + } + + createSolution(date: string): Prisma.SolutionTargetCreateInput[] { + return [ + { + name: `Mitarbeiter ${date}`, + steps: { + create: [ + { + description: + 'Ist der Mitarbeiter teil des Fahrerteams, dann informieren Sie ihn, dass er sich am Fahrzeug anmelden muss', + }, + { + description: + 'Ist der Mitarbeiter nicht teil des Fahrerteams, akzeptieren Sie diese Anomalie', + }, + ], + }, + }, + ]; + } + + private createAnomaly( + anomalyId: string, + dateString: string, + name: string, + ): Prisma.AnomalyCreateInput { + return { + ...this.getAnomalySkeleton(), + id: anomalyId, + type: this.type, + groupKey: dateString, + groupDescription: `${format(toZonedTime(new Date(dateString), 'Europe/Berlin'), 'dd.MM.yy')}`, + solution: { + create: this.createSolution( + format( + toZonedTime(new Date(dateString), 'Europe/Berlin'), + 'dd.MM.yy', + ), + ), + }, + description: this.createDescription(name), + }; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-calculation/billing-information-by-ordinance-type.ts b/service/data-hub/data-connector/src/modules/feat-calculation/billing-information-by-ordinance-type.ts new file mode 100644 index 0000000..6d2c239 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-calculation/billing-information-by-ordinance-type.ts @@ -0,0 +1,110 @@ +export const BILLING_INFORMATION_BY_ORDINANCE_TYPE = { + BTW: { + 'Mo-Fr': { + '03:00-11:59': { + personnelCostsPerHour: 20.23, + consumptionCostsPerTour: 3.68, + revenuePerTour: 41.22, + }, + '12:00-18:29': { + personnelCostsPerHour: 20.23, + consumptionCostsPerTour: 3.68, + revenuePerTour: 41.22, + }, + '18:30-02:59': { + personnelCostsPerHour: 24.59, + consumptionCostsPerTour: 3.68, + revenuePerTour: 41.22, + }, + }, + Sa: { + '03:00-11:59': { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + revenuePerTour: 41.22, + }, + '12:00-18:29': { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + revenuePerTour: 41.22, + }, + '18:30-02:59': { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + revenuePerTour: 41.22, + }, + }, + }, + TSW: { + 'Mo-Fr': { + '03:00-11:59': { + personnelCostsPerHour: 20.23, + consumptionCostsPerTour: 3.68, + revenuePerTour: 58.08, + }, + '12:00-18:29': { + personnelCostsPerHour: 20.23, + consumptionCostsPerTour: 3.68, + revenuePerTour: 58.08, + }, + '18:30-02:59': { + personnelCostsPerHour: 24.59, + consumptionCostsPerTour: 3.68, + revenuePerTour: 58.08, + }, + }, + Sa: { + '03:00-11:59': { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + revenuePerTour: 58.08, + }, + '12:00-18:29': { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + revenuePerTour: 58.08, + }, + '18:30-02:59': { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + revenuePerTour: 58.08, + }, + }, + }, + KTW: { + 'Mo-Fr': { + '03:00-11:59': { + personnelCostsPerHour: 56.36 / 2, + consumptionCostsPerTour: 4.02, + revenuePerTour: 128.08, + }, + '12:00-18:29': { + personnelCostsPerHour: 56.36 / 2, + consumptionCostsPerTour: 4.02, + revenuePerTour: 128.08, + }, + '18:30-02:59': { + personnelCostsPerHour: 68.5 / 2, + consumptionCostsPerTour: 4.02, + revenuePerTour: 128.08, + }, + }, + Sa: { + '03:00-11:59': { + personnelCostsPerHour: 64.81 / 2, + consumptionCostsPerTour: 4.02, + revenuePerTour: 128.08, + }, + '12:00-18:29': { + personnelCostsPerHour: 64.81 / 2, + consumptionCostsPerTour: 4.02, + revenuePerTour: 128.08, + }, + '18:30-02:59': { + personnelCostsPerHour: 64.81 / 2, + consumptionCostsPerTour: 4.02, + revenuePerTour: 128.08, + }, + }, + }, +}; diff --git a/service/data-hub/data-connector/src/modules/feat-calculation/calculation.service.ts b/service/data-hub/data-connector/src/modules/feat-calculation/calculation.service.ts new file mode 100644 index 0000000..4cd9ec8 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-calculation/calculation.service.ts @@ -0,0 +1,476 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { + CostType, + CostTypeVariant, + Tariff, + TariffGroup, + Tour, +} from '@prisma/client'; +import { + Interval, + addDays, + isSameDay, + isSaturday, + isWeekend, + isWithinInterval, +} from 'date-fns'; +import { toZonedTime } from 'date-fns-tz'; + +import { PrismaService } from 'src/core/database/prisma.service'; +import { generateIntervalForTimeRange } from 'src/utils'; +import { BILLING_INFORMATION_BY_ORDINANCE_TYPE } from './billing-information-by-ordinance-type'; +import { INFECTION_TYPES } from './infection-types'; +import { PersonnelCostCalculationService } from './personnel-cost-calculation.service'; +import { PUBLIC_HOLIDAYS_HH } from './public-holidays'; + +enum OrdinanceTypes { + BTW = 'BTW', + TSW = 'TSW', + KTW = 'KTW', +} + +@Injectable() +export class CalculationService { + private readonly logger = new Logger(CalculationService.name); + + private healthInsurancesWithNoTenant = []; + + constructor( + private readonly prisma: PrismaService, + private readonly personnelCostCalculationService: PersonnelCostCalculationService, + ) {} + + async calculateTourRevenue(tour: Tour): Promise { + const { healthInsurance, ordinanceType, startDate } = tour; + if (!ordinanceType) { + return 0; + } + const tariff = await this.findTariff( + healthInsurance, + ordinanceType.match(/([A-Z])\w+/).at(0), + new Date(startDate), + ); + if (!tariff) { + this.logger.error( + `No tariff found for tour ${tour.operationId} (${tour.healthInsurance})`, + ); + return 0; + } + const revenue = this.calculateRevenue(tour, tariff) / 100; + return revenue; + } + + public calculatePersonnelCostInInterval( + interval: Interval, + employeeAmount: number, + ordinanceType: string, + ): number { + return this.personnelCostCalculationService.calculatePersonnelCostInInterval( + interval, + ordinanceType, + employeeAmount, + ); + } + + public getBillingInformationByOrdinanceType( + ordinanceType: string, + date: Date, + ) { + if (isSaturday(date)) { + if (ordinanceType.indexOf('KTW') > -1) { + return { + personnelCostsPerHour: 64.81 / 2, + consumptionCostsPerTour: 4.02, + }; + } + return { + personnelCostsPerHour: 23.27, + consumptionCostsPerTour: 3.68, + }; + } + if (ordinanceType.indexOf('KTW') > -1) { + if ( + isWithinInterval( + date, + generateIntervalForTimeRange('18:30-03:00', 'Europe/Berlin', date), + ) + ) { + return { + personnelCostsPerHour: 68.5 / 2, + consumptionCostsPerTour: 4.02, + }; + } + return { + personnelCostsPerHour: 56.36 / 2, + consumptionCostsPerTour: 4.02, + }; + } + + if ( + isWithinInterval( + date, + generateIntervalForTimeRange('18:30-03:00', 'Europe/Berlin', date), + ) + ) { + return { + personnelCostsPerHour: 24.59, + consumptionCostsPerTour: 3.68, + }; + } + return { + personnelCostsPerHour: 20.23, + consumptionCostsPerTour: 3.68, + }; + } + + public getModellBillingInformationByOrdinanceType( + ordinanceType: string, + date: Date, + ) { + const daysKey = isSaturday(date) ? 'Sa' : 'Mo-Fr'; + + if ( + !Object.values(OrdinanceTypes).includes(ordinanceType as OrdinanceTypes) + ) { + throw new Error( + `OrdinanceType not supported. Supported types ${Object.values( + OrdinanceTypes, + ).join(', ')}, got ${ordinanceType}`, + ); + } + + const billingInformationsByIntervals = + BILLING_INFORMATION_BY_ORDINANCE_TYPE[ordinanceType][daysKey] as Record< + string, + { + personnelCostsPerHour: number; + consumptionCostsPerTour: number; + revenuePerTour: number; + } + >; + const billingInformation = Object.entries( + billingInformationsByIntervals, + ).find(([timeRange]) => + isWithinInterval( + date, + generateIntervalForTimeRange( + timeRange, + 'Europe/Berlin', + date.getHours() >= 0 && date.getHours() <= 3 + ? addDays(date, -1) + : date, + ), + ), + ); + if (!billingInformation) { + this.logger.error( + "Couldn't find billing information", + ordinanceType, + date.toISOString(), + ); + throw new Error("Couldn't find billing information"); + } + return billingInformation[1]; + } + + private calculateRevenue( + tour: Tour, + tariff: Tariff & { costTypes: CostType[]; tariffGroup: TariffGroup }, + ): number { + const highestZuschlag = this.getHighestZuschlag(tour, tariff); + // if TariffGroup is VDEK KTW, sum up costTypes + const isVdek = + tariff.tariffGroup?.description?.indexOf('VDEK KTW') > -1 ?? false; + + return tariff.costTypes.reduce((sum, costType) => { + switch (costType.variant) { + case CostTypeVariant.GRUNDPREIS: + // TODO: decide if you need a CostTypeVariant for QMS Zuschlag and exclude the category there + if ( + costType.description.indexOf('QMS') > -1 && + tour.category === 'Privatfahrt Rechnung' + ) { + return sum; + } + return sum + costType.costAmount; + case CostTypeVariant.TSWDIFFERENZIERUNG: + return sum + this.calculateTSW(tour, costType); + case CostTypeVariant.DESINFEKTIONSZUSCHLAG: + return sum + this.calculateDesinfektionszuschlag(tour, costType); + case CostTypeVariant.KILOMETERZUSCHLAG: + return sum + this.calculateKilometerzuschlag(tour, costType); + case CostTypeVariant.FAHRZEUGZUSCHLAG: + return sum + this.calculateFahrzeugzuschlag(tour, costType); + case CostTypeVariant.NACHTZUSCHLAG: + if (highestZuschlag === CostTypeVariant.NACHTZUSCHLAG || isVdek) { + return sum + this.calculateNachtzuschlag(tour, costType); + } + return sum; + case CostTypeVariant.WOCHENENDZUSCHLAG: + if (highestZuschlag === CostTypeVariant.WOCHENENDZUSCHLAG || isVdek) { + return sum + this.calculateWochenendzuschlag(tour, costType); + } + return sum; + case CostTypeVariant.FEIERTAGSZUSCHLAG: + if (highestZuschlag === CostTypeVariant.FEIERTAGSZUSCHLAG || isVdek) { + return sum + this.calculateFeiertagszuschlag(tour, costType); + } + return sum; + } + }, 0); + } + + private getHighestZuschlag( + tour: Tour, + tariff: Tariff & { costTypes: CostType[] }, + ): CostTypeVariant { + const zuschlaegeHighestToLowest = tariff.costTypes + .filter((costType) => + [ + CostTypeVariant.NACHTZUSCHLAG, + CostTypeVariant.FEIERTAGSZUSCHLAG, + CostTypeVariant.WOCHENENDZUSCHLAG, + ].includes(costType.variant as any), + ) + .map((costType): [CostTypeVariant, number] => { + switch (costType.variant) { + case CostTypeVariant.NACHTZUSCHLAG: + return [ + CostTypeVariant.NACHTZUSCHLAG, + this.calculateNachtzuschlag(tour, costType), + ]; + case CostTypeVariant.WOCHENENDZUSCHLAG: + return [ + CostTypeVariant.WOCHENENDZUSCHLAG, + this.calculateWochenendzuschlag(tour, costType), + ]; + case CostTypeVariant.FEIERTAGSZUSCHLAG: + return [ + CostTypeVariant.FEIERTAGSZUSCHLAG, + this.calculateFeiertagszuschlag(tour, costType), + ]; + } + }) + .sort( + ([, costAmountA], [, costAmountB]) => + (costAmountA as number) - (costAmountB as number), + ) + .reverse(); + if (zuschlaegeHighestToLowest.length === 0) { + return undefined; + } + return zuschlaegeHighestToLowest[0][0]; + } + + private calculateDesinfektionszuschlag( + tour: Tour, + costType: CostType, + ): number { + if (tour.hasInfection && !tour.infectionName) { + return 0; + } + if ( + tour.hasInfection && + (tour.infectionName.indexOf(costType.infectionType) > -1 || + INFECTION_TYPES[tour.infectionName] === costType.infectionType) + ) { + return costType.costAmount; + } + return 0; + } + + private calculateTSW(tour: Tour, costType: CostType): number { + if ( + costType.description.includes('TSW 1') && + tour.driverId === tour.codriverId + ) { + return costType.costAmount; + } else if ( + costType.description.includes('TSW 2') && + tour.driverId !== tour.codriverId + ) { + return costType.costAmount; + } + return 0; + } + + private calculateFeiertagszuschlag(tour: Tour, costType: CostType): number { + if ( + PUBLIC_HOLIDAYS_HH.some((day) => + isSameDay( + new Date(day), + new Date(toZonedTime(tour.startDate, 'Europe/Berlin')), + ), + ) + ) { + return costType.costAmount; + } + return 0; + } + + private calculateNachtzuschlag(tour: Tour, costType: CostType): number { + const firstInterval = generateIntervalForTimeRange( + costType.timeRange, + 'Europe/Berlin', + addDays(tour.startDate, -1), + ); + const secondInterval = generateIntervalForTimeRange( + costType.timeRange, + 'Europe/Berlin', + tour.startDate, + ); + if ( + isWithinInterval(tour.startDate, firstInterval) || + isWithinInterval(tour.startDate, secondInterval) + ) { + return costType.costAmount; + } + return 0; + } + + private calculateKilometerzuschlag(tour: Tour, costType: CostType): number { + const kilometerOverLimit = Math.ceil( + tour.occupiedKm - costType.kmInclusive, + ); + if (kilometerOverLimit <= 0) return 0; + return costType.costAmount * kilometerOverLimit; + } + + private calculateFahrzeugzuschlag(tour: Tour, costType: CostType): number { + const isCarNameSupported = !costType.excludeCarNames.includes(tour.carName); + if (!isCarNameSupported) return 0; + return costType.costAmount; + } + + private calculateWochenendzuschlag(tour: Tour, costType: CostType): number { + if (isWeekend(toZonedTime(tour.startDate, 'Europe/Berlin'))) + return costType.costAmount; + return 0; + } + + private async findTariff( + healthInsurance: string, + ordinanceType: string, + tourDate: Date, + ) { + if (!healthInsurance || healthInsurance === '') { + return this.prisma.tariff.findFirst({ + where: { + tariffGroup: { + description: { + contains: 'AOK', + }, + ordinanceType, + }, + OR: [ + { + AND: [ + { validTo: null }, + { + validFrom: { + lte: tourDate, + }, + }, + ], + }, + { + AND: [ + { validTo: { gte: tourDate } }, + { validFrom: { lte: tourDate } }, + ], + }, + ], + }, + include: { + tariffGroup: true, + costTypes: true, + }, + }); + } + const tenant = await this.prisma.avicennaTenant.findFirst({ + where: { + name: { + contains: healthInsurance, + }, + tariffGroups: { + some: { + ordinanceType, + }, + }, + }, + }); + if (!tenant) { + this.healthInsurancesWithNoTenant.push(healthInsurance); + return this.prisma.tariff.findFirst({ + where: { + tariffGroup: { + description: { + contains: 'AOK', + }, + ordinanceType, + }, + OR: [ + { + AND: [ + { validTo: null }, + { + validFrom: { + lte: tourDate, + }, + }, + ], + }, + { + AND: [ + { validTo: { gte: tourDate } }, + { validFrom: { lte: tourDate } }, + ], + }, + ], + }, + include: { + tariffGroup: true, + costTypes: true, + }, + }); + } + return this.prisma.tariff.findFirst({ + where: { + tariffGroup: { + tenants: { + some: { + id: tenant.id, + }, + }, + ordinanceType, + }, + OR: [ + { + AND: [ + { validTo: null }, + { + validFrom: { + lte: tourDate, + }, + }, + ], + }, + { + AND: [ + { validTo: { gte: tourDate } }, + { validFrom: { lte: tourDate } }, + ], + }, + ], + }, + include: { + tariffGroup: true, + costTypes: true, + }, + }); + } + + getHealthInsurancesWithNoTenant(): string[] { + return [...new Set(this.healthInsurancesWithNoTenant)]; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-calculation/infection-types.ts b/service/data-hub/data-connector/src/modules/feat-calculation/infection-types.ts new file mode 100644 index 0000000..1648f6a --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-calculation/infection-types.ts @@ -0,0 +1,22 @@ +export const INFECTION_TYPES = { + '3 MRGN': '2.A', + '4 MRGN': '2.A', + Aids: '2.A', + Clostridien: '2.B', + 'Clostridium diffcile': '2.B', + 'Covid-19': '3.1', + Durchfall: '2.A', + 'Durchfallerkrankungen/Salmonellosen': '2.A', + ESBL: '2.A', + 'Extended-spectrum Beta-Laktamase': '2.A', + 'Hepatitis B inkl. D': '2.A', + 'Hepatitis B inklusive D': '2.A', + 'Hepatitis C': '2.A', + HIV: '2.A', + Meningitis: '3.1', + 'Methicillin resistente Staphylococcus Aureus': '2.A', + MRSA: '2.A', + Norovirus: '2.B', + Sonstiges: '2.A', + VRE: '2.A', +}; diff --git a/service/data-hub/data-connector/src/modules/feat-calculation/personnel-cost-calculation.service.ts b/service/data-hub/data-connector/src/modules/feat-calculation/personnel-cost-calculation.service.ts new file mode 100644 index 0000000..5c8a4bf --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-calculation/personnel-cost-calculation.service.ts @@ -0,0 +1,175 @@ +import { Injectable } from '@nestjs/common'; +import { Interval, getISODay, isSameDay } from 'date-fns'; +import { toZonedTime } from 'date-fns-tz'; + +import { generateIntervalForTimeRange, getHoursInInterval } from 'src/utils'; +import { PUBLIC_HOLIDAYS_HH } from './public-holidays'; + +enum PersonnelCostCondition { + NACHTZUSCHLAG = 'NACHTZUSCHLAG', + SAMSTAGSZUSCHLAG = 'SAMSTAGSZUSCHLAG', + SONNTAGSZUSCHLAG = 'SONNTAGSZUSCHLAG', + FEIERTAGSZUSCHLAG = 'FEIERTAGSZUSCHLAG', +} + +@Injectable() +export class PersonnelCostCalculationService { + private baseCost: Record< + 'KTW' | 'OTHER', + { + base: number; + withAdditional: number; + } + > = { + KTW: { + base: 1733, + withAdditional: 2306, + }, + OTHER: { + base: 1440, + withAdditional: 1797, + }, + }; + private costTypes = [ + { + description: 'Nachtzuschlag von 20 Uhr bis 0 Uhr', + condition: PersonnelCostCondition.NACHTZUSCHLAG, + percent: 25, + timeRange: '20:00-23:59', + }, + { + description: 'Nachtzuschlag von 0 Uhr bis 4 Uhr', + condition: PersonnelCostCondition.NACHTZUSCHLAG, + percent: 40, + timeRange: '00:00-04:00', + }, + { + description: 'Samstagszuschlag', + condition: PersonnelCostCondition.SAMSTAGSZUSCHLAG, + percent: 15, + }, + { + description: 'Sonntagszuschlag', + condition: PersonnelCostCondition.SONNTAGSZUSCHLAG, + percent: 50, + }, + { + description: 'Feiertagszuschlag', + condition: PersonnelCostCondition.FEIERTAGSZUSCHLAG, + percent: 125, + }, + ]; + + calculatePersonnelCostInInterval( + interval: Interval, + ordinanceType: string, + employeeAmount: number, + ): number { + const { base, withAdditional } = + this.getBaseCostForOrdinanceType(ordinanceType); + const baseCostInInterval = getHoursInInterval(interval) * withAdditional; + const additionalCosts = this.calculateAdditionalCosts(interval, base); + return (baseCostInInterval + additionalCosts) * employeeAmount; + } + + calculateAdditionalCosts(interval: Interval, baseCost: number): number { + return this.costTypes + .map(({ condition, percent, timeRange }) => { + switch (condition) { + case PersonnelCostCondition.NACHTZUSCHLAG: + return this.calculateNachtZuschlag( + interval, + baseCost, + percent, + timeRange, + ); + case PersonnelCostCondition.SAMSTAGSZUSCHLAG: + return this.calculateWeekdayZuschlag( + interval, + baseCost, + percent, + 6, + ); + case PersonnelCostCondition.SONNTAGSZUSCHLAG: + return this.calculateWeekdayZuschlag( + interval, + baseCost, + percent, + 7, + ); + case PersonnelCostCondition.FEIERTAGSZUSCHLAG: + return this.calculateFeiertagZuschlag(interval, baseCost, percent); + } + }) + .reduce((sum, cost) => (sum += cost), 0); + } + + private calculateNachtZuschlag( + interval: Interval, + baseCost: number, + percent: number, + timeRange: string, + ): number { + const timeRangeIntervalForStart = generateIntervalForTimeRange( + timeRange, + 'Europe/Berlin', + new Date(interval.start), + ); + const timeRangeIntervalForEnd = generateIntervalForTimeRange( + timeRange, + 'Europe/Berlin', + new Date(interval.end), + ); + const costsForStart = + (getHoursInInterval(interval, timeRangeIntervalForStart) * + baseCost * + percent) / + 100; + const costsForEnd = + (getHoursInInterval(interval, timeRangeIntervalForEnd) * + baseCost * + percent) / + 100; + return costsForStart > costsForEnd ? costsForStart : costsForEnd; + } + + private calculateWeekdayZuschlag( + interval: Interval, + baseCost: number, + percent: number, + weekday: number, + ): number { + if (getISODay(toZonedTime(interval.start, 'Europe/Berlin')) === weekday) { + return (getHoursInInterval(interval) * baseCost * percent) / 100; + } + return 0; + } + + private calculateFeiertagZuschlag( + interval: Interval, + baseCost: number, + percent: number, + ): number { + if ( + PUBLIC_HOLIDAYS_HH.some((day) => + isSameDay( + new Date(day), + new Date(toZonedTime(interval.start, 'Europe/Berlin')), + ), + ) + ) { + return (getHoursInInterval(interval) * baseCost * percent) / 100; + } + return 0; + } + + private getBaseCostForOrdinanceType(ordinanceType: string): { + base: number; + withAdditional: number; + } { + if (ordinanceType.indexOf('KTW') > -1) { + return this.baseCost.KTW; + } + return this.baseCost.OTHER; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-calculation/public-holidays.ts b/service/data-hub/data-connector/src/modules/feat-calculation/public-holidays.ts new file mode 100644 index 0000000..415463a --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-calculation/public-holidays.ts @@ -0,0 +1,112 @@ +export const PUBLIC_HOLIDAYS_HH = [ + '2020-01-01T00:00:00.000Z', + '2020-04-10T00:00:00.000Z', + '2020-04-13T00:00:00.000Z', + '2020-05-01T00:00:00.000Z', + '2020-05-21T00:00:00.000Z', + '2020-06-01T00:00:00.000Z', + '2020-10-03T00:00:00.000Z', + '2020-10-31T00:00:00.000Z', + '2020-12-25T00:00:00.000Z', + '2020-12-26T00:00:00.000Z', + '2021-01-01T00:00:00.000Z', + '2021-04-02T00:00:00.000Z', + '2021-04-05T00:00:00.000Z', + '2021-05-01T00:00:00.000Z', + '2021-05-13T00:00:00.000Z', + '2021-05-24T00:00:00.000Z', + '2021-10-03T00:00:00.000Z', + '2021-10-31T00:00:00.000Z', + '2021-12-25T00:00:00.000Z', + '2021-12-26T00:00:00.000Z', + '2022-01-01T00:00:00.000Z', + '2022-04-15T00:00:00.000Z', + '2022-04-18T00:00:00.000Z', + '2022-05-01T00:00:00.000Z', + '2022-06-06T00:00:00.000Z', + '2022-05-26T00:00:00.000Z', + '2022-10-03T00:00:00.000Z', + '2022-10-31T00:00:00.000Z', + '2022-12-25T00:00:00.000Z', + '2022-12-26T00:00:00.000Z', + '2023-01-01T00:00:00.000Z', + '2023-04-07T00:00:00.000Z', + '2023-04-10T00:00:00.000Z', + '2023-05-01T00:00:00.000Z', + '2023-05-18T00:00:00.000Z', + '2023-05-29T00:00:00.000Z', + '2023-10-03T00:00:00.000Z', + '2023-10-31T00:00:00.000Z', + '2023-12-25T00:00:00.000Z', + '2023-12-26T00:00:00.000Z', + '2024-01-01T00:00:00.000Z', + '2024-03-29T00:00:00.000Z', + '2024-04-01T00:00:00.000Z', + '2024-05-01T00:00:00.000Z', + '2024-05-09T00:00:00.000Z', + '2024-05-20T00:00:00.000Z', + '2024-10-03T00:00:00.000Z', + '2024-10-31T00:00:00.000Z', + '2024-12-25T00:00:00.000Z', + '2024-12-26T00:00:00.000Z', + '2025-01-01T00:00:00.000Z', + '2025-04-18T00:00:00.000Z', + '2025-04-21T00:00:00.000Z', + '2025-05-01T00:00:00.000Z', + '2025-05-29T00:00:00.000Z', + '2025-06-09T00:00:00.000Z', + '2025-10-03T00:00:00.000Z', + '2025-10-31T00:00:00.000Z', + '2025-12-25T00:00:00.000Z', + '2025-12-26T00:00:00.000Z', + '2026-01-01T00:00:00.000Z', + '2026-04-03T00:00:00.000Z', + '2026-04-06T00:00:00.000Z', + '2026-05-01T00:00:00.000Z', + '2026-05-14T00:00:00.000Z', + '2026-05-25T00:00:00.000Z', + '2026-10-03T00:00:00.000Z', + '2026-10-31T00:00:00.000Z', + '2026-12-25T00:00:00.000Z', + '2026-12-26T00:00:00.000Z', + '2027-01-01T00:00:00.000Z', + '2027-03-26T00:00:00.000Z', + '2027-03-29T00:00:00.000Z', + '2027-05-01T00:00:00.000Z', + '2027-05-06T00:00:00.000Z', + '2027-05-17T00:00:00.000Z', + '2027-10-03T00:00:00.000Z', + '2027-10-31T00:00:00.000Z', + '2027-12-25T00:00:00.000Z', + '2027-12-26T00:00:00.000Z', + '2028-01-01T00:00:00.000Z', + '2028-04-14T00:00:00.000Z', + '2028-04-17T00:00:00.000Z', + '2028-05-01T00:00:00.000Z', + '2028-05-25T00:00:00.000Z', + '2028-06-05T00:00:00.000Z', + '2028-10-03T00:00:00.000Z', + '2028-10-31T00:00:00.000Z', + '2028-12-25T00:00:00.000Z', + '2028-12-26T00:00:00.000Z', + '2029-01-01T00:00:00.000Z', + '2029-03-30T00:00:00.000Z', + '2029-04-02T00:00:00.000Z', + '2029-05-01T00:00:00.000Z', + '2029-05-10T00:00:00.000Z', + '2029-05-21T00:00:00.000Z', + '2029-10-03T00:00:00.000Z', + '2029-10-31T00:00:00.000Z', + '2029-12-25T00:00:00.000Z', + '2029-12-26T00:00:00.000Z', + '2030-01-01T00:00:00.000Z', + '2030-04-19T00:00:00.000Z', + '2030-04-22T00:00:00.000Z', + '2030-05-01T00:00:00.000Z', + '2030-05-30T00:00:00.000Z', + '2030-06-10T00:00:00.000Z', + '2030-10-03T00:00:00.000Z', + '2030-10-31T00:00:00.000Z', + '2030-12-25T00:00:00.000Z', + '2030-12-26T00:00:00.000Z', +]; diff --git a/service/data-hub/data-connector/src/modules/feat-calculation/util-calculation.module.ts b/service/data-hub/data-connector/src/modules/feat-calculation/util-calculation.module.ts new file mode 100644 index 0000000..647273f --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-calculation/util-calculation.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { PrismaModule } from 'src/core/database/prisma.module'; +import { CalculationService } from './calculation.service'; +import { PersonnelCostCalculationService } from './personnel-cost-calculation.service'; + +@Module({ + imports: [PrismaModule], + providers: [CalculationService, PersonnelCostCalculationService], + exports: [CalculationService], +}) +export class UtilCalculationModule {} diff --git a/service/data-hub/data-connector/src/modules/feat-importers/importer.service.ts b/service/data-hub/data-connector/src/modules/feat-importers/importer.service.ts index d4e8d19..5fa56ac 100644 --- a/service/data-hub/data-connector/src/modules/feat-importers/importer.service.ts +++ b/service/data-hub/data-connector/src/modules/feat-importers/importer.service.ts @@ -75,7 +75,8 @@ export class ImporterService { private runTransformers(jobId: string): Observable { return combineLatest([ this.transformersService.transformAttendanceRegistrations(jobId), - this.transformersService.transformEmployees(jobId), + this.transformersService.transformDyflexisEmployees(jobId), + this.transformersService.transformDispoliveEmployees(jobId), this.transformersService.transformPatients(jobId), this.transformersService.transformPlannedTimes(jobId), this.transformersService.transformWorkTimes(jobId), @@ -96,6 +97,8 @@ export class ImporterService { private runLoaders(jobId: string): Observable { return this.loadersService.loadTours().pipe( switchMap(() => this.loadersService.loadPatients()), + switchMap(() => this.loadersService.loadDyflexisEmployees()), + switchMap(() => this.loadersService.loadDispoliveEmployees()), switchMap(() => this.loadersService.loadAttendanceRegistrations()), switchMap(() => this.loadersService.loadPlannedTimes()), switchMap(() => this.loadersService.loadWorkTimes()), diff --git a/service/data-hub/data-connector/src/modules/feat-loaders/final.repository.ts b/service/data-hub/data-connector/src/modules/feat-loaders/final.repository.ts index a02427f..956a233 100644 --- a/service/data-hub/data-connector/src/modules/feat-loaders/final.repository.ts +++ b/service/data-hub/data-connector/src/modules/feat-loaders/final.repository.ts @@ -1,6 +1,8 @@ import { Injectable } from '@nestjs/common'; import { AttendanceRegistration, + DyflexisEmployee, + Employee, Patient, PlannedTime, Prisma, @@ -115,6 +117,76 @@ export class FinalRepository { }); } + findEmployeeDyflexis(): Promise { + return this.prisma.dyflexisEmployee.findMany({ + orderBy: { + surname: 'asc', + }, + }); + } + + createEmployeeDyflexis( + employeeDyflexisCreateInput: Prisma.DyflexisEmployeeCreateInput[], + ): Promise { + return this.prisma.dyflexisEmployee.createMany({ + data: employeeDyflexisCreateInput, + skipDuplicates: true, + }); + } + + async updateEmployeeDyflexis( + employeeDyflexisCreateInput: Prisma.DyflexisEmployeeCreateInput[], + ): Promise { + await this.deleteEmployeeDyflexis( + employeeDyflexisCreateInput.map(({ id }) => id), + ); + return this.createEmployeeDyflexis(employeeDyflexisCreateInput); + } + + deleteEmployeeDyflexis(ids: number[]): Promise { + return this.prisma.dyflexisEmployee.deleteMany({ + where: { + id: { + in: ids, + }, + }, + }); + } + + findEmployeeDispolive(): Promise { + return this.prisma.employee.findMany({ + orderBy: { + surname: 'asc', + }, + }); + } + + createEmployeeDispolive( + employeeCreateInput: Prisma.EmployeeCreateInput[], + ): Promise { + return this.prisma.employee.createMany({ + data: employeeCreateInput, + skipDuplicates: true, + }); + } + + async updateEmployeeDispolive( + employeeCreateInput: Prisma.EmployeeCreateInput[], + ): Promise { + await this.deleteEmployeeDispolive(employeeCreateInput.map(({ id }) => id)); + return this.createEmployeeDispolive(employeeCreateInput); + } + + deleteEmployeeDispolive(ids: string[]): Promise { + return this.prisma.employee.deleteMany({ + where: { + id: { + in: ids, + }, + }, + }); + } + findAttendanceRegistrationsInInterval( interval: Interval, ): Promise { diff --git a/service/data-hub/data-connector/src/modules/feat-loaders/loaders.service.ts b/service/data-hub/data-connector/src/modules/feat-loaders/loaders.service.ts index 2b560f4..125569f 100644 --- a/service/data-hub/data-connector/src/modules/feat-loaders/loaders.service.ts +++ b/service/data-hub/data-connector/src/modules/feat-loaders/loaders.service.ts @@ -4,6 +4,8 @@ import { from, map, of, switchMap } from 'rxjs'; import { TransformersService } from '../feat-transformers/transformers.service'; import { FinalRepository } from './final.repository'; import { AttendanceRegistrationLoader } from './loaders/attendance-registration.loader'; +import { EmployeeDispoliveLoader } from './loaders/employee-dispolive'; +import { EmployeeDyflexisLoader } from './loaders/employee-dyflexis'; import { PatientLoader } from './loaders/patient.loader'; import { PlannedTimeLoader } from './loaders/planned-time.loader'; import { TourLoader } from './loaders/tour.loader'; @@ -82,6 +84,56 @@ export class LoadersService { ); } + loadDyflexisEmployees() { + return from(this.transformersService.findDyflexisEmployees()).pipe( + switchMap((stagingEmployees) => + from(this.repository.findEmployeeDyflexis()).pipe( + map((finalEmployees) => ({ + final: finalEmployees, + staging: stagingEmployees, + })), + ), + ), + map(({ staging, final }) => + EmployeeDyflexisLoader.determineLoadOperations(staging, final), + ), + switchMap(({ deleted, updated, created }) => + from( + Promise.all([ + this.repository.deleteEmployeeDyflexis(deleted), + this.repository.updateEmployeeDyflexis(updated), + this.repository.createEmployeeDyflexis(created), + ]), + ), + ), + ); + } + + loadDispoliveEmployees() { + return from(this.transformersService.findDispoliveEmployees()).pipe( + switchMap((stagingEmployees) => + from(this.repository.findEmployeeDispolive()).pipe( + map((finalEmployees) => ({ + final: finalEmployees, + staging: stagingEmployees, + })), + ), + ), + map(({ staging, final }) => + EmployeeDispoliveLoader.determineLoadOperations(staging, final), + ), + switchMap(({ deleted, updated, created }) => + from( + Promise.all([ + this.repository.deleteEmployeeDispolive(deleted), + this.repository.updateEmployeeDispolive(updated), + this.repository.createEmployeeDispolive(created), + ]), + ), + ), + ); + } + loadAttendanceRegistrations() { return from(this.transformersService.findAttendanceRegistrations()).pipe( switchMap((stagingAttendanceRegistrations) => { diff --git a/service/data-hub/data-connector/src/modules/feat-loaders/loaders/employee-dispolive.ts b/service/data-hub/data-connector/src/modules/feat-loaders/loaders/employee-dispolive.ts new file mode 100644 index 0000000..bc87e01 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-loaders/loaders/employee-dispolive.ts @@ -0,0 +1,65 @@ +import { Employee, EmployeeDispoLiveStaging, Prisma } from '@prisma/client'; + +export class EmployeeDispoliveLoader { + public static determineLoadOperations( + stagingEmployees: EmployeeDispoLiveStaging[], + finalEmployees: Employee[], + ): { + deleted: string[]; + updated: Prisma.EmployeeCreateInput[]; + created: Prisma.EmployeeCreateInput[]; + } { + const deletedEmployees = finalEmployees.filter( + (finalEmployee) => + !stagingEmployees.find( + (stagingEmployee) => stagingEmployee.id === finalEmployee.id, + ), + ); + + const employeesToInsert = stagingEmployees.filter( + ({ id }) => + !!id && + !deletedEmployees.find((deletedEmployee) => deletedEmployee.id === id), + ); + const newEmployees: Prisma.EmployeeCreateInput[] = []; + const updatedEmployees: Prisma.EmployeeCreateInput[] = []; + + for (const stagingEmployee of employeesToInsert) { + const finalEmployee = finalEmployees.find( + (finalEmployee) => finalEmployee.id === stagingEmployee.id, + ); + if (finalEmployee) { + updatedEmployees.push(this.employeeStagingToFinal(stagingEmployee)); + } else { + newEmployees.push(this.employeeStagingToFinal(stagingEmployee)); + } + } + return { + deleted: deletedEmployees.map(({ id }) => id), + updated: updatedEmployees, + created: newEmployees, + }; + } + + private static employeeStagingToFinal( + employee: EmployeeDispoLiveStaging, + ): Prisma.EmployeeCreateInput { + const { + id, + name, + surname, + personnelNumber, + qualification, + personTransportCertificate, + } = employee; + + return { + id, + name, + surname, + personnelNumber, + qualification, + personTransportCertificate, + }; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-loaders/loaders/employee-dyflexis.ts b/service/data-hub/data-connector/src/modules/feat-loaders/loaders/employee-dyflexis.ts new file mode 100644 index 0000000..9c2c861 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-loaders/loaders/employee-dyflexis.ts @@ -0,0 +1,71 @@ +import { + DyflexisEmployee, + EmployeeDyflexisStaging, + Prisma, +} from '@prisma/client'; + +export class EmployeeDyflexisLoader { + public static determineLoadOperations( + stagingEmployees: EmployeeDyflexisStaging[], + finalEmployees: DyflexisEmployee[], + ): { + deleted: number[]; + updated: Prisma.DyflexisEmployeeCreateInput[]; + created: Prisma.DyflexisEmployeeCreateInput[]; + } { + const deletedEmployees = finalEmployees.filter( + (finalEmployee) => + !stagingEmployees.find( + (stagingEmployee) => stagingEmployee.id === finalEmployee.id, + ), + ); + + const employeesToInsert = stagingEmployees.filter( + ({ id }) => + !!id && + !deletedEmployees.find((deletedEmployee) => deletedEmployee.id === id), + ); + const newEmployees: Prisma.DyflexisEmployeeCreateInput[] = []; + const updatedEmployees: Prisma.DyflexisEmployeeCreateInput[] = []; + + for (const stagingEmployee of employeesToInsert) { + const finalEmployee = finalEmployees.find( + (finalEmployee) => finalEmployee.id === stagingEmployee.id, + ); + if (finalEmployee) { + updatedEmployees.push(this.employeeStagingToFinal(stagingEmployee)); + } else { + newEmployees.push(this.employeeStagingToFinal(stagingEmployee)); + } + } + return { + deleted: deletedEmployees.map(({ id }) => id), + updated: updatedEmployees, + created: newEmployees, + }; + } + + private static employeeStagingToFinal( + employee: EmployeeDyflexisStaging, + ): Prisma.DyflexisEmployeeCreateInput { + const { + id, + firstname, + surname, + contractStart, + contractEnd, + contractHoursWeek, + contractSalaryHour, + } = employee; + + return { + id, + firstname, + surname, + contractStart, + contractEnd, + contractHoursWeek, + contractSalaryHour, + }; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket-arg.types.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-arg.types.ts new file mode 100644 index 0000000..68f0c76 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-arg.types.ts @@ -0,0 +1,20 @@ +import { ApprovalState } from '@prisma/client'; +import { TicketFilter } from './ticket-filter'; + +export class TicketFilterArgs implements TicketFilter { + errors: string[]; + approvalStates: ApprovalState[]; + documentInfo: ('approval' | 'transport_document')[]; +} + +export interface ApprovalInfoArgs { + isNeeded?: boolean; + whoRequested?: string; + answeredFrom?: string; + location?: string; +} + +export interface DocumentInfoArgs { + approval: ApprovalInfoArgs; + tdLocation?: string; +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket-filter.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-filter.ts new file mode 100644 index 0000000..4179193 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-filter.ts @@ -0,0 +1,71 @@ +import { ApprovalState, Prisma } from '@prisma/client'; + +export interface TicketFilter { + errors?: string[]; + approvalStates?: ApprovalState[]; + documentInfo?: ('approval' | 'transport_document')[]; +} + +export function createPrismaQueryFromTicketFilters( + filter: TicketFilter, +): Prisma.TicketWhereInput[] { + const conditions: Prisma.TicketWhereInput[] = []; + + Object.entries(filter ?? {}).forEach(([property, args]) => { + switch (property) { + case 'errors': + if (args.length > 0) + conditions.push({ + errors: { + hasSome: [...args], + }, + }); + return; + case 'approvalStates': + if (args.length > 0) + conditions.push({ + approvalState: { + in: [...args], + }, + }); + return; + case 'documentInfo': + if (args.includes('approval')) { + conditions.push({ + OR: [ + { + documentInfo: { + path: ['approval', 'location'], + not: 'company', + }, + }, + { + documentInfo: { + path: ['approval', 'location'], + equals: Prisma.JsonNull, + }, + }, + ], + }); + } + if (args.includes('td_company')) { + conditions.push({ + documentInfo: { + path: ['tdLocation'], + equals: 'company', + }, + }); + } + if (args.includes('td_customer')) { + conditions.push({ + documentInfo: { + path: ['tdLocation'], + equals: 'customer', + }, + }); + } + return; + } + }); + return conditions; +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket-lifecycle.service.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-lifecycle.service.ts new file mode 100644 index 0000000..03f1ade --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-lifecycle.service.ts @@ -0,0 +1,240 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { + ApprovalState, + Ticket, + TicketValidationState, + Tour, +} from '@prisma/client'; +import { + ValidationResult, + validatePatient, + validatePatientDataOnTours, + validateTour, +} from './ticket-validation.functions'; +import { TicketRepository } from './ticket.repository'; +import { DocumentInfoArgs } from './ticket-arg.types'; +import { Interval } from 'date-fns'; + +@Injectable() +export class TicketLifecycleService { + private readonly logger = new Logger(TicketLifecycleService.name); + + constructor(private readonly repository: TicketRepository) {} + + async createTickets(interval: Interval): Promise { + const tours = await this.repository.findTours(interval); + + for (const tour of tours) { + if (tour.ticketId) { + continue; + } + const ticketId = await this.repository.searchTicketIDForTour(tour); + if (ticketId) { + await this.repository.addToursToTicket(ticketId, [tour]); + } else { + await this.repository.createTicket([tour]); + } + } + + await this.validateCreatedTickets(); + // await this.archiveClosedTickets(); + } + + async validateDocumentInfoUpdate( + ticketId: string, + documentInfo: DocumentInfoArgs, + ) { + const ticket = await this.repository.findById(ticketId); + + switch (ticket.currentState) { + case TicketValidationState.USER_INTERACTION_REQUIRED: + const approvalStateUpdate = documentInfo.approval.isNeeded + ? ApprovalState.REQUESTED + : ApprovalState.FREE; + + let stateUpdate: TicketValidationState = + TicketValidationState.USER_INTERACTION_REQUIRED; + if ( + documentInfo.tdLocation === 'company' && + approvalStateUpdate === ApprovalState.FREE + ) + stateUpdate = TicketValidationState.ARCHIVED; + else if (documentInfo.tdLocation === 'uncertain') + stateUpdate = TicketValidationState.TD_UNCERTAIN; + else stateUpdate = TicketValidationState.DOCUMENTS_MISSING; + + return this.repository.updateTicket(ticketId, { + documentInfo, + approvalState: approvalStateUpdate, + state: stateUpdate, + }); + + case TicketValidationState.TD_UNCERTAIN: + return this.repository.updateTicket(ticketId, { + documentInfo, + state: + ticket.approvalState === ApprovalState.FREE && + documentInfo.tdLocation === 'company' + ? TicketValidationState.ARCHIVED + : TicketValidationState.DOCUMENTS_MISSING, + }); + case TicketValidationState.DOCUMENTS_MISSING: + return this.repository.updateTicket(ticketId, { + documentInfo, + ...((ticket.approvalState === ApprovalState.FREE || + documentInfo.approval.location === 'company') && + documentInfo.tdLocation === 'company' + ? { state: TicketValidationState.ARCHIVED } + : {}), + }); + } + } + + private async validateCreatedTickets(): Promise { + const tickets = await this.repository.findAllCreated(); + this.logger.debug(`Found ${tickets.length} with state CREATED`); + + for (const ticket of tickets) { + const { + result: isValid, + errors, + notes, + } = await this.validateCreatedTicket(ticket); + + if (isValid) { + const { result: approvalResult } = await this.isApprovalNeeded(ticket); + if (approvalResult) { + await this.repository.updateTicket(ticket.id, { + errors, + notes, + state: TicketValidationState.USER_INTERACTION_REQUIRED, + approvalState: ticket.tours.every(({ patientId }) => !patientId) + ? ApprovalState.UNKNOWN + : ApprovalState.REQUIRED, + }); + } else { + await this.repository.updateTicket(ticket.id, { + errors, + notes, + state: TicketValidationState.USER_INTERACTION_REQUIRED, + approvalState: ApprovalState.FREE, + }); + } + } else { + await this.repository.setActionablesOnTicket(ticket.id, errors, notes); + } + } + } + + private async archiveClosedTickets() { + const closedTickets = await this.repository.findAllClosed(); + for (const closedTicket of closedTickets) { + await this.repository.setStateOfTicket( + closedTicket.id, + TicketValidationState.ARCHIVED, + ); + } + } + + private async validateCreatedTicket( + ticket: Ticket & { tours: Tour[] }, + ): Promise { + const patientIds = [ + ...new Set(ticket.tours.map(({ patientId }) => patientId)), + ]; + if (patientIds.length > 1) { + return { + result: false, + errors: ['Ticket: Die Touren umfassen mehr als einen Patienten'], + notes: [], + }; + } + const [patientId] = patientIds; + if (!patientId && ticket.tours.at(0)?.type !== 'Spontan') { + return { + result: false, + errors: [], + notes: ['Patient: Der Patient ist nicht in DispoLive hinterlegt'], + }; + } + + let patientResult: ValidationResult; + if (!patientId && ticket.tours.at(0)?.type === 'Spontan') { + patientResult = validatePatientDataOnTours(ticket.tours); + } else { + try { + const patient = await this.repository.findPatientById(patientId); + patientResult = validatePatient(patient); + } catch { + patientResult = validatePatientDataOnTours(ticket.tours); + } + } + const tourResults = ticket.tours.map((tour) => validateTour(tour)); + + return [patientResult, ...tourResults].reduce( + (result, results) => ({ + result: result.result && results.result, + errors: [...result.errors, ...results.errors], + notes: [...result.notes, ...results.notes], + }), + { result: true, errors: [], notes: [] } as ValidationResult, + ); + } + + private async isApprovalNeeded( + ticket: Ticket & { tours: Tour[] }, + ): Promise { + const approvalRequirements = await Promise.all( + ticket.tours.map((tour) => this.checkTourApprovalRequirement(tour)), + ); + const isApprovalRequired = approvalRequirements.reduce( + (result, requirement) => result || requirement, + false, + ); + + return { + result: isApprovalRequired, + errors: [], + notes: + isApprovalRequired && ticket.tours.every(({ patientId }) => !patientId) + ? [ + 'Patient nicht in Stammdaten: Prüfen Sie ob eine Genehmigung benötigt wird', + ] + : [], + }; + } + + private async checkTourApprovalRequirement(tour: Tour): Promise { + if ( + [ + 'Einweisung', + 'Entlassung', + 'Entlassung Vorbestellung', + 'Konsil KH - Dia', + 'Privatfahrt Rechnung', + 'Tagesklinik', + 'Verlegung', + ].includes(tour.category) || + tour.healthInsurance === 'KOSTENTRÄGER PATIENT' + ) { + return false; + } + + if ( + tour.patientId && + ['BTW', 'TSW'].includes(tour.ordinanceType) && + tour.category !== 'Dialyse' + ) { + const patient = await this.repository.findPatientById(tour.patientId); + if ( + ['3', '4', '5'].includes(patient.careDegree) && + (['aG', 'Bi', 'H'].includes(patient.disabilityMark1) || + ['aG', 'Bi', 'H'].includes(patient.disabilityMark2)) + ) { + return false; + } + } + + return true; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket-system.events.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-system.events.ts new file mode 100644 index 0000000..ec1e88a --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-system.events.ts @@ -0,0 +1,7 @@ +export enum TicketSystemEventTypes { + Validated = 'ticket-system.validated', +} + +export class TicketSystemValidatedEvent { + constructor(public readonly count: number) {} +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket-system.module.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-system.module.ts new file mode 100644 index 0000000..8b0cce9 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-system.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/core/database/prisma.module'; +import { TicketLifecycleService } from './ticket-lifecycle.service'; +import { TicketRepository } from './ticket.repository'; +import { TicketService } from './tickets.service'; + +@Module({ + imports: [PrismaModule], + providers: [TicketRepository, TicketService, TicketLifecycleService], + exports: [TicketService], +}) +export class TicketSystemModule {} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket-validation.functions.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-validation.functions.ts new file mode 100644 index 0000000..7258667 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket-validation.functions.ts @@ -0,0 +1,153 @@ +import { Patient, Tour } from '@prisma/client'; + +export interface ValidationResult { + result: boolean; + notes: string[]; + errors: string[]; +} + +export function validatePatient(patient: Patient): ValidationResult { + const notes: string[] = []; + const errors: string[] = []; + let isValid = true; + + if (!patient?.name) { + isValid = false; + errors.push('Patient: Vorname ist nicht gefüllt'); + } + if (!patient?.surname) { + isValid = false; + errors.push('Patient: Nachname ist nicht gefüllt'); + } + if (!patient?.birthday) { + isValid = false; + notes.push('Patient: Geburtstag ist nicht gefüllt'); + } + if (!patient?.healthinsurance) { + isValid = false; + errors.push('Patient: Krankenkasse ist nicht gefüllt'); + } + if (!patient?.careDegree) { + notes.push('Patient: Pflegegrad ist nicht gefüllt'); + } + if (!patient?.disabilityMark1) { + notes.push('Patient: Merkzeichen 1 ist nicht gefüllt'); + } + if (!patient?.disabilityMark2) { + notes.push('Patient: Merkzeichen 2 ist nicht gefüllt'); + } + + return { + result: isValid, + errors, + notes, + }; +} + +export function validatePatientDataOnTours(tours: Tour[]): ValidationResult { + const errors: string[] = []; + let isValid = true; + + for (const tour of tours) { + if (!tour.patientName) { + isValid = false; + errors.push( + `Tour ${tour.operationId}: Patient Vorname ist nicht gefüllt`, + ); + } + if (!tour.patientSurname) { + isValid = false; + errors.push( + `Tour ${tour.operationId}: Patient Nachname ist nicht gefüllt`, + ); + } + if (!tour.healthInsurance) { + isValid = false; + errors.push( + `Tour ${tour.operationId}: Patient Krankenversicherung ist nicht gefüllt`, + ); + } + } + + return { + result: isValid, + errors, + notes: [], + }; +} + +export function validateTour(tour: Tour): ValidationResult { + const errors: string[] = []; + let isValid = true; + + if (!tour.ordinanceType) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Verordnungsart ist nicht gefüllt`); + } + if (!tour.transportType) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Transportart ist nicht gefüllt`); + } + if (!tour.category) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Kategorie ist nicht gefüllt`); + } + if (!tour.startDate) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Startzeit ist nicht gefüllt`); + } + if (!tour.startStreet || !tour.startZip || !tour.startCity) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Start Adresse ist nicht gefüllt`); + } + if (!tour.targetStreet || !tour.targetZip || !tour.targetCity) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Ziel Adresse ist nicht gefüllt`); + } + if (tour.occupiedKm > 9990) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Besetzte Kilometer sind zu hoch`); + } + + return { + result: isValid, + errors, + notes: [], + }; +} + +export function validateTransport(tour: Tour): ValidationResult { + const errors: string[] = []; + let isValid = true; + + if (!tour.carName) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Fahrzeugname ist nicht angegeben`); + } + + if (!tour.driverName) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Fahrer ist nicht angegeben`); + } + + if (!tour.codriverName) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Beifahrer ist nicht angegeben`); + } + + if (!tour.startBegin) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Anfahrt-Stempel fehlt`); + } + + if (!tour.empty) { + isValid = false; + errors.push(`Tour ${tour.operationId}: Frei-Stempel fehlt`); + } + + return { + result: isValid, + errors, + notes: [], + }; +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/ticket.repository.ts b/service/data-hub/data-connector/src/modules/feat-tickets/ticket.repository.ts new file mode 100644 index 0000000..61f5d0e --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/ticket.repository.ts @@ -0,0 +1,499 @@ +import { Inject, Injectable, Logger } from '@nestjs/common'; +import { Patient, Prisma, TicketValidationState, Tour } from '@prisma/client'; +import { Interval, endOfDay, startOfDay } from 'date-fns'; +import { ExpressionBuilder, Kysely } from 'kysely'; +import { jsonArrayFrom } from 'kysely/helpers/postgres'; + +import { KYSELY_CLIENT_PROVIDER_TOKEN } from 'src/core/database/database.module'; +import { PrismaService } from 'src/core/database/prisma.service'; +import { ApprovalState, DB } from 'src/core/database/types'; +import { DocumentInfoArgs, TicketFilterArgs } from './ticket-arg.types'; +import { createPrismaQueryFromTicketFilters } from './ticket-filter'; + +function withTours(eb: ExpressionBuilder) { + return jsonArrayFrom( + eb + .selectFrom('Tour') + .selectAll('Tour') + .whereRef('Tour.ticketId', '=', 'Ticket.id') + .orderBy('Tour.operationId'), + ).as('tours'); +} + +@Injectable() +export class TicketRepository { + private logger = new Logger(TicketRepository.name); + + constructor( + private readonly prisma: PrismaService, + @Inject(KYSELY_CLIENT_PROVIDER_TOKEN) private readonly db: Kysely, + ) {} + + async createTicket(tours: Tour[]) { + const ticket = await this.db + .insertInto('Ticket') + .values({ + currentState: TicketValidationState.CREATED, + }) + .returningAll() + .executeTakeFirst(); + + await this.db + .insertInto('TicketStateHistory') + .values({ + state: TicketValidationState.CREATED, + ticketId: ticket.id, + }) + .executeTakeFirst(); + + await this.db + .updateTable('Tour') + .set({ + ticketId: ticket.id, + }) + .where( + 'id', + 'in', + tours.map(({ id }) => id), + ) + .execute(); + + return ticket; + } + + async addToursToTicket(ticketId: string, tours: Tour[]) { + await this.db + .updateTable('Tour') + .set({ + ticketId: ticketId, + }) + .where( + 'id', + 'in', + tours.map(({ id }) => id), + ) + .execute(); + + return this.db + .selectFrom('Ticket') + .where('id', '=', ticketId) + .selectAll() + .executeTakeFirst(); + } + + setActionablesOnTicket(ticketId: string, errors: string[], notes: string[]) { + return this.db + .updateTable('Ticket') + .set({ errors, notes }) + .where('id', '=', ticketId) + .returningAll() + .executeTakeFirst(); + } + + async setStateOfTicket(ticketId: string, state: TicketValidationState) { + await this.db + .updateTable('Ticket') + .set({ + currentState: state, + }) + .where('Ticket.id', '=', ticketId) + .execute(); + + return this.db + .insertInto('TicketStateHistory') + .values({ state, ticketId }) + .returningAll() + .executeTakeFirst(); + } + + async updateTicket( + ticketId: string, + data: { + state?: TicketValidationState; + errors?: string[]; + notes?: string[]; + isUrgent?: boolean; + urgency?: Date; + approvalState?: ApprovalState; + documentInfo?: DocumentInfoArgs; + approvalPath?: string; + }, + ) { + const { state, ...ticketData } = data; + + await this.db + .updateTable('Ticket') + .set({ ...ticketData }) + .where('id', '=', ticketId) + .execute(); + + if (state) { + await this.setStateOfTicket(ticketId, state); + } + + return this.db + .selectFrom('Ticket') + .where('id', '=', ticketId) + .selectAll('Ticket') + .select((eb) => withTours(eb)) + .executeTakeFirst(); + } + + findById(id: string) { + return this.prisma.ticket.findUnique({ + where: { + id, + }, + include: { + tours: true, + }, + }); + } + + findAll() { + return this.prisma.ticket.findMany({ + where: { + state: { + none: { + state: TicketValidationState.ARCHIVED, + }, + }, + }, + include: { + tours: true, + }, + }); + } + + findAllCreated() { + return this.prisma.ticket.findMany({ + where: { + state: { + none: { + state: TicketValidationState.USER_INTERACTION_REQUIRED, + }, + }, + }, + include: { + tours: true, + }, + }); + } + + findAllClosed() { + return this.prisma.ticket.findMany({ + where: { + tours: { + every: { + check: { + not: 0, + }, + }, + }, + }, + }); + } + + search(query: string) { + return this.prisma.ticket.findMany({ + where: { + state: { + none: { + state: TicketValidationState.ARCHIVED, + }, + }, + tours: { + some: { + OR: [ + ...query.split(' ').flatMap((word) => [ + { + patientName: { + contains: word, + mode: Prisma.QueryMode.insensitive, + }, + }, + { + patientSurname: { + contains: word, + mode: Prisma.QueryMode.insensitive, + }, + }, + { + operationId: { + contains: word, + mode: Prisma.QueryMode.insensitive, + }, + }, + ]), + ], + }, + }, + }, + take: 5, + include: { + tours: true, + }, + }); + } + + async findByState( + state: TicketValidationState, + filter: TicketFilterArgs, + take?: number, + skip?: number, + ) { + const query: Prisma.TicketFindManyArgs = { + ...{ + ...(skip ? { skip, take: 10 } : {}), + ...(take ? { take } : {}), + ...(take && !skip ? { skip: 0 } : {}), + }, + where: { + AND: createPrismaQueryFromTicketFilters(filter), + currentState: state, + tours: { + some: { + check: 0, + }, + }, + }, + orderBy: { createdAt: 'desc' }, + }; + + const [tickets, count] = await this.prisma.$transaction([ + this.prisma.ticket.findMany({ ...query }), + this.prisma.ticket.count({ where: query.where }), + ]); + return { + tickets, + total: count, + }; + } + + findPatientById(patientId: string): Promise { + return this.prisma.patient.findUnique({ where: { id: patientId } }); + } + + findStatesByTicketId( + ticketId: string, + ): Promise<{ state: TicketValidationState }[]> { + return this.prisma.ticketStateHistory.findMany({ + where: { + ticketId, + }, + select: { + state: true, + }, + }); + } + + findToursByTicketId(ticketId: string): Promise { + return this.prisma.tour.findMany({ + where: { + ticketId, + }, + }); + } + + async searchTicketIDForTour(tour: Tour): Promise { + const tours = await Promise.all([ + this.findFirstRecurringTour(tour), + this.findTourOnSameDayWithOppositeDirection(tour), + ]); + const firstFoundTour = tours.filter((tour) => !!tour)[0]; + if (firstFoundTour) { + const ticket = await this.prisma.ticket.findFirst({ + select: { + id: true, + }, + where: { + tours: { + some: { + id: firstFoundTour.id, + }, + }, + }, + }); + return ticket?.id; + } + return undefined; + } + + findFirstRecurringTour(tour: Tour): Promise { + const institutionStreet = + tour.direction === 'Hinfahrt' ? tour.targetStreet : tour.startStreet; + return this.prisma.tour.findFirst({ + where: { + type: 'Serie', + category: tour.category, + ordinanceType: tour.ordinanceType, + patientId: tour.patientId, + patientName: tour.patientName, + patientSurname: tour.patientSurname, + patientStreet: tour.patientStreet, + patientCity: tour.patientCity, + patientZip: tour.patientZip, + OR: [ + { targetStreet: institutionStreet }, + { startStreet: institutionStreet }, + ], + rangeEndDate: { + gte: tour.startDate, + }, + ticketId: { + not: null, + }, + }, + orderBy: { + startDate: 'desc', + }, + }); + } + + findTourOnSameDayWithOppositeDirection(tour: Tour): Promise { + return this.prisma.tour.findFirst({ + where: { + AND: [ + { + startDate: { + gt: startOfDay(new Date(tour.startDate)), + }, + }, + { + startDate: { + lt: endOfDay(new Date(tour.startDate)), + }, + }, + { + startStreet: tour.targetStreet, + }, + { + targetStreet: tour.startStreet, + }, + { + direction: tour.direction === 'Hinfahrt' ? 'Rückfahrt' : 'Hinfahrt', + }, + ], + }, + }); + } + + findToursWithTicket(interval: Interval): Promise { + return this.prisma.tour.findMany({ + where: { + AND: [ + { + ticketId: { + not: null, + }, + }, + { + startDate: { + gte: new Date(interval.start), + }, + }, + { + startDate: { + lt: new Date(interval.end), + }, + }, + ], + }, + }); + } + + removeTourFromTicket(tourId: string): Promise { + return this.prisma.tour.update({ + where: { + id: tourId, + }, + data: { + Ticket: { + disconnect: true, + }, + }, + }); + } + + findTours(interval: Interval): Promise { + return this.prisma.tour.findMany({ + where: { + AND: [ + { + startDate: { + gte: new Date(interval.start), + }, + }, + { + startDate: { + lt: new Date(interval.end), + }, + }, + { + OR: [ + { + carName: null, + }, + { + AND: [ + { + carName: { + not: 'Storno', + }, + }, + { + carName: { + not: 'Löschen', + }, + }, + { + carName: { + not: 'Abgabe', + }, + }, + ], + }, + ], + }, + { + check: { + not: 3, + }, + }, + { + deletedAt: null, + }, + { + ticketId: null, + }, + { + AND: [ + { + patientId: { + // Pause + not: 'b7424477-a4b2-42f7-b7e7-a4bef24f6979', + }, + }, + { + patientId: { + // Feierabend + not: '3554e1a9-9c07-45e5-b53c-692a77e4fa9a', + }, + }, + ], + }, + ], + }, + }); + } + + async deleteEmptyTickets(): Promise { + return this.prisma.ticket.deleteMany({ + where: { + tours: { + none: {}, + }, + }, + }); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-tickets/tickets.service.ts b/service/data-hub/data-connector/src/modules/feat-tickets/tickets.service.ts new file mode 100644 index 0000000..561f9d8 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-tickets/tickets.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { Ticket, TicketValidationState, Tour } from '@prisma/client'; +import { Interval } from 'date-fns'; +import { DocumentInfoArgs } from './ticket-arg.types'; +import { TicketLifecycleService } from './ticket-lifecycle.service'; +import { + TicketSystemEventTypes, + TicketSystemValidatedEvent, +} from './ticket-system.events'; +import { TicketRepository } from './ticket.repository'; + +@Injectable() +export class TicketService { + constructor( + private readonly repository: TicketRepository, + private readonly lifecycle: TicketLifecycleService, + private readonly eventEmitter: EventEmitter2, + ) {} + + async createTickets(interval: Interval): Promise { + await this.lifecycle.createTickets(interval); + + this.eventEmitter.emit( + TicketSystemEventTypes.Validated, + new TicketSystemValidatedEvent(0), + ); + } + + async updateDocumentInfo(ticketId: string, documentInfo: DocumentInfoArgs) { + return this.lifecycle.validateDocumentInfoUpdate(ticketId, documentInfo); + } + + findById(id: string): Promise { + return this.repository.findById(id); + } + + findAll(): Promise { + return this.repository.findAll() as Promise; + } + + searchTickets(query: string): Promise { + return this.repository.search(query); + } + + findToursByTicketId(ticketId: string): Promise { + return this.repository.findToursByTicketId(ticketId); + } + + findStatesByTicketId(ticketId: string): Promise { + return this.repository + .findStatesByTicketId(ticketId) + .then((states) => states.map(({ state }) => state)); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/adapter/tours-calculation.adapter.ts b/service/data-hub/data-connector/src/modules/feat-transformers/adapter/tours-calculation.adapter.ts index a100651..d464092 100644 --- a/service/data-hub/data-connector/src/modules/feat-transformers/adapter/tours-calculation.adapter.ts +++ b/service/data-hub/data-connector/src/modules/feat-transformers/adapter/tours-calculation.adapter.ts @@ -1,54 +1,55 @@ -// import { CalculationService } from '@dks/avicenna/api-util-calculation'; -// import { Injectable } from '@nestjs/common'; -// import { Tour } from '@prisma/client'; -// import { chunk } from 'src/utils'; -// import { TourPreStaging } from '../staging.interface'; +import { Injectable } from '@nestjs/common'; +import { Tour } from '@prisma/client'; -// @Injectable() -// export class ToursCalculationAdapater { -// constructor(private readonly calculationService: CalculationService) {} +import { CalculationService } from 'src/modules/feat-calculation/calculation.service'; +import { chunk } from 'src/utils'; +import { TourPreStaging } from '../staging.interface'; -// public async addRevenueAndConsumptionCostsToTours( -// tours: TourPreStaging[], -// ): Promise { -// const resultTours = []; -// for (const tourChunk of chunk(tours, 5)) { -// resultTours.push( -// await Promise.all( -// tourChunk.map((tour) => -// this.addRevenueAndConsumptionCostsToTour(tour), -// ), -// ), -// ); -// } -// return resultTours.flat(); -// } +@Injectable() +export class ToursCalculationAdapater { + constructor(private readonly calculationService: CalculationService) {} -// public async addRevenueAndConsumptionCostsToTour( -// tour: TourPreStaging, -// ): Promise { -// if (!tour?.ordinanceType) { -// return tour; -// } -// const revenue = await this.calculationService.calculateTourRevenue( -// tour as unknown as Tour, -// ); -// const revenueDeviation = -// tour.revenueDispoLive > 0 -// ? Math.floor((revenue - tour.revenueDispoLive) * 100) / 100 -// : 0; + public async addRevenueAndConsumptionCostsToTours( + tours: TourPreStaging[], + ): Promise { + const resultTours = []; + for (const tourChunk of chunk(tours, 5)) { + resultTours.push( + await Promise.all( + tourChunk.map((tour) => + this.addRevenueAndConsumptionCostsToTour(tour), + ), + ), + ); + } + return resultTours.flat(); + } -// const { consumptionCostsPerTour } = -// this.calculationService.getBillingInformationByOrdinanceType( -// tour.ordinanceType.match(/([A-Z])\w+/).at(0), -// tour.startDate, -// ); + public async addRevenueAndConsumptionCostsToTour( + tour: TourPreStaging, + ): Promise { + if (!tour?.ordinanceType) { + return tour; + } + const revenue = await this.calculationService.calculateTourRevenue( + tour as unknown as Tour, + ); + const revenueDeviation = + tour.revenueDispoLive > 0 + ? Math.floor((revenue - tour.revenueDispoLive) * 100) / 100 + : 0; -// return { -// ...tour, -// revenue, -// revenueDeviation, -// consumptionCosts: consumptionCostsPerTour, -// }; -// } -// } + const { consumptionCostsPerTour } = + this.calculationService.getBillingInformationByOrdinanceType( + tour.ordinanceType.match(/([A-Z])\w+/).at(0), + tour.startDate, + ); + + return { + ...tour, + revenue, + revenueDeviation, + consumptionCosts: consumptionCostsPerTour, + }; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/data-access-transformers.module.ts b/service/data-hub/data-connector/src/modules/feat-transformers/data-access-transformers.module.ts index 08d82ad..38f1691 100644 --- a/service/data-hub/data-connector/src/modules/feat-transformers/data-access-transformers.module.ts +++ b/service/data-hub/data-connector/src/modules/feat-transformers/data-access-transformers.module.ts @@ -1,13 +1,14 @@ import { Module } from '@nestjs/common'; -// import { ToursCalculationAdapater } from './adapter/tours-calculation.adapter'; +import { PrismaModule } from 'src/core/database/prisma.module'; +import { UtilCalculationModule } from '../feat-calculation/util-calculation.module'; +import { DataAccessExtractorsModule } from '../feat-extractors/data-access-extractors.module'; +import { ToursCalculationAdapater } from './adapter/tours-calculation.adapter'; import { StagingRepository } from './staging.repository'; import { TransformersService } from './transformers.service'; -import { PrismaModule } from 'src/core/database/prisma.module'; -import { DataAccessExtractorsModule } from '../feat-extractors/data-access-extractors.module'; @Module({ - imports: [PrismaModule, DataAccessExtractorsModule], - providers: [TransformersService, StagingRepository], + imports: [PrismaModule, DataAccessExtractorsModule, UtilCalculationModule], + providers: [TransformersService, StagingRepository, ToursCalculationAdapater], exports: [TransformersService], }) export class DataAccessTransformersModule {} diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/staging.interface.ts b/service/data-hub/data-connector/src/modules/feat-transformers/staging.interface.ts index 4561d3c..db3f6cf 100644 --- a/service/data-hub/data-connector/src/modules/feat-transformers/staging.interface.ts +++ b/service/data-hub/data-connector/src/modules/feat-transformers/staging.interface.ts @@ -104,7 +104,7 @@ export interface WorkTimePreStaging { endDate: Date; } -export interface EmployeePreStaging { +export interface EmployeeDyflexisPreStaging { id: number; firstname: string; surname: string; @@ -112,6 +112,13 @@ export interface EmployeePreStaging { contractEnd: Date; contractHoursWeek: number; contractSalaryHour: number; - personTransportCertificate?: Date; - qualification?: string; +} + +export interface EmployeeDispoLivePreStaging { + id: string; + name: string; + surname: string; + personnelNumber?: string; + qualification?: string; + personTransportCertificate?: Date; } diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/staging.repository.ts b/service/data-hub/data-connector/src/modules/feat-transformers/staging.repository.ts index 136e313..81ebaf6 100644 --- a/service/data-hub/data-connector/src/modules/feat-transformers/staging.repository.ts +++ b/service/data-hub/data-connector/src/modules/feat-transformers/staging.repository.ts @@ -1,6 +1,8 @@ import { Injectable } from '@nestjs/common'; import { AttendanceRegistrationStaging, + EmployeeDispoLiveStaging, + EmployeeDyflexisStaging, PatientStaging, PlannedTimeStaging, Prisma, @@ -10,7 +12,8 @@ import { import { PrismaService } from 'src/core/database/prisma.service'; import { AttendanceRegistrationPreStaging, - EmployeePreStaging, + EmployeeDispoLivePreStaging, + EmployeeDyflexisPreStaging, PatientPreStaging, PlannedTimePreStaging, TourPreStaging, @@ -24,7 +27,8 @@ export class StagingRepository { clearStaging(): Promise { return Promise.all([ this.prisma.tourStaging.deleteMany(), - this.prisma.employeeStaging.deleteMany(), + this.prisma.employeeDispoLiveStaging.deleteMany(), + this.prisma.employeeDyflexisStaging.deleteMany(), this.prisma.workTimeStaging.deleteMany(), this.prisma.plannedTimeStaging.deleteMany(), this.prisma.attendanceRegistrationStaging.deleteMany(), @@ -68,14 +72,38 @@ export class StagingRepository { }); } - createEmployees( - employees: EmployeePreStaging[], + createDyflexisEmployees( + employees: EmployeeDyflexisPreStaging[], ): Promise { - return this.prisma.employeeStaging.createMany({ + return this.prisma.employeeDyflexisStaging.createMany({ data: employees, }); } + createDispoliveEmployees( + employees: EmployeeDispoLivePreStaging[], + ): Promise { + return this.prisma.employeeDispoLiveStaging.createMany({ + data: employees, + }); + } + + findDyflexisEmployees(): Promise { + return this.prisma.employeeDyflexisStaging.findMany({ + orderBy: { + surname: 'asc', + }, + }); + } + + findDispoliveEmployees(): Promise { + return this.prisma.employeeDispoLiveStaging.findMany({ + orderBy: { + surname: 'asc', + }, + }); + } + findPatients(): Promise { return this.prisma.patientStaging.findMany({ orderBy: { diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/transformers.service.ts b/service/data-hub/data-connector/src/modules/feat-transformers/transformers.service.ts index 6372a40..05076f2 100644 --- a/service/data-hub/data-connector/src/modules/feat-transformers/transformers.service.ts +++ b/service/data-hub/data-connector/src/modules/feat-transformers/transformers.service.ts @@ -2,20 +2,23 @@ import { Injectable } from '@nestjs/common'; import { AttendanceRegistrationStaging, EmployeeDispoLiveSource, + EmployeeDispoLiveStaging, EmployeeDyflexisSource, + EmployeeDyflexisStaging, PatientStaging, PlannedTimeStaging, Prisma, TourStaging, WorkTimeStaging, } from '@prisma/client'; -import { combineLatest, from, map, switchMap } from 'rxjs'; +import { from, map, switchMap } from 'rxjs'; import { ExtractorsService } from '../feat-extractors/extractors.service'; -// import { ToursCalculationAdapater } from './adapter/tours-calculation.adapter'; +import { ToursCalculationAdapater } from './adapter/tours-calculation.adapter'; import { StagingRepository } from './staging.repository'; import { AttendanceRegistrationTransformer } from './transformers/attendance-registration.transformer'; -import { EmployeeTransformer } from './transformers/employee.transformer'; +import { DispoliveEmployeeTransformer } from './transformers/employee-dispolive.transformer'; +import { DyflexisEmployeeTransformer } from './transformers/employee-dyflexis.transformer'; import { PatientTransformer } from './transformers/patient.transformer'; import { PlannedTimeTransformer } from './transformers/planned-time.transformer'; import { TourTransformer } from './transformers/tour.transformer'; @@ -26,7 +29,7 @@ export class TransformersService { constructor( private readonly extractorsService: ExtractorsService, private readonly repository: StagingRepository, - // private readonly tourCalculationAdapter: ToursCalculationAdapater, + private readonly tourCalculationAdapter: ToursCalculationAdapater, ) {} clearStaging(): Promise { @@ -78,43 +81,48 @@ export class TransformersService { .filter(({ einsatzNummer }) => !!einsatzNummer) .map((tour) => TourTransformer.transform(tour)), ), - // switchMap((tours) => - // from( - // this.tourCalculationAdapter.addRevenueAndConsumptionCostsToTours( - // tours, - // ), - // ), - // ), + switchMap((tours) => + from( + this.tourCalculationAdapter.addRevenueAndConsumptionCostsToTours( + tours, + ), + ), + ), switchMap((tours) => this.repository.createTours(tours)), ); } - transformEmployees(jobId: string) { - return combineLatest([ - from(this.extractorsService.findEmployeesDispoLiveByJobId(jobId)), - from(this.extractorsService.findEmployeesDyflexisByJobId(jobId)), - ]).pipe( - map(([dispoLiveEmployees, dyflexisEmployees]) => - dyflexisEmployees - .map((dyflexisEmployee) => { - const dispoLiveEmployee = dispoLiveEmployees.find( - (e) => e.importPersId === dyflexisEmployee.id, - ); - if (!dispoLiveEmployee) return undefined; - - return [dyflexisEmployee, dispoLiveEmployee]; - }) - .filter(Boolean), - ), + transformDyflexisEmployees(jobId: string) { + return from( + this.extractorsService.findEmployeesDyflexisByJobId(jobId), + ).pipe( map((employees) => - employees.map(([dyflexisEmployee, dispoLiveEmployee]) => - EmployeeTransformer.transform( + employees.map((dyflexisEmployee) => + DyflexisEmployeeTransformer.transform( dyflexisEmployee as EmployeeDyflexisSource, + ), + ), + ), + switchMap((employees) => + this.repository.createDyflexisEmployees(employees), + ), + ); + } + + transformDispoliveEmployees(jobId: string) { + return from( + this.extractorsService.findEmployeesDispoLiveByJobId(jobId), + ).pipe( + map((employees) => + employees.map((dispoLiveEmployee) => + DispoliveEmployeeTransformer.transform( dispoLiveEmployee as EmployeeDispoLiveSource, ), ), ), - switchMap((employees) => this.repository.createEmployees(employees)), + switchMap((employees) => + this.repository.createDispoliveEmployees(employees), + ), ); } @@ -131,6 +139,14 @@ export class TransformersService { return this.repository.findPatients(); } + findDyflexisEmployees(): Promise { + return this.repository.findDyflexisEmployees(); + } + + findDispoliveEmployees(): Promise { + return this.repository.findDispoliveEmployees(); + } + findTours(): Promise { return this.repository.findTours(); } diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee-dispolive.transformer.ts b/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee-dispolive.transformer.ts new file mode 100644 index 0000000..03a3827 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee-dispolive.transformer.ts @@ -0,0 +1,42 @@ +import { EmployeeDispoLiveSource } from '@prisma/client'; + +import { isValidDate } from 'src/utils'; +import { EmployeeDispoLivePreStaging } from '../staging.interface'; +import { + parseDateTime, + pick, + transformProperties, +} from '../transformer.functions'; + +export class DispoliveEmployeeTransformer { + public static transform( + dispoLiveEmployeeSource: EmployeeDispoLiveSource, + ): EmployeeDispoLivePreStaging { + const dispoLiveEmployeeParsed = { + ...dispoLiveEmployeeSource, + ...transformProperties(parseDateTime('yyyy-MM-dd'))( + pick(['pScheinAblaufDatum'])(dispoLiveEmployeeSource), + ), + }; + + const { + id, + name, + surname, + importPersId, + pScheinAblaufDatum, + qualifikation, + } = dispoLiveEmployeeParsed; + + return { + id, + name, + surname, + personnelNumber: importPersId, + personTransportCertificate: isValidDate(new Date(pScheinAblaufDatum)) + ? pScheinAblaufDatum + : undefined, + qualification: qualifikation, + } as unknown as EmployeeDispoLivePreStaging; + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee.transformer.ts b/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee-dyflexis.transformer.ts similarity index 58% rename from service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee.transformer.ts rename to service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee-dyflexis.transformer.ts index f9e0383..cdf5bfa 100644 --- a/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee.transformer.ts +++ b/service/data-hub/data-connector/src/modules/feat-transformers/transformers/employee-dyflexis.transformer.ts @@ -1,10 +1,6 @@ -import { - EmployeeDispoLiveSource, - EmployeeDyflexisSource, -} from '@prisma/client'; +import { EmployeeDyflexisSource } from '@prisma/client'; -import { isValidDate } from 'src/utils'; -import { EmployeePreStaging } from '../staging.interface'; +import { EmployeeDyflexisPreStaging } from '../staging.interface'; import { parseDateTime, parseFloat, @@ -13,11 +9,10 @@ import { transformProperties, } from '../transformer.functions'; -export class EmployeeTransformer { +export class DyflexisEmployeeTransformer { public static transform( dyflexisEmployeeSource: EmployeeDyflexisSource, - dispoLiveEmployeeSource: EmployeeDispoLiveSource, - ): EmployeePreStaging { + ): EmployeeDyflexisPreStaging { const dyflexisEmployeeParsed = { ...dyflexisEmployeeSource, ...transformProperties(parseFloat)( @@ -32,12 +27,6 @@ export class EmployeeTransformer { pick(['contract_start', 'contract_end'])(dyflexisEmployeeSource), ), }; - const dispoLiveEmployeeParsed = { - ...dispoLiveEmployeeSource, - ...transformProperties(parseDateTime('yyyy-MM-dd'))( - pick(['pScheinAblaufDatum'])(dispoLiveEmployeeSource), - ), - }; const { id, @@ -48,7 +37,6 @@ export class EmployeeTransformer { contract_hours_week, contract_salary_hour, } = dyflexisEmployeeParsed; - const { pScheinAblaufDatum, qualifikation } = dispoLiveEmployeeParsed; return { id, @@ -58,10 +46,6 @@ export class EmployeeTransformer { contractEnd: contract_end, contractHoursWeek: contract_hours_week, contractSalaryHour: contract_salary_hour, - personTransportCertificate: isValidDate(new Date(pScheinAblaufDatum)) - ? pScheinAblaufDatum - : undefined, - qualification: qualifikation, - } as unknown as EmployeePreStaging; + } as unknown as EmployeeDyflexisPreStaging; } } diff --git a/service/data-hub/data-connector/src/utils/helper.ts b/service/data-hub/data-connector/src/utils/helper.ts new file mode 100644 index 0000000..9cf7c43 --- /dev/null +++ b/service/data-hub/data-connector/src/utils/helper.ts @@ -0,0 +1,84 @@ +import { + Interval, + addDays, + clamp, + differenceInMilliseconds, + set, +} from 'date-fns'; +import { fromZonedTime } from 'date-fns-tz'; + +/** + * Generates an interval for the given time range for the baseDate, today by default. If the second time is lower than the first, the interval spans over to the next day + * @param timeRange A user readable time range formatted as "HH:mm-HH:mm" + */ +export function generateIntervalForTimeRange( + timeRange: string, + timeZone = 'Europe/London', + baseDate = new Date(), +): Interval { + const [firstTime, secondTime] = timeRange.split('-'); + if ( + !firstTime || + !secondTime || + firstTime?.indexOf(':') === -1 || + secondTime?.indexOf(':') === -1 + ) { + throw new Error( + `Invalid argument for 'timeRange', expected format 'HH:mm-HH:mm', got ${timeRange}`, + ); + } + const [startHours, startMinutes] = firstTime.split(':').map((val) => +val); + const [endHours, endMinutes] = secondTime.split(':').map((val) => +val); + const startDate = baseDate; + let endDate = baseDate; + if (endHours < startHours) { + endDate = addDays(endDate, 1); + } + return { + start: fromZonedTime( + set(startDate, { + hours: startHours, + minutes: startMinutes, + seconds: 0, + milliseconds: 0, + }), + timeZone, + ), + end: fromZonedTime( + set(endDate, { + hours: endHours, + minutes: endMinutes, + seconds: 0, + milliseconds: 0, + }), + timeZone, + ), + }; +} + +export function clampInterval( + interval: Interval, + intervalClamp: Interval, +): Interval { + return { + start: clamp(interval.start, intervalClamp), + end: clamp(interval.end, intervalClamp), + }; +} + +export function getHoursInInterval( + interval: Interval, + intervalClamp?: Interval, +): number { + const clampedInterval: Interval = clampInterval( + interval, + intervalClamp ?? interval, + ); + + return ( + differenceInMilliseconds(clampedInterval.end, clampedInterval.start) / + 60 / + 60 / + 1000 + ); +} diff --git a/service/data-hub/data-connector/src/utils/index.ts b/service/data-hub/data-connector/src/utils/index.ts index 36cedd1..2c3535b 100644 --- a/service/data-hub/data-connector/src/utils/index.ts +++ b/service/data-hub/data-connector/src/utils/index.ts @@ -1,3 +1,4 @@ export * from './chunk'; +export * from './helper'; export * from './is-valid-date'; export * from './range';