From 137ce0f0f701c14956a5182d3828defcea507e88 Mon Sep 17 00:00:00 2001 From: Pushyami Gundala Date: Tue, 16 Apr 2024 11:56:44 -0400 Subject: [PATCH] #330 Upgrade CCM To ESM (#433) --- .github/workflows/ccm.yml | 3 +- README.md | 12 +- ccm_web/Dockerfile | 2 +- ccm_web/client/src/App.tsx | 24 +- ccm_web/client/src/api.ts | 8 +- .../client/src/components/APIErrorMessage.tsx | 2 +- .../client/src/components/APIErrorsTable.tsx | 4 +- ccm_web/client/src/components/Accordion.tsx | 2 +- .../client/src/components/AuthorizePrompt.tsx | 2 +- ccm_web/client/src/components/Breadcrumbs.tsx | 4 +- .../src/components/BulkApiErrorContent.tsx | 10 +- ...ulkEnrollExternalUserConfirmationTable.tsx | 4 +- .../BulkEnrollUMUserConfirmationTable.tsx | 4 +- ...nrollUMUserToSectionsConfirmationTable.tsx | 4 +- ...lkSectionCreateUploadConfirmationTable.tsx | 2 +- .../components/BulkSectionCreateValidators.ts | 6 +- .../client/src/components/ConfirmDialog.tsx | 4 +- .../src/components/CourseSectionList.tsx | 10 +- .../src/components/CreateSectionWidget.tsx | 10 +- .../components/CreateSelectSectionWidget.tsx | 10 +- ccm_web/client/src/components/CustomTable.tsx | 6 +- ccm_web/client/src/components/ErrorAlert.tsx | 4 +- .../components/ExampleFileDownloadHeader.tsx | 2 +- ccm_web/client/src/components/FeatureCard.tsx | 2 +- ccm_web/client/src/components/FileUpload.tsx | 2 +- .../components/GradebookCanvasValidators.ts | 6 +- .../GradebookUploadConfirmationTable.tsx | 2 +- .../src/components/InlineErrorAlert.tsx | 2 +- .../client/src/components/InlineTextEdit.tsx | 2 +- ccm_web/client/src/components/Layout.tsx | 8 +- .../MultipleSectionEnrollmentWorkflow.tsx | 46 +- .../MultipleUserEnrollmentWorkflow.tsx | 54 +- ccm_web/client/src/components/RoleSelect.tsx | 2 +- .../src/components/RowLevelErrorsContent.tsx | 2 +- .../src/components/SectionSelectorWidget.tsx | 16 +- .../SingleSectionEnrollmentWorkflow.tsx | 46 +- ccm_web/client/src/components/SuccessCard.tsx | 2 +- .../ThirdPartyGradebookConfirmationTable.tsx | 4 +- .../src/components/UserEnrollmentForm.tsx | 32 +- .../src/components/ValidatedFormField.tsx | 2 +- .../src/components/ValidationErrorTable.tsx | 6 +- .../client/src/components/WarningAlert.tsx | 4 +- ccm_web/client/src/hooks/useGlobals.ts | 6 +- ccm_web/client/src/index.tsx | 8 +- ccm_web/client/src/models/FeatureUIData.tsx | 30 +- ccm_web/client/src/models/canvas.ts | 2 +- ccm_web/client/src/models/enrollment.ts | 4 +- ccm_web/client/src/models/externalUser.ts | 4 +- ccm_web/client/src/models/feature.ts | 2 +- ccm_web/client/src/models/models.ts | 2 +- ccm_web/client/src/pages/AccessDenied.tsx | 6 +- ccm_web/client/src/pages/AddNonUMUsers.tsx | 18 +- ccm_web/client/src/pages/AddUMUsers.tsx | 16 +- .../client/src/pages/BulkSectionCreate.tsx | 44 +- .../src/pages/FormatThirdPartyGradebook.tsx | 42 +- ccm_web/client/src/pages/GradebookCanvas.tsx | 36 +- ccm_web/client/src/pages/Home.tsx | 22 +- ccm_web/client/src/pages/LaunchError.tsx | 6 +- ccm_web/client/src/pages/MergeSections.tsx | 20 +- .../client/src/utils/CSVSchemaValidator.ts | 4 +- ccm_web/client/src/utils/SectionSearcher.ts | 6 +- .../utils/ThirdPartyGradebookProcessor.tsx | 6 +- .../src/utils/canvasSectionNameValidator.ts | 6 +- .../client/src/utils/enrollmentValidators.ts | 10 +- ccm_web/client/src/utils/handleErrors.ts | 6 +- ccm_web/client/src/utils/rowValidation.ts | 6 +- ccm_web/client/tsconfig.json | 4 +- ...osystem.config.js => ecosystem.config.cjs} | 0 ccm_web/nmon_config.json | 2 +- ccm_web/package-lock.json | 2804 ++++++++--------- ccm_web/package.json | 78 +- ccm_web/server/localTypes/express/index.d.ts | 2 +- ccm_web/server/src/api/api.admin.handler.ts | 21 +- ccm_web/server/src/api/api.controller.ts | 37 +- ccm_web/server/src/api/api.course.handler.ts | 18 +- ccm_web/server/src/api/api.interfaces.ts | 4 +- ccm_web/server/src/api/api.module.ts | 12 +- ccm_web/server/src/api/api.section.handler.ts | 20 +- ccm_web/server/src/api/api.service.ts | 32 +- ccm_web/server/src/api/api.utils.ts | 8 +- .../api/dtos/api.section.enrollment.dto.ts | 2 +- .../src/api/dtos/api.section.users.dto.ts | 2 +- .../src/api/invalid.token.interceptor.ts | 8 +- .../src/api/too.many.results.interceptor.ts | 2 +- ccm_web/server/src/app.module.ts | 29 +- ccm_web/server/src/auth/auth.controller.ts | 8 +- ccm_web/server/src/auth/auth.module.ts | 16 +- ccm_web/server/src/auth/auth.service.ts | 6 +- .../server/src/auth/csrf.exception.filter.ts | 6 +- .../server/src/auth/double.csrf.middleware.ts | 4 +- ccm_web/server/src/auth/jwt.strategy.ts | 10 +- .../server/src/canvas/canvas.controller.ts | 20 +- .../server/src/canvas/canvas.interfaces.ts | 5 +- ccm_web/server/src/canvas/canvas.model.ts | 12 +- ccm_web/server/src/canvas/canvas.module.ts | 6 +- ccm_web/server/src/canvas/canvas.service.ts | 32 +- ccm_web/server/src/config.ts | 4 +- ccm_web/server/src/health/health.module.ts | 2 +- ccm_web/server/src/init.ts | 6 +- .../cirrus-invitation.interfaces.ts | 2 +- .../invitation/cirrus-invitation.module.ts | 2 +- .../invitation/cirrus-invitation.service.ts | 10 +- ccm_web/server/src/logger.ts | 2 +- ccm_web/server/src/lti/lti.middleware.ts | 2 +- ccm_web/server/src/lti/lti.module.ts | 10 +- ccm_web/server/src/lti/lti.service.ts | 10 +- ccm_web/server/src/main.ts | 18 +- .../2021.06.16T19.36.19.create-user.ts | 2 +- ...2021.06.16T19.36.43.create-canvas-token.ts | 2 +- ...30T19.52.46.add-canvas-token-expires-at.ts | 2 +- ....21.06.add-unique-constraint-to-user-id.ts | 2 +- ccm_web/server/src/migrator.ts | 13 +- ccm_web/server/src/user/user.decorator.ts | 4 +- ccm_web/server/src/user/user.model.ts | 14 +- ccm_web/server/src/user/user.module.ts | 6 +- ccm_web/server/src/user/user.service.ts | 12 +- ccm_web/start.sh | 4 +- ccm_web/tsconfig.json | 11 +- ccm_web/webpack/webpack.common.ts | 9 +- ccm_web/webpack/webpack.dev.ts | 2 +- ccm_web/webpack/webpack.prod.ts | 2 +- 121 files changed, 2036 insertions(+), 2018 deletions(-) rename ccm_web/{ecosystem.config.js => ecosystem.config.cjs} (100%) diff --git a/.github/workflows/ccm.yml b/.github/workflows/ccm.yml index 566ad5c28..d1562b013 100644 --- a/.github/workflows/ccm.yml +++ b/.github/workflows/ccm.yml @@ -7,6 +7,7 @@ on: - main - '[0-9][0-9][0-9][0-9].[0-9][0-9].*' # 2021.01.x - '2024-03-01-dep-update' + - 'i330_alt_cjs_esm_upgrade' tags: - '[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]' # 2021.01.01 @@ -22,7 +23,7 @@ env: jobs: build: # to test a feature, change the repo name to your github id - if: github.repository_owner == 'tl-its-umich-edu' + if: github.repository_owner == 'tl-its-umich-edu' || github.repository_owner == 'pushyamig' runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index 4fdd1dbc1..53f47adfb 100644 --- a/README.md +++ b/README.md @@ -188,9 +188,9 @@ you create a migration file and run the migration using `umzug`. Developers have to write `up` and `down` migration steps manually. 1. Running migrations locally - 1. Run migrations: `docker exec -it ccm_web node -r ts-node/register server/src/migrator up` - 2. Revert a migration: `docker exec -it ccm_web node -r ts-node/register server/src/migrator down`. - 3. Create a migration file: `docker exec -it ccm_web node -r ts-node/register server/src/migrator create --name my-migration.ts`. + 1. Run migrations: `docker exec -it ccm_web node --loader ts-node/esm server/src/migrator.ts up` + 2. Revert a migration: `docker exec -it ccm_web node --loader ts-node/esm server/src/migrator.ts down`. + 3. Create a migration file: `docker exec -it ccm_web node --loader ts-node/esm server/src/migrator.ts create --name my-migration.ts`. This generates a migration file called `.my-migration.ts`. The timestamp prefix can be customized to be date-only or omitted, @@ -201,9 +201,9 @@ Developers have to write `up` and `down` migration steps manually. 2. Running the migration are usually done when server is starting up, but in addition if you want to run migrations or revert use above commands 3. Running migrations `docker-compose-prod.yml` - 1. For running the migrations in in dev/test/prod, use `docker exec -it ccm_web_prod node server/src/migrator up` and `docker exec -it ccm_web_prod node server/src/migrator down`. + 1. For running the migrations in in dev/test/prod, use `docker exec -it ccm_web_prod node --loader ts-node/esm server/src/migrator.js up` and `docker exec -it ccm_web_prod node --loader ts-node/esm server/src/migrator.js down`. 2. The reason for the separate setups for running migrations for local/non-prod and prod is locally, we don't - transpile TypeScript to Javascript and so we always use `ts-node/register` module for running in node + transpile TypeScript to Javascript and so we always use `ts-node/esm` module for running in node environment. #### Troubleshooting @@ -352,7 +352,7 @@ This code will hopefully only remain in this repository temporarily. 2. The action is triggered whenever a commit is made to the `main` branch. E.g., when a pull request is merged to `main`. 3. OpenShift projects can periodically pull this image from GHCR. Configure only **_NON-PRODUCTION_** CCM projects to pull the imageā€¦ ```sh - oc tag ghcr.io/tl-its-umich-edu/canvas-course-manager-next:latest canvas-course-manager-next:latest --scheduled --reference-policy=local + oc tag ghcr.io/tl-its-umich-edu/canvas-course-manager-next:main canvas-course-manager-next:main --scheduled --reference-policy=local ``` See the OpenShift documentation "[Managing image streams: Configuring periodic importing of image stream tags](https://docs.openshift.com/container-platform/4.11/openshift_images/image-streams-manage.html#images-imagestream-import_image-streams-managing)" for details. diff --git a/ccm_web/Dockerfile b/ccm_web/Dockerfile index 19ab20477..6cd39c80d 100644 --- a/ccm_web/Dockerfile +++ b/ccm_web/Dockerfile @@ -29,7 +29,7 @@ COPY --from=base \ /base/package.json \ /base/package-lock.json \ /base/start.sh \ - /base/ecosystem.config.js \ + /base/ecosystem.config.cjs \ ./ RUN npm install --production RUN npm install pm2@5.3.1 -g diff --git a/ccm_web/client/src/App.tsx b/ccm_web/client/src/App.tsx index 2df0ecabd..f5305e9c8 100644 --- a/ccm_web/client/src/App.tsx +++ b/ccm_web/client/src/App.tsx @@ -1,19 +1,19 @@ import React, { useEffect, useState } from 'react' import { Route, Routes, useLocation } from 'react-router-dom' -import { getCourse } from './api' +import { getCourse } from './api.js' import './App.css' -import APIErrorMessage from './components/APIErrorMessage' -import AuthorizePrompt from './components/AuthorizePrompt' -import ErrorAlert from './components/ErrorAlert' -import Layout from './components/Layout' -import useGlobals from './hooks/useGlobals' -import usePromise from './hooks/usePromise' -import { CanvasCourseBase } from './models/canvas' -import allFeatures from './models/FeatureUIData' -import Home from './pages/Home' -import NotFound from './pages/NotFound' -import redirect from './utils/redirect' +import APIErrorMessage from './components/APIErrorMessage.js' +import AuthorizePrompt from './components/AuthorizePrompt.js' +import ErrorAlert from './components/ErrorAlert.js' +import Layout from './components/Layout.js' +import useGlobals from './hooks/useGlobals.js' +import usePromise from './hooks/usePromise.js' +import { CanvasCourseBase } from './models/canvas.js' +import allFeatures from './models/FeatureUIData.js' +import Home from './pages/Home.js' +import NotFound from './pages/NotFound.js' +import redirect from './utils/redirect.js' function App (): JSX.Element { const features = allFeatures.map(f => f.features).flat() diff --git a/ccm_web/client/src/api.ts b/ccm_web/client/src/api.ts index 667a01d93..8a5def7b7 100644 --- a/ccm_web/client/src/api.ts +++ b/ccm_web/client/src/api.ts @@ -1,10 +1,10 @@ import { CanvasCourseBase, CanvasCourseSection, CanvasCourseSectionBase, CanvasEnrollment, CanvasUserCondensed, CourseWithSections -} from './models/canvas' -import { ExternalUserSuccess } from './models/externalUser' -import { Globals, CsrfToken } from './models/models' -import handleErrors, { CanvasError } from './utils/handleErrors' +} from './models/canvas.js' +import { ExternalUserSuccess } from './models/externalUser.js' +import { Globals, CsrfToken } from './models/models.js' +import handleErrors, { CanvasError } from './utils/handleErrors.js' const jsonMimeType = 'application/json' diff --git a/ccm_web/client/src/components/APIErrorMessage.tsx b/ccm_web/client/src/components/APIErrorMessage.tsx index 40aa693b5..df9b0db16 100644 --- a/ccm_web/client/src/components/APIErrorMessage.tsx +++ b/ccm_web/client/src/components/APIErrorMessage.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Typography } from '@mui/material' -import { CanvasError } from '../utils/handleErrors' +import { CanvasError } from '../utils/handleErrors.js' interface APIErrorMessageProps { context: string diff --git a/ccm_web/client/src/components/APIErrorsTable.tsx b/ccm_web/client/src/components/APIErrorsTable.tsx index 6e23cb252..5f2100784 100644 --- a/ccm_web/client/src/components/APIErrorsTable.tsx +++ b/ccm_web/client/src/components/APIErrorsTable.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' -import CustomTable, { TableColumn } from './CustomTable' -import { ErrorDescription } from '../utils/handleErrors' +import CustomTable, { TableColumn } from './CustomTable.js' +import { ErrorDescription } from '../utils/handleErrors.js' interface NumberedErrorDescription extends ErrorDescription { rowNumber: number diff --git a/ccm_web/client/src/components/Accordion.tsx b/ccm_web/client/src/components/Accordion.tsx index 7febe4e4c..9a4e6fb7a 100644 --- a/ccm_web/client/src/components/Accordion.tsx +++ b/ccm_web/client/src/components/Accordion.tsx @@ -5,7 +5,7 @@ import { AccordionDetails as MUIAccordionDetails, AccordionSummary as MUIAccordionSummary } from '@mui/material' -import ExpandMoreIcon from '@mui/icons-material/ExpandMore' +import {ExpandMore as ExpandMoreIcon} from '@mui/icons-material' const PREFIX = 'Accordion' diff --git a/ccm_web/client/src/components/AuthorizePrompt.tsx b/ccm_web/client/src/components/AuthorizePrompt.tsx index 63efe526d..6e7fcdd80 100644 --- a/ccm_web/client/src/components/AuthorizePrompt.tsx +++ b/ccm_web/client/src/components/AuthorizePrompt.tsx @@ -2,7 +2,7 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Button, Typography } from '@mui/material' -import Help from './Help' +import Help from './Help.js' const PREFIX = 'AuthorizePrompt' diff --git a/ccm_web/client/src/components/Breadcrumbs.tsx b/ccm_web/client/src/components/Breadcrumbs.tsx index 4e89927f5..eb89a561a 100644 --- a/ccm_web/client/src/components/Breadcrumbs.tsx +++ b/ccm_web/client/src/components/Breadcrumbs.tsx @@ -2,9 +2,9 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Link as RouterLink } from 'react-router-dom' import { Breadcrumbs as MuiBreadcrumbs, Link, Typography } from '@mui/material' -import NavigateNextIcon from '@mui/icons-material/NavigateNext' +import {NavigateNext as NavigateNextIcon} from '@mui/icons-material' -import { FeatureUIProps } from '../models/FeatureUIData' +import { FeatureUIProps } from '../models/FeatureUIData.js' const PREFIX = 'Breadcrumbs' diff --git a/ccm_web/client/src/components/BulkApiErrorContent.tsx b/ccm_web/client/src/components/BulkApiErrorContent.tsx index 496524910..a501408d5 100644 --- a/ccm_web/client/src/components/BulkApiErrorContent.tsx +++ b/ccm_web/client/src/components/BulkApiErrorContent.tsx @@ -1,11 +1,11 @@ import React from 'react' import { Typography } from '@mui/material' -import APIErrorsTable from './APIErrorsTable' -import CSVFileName from './CSVFileName' -import ErrorAlert from './ErrorAlert' -import RowLevelErrorsContent from './RowLevelErrorsContent' -import { CanvasError } from '../utils/handleErrors' +import APIErrorsTable from './APIErrorsTable.js' +import CSVFileName from './CSVFileName.js' +import ErrorAlert from './ErrorAlert.js' +import RowLevelErrorsContent from './RowLevelErrorsContent.js' +import { CanvasError } from '../utils/handleErrors.js' interface BulkApiErrorContentProps { error: Error diff --git a/ccm_web/client/src/components/BulkEnrollExternalUserConfirmationTable.tsx b/ccm_web/client/src/components/BulkEnrollExternalUserConfirmationTable.tsx index c2f7b9cb5..f8540a1ed 100644 --- a/ccm_web/client/src/components/BulkEnrollExternalUserConfirmationTable.tsx +++ b/ccm_web/client/src/components/BulkEnrollExternalUserConfirmationTable.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' -import CustomTable from './CustomTable' -import { RowNumberedAddNewExternalUserEnrollment } from '../models/enrollment' +import CustomTable from './CustomTable.js' +import { RowNumberedAddNewExternalUserEnrollment } from '../models/enrollment.js' interface BulkEnrollExternalConfirmationTableProps { enrollments: RowNumberedAddNewExternalUserEnrollment[] diff --git a/ccm_web/client/src/components/BulkEnrollUMUserConfirmationTable.tsx b/ccm_web/client/src/components/BulkEnrollUMUserConfirmationTable.tsx index 152595055..e503ff24a 100644 --- a/ccm_web/client/src/components/BulkEnrollUMUserConfirmationTable.tsx +++ b/ccm_web/client/src/components/BulkEnrollUMUserConfirmationTable.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' -import CustomTable from './CustomTable' -import { RowNumberedAddEnrollment } from '../models/enrollment' +import CustomTable from './CustomTable.js' +import { RowNumberedAddEnrollment } from '../models/enrollment.js' interface BulkEnrollUMUserConfirmationTableProps { enrollments: RowNumberedAddEnrollment[] diff --git a/ccm_web/client/src/components/BulkEnrollUMUserToSectionsConfirmationTable.tsx b/ccm_web/client/src/components/BulkEnrollUMUserToSectionsConfirmationTable.tsx index 51281404d..fad28ddf4 100644 --- a/ccm_web/client/src/components/BulkEnrollUMUserToSectionsConfirmationTable.tsx +++ b/ccm_web/client/src/components/BulkEnrollUMUserToSectionsConfirmationTable.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' -import CustomTable from './CustomTable' -import { RowNumberedAddEnrollmentWithSectionId } from '../models/enrollment' +import CustomTable from './CustomTable.js' +import { RowNumberedAddEnrollmentWithSectionId } from '../models/enrollment.js' interface BulkEnrollUMUserSectionsConfirmationTableProps { enrollments: RowNumberedAddEnrollmentWithSectionId[] diff --git a/ccm_web/client/src/components/BulkSectionCreateUploadConfirmationTable.tsx b/ccm_web/client/src/components/BulkSectionCreateUploadConfirmationTable.tsx index a4dae54e5..07287a754 100644 --- a/ccm_web/client/src/components/BulkSectionCreateUploadConfirmationTable.tsx +++ b/ccm_web/client/src/components/BulkSectionCreateUploadConfirmationTable.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import CustomTable from './CustomTable' +import CustomTable from './CustomTable.js' interface Section { rowNumber: number diff --git a/ccm_web/client/src/components/BulkSectionCreateValidators.ts b/ccm_web/client/src/components/BulkSectionCreateValidators.ts index 1a6dad888..6d3ada22e 100644 --- a/ccm_web/client/src/components/BulkSectionCreateValidators.ts +++ b/ccm_web/client/src/components/BulkSectionCreateValidators.ts @@ -1,6 +1,6 @@ -import { InvalidationType } from '../models/models' -import { DuplicateIdentifierInRowsValidator, RowInvalidation, StringRowsSchemaValidator } from '../utils/rowValidation' -import { sectionNameSchema } from '../utils/validation' +import { InvalidationType } from '../models/models.js' +import { DuplicateIdentifierInRowsValidator, RowInvalidation, StringRowsSchemaValidator } from '../utils/rowValidation.js' +import { sectionNameSchema } from '../utils/validation.js' interface SectionsRowInvalidation extends RowInvalidation {} diff --git a/ccm_web/client/src/components/ConfirmDialog.tsx b/ccm_web/client/src/components/ConfirmDialog.tsx index 08a1a022d..37ae93b4f 100644 --- a/ccm_web/client/src/components/ConfirmDialog.tsx +++ b/ccm_web/client/src/components/ConfirmDialog.tsx @@ -1,9 +1,9 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Button, Paper, Typography } from '@mui/material' -import CloudDoneIcon from '@mui/icons-material/CloudDone' +import { CloudDone as CloudDoneIcon } from '@mui/icons-material' -import { DownloadData } from '../models/models' +import { DownloadData } from '../models/models.js' const PREFIX = 'ConfirmDialog' diff --git a/ccm_web/client/src/components/CourseSectionList.tsx b/ccm_web/client/src/components/CourseSectionList.tsx index ffc776af0..a2b768753 100644 --- a/ccm_web/client/src/components/CourseSectionList.tsx +++ b/ccm_web/client/src/components/CourseSectionList.tsx @@ -12,13 +12,13 @@ import { Typography } from '@mui/material' -import APIErrorMessage from './APIErrorMessage' -import { getCourseSections, unmergeSections } from '../api' -import usePromise from '../hooks/usePromise' +import APIErrorMessage from './APIErrorMessage.js' +import { getCourseSections, unmergeSections } from '../api.js' +import usePromise from '../hooks/usePromise.js' import { CanvasCourseSection, CanvasCourseSectionBase, injectCourseName, CanvasCourseSectionWithCourseName -} from '../models/canvas' -import { CCMComponentProps } from '../models/FeatureUIData' +} from '../models/canvas.js' +import { CCMComponentProps } from '../models/FeatureUIData.js' const PREFIX = 'CourseSectionList' diff --git a/ccm_web/client/src/components/CreateSectionWidget.tsx b/ccm_web/client/src/components/CreateSectionWidget.tsx index 9192024cd..e2aa7dc6c 100644 --- a/ccm_web/client/src/components/CreateSectionWidget.tsx +++ b/ccm_web/client/src/components/CreateSectionWidget.tsx @@ -4,11 +4,11 @@ import { useSnackbar } from 'notistack' import React, { ChangeEvent, useState } from 'react' import { Button, Grid, TextField } from '@mui/material' -import APIErrorMessage from './APIErrorMessage' -import { addCourseSections } from '../api' -import { CanvasCourseBase, CanvasCourseSection } from '../models/canvas' -import { CanvasCoursesSectionNameValidator, ICanvasSectionNameInvalidError } from '../utils/canvasSectionNameValidator' -import { CsrfToken } from '../models/models' +import APIErrorMessage from './APIErrorMessage.js' +import { addCourseSections } from '../api.js' +import { CanvasCourseBase, CanvasCourseSection } from '../models/canvas.js' +import { CanvasCoursesSectionNameValidator, ICanvasSectionNameInvalidError } from '../utils/canvasSectionNameValidator.js' +import { CsrfToken } from '../models/models.js' const PREFIX = 'CreateSectionWidget' diff --git a/ccm_web/client/src/components/CreateSelectSectionWidget.tsx b/ccm_web/client/src/components/CreateSelectSectionWidget.tsx index 25e63e756..e41b0820f 100644 --- a/ccm_web/client/src/components/CreateSelectSectionWidget.tsx +++ b/ccm_web/client/src/components/CreateSelectSectionWidget.tsx @@ -1,12 +1,12 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Tooltip, Typography } from '@mui/material' -import HelpOutline from '@mui/icons-material/HelpOutline' +import { HelpOutline } from '@mui/icons-material' -import CreateSectionWidget from './CreateSectionWidget' -import SectionSelectorWidget from './SectionSelectorWidget' -import { CanvasCourseBase, CanvasCourseSection, CanvasCourseSectionWithCourseName } from '../models/canvas' -import { CsrfToken } from '../models/models' +import CreateSectionWidget from './CreateSectionWidget.js' +import SectionSelectorWidget from './SectionSelectorWidget.js' +import { CanvasCourseBase, CanvasCourseSection, CanvasCourseSectionWithCourseName } from '../models/canvas.js' +import { CsrfToken } from '../models/models.js' const PREFIX = 'CreateSelectSectionWidget' diff --git a/ccm_web/client/src/components/CustomTable.tsx b/ccm_web/client/src/components/CustomTable.tsx index 4c49c44bf..1b4488821 100644 --- a/ccm_web/client/src/components/CustomTable.tsx +++ b/ccm_web/client/src/components/CustomTable.tsx @@ -1,8 +1,8 @@ import { Paper, Table, TableBody, TableCell, TableContainer, TableFooter, TableHead, TablePagination, TableRow } from '@mui/material' import React from 'react' -import StyledTableCell from './StyledTableCell' -import TableCaption from './TableCaption' -import { TablePaginationActions } from './TablePagination' +import StyledTableCell from './StyledTableCell.js' +import TableCaption from './TableCaption.js' +import { TablePaginationActions } from './TablePagination.js' interface TableEntity { rowNumber: number diff --git a/ccm_web/client/src/components/ErrorAlert.tsx b/ccm_web/client/src/components/ErrorAlert.tsx index 61d8aef06..18a134a3c 100644 --- a/ccm_web/client/src/components/ErrorAlert.tsx +++ b/ccm_web/client/src/components/ErrorAlert.tsx @@ -1,9 +1,9 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Button, Typography } from '@mui/material' -import ErrorIcon from '@mui/icons-material/Error' +import { Error as ErrorIcon } from '@mui/icons-material' -import Alert from './Alert' +import Alert from './Alert.js' const PREFIX = 'ErrorAlert' diff --git a/ccm_web/client/src/components/ExampleFileDownloadHeader.tsx b/ccm_web/client/src/components/ExampleFileDownloadHeader.tsx index b5f320b46..d72f1f208 100644 --- a/ccm_web/client/src/components/ExampleFileDownloadHeader.tsx +++ b/ccm_web/client/src/components/ExampleFileDownloadHeader.tsx @@ -2,7 +2,7 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Link, Typography } from '@mui/material' -import { prepDownloadDataString } from '../utils/fileUtils' +import { prepDownloadDataString } from '../utils/fileUtils.js' const PREFIX = 'ExampleFileDownloadHeader' diff --git a/ccm_web/client/src/components/FeatureCard.tsx b/ccm_web/client/src/components/FeatureCard.tsx index 15185f543..b1ca70a42 100644 --- a/ccm_web/client/src/components/FeatureCard.tsx +++ b/ccm_web/client/src/components/FeatureCard.tsx @@ -3,7 +3,7 @@ import { styled } from '@mui/material/styles' import { Link as RouterLink } from 'react-router-dom' import { Card, CardActionArea, CardContent, Grid, Typography } from '@mui/material' -import { FeatureUIProps } from '../models/FeatureUIData' +import { FeatureUIProps } from '../models/FeatureUIData.js' const PREFIX = 'FeatureCard' diff --git a/ccm_web/client/src/components/FileUpload.tsx b/ccm_web/client/src/components/FileUpload.tsx index 1f70ef92f..1518c39bb 100644 --- a/ccm_web/client/src/components/FileUpload.tsx +++ b/ccm_web/client/src/components/FileUpload.tsx @@ -1,7 +1,7 @@ import React, { ChangeEvent, useRef } from 'react' import { styled } from '@mui/material/styles' import { Button, Card, CardContent, Typography } from '@mui/material' -import CloudUploadIcon from '@mui/icons-material/CloudUpload' +import { CloudUpload as CloudUploadIcon } from '@mui/icons-material' import { useSnackbar } from 'notistack' const PREFIX = 'FileUpload' diff --git a/ccm_web/client/src/components/GradebookCanvasValidators.ts b/ccm_web/client/src/components/GradebookCanvasValidators.ts index 6ce2a5a98..e67cc63c4 100644 --- a/ccm_web/client/src/components/GradebookCanvasValidators.ts +++ b/ccm_web/client/src/components/GradebookCanvasValidators.ts @@ -1,6 +1,6 @@ -import { InvalidationType } from '../models/models' -import { GradebookRecord } from '../pages/GradebookCanvas' -import { RowInvalidation } from '../utils/rowValidation' +import { InvalidationType } from '../models/models.js' +import { GradebookRecord } from '../pages/GradebookCanvas.js' +import { RowInvalidation } from '../utils/rowValidation.js' interface GradebookRowInvalidation extends RowInvalidation {} diff --git a/ccm_web/client/src/components/GradebookUploadConfirmationTable.tsx b/ccm_web/client/src/components/GradebookUploadConfirmationTable.tsx index 5500c1038..44d89764e 100644 --- a/ccm_web/client/src/components/GradebookUploadConfirmationTable.tsx +++ b/ccm_web/client/src/components/GradebookUploadConfirmationTable.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import CustomTable from './CustomTable' +import CustomTable from './CustomTable.js' interface StudentGrade { rowNumber: number diff --git a/ccm_web/client/src/components/InlineErrorAlert.tsx b/ccm_web/client/src/components/InlineErrorAlert.tsx index 5f6eaaa5e..b3f54fe0f 100644 --- a/ccm_web/client/src/components/InlineErrorAlert.tsx +++ b/ccm_web/client/src/components/InlineErrorAlert.tsx @@ -1,7 +1,7 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Grid, Paper } from '@mui/material' -import ErrorIcon from '@mui/icons-material/Error' +import { Error as ErrorIcon } from '@mui/icons-material' import { red } from '@mui/material/colors' const PREFIX = 'InlineErrorAlert' diff --git a/ccm_web/client/src/components/InlineTextEdit.tsx b/ccm_web/client/src/components/InlineTextEdit.tsx index 352bf9833..f00d2a44b 100644 --- a/ccm_web/client/src/components/InlineTextEdit.tsx +++ b/ccm_web/client/src/components/InlineTextEdit.tsx @@ -4,7 +4,7 @@ import { Button, Grid, TextField, Typography } from '@mui/material' import { Edit as EditIcon } from '@mui/icons-material' import { CODE_ENTER, CODE_NUMPAD_ENTER, CODE_ESCAPE } from 'keycode-js' -import { ValidationResult } from '../utils/validation' +import { ValidationResult } from '../utils/validation.js' const PREFIX = 'InlineTextEdit' diff --git a/ccm_web/client/src/components/Layout.tsx b/ccm_web/client/src/components/Layout.tsx index fdcff1ec5..fde563f14 100644 --- a/ccm_web/client/src/components/Layout.tsx +++ b/ccm_web/client/src/components/Layout.tsx @@ -1,11 +1,11 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Divider, Grid, Link, Paper, Typography } from '@mui/material' -import BuildIcon from '@mui/icons-material/Build' +import { Build as BuildIcon } from '@mui/icons-material' -import Breadcrumbs, { BreadcrumbsProps } from './Breadcrumbs' -import ResponsiveHelper from './ResponsiveHelper' -import { CsrfToken } from '../models/models' +import Breadcrumbs, { BreadcrumbsProps } from './Breadcrumbs.js' +import ResponsiveHelper from './ResponsiveHelper.js' +import { CsrfToken } from '../models/models.js' const PREFIX = 'Layout' diff --git a/ccm_web/client/src/components/MultipleSectionEnrollmentWorkflow.tsx b/ccm_web/client/src/components/MultipleSectionEnrollmentWorkflow.tsx index 313b285f2..9b4e11dba 100644 --- a/ccm_web/client/src/components/MultipleSectionEnrollmentWorkflow.tsx +++ b/ccm_web/client/src/components/MultipleSectionEnrollmentWorkflow.tsx @@ -15,35 +15,35 @@ import { Typography } from '@mui/material' -import Accordion from './Accordion' -import APIErrorMessage from './APIErrorMessage' -import BulkApiErrorContent from './BulkApiErrorContent' -import BulkEnrollUMUserToSectionsConfirmationTable from './BulkEnrollUMUserToSectionsConfirmationTable' -import ConfirmDialog from './ConfirmDialog' -import CSVFileName from './CSVFileName' -import ErrorAlert from './ErrorAlert' -import ExampleFileDownloadHeader from './ExampleFileDownloadHeader' -import FileUpload from './FileUpload' -import RowLevelErrorsContent from './RowLevelErrorsContent' -import SuccessCard from './SuccessCard' -import TableCaption from './TableCaption' -import ValidationErrorTable, { RowValidationError } from './ValidationErrorTable' -import * as api from '../api' -import usePromise from '../hooks/usePromise' -import { ClientEnrollmentType } from '../models/canvas' +import Accordion from './Accordion.js' +import APIErrorMessage from './APIErrorMessage.js' +import BulkApiErrorContent from './BulkApiErrorContent.js' +import BulkEnrollUMUserToSectionsConfirmationTable from './BulkEnrollUMUserToSectionsConfirmationTable.js' +import ConfirmDialog from './ConfirmDialog.js' +import CSVFileName from './CSVFileName.js' +import ErrorAlert from './ErrorAlert.js' +import ExampleFileDownloadHeader from './ExampleFileDownloadHeader.js' +import FileUpload from './FileUpload.js' +import RowLevelErrorsContent from './RowLevelErrorsContent.js' +import SuccessCard from './SuccessCard.js' +import TableCaption from './TableCaption.js' +import ValidationErrorTable, { RowValidationError } from './ValidationErrorTable.js' +import * as api from '../api.js' +import usePromise from '../hooks/usePromise.js' +import { ClientEnrollmentType } from '../models/canvas.js' import { AddEnrollmentWithSectionId, EnrollmentWithSectionIdRecord, isEnrollmentWithSectionIdRecord, MAX_ENROLLMENT_RECORDS, MAX_ENROLLMENT_MESSAGE, RowNumberedAddEnrollmentWithSectionId, REQUIRED_ENROLLMENT_WITH_SECTION_ID_HEADERS, SECTION_ID_TEXT, USER_ID_TEXT, USER_ROLE_TEXT -} from '../models/enrollment' -import { AddUMUsersLeafProps } from '../models/FeatureUIData' -import { CsrfToken, InvalidationType } from '../models/models' -import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator' +} from '../models/enrollment.js' +import { AddUMUsersLeafProps } from '../models/FeatureUIData.js' +import { CsrfToken, InvalidationType } from '../models/models.js' +import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator.js' import { EnrollmentInvalidation, LoginIDRowsValidator, RoleRowsValidator, SectionIdRowsValidator -} from '../utils/enrollmentValidators' -import { getRowNumber, prepDownloadDataString } from '../utils/fileUtils' -import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper' +} from '../utils/enrollmentValidators.js' +import { getRowNumber, prepDownloadDataString } from '../utils/fileUtils.js' +import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper.js' const PREFIX = 'MultipleSectionEnrollmentWorkflow' diff --git a/ccm_web/client/src/components/MultipleUserEnrollmentWorkflow.tsx b/ccm_web/client/src/components/MultipleUserEnrollmentWorkflow.tsx index 681b649d0..a3a7a679b 100644 --- a/ccm_web/client/src/components/MultipleUserEnrollmentWorkflow.tsx +++ b/ccm_web/client/src/components/MultipleUserEnrollmentWorkflow.tsx @@ -2,38 +2,38 @@ import React, { useState } from 'react' import { styled } from '@mui/material/styles' import { Backdrop, Button, CircularProgress, Grid, Typography } from '@mui/material' -import APIErrorMessage from './APIErrorMessage' -import APIErrorsTable from './APIErrorsTable' -import BulkEnrollExternalUserConfirmationTable from './BulkEnrollExternalUserConfirmationTable' -import ConfirmDialog from './ConfirmDialog' -import CreateSelectSectionWidget, { CreateSelectSectionWidgetCreateProps } from './CreateSelectSectionWidget' -import CSVFileName from './CSVFileName' -import ErrorAlert from './ErrorAlert' -import ExampleFileDownloadHeader from './ExampleFileDownloadHeader' -import FileUpload from './FileUpload' -import RowLevelErrorsContent from './RowLevelErrorsContent' -import SuccessCard from './SuccessCard' -import ValidationErrorTable from './ValidationErrorTable' -import WorkflowStepper from './WorkflowStepper' -import CanvasSettingsLink from './CanvasSettingsLink' -import * as api from '../api' -import usePromise from '../hooks/usePromise' +import APIErrorMessage from './APIErrorMessage.js' +import APIErrorsTable from './APIErrorsTable.js' +import BulkEnrollExternalUserConfirmationTable from './BulkEnrollExternalUserConfirmationTable.js' +import ConfirmDialog from './ConfirmDialog.js' +import CreateSelectSectionWidget, { CreateSelectSectionWidgetCreateProps } from './CreateSelectSectionWidget.js' +import CSVFileName from './CSVFileName.js' +import ErrorAlert from './ErrorAlert.js' +import ExampleFileDownloadHeader from './ExampleFileDownloadHeader.js' +import FileUpload from './FileUpload.js' +import RowLevelErrorsContent from './RowLevelErrorsContent.js' +import SuccessCard from './SuccessCard.js' +import ValidationErrorTable from './ValidationErrorTable.js' +import WorkflowStepper from './WorkflowStepper.js' +import CanvasSettingsLink from './CanvasSettingsLink.js' +import * as api from '../api.js' +import usePromise from '../hooks/usePromise.js' import { CanvasCourseBase, CanvasCourseSection, CanvasCourseSectionWithCourseName, ClientEnrollmentType, injectCourseName -} from '../models/canvas' -import { AddNewExternalUserEnrollment, RowNumberedAddNewExternalUserEnrollment } from '../models/enrollment' -import { ExternalUserSuccess, isExternalUserSuccess } from '../models/externalUser' -import { createSectionRoles } from '../models/feature' -import { AddNonUMUsersLeafProps, isAuthorizedForRoles } from '../models/FeatureUIData' -import { CSVWorkflowStep, CsrfToken, InvalidationType, RoleEnum } from '../models/models' -import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator' +} from '../models/canvas.js' +import { AddNewExternalUserEnrollment, RowNumberedAddNewExternalUserEnrollment } from '../models/enrollment.js' +import { ExternalUserSuccess, isExternalUserSuccess } from '../models/externalUser.js' +import { createSectionRoles } from '../models/feature.js' +import { AddNonUMUsersLeafProps, isAuthorizedForRoles } from '../models/FeatureUIData.js' +import { CSVWorkflowStep, CsrfToken, InvalidationType, RoleEnum } from '../models/models.js' +import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator.js' import { DuplicateEmailRowsValidator, EmailRowsValidator, EnrollmentInvalidation, FirstNameRowsValidator, LastNameRowsValidator, RoleRowsValidator -} from '../utils/enrollmentValidators' -import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper' -import { getRowNumber } from '../utils/fileUtils' -import { CanvasError, ErrorDescription, ExternalUserProcessError } from '../utils/handleErrors' +} from '../utils/enrollmentValidators.js' +import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper.js' +import { getRowNumber } from '../utils/fileUtils.js' +import { CanvasError, ErrorDescription, ExternalUserProcessError } from '../utils/handleErrors.js' const PREFIX = 'MultipleUserEnrollmentWorkflow' diff --git a/ccm_web/client/src/components/RoleSelect.tsx b/ccm_web/client/src/components/RoleSelect.tsx index 48755043e..11d788b37 100644 --- a/ccm_web/client/src/components/RoleSelect.tsx +++ b/ccm_web/client/src/components/RoleSelect.tsx @@ -2,7 +2,7 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Grid, MenuItem, Select, SelectChangeEvent, Typography } from '@mui/material' -import { ClientEnrollmentType } from '../models/canvas' +import { ClientEnrollmentType } from '../models/canvas.js' const PREFIX = 'RoleSelect' diff --git a/ccm_web/client/src/components/RowLevelErrorsContent.tsx b/ccm_web/client/src/components/RowLevelErrorsContent.tsx index 30fa07602..999fc0e83 100644 --- a/ccm_web/client/src/components/RowLevelErrorsContent.tsx +++ b/ccm_web/client/src/components/RowLevelErrorsContent.tsx @@ -2,7 +2,7 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Grid, Typography } from '@mui/material' -import ErrorAlert from './ErrorAlert' +import ErrorAlert from './ErrorAlert.js' const PREFIX = 'RowLevelErrorsContent' diff --git a/ccm_web/client/src/components/SectionSelectorWidget.tsx b/ccm_web/client/src/components/SectionSelectorWidget.tsx index 605e0bdb0..cdccbaac5 100644 --- a/ccm_web/client/src/components/SectionSelectorWidget.tsx +++ b/ccm_web/client/src/components/SectionSelectorWidget.tsx @@ -25,16 +25,16 @@ import { useMediaQuery, useTheme } from '@mui/material' -import ClearIcon from '@mui/icons-material/Clear' -import SortIcon from '@mui/icons-material/Sort' +import { Clear as ClearIcon } from '@mui/icons-material' +import { Sort as SortIcon } from '@mui/icons-material' import { useDebounce } from '@react-hook/debounce' -import APIErrorMessage from './APIErrorMessage' -import { unmergeSections } from '../api' -import usePromise from '../hooks/usePromise' -import { CanvasCourseSectionBase, CanvasCourseSectionWithCourseName, ICanvasCourseSectionSort } from '../models/canvas' -import { ISectionSearcher } from '../utils/SectionSearcher' -import { CsrfToken } from '../models/models' +import APIErrorMessage from './APIErrorMessage.js' +import { unmergeSections } from '../api.js' +import usePromise from '../hooks/usePromise.js' +import { CanvasCourseSectionBase, CanvasCourseSectionWithCourseName, ICanvasCourseSectionSort } from '../models/canvas.js' +import { ISectionSearcher } from '../utils/SectionSearcher.js' +import { CsrfToken } from '../models/models.js' const PREFIX = 'SectionSelectorWidget' diff --git a/ccm_web/client/src/components/SingleSectionEnrollmentWorkflow.tsx b/ccm_web/client/src/components/SingleSectionEnrollmentWorkflow.tsx index c4ec3b00b..a506708ba 100644 --- a/ccm_web/client/src/components/SingleSectionEnrollmentWorkflow.tsx +++ b/ccm_web/client/src/components/SingleSectionEnrollmentWorkflow.tsx @@ -2,35 +2,35 @@ import React, { useState } from 'react' import { styled } from '@mui/material/styles' import { Backdrop, Button, CircularProgress, Grid, Link, Typography } from '@mui/material' -import APIErrorMessage from './APIErrorMessage' -import BulkApiErrorContent from './BulkApiErrorContent' -import BulkEnrollUMUserConfirmationTable from './BulkEnrollUMUserConfirmationTable' -import ConfirmDialog from './ConfirmDialog' -import CreateSelectSectionWidget from './CreateSelectSectionWidget' -import CSVFileName from './CSVFileName' -import ErrorAlert from './ErrorAlert' -import ExampleFileDownloadHeader, { ExampleFileDownloadHeaderProps } from './ExampleFileDownloadHeader' -import FileUpload from './FileUpload' -import RowLevelErrorsContent from './RowLevelErrorsContent' -import SuccessCard from './SuccessCard' -import ValidationErrorTable, { RowValidationError } from './ValidationErrorTable' -import WorkflowStepper from './WorkflowStepper' -import * as api from '../api' -import usePromise from '../hooks/usePromise' +import APIErrorMessage from './APIErrorMessage.js' +import BulkApiErrorContent from './BulkApiErrorContent.js' +import BulkEnrollUMUserConfirmationTable from './BulkEnrollUMUserConfirmationTable.js' +import ConfirmDialog from './ConfirmDialog.js' +import CreateSelectSectionWidget from './CreateSelectSectionWidget.js' +import CSVFileName from './CSVFileName.js' +import ErrorAlert from './ErrorAlert.js' +import ExampleFileDownloadHeader, { ExampleFileDownloadHeaderProps } from './ExampleFileDownloadHeader.js' +import FileUpload from './FileUpload.js' +import RowLevelErrorsContent from './RowLevelErrorsContent.js' +import SuccessCard from './SuccessCard.js' +import ValidationErrorTable, { RowValidationError } from './ValidationErrorTable.js' +import WorkflowStepper from './WorkflowStepper.js' +import * as api from '../api.js' +import usePromise from '../hooks/usePromise.js' import { CanvasCourseBase, CanvasCourseSection, CanvasCourseSectionWithCourseName, ClientEnrollmentType, injectCourseName -} from '../models/canvas' +} from '../models/canvas.js' import { EnrollmentRecord, isEnrollmentRecord, MAX_ENROLLMENT_MESSAGE, MAX_ENROLLMENT_RECORDS, REQUIRED_ENROLLMENT_HEADERS, RowNumberedAddEnrollment, USER_ID_TEXT, USER_ROLE_TEXT -} from '../models/enrollment' -import { AddUMUsersLeafProps } from '../models/FeatureUIData' -import { CSVWorkflowStep, CsrfToken, InvalidationType } from '../models/models' -import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator' -import { EnrollmentInvalidation, LoginIDRowsValidator, RoleRowsValidator } from '../utils/enrollmentValidators' -import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper' -import { getRowNumber } from '../utils/fileUtils' +} from '../models/enrollment.js' +import { AddUMUsersLeafProps } from '../models/FeatureUIData.js' +import { CSVWorkflowStep, CsrfToken, InvalidationType } from '../models/models.js' +import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator.js' +import { EnrollmentInvalidation, LoginIDRowsValidator, RoleRowsValidator } from '../utils/enrollmentValidators.js' +import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper.js' +import { getRowNumber } from '../utils/fileUtils.js' const PREFIX = 'SingleSectionEnrollmentWorkflow' diff --git a/ccm_web/client/src/components/SuccessCard.tsx b/ccm_web/client/src/components/SuccessCard.tsx index 4bcdafec8..2cb1af4e6 100644 --- a/ccm_web/client/src/components/SuccessCard.tsx +++ b/ccm_web/client/src/components/SuccessCard.tsx @@ -1,7 +1,7 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Card, CardContent, CardActions } from '@mui/material' -import CheckCircle from '@mui/icons-material/CheckCircle' +import { CheckCircle } from '@mui/icons-material' const PREFIX = 'SuccessCard' diff --git a/ccm_web/client/src/components/ThirdPartyGradebookConfirmationTable.tsx b/ccm_web/client/src/components/ThirdPartyGradebookConfirmationTable.tsx index ef0318d25..19a2aa0ba 100644 --- a/ccm_web/client/src/components/ThirdPartyGradebookConfirmationTable.tsx +++ b/ccm_web/client/src/components/ThirdPartyGradebookConfirmationTable.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' -import CustomTable from './CustomTable' -import { REQUIRED_LOGIN_ID_HEADER } from '../utils/ThirdPartyGradebookProcessor' +import CustomTable from './CustomTable.js' +import { REQUIRED_LOGIN_ID_HEADER } from '../utils/ThirdPartyGradebookProcessor.js' interface NumberedSlimGradebookRecord extends Record { rowNumber: number diff --git a/ccm_web/client/src/components/UserEnrollmentForm.tsx b/ccm_web/client/src/components/UserEnrollmentForm.tsx index 126ace318..9f9fb9f95 100644 --- a/ccm_web/client/src/components/UserEnrollmentForm.tsx +++ b/ccm_web/client/src/components/UserEnrollmentForm.tsx @@ -2,24 +2,24 @@ import React, { useState } from 'react' import { styled } from '@mui/material/styles' import { Backdrop, Button, CircularProgress, Grid, Paper, Typography } from '@mui/material' -import APIErrorMessage from './APIErrorMessage' -import CanvasSettingsLink from './CanvasSettingsLink' -import ErrorAlert from './ErrorAlert' -import InlineErrorAlert from './InlineErrorAlert' -import RoleSelect from './RoleSelect' -import SectionSelectorWidget from './SectionSelectorWidget' -import SuccessCard from './SuccessCard' -import ValidatedFormField from './ValidatedFormField' -import * as api from '../api' -import usePromise from '../hooks/usePromise' -import { CanvasCourseSectionWithCourseName, CanvasUserCondensed, ClientEnrollmentType } from '../models/canvas' -import { AddExternalUserEnrollment, AddNewExternalUserEnrollment } from '../models/enrollment' -import { AddNonUMUsersLeafProps } from '../models/FeatureUIData' -import { APIErrorWithContext, CsrfToken } from '../models/models' -import { CanvasError, ExternalUserProcessError } from '../utils/handleErrors' +import APIErrorMessage from './APIErrorMessage.js' +import CanvasSettingsLink from './CanvasSettingsLink.js' +import ErrorAlert from './ErrorAlert.js' +import InlineErrorAlert from './InlineErrorAlert.js' +import RoleSelect from './RoleSelect.js' +import SectionSelectorWidget from './SectionSelectorWidget.js' +import SuccessCard from './SuccessCard.js' +import ValidatedFormField from './ValidatedFormField.js' +import * as api from '../api.js' +import usePromise from '../hooks/usePromise.js' +import { CanvasCourseSectionWithCourseName, CanvasUserCondensed, ClientEnrollmentType } from '../models/canvas.js' +import { AddExternalUserEnrollment, AddNewExternalUserEnrollment } from '../models/enrollment.js' +import { AddNonUMUsersLeafProps } from '../models/FeatureUIData.js' +import { APIErrorWithContext, CsrfToken } from '../models/models.js' +import { CanvasError, ExternalUserProcessError } from '../utils/handleErrors.js' import { emailInputSchema, firstNameInputSchema, lastNameInputSchema, validateString, ValidationResult -} from '../utils/validation' +} from '../utils/validation.js' const PREFIX = 'UserEnrollmentForm' diff --git a/ccm_web/client/src/components/ValidatedFormField.tsx b/ccm_web/client/src/components/ValidatedFormField.tsx index 13a033025..3b3088ba6 100644 --- a/ccm_web/client/src/components/ValidatedFormField.tsx +++ b/ccm_web/client/src/components/ValidatedFormField.tsx @@ -1,7 +1,7 @@ import React from 'react' import { TextField } from '@mui/material' -import { ValidationResult } from '../utils/validation' +import { ValidationResult } from '../utils/validation.js' type TextChangeEvent = React.ChangeEvent diff --git a/ccm_web/client/src/components/ValidationErrorTable.tsx b/ccm_web/client/src/components/ValidationErrorTable.tsx index c7f8ecd2e..fc1439576 100644 --- a/ccm_web/client/src/components/ValidationErrorTable.tsx +++ b/ccm_web/client/src/components/ValidationErrorTable.tsx @@ -3,9 +3,9 @@ import React, { useEffect, useState } from 'react' import { Paper, Table, TableBody, TableCell, TableContainer, TableFooter, TableHead, TablePagination, TableRow } from '@mui/material' -import StyledTableCell from './StyledTableCell' -import TableCaption from './TableCaption' -import { TablePaginationActions } from './TablePagination' +import StyledTableCell from './StyledTableCell.js' +import TableCaption from './TableCaption.js' +import { TablePaginationActions } from './TablePagination.js' interface RowValidationError { rowNumber: number diff --git a/ccm_web/client/src/components/WarningAlert.tsx b/ccm_web/client/src/components/WarningAlert.tsx index 8d7378f8e..4cc260ee2 100644 --- a/ccm_web/client/src/components/WarningAlert.tsx +++ b/ccm_web/client/src/components/WarningAlert.tsx @@ -1,9 +1,9 @@ import React from 'react' import { styled } from '@mui/material/styles' import { Button } from '@mui/material' -import ErrorIcon from '@mui/icons-material/Error' +import { Error as ErrorIcon } from '@mui/icons-material' -import Alert from './Alert' +import Alert from './Alert.js' const PREFIX = 'WarningAlert' diff --git a/ccm_web/client/src/hooks/useGlobals.ts b/ccm_web/client/src/hooks/useGlobals.ts index dad8755d9..4df765026 100644 --- a/ccm_web/client/src/hooks/useGlobals.ts +++ b/ccm_web/client/src/hooks/useGlobals.ts @@ -1,8 +1,8 @@ import { useEffect, useState } from 'react' -import usePromise from './usePromise' -import * as api from '../api' -import { Globals, CsrfToken } from '../models/models' +import usePromise from './usePromise.js' +import * as api from '../api.js' +import { Globals, CsrfToken } from '../models/models.js' /* Hook for fetching global data, checking whether user is authenticated, and diff --git a/ccm_web/client/src/index.tsx b/ccm_web/client/src/index.tsx index c98aa5b86..7964a8f44 100644 --- a/ccm_web/client/src/index.tsx +++ b/ccm_web/client/src/index.tsx @@ -4,11 +4,11 @@ import { createRoot } from 'react-dom/client' import { BrowserRouter, Route, Routes } from 'react-router-dom' import { ThemeProvider, StyledEngineProvider } from '@mui/material' -import App from './App' +import App from './App.js' import './index.css' -import ccmTheme from './theme' -import AccessDenied from './pages/AccessDenied' -import LaunchError from './pages/LaunchError' +import ccmTheme from './theme.js' +import AccessDenied from './pages/AccessDenied.js' +import LaunchError from './pages/LaunchError.js' const helpContactProps = { email: '4help@umich.edu', diff --git a/ccm_web/client/src/models/FeatureUIData.tsx b/ccm_web/client/src/models/FeatureUIData.tsx index c5800aa0c..007f883fb 100644 --- a/ccm_web/client/src/models/FeatureUIData.tsx +++ b/ccm_web/client/src/models/FeatureUIData.tsx @@ -1,23 +1,23 @@ import React, { ComponentType } from 'react' -import AccountCircleOutlinedIcon from '@mui/icons-material/AccountCircleOutlined' -import LibraryBooksOutlinedIcon from '@mui/icons-material/LibraryBooksOutlined' -import MergeTypeIcon from '@mui/icons-material/MergeType' -import PersonAddIcon from '@mui/icons-material/PersonAdd' -import PersonAddOutlinedIcon from '@mui/icons-material/PersonAddOutlined' -import PostAddOutlinedIcon from '@mui/icons-material/PostAddOutlined' +import { AccountCircleOutlined as AccountCircleOutlinedIcon } from '@mui/icons-material' +import { LibraryBooksOutlined as LibraryBooksOutlinedIcon } from '@mui/icons-material' +import { MergeType as MergeTypeIcon } from '@mui/icons-material' +import { PersonAdd as PersonAddIcon } from '@mui/icons-material' +import { PersonAddOutlined as PersonAddOutlinedIcon } from '@mui/icons-material' +import { PostAddOutlined as PostAddOutlinedIcon } from '@mui/icons-material' import { FeatureDataProps, mergeSectionProps, formatCanvasGradebookProps, formatThirdPartyGradebookProps, createSectionsProps, addUMUsersProps, addNonUMUsersProps -} from './feature' -import AddNonUMUsers from '../pages/AddNonUMUsers' -import AddUMUsers from '../pages/AddUMUsers' -import BulkSectionCreate from '../pages/BulkSectionCreate' -import FormatThirdPartyGradebook from '../pages/FormatThirdPartyGradebook' -import ConvertCanvasGradebook from '../pages/GradebookCanvas' -import MergeSections from '../pages/MergeSections' -import { CsrfToken, Globals, RoleEnum } from './models' -import { CanvasCourseBase, CanvasCourseSectionWithCourseName, ClientEnrollmentType } from './canvas' +} from './feature.js' +import AddNonUMUsers from '../pages/AddNonUMUsers.js' +import AddUMUsers from '../pages/AddUMUsers.js' +import BulkSectionCreate from '../pages/BulkSectionCreate.js' +import FormatThirdPartyGradebook from '../pages/FormatThirdPartyGradebook.js' +import ConvertCanvasGradebook from '../pages/GradebookCanvas.js' +import MergeSections from '../pages/MergeSections.js' +import { CsrfToken, Globals, RoleEnum } from './models.js' +import { CanvasCourseBase, CanvasCourseSectionWithCourseName, ClientEnrollmentType } from './canvas.js' export interface CCMComponentProps { globals: Globals diff --git a/ccm_web/client/src/models/canvas.ts b/ccm_web/client/src/models/canvas.ts index fa8396114..b1b879ab7 100644 --- a/ccm_web/client/src/models/canvas.ts +++ b/ccm_web/client/src/models/canvas.ts @@ -1,4 +1,4 @@ -import { RoleEnum } from './models' +import { RoleEnum } from './models.js' export interface CanvasCourseBase { id: number diff --git a/ccm_web/client/src/models/enrollment.ts b/ccm_web/client/src/models/enrollment.ts index 78198bdb2..f6bdcce12 100644 --- a/ccm_web/client/src/models/enrollment.ts +++ b/ccm_web/client/src/models/enrollment.ts @@ -1,5 +1,5 @@ -import { ClientEnrollmentType } from './canvas' -import { CSVRecord } from '../utils/FileParserWrapper' +import { ClientEnrollmentType } from './canvas.js' +import { CSVRecord } from '../utils/FileParserWrapper.js' interface RowNumberedData { rowNumber: number diff --git a/ccm_web/client/src/models/externalUser.ts b/ccm_web/client/src/models/externalUser.ts index 219bbcca8..16336aa70 100644 --- a/ccm_web/client/src/models/externalUser.ts +++ b/ccm_web/client/src/models/externalUser.ts @@ -1,5 +1,5 @@ -import { APIErrorData, CanvasAPIErrorPayload, isCanvasAPIErrorPayload } from './models' -import { hasKeys } from './typeUtils' +import { APIErrorData, CanvasAPIErrorPayload, isCanvasAPIErrorPayload } from './models.js' +import { hasKeys } from './typeUtils.js' interface CirrusErrorData { statusCode: number diff --git a/ccm_web/client/src/models/feature.ts b/ccm_web/client/src/models/feature.ts index 0027e09f7..e17107910 100644 --- a/ccm_web/client/src/models/feature.ts +++ b/ccm_web/client/src/models/feature.ts @@ -1,4 +1,4 @@ -import { RoleEnum } from './models' +import { RoleEnum } from './models.js' interface FeatureDataProps { id: string diff --git a/ccm_web/client/src/models/models.ts b/ccm_web/client/src/models/models.ts index e7be4636f..b0fb64a72 100644 --- a/ccm_web/client/src/models/models.ts +++ b/ccm_web/client/src/models/models.ts @@ -2,7 +2,7 @@ Interfaces for common objects and entities (e.g. Globals, Course, Section, etc.) */ -import { hasKeys } from './typeUtils' +import { hasKeys } from './typeUtils.js' // Globals diff --git a/ccm_web/client/src/pages/AccessDenied.tsx b/ccm_web/client/src/pages/AccessDenied.tsx index 14366e423..c82f37f96 100644 --- a/ccm_web/client/src/pages/AccessDenied.tsx +++ b/ccm_web/client/src/pages/AccessDenied.tsx @@ -1,9 +1,9 @@ import React from 'react' import { Typography } from '@mui/material' -import HelpContact, { HelpContactProps } from '../components/HelpContact' -import InlineErrorAlert from '../components/InlineErrorAlert' -import Layout from '../components/Layout' +import HelpContact, { HelpContactProps } from '../components/HelpContact.js' +import InlineErrorAlert from '../components/InlineErrorAlert.js' +import Layout from '../components/Layout.js' interface AccessDeniedProps extends HelpContactProps {} diff --git a/ccm_web/client/src/pages/AddNonUMUsers.tsx b/ccm_web/client/src/pages/AddNonUMUsers.tsx index 1e05a897b..84e8eabaa 100644 --- a/ccm_web/client/src/pages/AddNonUMUsers.tsx +++ b/ccm_web/client/src/pages/AddNonUMUsers.tsx @@ -2,18 +2,18 @@ import React, { useState } from 'react' import { styled } from '@mui/material/styles' import { Typography } from '@mui/material' -import * as api from '../api' -import ErrorAlert from '../components/ErrorAlert' -import Help from '../components/Help' -import MultipleUserEnrollmentWorkflow from '../components/MultipleUserEnrollmentWorkflow' -import UserEnrollmentForm from '../components/UserEnrollmentForm' -import MethodSelect from '../components/MethodSelect' -import usePromise from '../hooks/usePromise' +import * as api from '../api.js' +import ErrorAlert from '../components/ErrorAlert.js' +import Help from '../components/Help.js' +import MultipleUserEnrollmentWorkflow from '../components/MultipleUserEnrollmentWorkflow.js' +import UserEnrollmentForm from '../components/UserEnrollmentForm.js' +import MethodSelect from '../components/MethodSelect.js' +import usePromise from '../hooks/usePromise.js' import { CanvasCourseSection, CanvasCourseSectionWithCourseName, getRolesUserCanEnroll, injectCourseName, sortSections -} from '../models/canvas' -import { CCMComponentProps } from '../models/FeatureUIData' +} from '../models/canvas.js' +import { CCMComponentProps } from '../models/FeatureUIData.js' const PREFIX = 'AddNonUMUsers' diff --git a/ccm_web/client/src/pages/AddUMUsers.tsx b/ccm_web/client/src/pages/AddUMUsers.tsx index 2a0dac16e..f3b7e582a 100644 --- a/ccm_web/client/src/pages/AddUMUsers.tsx +++ b/ccm_web/client/src/pages/AddUMUsers.tsx @@ -2,16 +2,16 @@ import React, { useState } from 'react' import { styled } from '@mui/material/styles' import { Typography } from '@mui/material' -import { getCourseSections } from '../api' -import Help from '../components/Help' -import MethodSelect from '../components/MethodSelect' -import MultipleSectionEnrollmentWorkflow from '../components/MultipleSectionEnrollmentWorkflow' -import SingleSectionEnrollmentWorkflow from '../components/SingleSectionEnrollmentWorkflow' -import usePromise from '../hooks/usePromise' +import { getCourseSections } from '../api.js' +import Help from '../components/Help.js' +import MethodSelect from '../components/MethodSelect.js' +import MultipleSectionEnrollmentWorkflow from '../components/MultipleSectionEnrollmentWorkflow.js' +import SingleSectionEnrollmentWorkflow from '../components/SingleSectionEnrollmentWorkflow.js' +import usePromise from '../hooks/usePromise.js' import { CanvasCourseSection, CanvasCourseSectionWithCourseName, injectCourseName, sortSections -} from '../models/canvas' -import { CCMComponentProps } from '../models/FeatureUIData' +} from '../models/canvas.js' +import { CCMComponentProps } from '../models/FeatureUIData.js' const PREFIX = 'AddUMUsers' diff --git a/ccm_web/client/src/pages/BulkSectionCreate.tsx b/ccm_web/client/src/pages/BulkSectionCreate.tsx index 995145da1..86825fb56 100644 --- a/ccm_web/client/src/pages/BulkSectionCreate.tsx +++ b/ccm_web/client/src/pages/BulkSectionCreate.tsx @@ -2,31 +2,31 @@ import React, { useEffect, useState } from 'react' import { styled } from '@mui/material/styles' import { Backdrop, Button, CircularProgress, Grid, Typography } from '@mui/material' -import { addCourseSections, getCourseSections } from '../api' -import APIErrorMessage from '../components/APIErrorMessage' -import BulkApiErrorContent from '../components/BulkApiErrorContent' -import BulkSectionCreateUploadConfirmationTable, { Section } from '../components/BulkSectionCreateUploadConfirmationTable' +import { addCourseSections, getCourseSections } from '../api.js' +import APIErrorMessage from '../components/APIErrorMessage.js' +import BulkApiErrorContent from '../components/BulkApiErrorContent.js' +import BulkSectionCreateUploadConfirmationTable, { Section } from '../components/BulkSectionCreateUploadConfirmationTable.js' import { DuplicateSectionInFileSectionRowsValidator, SectionNameLengthValidator, SectionRowsValidator, SectionsRowInvalidation -} from '../components/BulkSectionCreateValidators' -import CanvasSettingsLink from '../components/CanvasSettingsLink' -import ConfirmDialog from '../components/ConfirmDialog' -import CSVFileName from '../components/CSVFileName' -import ErrorAlert from '../components/ErrorAlert' -import ExampleFileDownloadHeader, { ExampleFileDownloadHeaderProps } from '../components/ExampleFileDownloadHeader' -import FileUpload from '../components/FileUpload' -import Help from '../components/Help' -import RowLevelErrorsContent from '../components/RowLevelErrorsContent' -import SuccessCard from '../components/SuccessCard' -import ValidationErrorTable from '../components/ValidationErrorTable' -import usePromise from '../hooks/usePromise' -import { CanvasCourseSection } from '../models/canvas' -import { CCMComponentProps } from '../models/FeatureUIData' -import { InvalidationType } from '../models/models' -import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator' -import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper' -import { getRowNumber } from '../utils/fileUtils' +} from '../components/BulkSectionCreateValidators.js' +import CanvasSettingsLink from '../components/CanvasSettingsLink.js' +import ConfirmDialog from '../components/ConfirmDialog.js' +import CSVFileName from '../components/CSVFileName.js' +import ErrorAlert from '../components/ErrorAlert.js' +import ExampleFileDownloadHeader, { ExampleFileDownloadHeaderProps } from '../components/ExampleFileDownloadHeader.js' +import FileUpload from '../components/FileUpload.js' +import Help from '../components/Help.js' +import RowLevelErrorsContent from '../components/RowLevelErrorsContent.js' +import SuccessCard from '../components/SuccessCard.js' +import ValidationErrorTable from '../components/ValidationErrorTable.js' +import usePromise from '../hooks/usePromise.js' +import { CanvasCourseSection } from '../models/canvas.js' +import { CCMComponentProps } from '../models/FeatureUIData.js' +import { InvalidationType } from '../models/models.js' +import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator.js' +import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper.js' +import { getRowNumber } from '../utils/fileUtils.js' const PREFIX = 'BulkSectionCreate' diff --git a/ccm_web/client/src/pages/FormatThirdPartyGradebook.tsx b/ccm_web/client/src/pages/FormatThirdPartyGradebook.tsx index 2fc4174e4..7d2a5356a 100644 --- a/ccm_web/client/src/pages/FormatThirdPartyGradebook.tsx +++ b/ccm_web/client/src/pages/FormatThirdPartyGradebook.tsx @@ -2,30 +2,30 @@ import React, { useEffect, useState } from 'react' import { styled } from '@mui/material/styles' import { Button, Backdrop, CircularProgress, Grid, Link, Typography } from '@mui/material' -import * as api from '../api' -import APIErrorMessage from '../components/APIErrorMessage' -import ConfirmDialog from '../components/ConfirmDialog' -import CSVFileName from '../components/CSVFileName' -import ErrorAlert from '../components/ErrorAlert' -import ExampleFileDownloadHeader from '../components/ExampleFileDownloadHeader' -import FileUpload from '../components/FileUpload' -import Help from '../components/Help' -import SectionSelectorWidget, { SelectableCanvasCourseSection } from '../components/SectionSelectorWidget' -import SuccessCard from '../components/SuccessCard' -import ThirdPartyGradebookConfirmationTable from '../components/ThirdPartyGradebookConfirmationTable' -import WarningAlert from '../components/WarningAlert' -import WorkflowStepper from '../components/WorkflowStepper' -import usePromise from '../hooks/usePromise' -import { CanvasCourseSection, injectCourseName } from '../models/canvas' -import { CCMComponentProps } from '../models/FeatureUIData' -import { APIErrorWithContext, CSVWorkflowStep, InvalidationType } from '../models/models' -import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator' -import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper' +import * as api from '../api.js' +import APIErrorMessage from '../components/APIErrorMessage.js' +import ConfirmDialog from '../components/ConfirmDialog.js' +import CSVFileName from '../components/CSVFileName.js' +import ErrorAlert from '../components/ErrorAlert.js' +import ExampleFileDownloadHeader from '../components/ExampleFileDownloadHeader.js' +import FileUpload from '../components/FileUpload.js' +import Help from '../components/Help.js' +import SectionSelectorWidget, { SelectableCanvasCourseSection } from '../components/SectionSelectorWidget.js' +import SuccessCard from '../components/SuccessCard.js' +import ThirdPartyGradebookConfirmationTable from '../components/ThirdPartyGradebookConfirmationTable.js' +import WarningAlert from '../components/WarningAlert.js' +import WorkflowStepper from '../components/WorkflowStepper.js' +import usePromise from '../hooks/usePromise.js' +import { CanvasCourseSection, injectCourseName } from '../models/canvas.js' +import { CCMComponentProps } from '../models/FeatureUIData.js' +import { APIErrorWithContext, CSVWorkflowStep, InvalidationType } from '../models/models.js' +import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator.js' +import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper.js' import ThirdPartyGradebookProcessor, { GradebookInvalidation, GradebookUploadRecord, isGradebookUploadRecord, POINTS_POS_TEXT, REQUIRED_LOGIN_ID_HEADER, REQUIRED_ORDERED_HEADERS -} from '../utils/ThirdPartyGradebookProcessor' -import { createOutputFileName, getRowNumber, prepDownloadDataString } from '../utils/fileUtils' +} from '../utils/ThirdPartyGradebookProcessor.js' +import { createOutputFileName, getRowNumber, prepDownloadDataString } from '../utils/fileUtils.js' const PREFIX = 'FormatThirdPartyGradebook' diff --git a/ccm_web/client/src/pages/GradebookCanvas.tsx b/ccm_web/client/src/pages/GradebookCanvas.tsx index 5797b6463..0166a4f0b 100644 --- a/ccm_web/client/src/pages/GradebookCanvas.tsx +++ b/ccm_web/client/src/pages/GradebookCanvas.tsx @@ -1,24 +1,24 @@ import React, { useEffect, useState } from 'react' import { styled } from '@mui/material/styles' import { Button, Grid, Link, Typography } from '@mui/material' -import WarningIcon from '@mui/icons-material/Warning' - -import CanvasSettingsLink from '../components/CanvasSettingsLink' -import ConfirmDialog from '../components/ConfirmDialog' -import CSVFileName from '../components/CSVFileName' -import ErrorAlert from '../components/ErrorAlert' -import FileUpload from '../components/FileUpload' -import Help from '../components/Help' -import RowLevelErrorsContent from '../components/RowLevelErrorsContent' -import SuccessCard from '../components/SuccessCard' -import ValidationErrorTable from '../components/ValidationErrorTable' -import GradebookUploadConfirmationTable, { StudentGrade } from '../components/GradebookUploadConfirmationTable' -import { CurrentAndFinalGradeMatchGradebookValidator, GradebookRowInvalidation } from '../components/GradebookCanvasValidators' -import { CCMComponentProps } from '../models/FeatureUIData' -import { DownloadData, InvalidationType } from '../models/models' -import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator' -import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper' -import { createOutputFileName, prepDownloadDataString } from '../utils/fileUtils' +import { Warning as WarningIcon } from '@mui/icons-material' + +import CanvasSettingsLink from '../components/CanvasSettingsLink.js' +import ConfirmDialog from '../components/ConfirmDialog.js' +import CSVFileName from '../components/CSVFileName.js' +import ErrorAlert from '../components/ErrorAlert.js' +import FileUpload from '../components/FileUpload.js' +import Help from '../components/Help.js' +import RowLevelErrorsContent from '../components/RowLevelErrorsContent.js' +import SuccessCard from '../components/SuccessCard.js' +import ValidationErrorTable from '../components/ValidationErrorTable.js' +import GradebookUploadConfirmationTable, { StudentGrade } from '../components/GradebookUploadConfirmationTable.js' +import { CurrentAndFinalGradeMatchGradebookValidator, GradebookRowInvalidation } from '../components/GradebookCanvasValidators.js' +import { CCMComponentProps } from '../models/FeatureUIData.js' +import { DownloadData, InvalidationType } from '../models/models.js' +import CSVSchemaValidator, { SchemaInvalidation } from '../utils/CSVSchemaValidator.js' +import FileParserWrapper, { CSVRecord } from '../utils/FileParserWrapper.js' +import { createOutputFileName, prepDownloadDataString } from '../utils/fileUtils.js' const PREFIX = 'ConvertCanvasGradebook' diff --git a/ccm_web/client/src/pages/Home.tsx b/ccm_web/client/src/pages/Home.tsx index 90afba45e..94a82b723 100644 --- a/ccm_web/client/src/pages/Home.tsx +++ b/ccm_web/client/src/pages/Home.tsx @@ -4,19 +4,19 @@ import React, { useEffect } from 'react' import { styled } from '@mui/material/styles' import { Grid, Typography } from '@mui/material' -import APIErrorMessage from '../components/APIErrorMessage' -import FeatureCard from '../components/FeatureCard' -import Help from '../components/Help' -import InlineTextEdit from '../components/InlineTextEdit' -import { setCourseName as apiSetCourseName } from '../api' -import usePromise from '../hooks/usePromise' -import { courseRenameRoles } from '../models/feature' +import APIErrorMessage from '../components/APIErrorMessage.js' +import FeatureCard from '../components/FeatureCard.js' +import Help from '../components/Help.js' +import InlineTextEdit from '../components/InlineTextEdit.js' +import { setCourseName as apiSetCourseName } from '../api.js' +import usePromise from '../hooks/usePromise.js' +import { courseRenameRoles } from '../models/feature.js' import allFeatures, { FeatureUIGroup, FeatureUIProps, isAuthorizedForAnyFeature, isAuthorizedForFeature, isAuthorizedForRoles -} from '../models/FeatureUIData' -import { CsrfToken, Globals } from '../models/models' -import { CanvasCourseBase } from '../models/canvas' -import { courseNameInputSchema, validateString } from '../utils/validation' +} from '../models/FeatureUIData.js' +import { CsrfToken, Globals } from '../models/models.js' +import { CanvasCourseBase } from '../models/canvas.js' +import { courseNameInputSchema, validateString } from '../utils/validation.js' const PREFIX = 'Home' diff --git a/ccm_web/client/src/pages/LaunchError.tsx b/ccm_web/client/src/pages/LaunchError.tsx index c2b7f526a..1f4853122 100644 --- a/ccm_web/client/src/pages/LaunchError.tsx +++ b/ccm_web/client/src/pages/LaunchError.tsx @@ -2,9 +2,9 @@ import React from 'react' import { Link, Typography } from '@mui/material' -import HelpContact, { HelpContactProps } from '../components/HelpContact' -import InlineErrorAlert from '../components/InlineErrorAlert' -import Layout from '../components/Layout' +import HelpContact, { HelpContactProps } from '../components/HelpContact.js' +import InlineErrorAlert from '../components/InlineErrorAlert.js' +import Layout from '../components/Layout.js' interface LaunchErrorProps extends HelpContactProps {} diff --git a/ccm_web/client/src/pages/MergeSections.tsx b/ccm_web/client/src/pages/MergeSections.tsx index ba1982a71..bb0372c0a 100644 --- a/ccm_web/client/src/pages/MergeSections.tsx +++ b/ccm_web/client/src/pages/MergeSections.tsx @@ -6,19 +6,19 @@ import { Button, Grid, LinearProgress, Paper, Typography } from '@mui/material' import { useSnackbar } from 'notistack' -import { adminRoles } from '../models/feature' -import { CCMComponentProps, isAuthorizedForRoles } from '../models/FeatureUIData' -import APIErrorMessage from '../components/APIErrorMessage' -import SectionSelectorWidget, { SelectableCanvasCourseSection } from '../components/SectionSelectorWidget' +import { adminRoles } from '../models/feature.js' +import { CCMComponentProps, isAuthorizedForRoles } from '../models/FeatureUIData.js' +import APIErrorMessage from '../components/APIErrorMessage.js' +import SectionSelectorWidget, { SelectableCanvasCourseSection } from '../components/SectionSelectorWidget.js' import { CanvasCourseSectionBase, CanvasCourseSectionSort_AZ, CanvasCourseSectionSort_UserCount, CanvasCourseSectionSort_ZA, CanvasCourseSectionWithCourseName, ICanvasCourseSectionSort -} from '../models/canvas' -import { mergeSections } from '../api' -import usePromise from '../hooks/usePromise' -import { CourseNameSearcher, CourseSectionSearcher, SectionNameSearcher, UniqnameSearcher } from '../utils/SectionSearcher' -import CourseSectionList from '../components/CourseSectionList' -import Help from '../components/Help' +} from '../models/canvas.js' +import { mergeSections } from '../api.js' +import usePromise from '../hooks/usePromise.js' +import { CourseNameSearcher, CourseSectionSearcher, SectionNameSearcher, UniqnameSearcher } from '../utils/SectionSearcher.js' +import CourseSectionList from '../components/CourseSectionList.js' +import Help from '../components/Help.js' const PREFIX = 'MergeSections' diff --git a/ccm_web/client/src/utils/CSVSchemaValidator.ts b/ccm_web/client/src/utils/CSVSchemaValidator.ts index 35cb2c97d..716545972 100644 --- a/ccm_web/client/src/utils/CSVSchemaValidator.ts +++ b/ccm_web/client/src/utils/CSVSchemaValidator.ts @@ -1,5 +1,5 @@ -import { InvalidationType } from '../models/models' -import { CSVRecord } from '../utils/FileParserWrapper' +import { InvalidationType } from '../models/models.js' +import { CSVRecord } from '../utils/FileParserWrapper.js' interface SchemaInvalidation { message: string diff --git a/ccm_web/client/src/utils/SectionSearcher.ts b/ccm_web/client/src/utils/SectionSearcher.ts index 03e248a5a..94c4df3b7 100644 --- a/ccm_web/client/src/utils/SectionSearcher.ts +++ b/ccm_web/client/src/utils/SectionSearcher.ts @@ -1,6 +1,6 @@ -import { getCourseSections, getTeacherSections, searchSections } from '../api' -import { injectCourseName, CanvasCourseSectionWithCourseName, CourseWithSections } from '../models/canvas' -import { localeIncludes } from './localeIncludes' +import { getCourseSections, getTeacherSections, searchSections } from '../api.js' +import { injectCourseName, CanvasCourseSectionWithCourseName, CourseWithSections } from '../models/canvas.js' +import { localeIncludes } from './localeIncludes.js' export interface ISectionSearcher { name: string diff --git a/ccm_web/client/src/utils/ThirdPartyGradebookProcessor.tsx b/ccm_web/client/src/utils/ThirdPartyGradebookProcessor.tsx index 661721670..306aec25a 100644 --- a/ccm_web/client/src/utils/ThirdPartyGradebookProcessor.tsx +++ b/ccm_web/client/src/utils/ThirdPartyGradebookProcessor.tsx @@ -1,6 +1,6 @@ -import { CSVRecord } from '../utils/FileParserWrapper' -import { InvalidationType } from '../models/models' -import { assignmentHeaderSchema, validateString } from './validation' +import { CSVRecord } from '../utils/FileParserWrapper.js' +import { InvalidationType } from '../models/models.js' +import { assignmentHeaderSchema, validateString } from './validation.js' export interface GradebookUploadRecord extends CSVRecord { 'SIS Login ID': string diff --git a/ccm_web/client/src/utils/canvasSectionNameValidator.ts b/ccm_web/client/src/utils/canvasSectionNameValidator.ts index ab4958d86..b5fbfa436 100644 --- a/ccm_web/client/src/utils/canvasSectionNameValidator.ts +++ b/ccm_web/client/src/utils/canvasSectionNameValidator.ts @@ -1,6 +1,6 @@ -import { sectionNameSchema, validateString } from './validation' -import { getCourseSections } from '../api' -import { CanvasCourseSection } from '../models/canvas' +import { sectionNameSchema, validateString } from './validation.js' +import { getCourseSections } from '../api.js' +import { CanvasCourseSection } from '../models/canvas.js' export interface ICanvasSectionNameInvalidError { reason: string diff --git a/ccm_web/client/src/utils/enrollmentValidators.ts b/ccm_web/client/src/utils/enrollmentValidators.ts index dc6af4ee2..98df63f1d 100644 --- a/ccm_web/client/src/utils/enrollmentValidators.ts +++ b/ccm_web/client/src/utils/enrollmentValidators.ts @@ -1,10 +1,10 @@ -import { ClientEnrollmentType, isValidRole } from '../models/canvas' -import { InvalidationType } from '../models/models' -import { getRowNumber } from './fileUtils' -import { DuplicateIdentifierInRowsValidator, RowInvalidation, StringRowsSchemaValidator } from '../utils/rowValidation' +import { ClientEnrollmentType, isValidRole } from '../models/canvas.js' +import { InvalidationType } from '../models/models.js' +import { getRowNumber } from './fileUtils.js' +import { DuplicateIdentifierInRowsValidator, RowInvalidation, StringRowsSchemaValidator } from '../utils/rowValidation.js' import { emailSchema, firstNameSchema, lastNameSchema, loginIDSchema, sectionIdSchema, validateNumberString -} from '../utils/validation' +} from '../utils/validation.js' export interface EnrollmentInvalidation extends RowInvalidation {} diff --git a/ccm_web/client/src/utils/handleErrors.ts b/ccm_web/client/src/utils/handleErrors.ts index 3bd923bb0..d6bb8a1bc 100644 --- a/ccm_web/client/src/utils/handleErrors.ts +++ b/ccm_web/client/src/utils/handleErrors.ts @@ -3,9 +3,9 @@ Modified version of Remote Office Hours Queue implementation of custom errors an See https://github.com/tl-its-umich-edu/remote-office-hours-queue/blob/master/src/assets/src/services/api.ts */ -import redirect from './redirect' -import { ExternalUserResult, isExternalUserAPIErrorData, isExternalUserFailure } from '../models/externalUser' -import { APIErrorData, CanvasAPIErrorPayload, isCanvasAPIErrorData } from '../models/models' +import redirect from './redirect.js' +import { ExternalUserResult, isExternalUserAPIErrorData, isExternalUserFailure } from '../models/externalUser.js' +import { APIErrorData, CanvasAPIErrorPayload, isCanvasAPIErrorData } from '../models/models.js' /* Custom Error types diff --git a/ccm_web/client/src/utils/rowValidation.ts b/ccm_web/client/src/utils/rowValidation.ts index d71c509fc..f18e3d0b2 100644 --- a/ccm_web/client/src/utils/rowValidation.ts +++ b/ccm_web/client/src/utils/rowValidation.ts @@ -1,8 +1,8 @@ import { StringSchema } from 'yup' -import { getRowNumber } from './fileUtils' -import { validateString, ValidationResult } from './validation' -import { InvalidationType } from '../models/models' +import { getRowNumber } from './fileUtils.js' +import { validateString, ValidationResult } from './validation.js' +import { InvalidationType } from '../models/models.js' // For validating row level issues export interface RowInvalidation { diff --git a/ccm_web/client/tsconfig.json b/ccm_web/client/tsconfig.json index 8b023497d..68896876d 100644 --- a/ccm_web/client/tsconfig.json +++ b/ccm_web/client/tsconfig.json @@ -1,13 +1,11 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "target": "es6", "lib": [ "dom", "dom.iterable", - "esnext" + "ES2022" ], - "module": "es6", "jsx": "react-jsx", "sourceMap": true }, diff --git a/ccm_web/ecosystem.config.js b/ccm_web/ecosystem.config.cjs similarity index 100% rename from ccm_web/ecosystem.config.js rename to ccm_web/ecosystem.config.cjs diff --git a/ccm_web/nmon_config.json b/ccm_web/nmon_config.json index 87aa0788e..b8f093304 100644 --- a/ccm_web/nmon_config.json +++ b/ccm_web/nmon_config.json @@ -3,7 +3,7 @@ "ignore": [".git", "node_modules/", "coverage/"], "watch": ["server/"], "execMap": { - "ts": "node -r ts-node/register" + "ts": "node --loader ts-node/esm" }, "env": { "TS_NODE_FILES": "true" diff --git a/ccm_web/package-lock.json b/ccm_web/package-lock.json index fb1beac27..ce63a1ebf 100644 --- a/ccm_web/package-lock.json +++ b/ccm_web/package-lock.json @@ -10,40 +10,40 @@ "license": "ISC", "dependencies": { "@emotion/react": "11.11.4", - "@emotion/styled": "^11.11.5", - "@kth/canvas-api": "4.2.5", - "@mui/icons-material": "5.15.14", - "@mui/material": "5.15.14", + "@emotion/styled": "11.11.5", + "@kth/canvas-api": "4.2.6", + "@mui/icons-material": "5.15.15", + "@mui/material": "5.15.15", "@nestjs/axios": "3.0.2", - "@nestjs/common": "10.3.3", - "@nestjs/config": "3.2.0", - "@nestjs/core": "10.3.3", + "@nestjs/common": "10.3.7", + "@nestjs/config": "3.2.2", + "@nestjs/core": "10.3.7", "@nestjs/jwt": "10.2.0", "@nestjs/passport": "10.0.3", - "@nestjs/platform-express": "10.3.3", + "@nestjs/platform-express": "10.3.7", "@nestjs/sequelize": "10.0.1", - "@nestjs/serve-static": "4.0.1", - "@nestjs/swagger": "7.3.0", + "@nestjs/serve-static": "4.0.2", + "@nestjs/swagger": "7.3.1", "@nestjs/terminus": "10.2.3", "@react-hook/debounce": "4.0.0", - "axios": "1.6.7", + "axios": "1.6.8", "class-transformer": "0.5.1", "class-validator": "0.14.1", "connect-session-sequelize": "7.1.7", "cookie-parser": "1.4.6", - "csrf-csrf": "^3.0.3", - "express": "4.18.3", + "csrf-csrf": "3.0.4", + "express": "4.19.2", "express-session": "1.18.0", "form-data": "4.0.0", - "got": "11.8.5", + "got": "11.8.6", "helmet": "7.1.0", "keycode-js": "3.1.0", - "ltijs": "5.9.3", + "ltijs": "5.9.4", "ltijs-sequelize": "2.4.4", "morgan": "1.10.0", - "mysql2": "3.9.2", + "mysql2": "3.9.4", "notistack": "3.0.1", - "p-limit": "3.1.0", + "p-limit": "4.0.0", "papaparse": "5.4.1", "passport": "0.7.0", "passport-jwt": "4.0.1", @@ -51,51 +51,54 @@ "react-dom": "18.2.0", "react-router-dom": "6.22.3", "rxjs": "7.8.1", - "sequelize": "6.37.1", + "sequelize": "6.37.2", "sequelize-typescript": "2.1.6", "swagger-ui-express": "5.0.0", - "umzug": "3.7.0", + "umzug": "3.8.0", "wait-port": "1.1.0", - "winston": "3.11.0", + "winston": "3.13.0", "yup": "1.4.0" }, "devDependencies": { - "@nestjs/testing": "10.3.1", + "@nestjs/testing": "10.3.7", "@types/cookie-parser": "1.4.7", "@types/express": "4.17.21", "@types/express-session": "1.18.0", "@types/html-webpack-plugin": "3.2.9", - "@types/jest": "28.1.4", + "@types/jest": "29.5.12", "@types/morgan": "1.9.9", - "@types/node": "20.11.24", + "@types/node": "20.12.7", "@types/papaparse": "5.3.14", "@types/passport": "1.0.16", "@types/passport-jwt": "4.0.1", - "@types/react": "18.2.74", - "@types/react-dom": "18.2.23", + "@types/react": "18.2.77", + "@types/react-dom": "18.2.25", "@types/react-router-dom": "5.3.3", - "@types/supertest": "2.0.12", + "@types/supertest": "6.0.2", "@types/webpack": "5.28.5", "@typescript-eslint/eslint-plugin": "6.4.0", "@typescript-eslint/parser": "6.4.0", "clean-webpack-plugin": "4.0.0", - "css-loader": "6.10.0", + "css-loader": "7.1.1", "eslint": "8.57.0", "eslint-config-standard-with-typescript": "43.0.1", - "eslint-plugin-react": "7.33.2", + "eslint-plugin-react": "7.34.1", "html-webpack-plugin": "5.6.0", - "jest": "28.1.2", + "jest": "29.7.0", "nodemon": "3.1.0", - "style-loader": "3.3.4", - "supertest": "6.2.4", - "ts-jest": "28.0.5", + "style-loader": "4.0.0", + "supertest": "6.3.4", + "ts-jest": "29.1.2", "ts-loader": "9.5.1", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "typescript": "5.3.3", - "webpack": "5.90.3", + "typescript": "5.4.5", + "webpack": "5.91.0", "webpack-cli": "5.1.4", "webpack-merge": "5.10.0" + }, + "engines": { + "node": ">=16" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -121,133 +124,122 @@ } }, "node_modules/@azure/abort-controller": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", - "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-auth": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.6.0.tgz", - "integrity": "sha512-3X9wzaaGgRaBCwhLQZDtFp5uLIXCPrGbwJNWPPugvL4xbIGgScv77YzzxToKGLAKvG9amDoofMoP+9hsH1vs1w==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.1.tgz", + "integrity": "sha512-dyeQwvgthqs/SlPVQbZQetpslXceHd4i5a7M/7z/lGEAVwnSluabnQOjF2/dk/hhWgMISusv1Ytp4mQ8JNy62A==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.8.0.tgz", - "integrity": "sha512-+gHS3gEzPlhyQBMoqVPOTeNH031R5DM/xpCvz72y38C09rg4Hui/1sJS/ujoisDZbbSHyuRLVWdFlwL0pIFwbg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.1.tgz", + "integrity": "sha512-hHYFx9lz0ZpbO5W+iotU9tmIX1jPcoIjYUEUaWGuMi1628LCQ/z05TUR4P+NRtMgyoHQuyVYyGQiD3PC47kaIA==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "^1.9.1", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-client/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.1.tgz", + "integrity": "sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-http-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.0.1.tgz", - "integrity": "sha512-xpQZz/q7E0jSW4rckrTo2mDFDQgo6I69hBU4voMQi7REi6JRW5a+KfVkbJCFCWnkFmP6cAJ0IbuudTdf/MEBOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.1.tgz", + "integrity": "sha512-QGSDBkKpDbVOmbqlVPdlPE1JalHWmJjLyZhL+9zZN9gj4X1pTksEbDR77P+qWCJ5NGaSWyKvAW+3Q6hNX8/W+Q==", "dependencies": { - "@azure/abort-controller": "^1.0.4", + "@azure/abort-controller": "^2.0.0", "@azure/core-client": "^1.3.0", "@azure/core-rest-pipeline": "^1.3.0" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-http-compat/node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-lro": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.6.0.tgz", - "integrity": "sha512-PyRNcaIOfMgoUC01/24NoG+k8O81VrKxYARnDlo+Q2xji0/0/j2nIt8BwQh294pb1c5QnXTDPbNR4KzoDKXEoQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.1.tgz", + "integrity": "sha512-kXSlrNHOCTVZMxpXNRqzgh9/j4cnNXU5Hf2YjMyjddRhCXFiFRzmNaqwN+XO9rGTsCOIaaG7M67zZdyliXZG9g==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-paging": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", - "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.1.tgz", + "integrity": "sha512-3tKIQXSU3mlN+ITz0m2pXLnKK3oQ6/EVcW8ud011Iq+M0rx6Wnm7NUEpoMeOAEedeKlPtemrQzO6YWoDR71O5w==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.14.0.tgz", - "integrity": "sha512-Tp4M6NsjCmn9L5p7HsW98eSOS7A0ibl3e5ntZglozT0XuD/0y6i36iW829ZbBq0qihlGgfaeFpkLjZ418KDm1Q==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.15.1.tgz", + "integrity": "sha512-ZxS6i3eHxh86u+1eWZJiYywoN2vxvsSoAUx60Mny8cZ4nTwvt7UzVVBJO+m2PW2KIJfNiXMt59xBa59htOWL4g==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.1.tgz", + "integrity": "sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-tracing": { @@ -263,12 +255,12 @@ } }, "node_modules/@azure/core-util": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.7.0.tgz", - "integrity": "sha512-Zq2i3QO6k9DA8vnm29mYM4G8IE9u1mhF1GUabVEqPNX8Lj833gdxQ2NAFxt2BZsfAL+e9cT8SyVN7dFVJ/Hf0g==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.8.1.tgz", + "integrity": "sha512-L3voj0StUdJ+YKomvwnTv7gHzguJO+a6h30pmmZdRprJCM+RJlGMPxzuh4R7lhQu1jNmEtaHX5wvTgWLDAmbGQ==", "dependencies": { "@azure/abort-controller": "^2.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" @@ -371,25 +363,25 @@ } }, "node_modules/@azure/keyvault-keys/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.1.tgz", + "integrity": "sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.1.tgz", + "integrity": "sha512-/+4TtokaGgC+MnThdf6HyIH9Wrjp+CnCn3Nx3ggevN7FFjjNyjqg0yLlc2i9S+Z2uAzI8GYOo35Nzb1MhQ89MA==", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/ms-rest-azure-env": { @@ -517,105 +509,41 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/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==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/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==" - }, - "node_modules/@babel/code-frame/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -647,14 +575,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -721,11 +649,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -784,9 +712,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } @@ -809,13 +737,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" }, "engines": { @@ -823,13 +751,14 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -900,9 +829,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -971,6 +900,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@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", @@ -1059,12 +1003,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1074,9 +1018,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1099,18 +1043,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -1447,9 +1391,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "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 }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1576,60 +1520,59 @@ } }, "node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@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": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "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": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1640,104 +1583,90 @@ } } }, - "node_modules/@jest/core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "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, "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@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", @@ -1745,21 +1674,20 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.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": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.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", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1771,94 +1699,100 @@ } }, "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "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, "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "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, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "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, "dependencies": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", + "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.1" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/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 + }, "node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1866,7 +1800,7 @@ "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -1902,13 +1836,13 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "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, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1933,9 +1867,9 @@ "integrity": "sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg==" }, "node_modules/@kth/canvas-api": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@kth/canvas-api/-/canvas-api-4.2.5.tgz", - "integrity": "sha512-3cUh+CznHESKLEfxoalIA2568bvnfx12QZ5Y/ThSZ6Tyrf4P+kYkQJZ/FBbBNS6jSu4ijC2FPffalYb50A0vXQ==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@kth/canvas-api/-/canvas-api-4.2.6.tgz", + "integrity": "sha512-D0C2Xid5K3VxBJblHQPsaIbdLM5WFHBqitvc8wGacntWpKzRGUT7ML2PTGnVCrLkAyEdlKjGedoceLXW6QJJzg==", "dependencies": { "form-data-encoder": "1.6.0", "formdata-node": "^3.7.0", @@ -1957,9 +1891,9 @@ "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==" }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", - "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -1997,18 +1931,18 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", - "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.14.tgz", - "integrity": "sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.15.tgz", + "integrity": "sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==", "dependencies": { "@babel/runtime": "^7.23.9" }, @@ -2031,14 +1965,14 @@ } }, "node_modules/@mui/material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz", - "integrity": "sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.14", - "@mui/system": "^5.15.14", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", "@mui/types": "^7.2.14", "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", @@ -2132,9 +2066,9 @@ } }, "node_modules/@mui/system": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", - "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.15.14", @@ -2221,9 +2155,9 @@ } }, "node_modules/@nestjs/common": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.3.tgz", - "integrity": "sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==", + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.7.tgz", + "integrity": "sha512-gKFtFzcJznrwsRYjtNZoPAvSOPYdNgxbTYoAyLTpoy393cIKgLmJTHu6ReH8/qIB9AaZLdGaFLkx98W/tFWFUw==", "dependencies": { "iterare": "1.2.1", "tslib": "2.6.2", @@ -2249,11 +2183,11 @@ } }, "node_modules/@nestjs/config": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.2.0.tgz", - "integrity": "sha512-BpYRn57shg7CH35KGT6h+hT7ZucB6Qn2B3NBNdvhD4ApU8huS5pX/Wc2e/aO5trIha606Bz2a9t9/vbiuTBTww==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.2.2.tgz", + "integrity": "sha512-vGICPOui5vE6kPz1iwQ7oCnp3qWgqxldPmBQ9onkVoKlBtyc83KJCr7CjuVtf4OdovMAVcux1d8Q6jglU2ZphA==", "dependencies": { - "dotenv": "16.4.1", + "dotenv": "16.4.5", "dotenv-expand": "10.0.0", "lodash": "4.17.21", "uuid": "9.0.1" @@ -2264,9 +2198,9 @@ } }, "node_modules/@nestjs/core": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.3.tgz", - "integrity": "sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==", + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.7.tgz", + "integrity": "sha512-hsdlnfiQ3kgqHL5k7js3CU0PV7hBJVi+LfFMgCkoagRxNMf67z0GFGeOV2jk5d65ssB19qdYsDa1MGVuEaoUpg==", "hasInstallScript": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", @@ -2341,13 +2275,13 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.3.tgz", - "integrity": "sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==", + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.7.tgz", + "integrity": "sha512-noNJ+PyIxQJLCKfuXz0tcQtlVAynfLIuKy62g70lEZ86UrIqSrZFqvWs/rFUgkbT6J8H7Rmv11hASOnX+7M2rA==", "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", - "express": "4.18.2", + "express": "4.19.2", "multer": "1.4.4-lts.1", "tslib": "2.6.2" }, @@ -2360,110 +2294,6 @@ "@nestjs/core": "^10.0.0" } }, - "node_modules/@nestjs/platform-express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/platform-express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@nestjs/platform-express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/@nestjs/platform-express/node_modules/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==" - }, - "node_modules/@nestjs/platform-express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nestjs/sequelize": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@nestjs/sequelize/-/sequelize-10.0.1.tgz", @@ -2481,14 +2311,14 @@ } }, "node_modules/@nestjs/serve-static": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.1.tgz", - "integrity": "sha512-AoOrVdAe+WmsceuCcA8nWmKUYmaOsg9pqBCbIj7PS4W3XdikJQMtfxgSIoOlyUksZdhTBFjHqKh0Yhpj6pulwQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.2.tgz", + "integrity": "sha512-cT0vdWN5ar7jDI2NKbhf4LcwJzU4vS5sVpMkVrHuyLcltbrz6JdGi1TfIMMatP2pNiq5Ie/uUdPSFDVaZX/URQ==", "dependencies": { "path-to-regexp": "0.2.5" }, "peerDependencies": { - "@fastify/static": "^6.5.0", + "@fastify/static": "^6.5.0 || ^7.0.0", "@nestjs/common": "^9.0.0 || ^10.0.0", "@nestjs/core": "^9.0.0 || ^10.0.0", "express": "^4.18.1", @@ -2512,9 +2342,9 @@ "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" }, "node_modules/@nestjs/swagger": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.3.0.tgz", - "integrity": "sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.3.1.tgz", + "integrity": "sha512-LUC4mr+5oAleEC/a2j8pNRh1S5xhKXJ1Gal5ZdRjt9XebQgbngXCdW7JTA9WOEcwGtFZN9EnKYdquzH971LZfw==", "dependencies": { "@microsoft/tsdoc": "^0.14.2", "@nestjs/mapped-types": "2.0.5", @@ -2613,9 +2443,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.1.tgz", - "integrity": "sha512-74aSAugWT31jSPnStyRWDXgjHXWO3GYaUfAZ2T7Dml88UGkGy95iwaWgYy7aYM8/xVFKcDYkfL5FAYqZYce/yg==", + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.7.tgz", + "integrity": "sha512-PmwZXyoCC/m3F3IFgpgD+SNN6cDPQa/vi3YQxFruvfX3cuHq+P6ZFvBB7hwaKKsLlhA0so42LsMm41oFBkdouw==", "dev": true, "dependencies": { "tslib": "2.6.2" @@ -2643,7 +2473,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" @@ -2656,7 +2485,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" } @@ -2665,7 +2493,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" @@ -2842,9 +2669,9 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "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 }, "node_modules/@sindresorhus/is": { @@ -2859,21 +2686,21 @@ } }, "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "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, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@szmarczak/http-timer": { @@ -2887,18 +2714,10 @@ "node": ">=10" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "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 }, "node_modules/@tsconfig/node12": { @@ -3038,9 +2857,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "version": "8.56.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz", + "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3076,9 +2895,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -3213,13 +3032,13 @@ } }, "node_modules/@types/jest": { - "version": "28.1.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.4.tgz", - "integrity": "sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { - "jest-matcher-utils": "^28.0.0", - "pretty-format": "^28.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { @@ -3284,9 +3103,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dependencies": { "undici-types": "~5.26.4" } @@ -3334,21 +3153,15 @@ "@types/passport": "*" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", "dev": true }, "node_modules/@types/range-parser": { @@ -3358,18 +3171,18 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.74", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.74.tgz", - "integrity": "sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==", + "version": "18.2.77", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.77.tgz", + "integrity": "sha512-CUT9KUUF+HytDM7WiXKLF9qUSg4tGImwy4FXTlfEDPEkkNUzJ7rVFolYweJ9fS1ljoIaP7M7Rdjc5eUm/Yu5AA==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", + "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", "dev": true, "dependencies": { "@types/react": "*" @@ -3435,14 +3248,14 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/source-list-map": { @@ -3466,9 +3279,9 @@ } }, "node_modules/@types/superagent": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.4.tgz", - "integrity": "sha512-uzSBYwrpal8y2X2Pul5ZSWpzRiDha2FLcquaN95qUPnOjYgm/zQ5LIdqeJpQJTRWNTN+Rhm0aC8H06Ds2rqCYw==", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.6.tgz", + "integrity": "sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==", "dev": true, "dependencies": { "@types/cookiejar": "^2.1.5", @@ -3477,12 +3290,13 @@ } }, "node_modules/@types/supertest": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", - "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", + "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", "dev": true, "dependencies": { - "@types/superagent": "*" + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" } }, "node_modules/@types/tapable": { @@ -3775,9 +3589,9 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -3797,9 +3611,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "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 }, "node_modules/@webassemblyjs/helper-numbers": { @@ -3820,15 +3634,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "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, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -3856,28 +3670,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "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, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "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" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -3885,24 +3699,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "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, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -3911,12 +3725,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -4089,14 +3903,14 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "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" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -4232,15 +4046,16 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -4268,18 +4083,18 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, - "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4289,16 +4104,17 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -4344,6 +4160,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/array.prototype.tosorted": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", @@ -4393,15 +4221,6 @@ "lodash": "^4.17.14" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4423,31 +4242,31 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "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, "dependencies": { - "@jest/transform": "^28.1.3", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" @@ -4469,10 +4288,35 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/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, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "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, "dependencies": { "@babel/template": "^7.3.3", @@ -4481,7 +4325,7 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-plugin-macros": { @@ -4522,16 +4366,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "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, "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -4578,12 +4422,15 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -4685,7 +4532,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -4782,18 +4628,10 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" - } + "node_modules/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==" }, "node_modules/builtin-modules": { "version": "3.3.0", @@ -4809,9 +4647,9 @@ } }, "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "peer": true, "dependencies": { @@ -4910,9 +4748,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001594", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", - "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", + "version": "1.0.30001607", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz", + "integrity": "sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==", "dev": true, "funding": [ { @@ -5374,6 +5212,27 @@ "node": ">=10" } }, + "node_modules/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, + "dependencies": { + "@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" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -5395,30 +5254,30 @@ } }, "node_modules/csrf-csrf": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csrf-csrf/-/csrf-csrf-3.0.3.tgz", - "integrity": "sha512-NxRERyDiWGH/MLw5KNl46FwVX36vwK0ppLJizNPa7K72FE+3T+WbOotjKkR5V4Q9lPZei+RtcCQna1rMLCjDFQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/csrf-csrf/-/csrf-csrf-3.0.4.tgz", + "integrity": "sha512-hYxhtg/HXGe+G+dTpDP+vnLjgcjrj8zUYeIhoMgUK22yJhzzrhOwI3mEQrP2AZx4aHE4Gdu+YIVgsYpxafXATg==", "dependencies": { "http-errors": "^2.0.0" } }, "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.1.tgz", + "integrity": "sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -5426,7 +5285,7 @@ }, "peerDependencies": { "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" + "webpack": "^5.27.0" }, "peerDependenciesMeta": { "@rspack/core": { @@ -5482,6 +5341,57 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-utils": { "version": "1.2.21", "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", @@ -5540,10 +5450,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-extend": { "version": "0.6.0", @@ -5699,9 +5617,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "optional": true, "engines": { "node": ">=8" @@ -5736,12 +5654,12 @@ } }, "node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -5852,14 +5770,14 @@ } }, "node_modules/dotenv": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", - "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -5889,16 +5807,15 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.693", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", - "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==", + "version": "1.4.730", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.730.tgz", + "integrity": "sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==", "dev": true }, "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "engines": { "node": ">=12" }, @@ -5933,9 +5850,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5955,9 +5872,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.12.0.tgz", + "integrity": "sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -5975,17 +5892,21 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -5996,10 +5917,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -6010,17 +5932,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -6029,13 +5951,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "peer": true - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -6056,37 +5971,48 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", + "es-abstract": "^1.23.0", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" + "safe-array-concat": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", @@ -6208,11 +6134,14 @@ } }, "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", + "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", "dev": true, "peer": true, + "dependencies": { + "semver": "^7.5.4" + }, "engines": { "node": ">=12" }, @@ -6253,6 +6182,7 @@ "version": "43.0.1", "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-43.0.1.tgz", "integrity": "sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==", + "deprecated": "Please use eslint-config-love, instead.", "dev": true, "dependencies": { "@typescript-eslint/parser": "^6.4.0", @@ -6318,15 +6248,15 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", - "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", + "integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.1.2" + "eslint-compat-utils": "^0.5.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -6482,27 +6412,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" @@ -6727,32 +6659,32 @@ } }, "node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" + "@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" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "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.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6828,9 +6760,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -6863,7 +6795,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", @@ -6879,7 +6810,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" }, @@ -6925,7 +6855,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" } @@ -6973,7 +6902,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7090,9 +7018,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -7342,9 +7270,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", "dev": true, "peer": true, "dependencies": { @@ -7468,9 +7396,9 @@ } }, "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -7568,9 +7496,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -7716,16 +7644,15 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http2-wrapper": { @@ -7741,15 +7668,15 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -8055,6 +7982,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -8088,7 +8030,6 @@ "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" } @@ -8141,7 +8082,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" }, @@ -8150,10 +8090,13 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8174,7 +8117,6 @@ "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" } @@ -8270,10 +8212,13 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8350,10 +8295,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8371,13 +8319,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8424,28 +8375,19 @@ } }, "node_modules/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==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -8520,21 +8462,21 @@ } }, "node_modules/jest": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.2.tgz", - "integrity": "sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^28.1.2", - "@jest/types": "^28.1.1", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.2" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -8546,72 +8488,127 @@ } }, "node_modules/jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "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, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "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, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@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": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "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": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "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, "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@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", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -8623,36 +8620,36 @@ } }, "node_modules/jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", + "@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": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "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": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", @@ -8668,158 +8665,159 @@ } }, "node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "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, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "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, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "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, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "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, "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "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, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "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, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@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": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -8840,153 +8838,177 @@ } }, "node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "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, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "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, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/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": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" + "yocto-queue": "^0.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "node_modules/jest-runner/node_modules/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, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@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", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "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" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "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, "dependencies": { "@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/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@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": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "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": "^28.1.3", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "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, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -8994,57 +9016,58 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "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, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "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, "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "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, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -9280,9 +9303,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.57", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.57.tgz", - "integrity": "sha512-OjsEd9y4LgcX+Ig09SbxWqcGESxliDDFNVepFhB9KEsQZTrnk3UdEU+cO0sW1APvLprHstQpS23OQpZ3bwxy6Q==" + "version": "1.10.60", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.60.tgz", + "integrity": "sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -9434,21 +9457,21 @@ } }, "node_modules/ltijs": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/ltijs/-/ltijs-5.9.3.tgz", - "integrity": "sha512-UrRstmGc4cs04zKGnJj39zUvUC929YEK9iJ+iTD03Hl6Z5rgha8Gk04j806QuDLX8j+rVJ0qKySLXu+gMmSRKA==", + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/ltijs/-/ltijs-5.9.4.tgz", + "integrity": "sha512-pFnONXCyTf7mygIYA3POkreCKTDId2PoANqBTF5XZ/RVIUVQN2fBMbCnhYC4wHw6uwiKJFYX4m5qSDZmqvmGzg==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.24.4", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "debug": "^4.3.4", - "express": "^4.18.2", + "express": "^4.19.2", "fast-url-parser": "^1.1.3", "got": "^11.8.2", "helmet": "^6.0.1", - "jsonwebtoken": "^9.0.0", - "mongoose": "^7.0.1", + "jsonwebtoken": "^9.0.2", + "mongoose": "^7.6.10", "parse-link-header": "^2.0.0", "rasha": "^1.2.5" }, @@ -9626,7 +9649,6 @@ "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" } @@ -9643,7 +9665,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -9804,9 +9825,9 @@ } }, "node_modules/mongoose": { - "version": "7.6.9", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.9.tgz", - "integrity": "sha512-3lR1fA/gS1E9Bn0woFqIysnnjCFDYtVo3yY+rGsVg1Q7kHX+gUTgAHTEKXrkwKxk2gHFdUfAsLt/Zjrdf6+nZA==", + "version": "7.6.10", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.10.tgz", + "integrity": "sha512-vfvGxXwFk6rZVRaMC+8pgXj1uOR2RafZpgaA3fO6ygDJN7dXnBQ3ehuacwaVD+U3hmZetqHimORJhvLEpdRl1w==", "dependencies": { "bson": "^5.5.0", "kareem": "2.5.1", @@ -9927,9 +9948,9 @@ } }, "node_modules/mysql2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", - "integrity": "sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.4.tgz", + "integrity": "sha512-OEESQuwxMza803knC1YSt7NMuc1BrK9j7gZhCSs2WAyxr1vfiI7QLaLOKTh5c9SWGz98qVyQUbK8/WckevNQhg==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -10042,9 +10063,9 @@ } }, "node_modules/node-abi": { - "version": "3.56.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", - "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.57.0.tgz", + "integrity": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==", "optional": true, "dependencies": { "semver": "^7.3.5" @@ -10332,28 +10353,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10363,41 +10385,46 @@ } }, "node_modules/object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "peer": true, "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10497,14 +10524,14 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10525,6 +10552,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-locate/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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -10543,11 +10597,6 @@ "node": ">=6" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, "node_modules/papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", @@ -10707,15 +10756,13 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "node_modules/pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", - "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", + "version": "8.11.5", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", + "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", + "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" }, @@ -10741,9 +10788,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "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-hstore": { "version": "2.3.4", @@ -10765,17 +10812,17 @@ } }, "node_modules/pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "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.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + "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", @@ -10803,14 +10850,12 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "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" }, @@ -10947,9 +10992,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -10968,16 +11013,16 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -10987,9 +11032,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -11004,9 +11049,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -11034,9 +11079,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -11133,18 +11178,17 @@ } }, "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "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, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -11234,6 +11278,22 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -11269,7 +11329,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", @@ -11484,22 +11543,22 @@ } }, "node_modules/reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "peer": true }, "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -11625,9 +11684,9 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -11653,7 +11712,6 @@ "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" @@ -11675,7 +11733,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", @@ -11703,13 +11760,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11888,9 +11945,9 @@ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/sequelize": { - "version": "6.37.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", - "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==", + "version": "6.37.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.2.tgz", + "integrity": "sha512-bnb7swGANONXCTrVyebpOOZssLwQrVkYX2tcC6qOIvH+P+OhsoMBi7c3GXI5bC+Z4b4tOl+kQy6yeqLCZ1YQAQ==", "funding": [ { "type": "opencollective", @@ -12024,16 +12081,16 @@ } }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "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==", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12236,9 +12293,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12411,34 +12468,41 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12448,28 +12512,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12517,19 +12584,19 @@ } }, "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "dev": true, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.27.0" } }, "node_modules/stylis": { @@ -12571,13 +12638,13 @@ } }, "node_modules/supertest": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.4.tgz", - "integrity": "sha512-M8xVnCNv+q2T2WXVzxDECvL2695Uv2uUj2O0utxsld/HRyJvOU8W9f1gvsYxSNU4wmIe0/L/ItnpU4iKq0emDA==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^8.0.0" + "superagent": "^8.1.2" }, "engines": { "node": ">=6.4.0" @@ -12594,19 +12661,6 @@ "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==", - "dev": true, - "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", @@ -12765,26 +12819,10 @@ "node": ">=6" } }, - "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==", - "dev": true, - "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.28.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", - "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", + "version": "5.30.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", + "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -12935,7 +12973,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" }, @@ -13001,9 +13038,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", - "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "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, "engines": { "node": ">=16" @@ -13013,36 +13050,40 @@ } }, "node_modules/ts-jest": { - "version": "28.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.5.tgz", - "integrity": "sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { "optional": true }, + "@jest/types": { + "optional": true + }, "babel-jest": { "optional": true }, @@ -13269,9 +13310,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -13294,9 +13335,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -13329,13 +13370,13 @@ } }, "node_modules/umzug": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.7.0.tgz", - "integrity": "sha512-r/L2Zlilgv3SKhmP2nkA9x2Xi1PKtu2K34/i/s7AYJ2mLjEO+IxETJAK7CKf6l3QOvoy5/ChykeX9qt6ykRz6Q==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.0.tgz", + "integrity": "sha512-FRBvdZxllW3eUzsqG3CIfgOVChUONrKNZozNOJfvmcfBn5pMKcJjICuMMEsDLHYa/aqd7a2NtXfYEG86XHe1lQ==", "dependencies": { "@rushstack/ts-command-line": "^4.12.2", "emittery": "^0.13.0", - "glob": "^8.0.3", + "fast-glob": "^3.3.2", "pony-cause": "^2.1.4", "type-fest": "^4.0.0" }, @@ -13343,58 +13384,10 @@ "node": ">=12" } }, - "node_modules/umzug/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/umzug/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/umzug/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/umzug/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/umzug/node_modules/type-fest": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.11.1.tgz", - "integrity": "sha512-MFMf6VkEVZAETidGGSYW2B1MjXbGX+sWIywn2QPEaJ3j08V+MwVRHMXtf2noB8ENJaD0LIun9wh5Z6OPNf1QzQ==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz", + "integrity": "sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==", "engines": { "node": ">=16" }, @@ -13604,9 +13597,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -13625,26 +13618,26 @@ } }, "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.16.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.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -13652,7 +13645,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -13846,31 +13839,34 @@ "dev": true }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13897,9 +13893,9 @@ "dev": true }, "node_modules/winston": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", - "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -13911,7 +13907,7 @@ "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "winston-transport": "^4.7.0" }, "engines": { "node": ">= 12.0.0" @@ -14099,11 +14095,11 @@ } }, "node_modules/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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/ccm_web/package.json b/ccm_web/package.json index a8c630e59..f5099261d 100644 --- a/ccm_web/package.json +++ b/ccm_web/package.json @@ -2,12 +2,16 @@ "name": "ccm_web", "version": "1.0.0", "description": "", + "type": "module", + "engines": { + "node": ">=16" + }, "scripts": { "dev:server": "nodemon --inspect=0.0.0.0:9229 --config nmon_config.json server/src/main.ts", - "dev:client": "webpack --watch --config webpack/webpack.dev.ts", + "dev:client": "node --loader ts-node/esm node_modules/.bin/webpack --watch --config webpack/webpack.dev.ts", "predev": "wait-port ccm_db:3306", - "dev": "node -r ts-node/register server/src/migrator up && npm run dev:server & npm run dev:client", - "build:client": "webpack --config webpack/webpack.prod.ts", + "dev": "node --loader ts-node/esm server/src/migrator.ts up && npm run dev:server & npm run dev:client", + "build:client": "node --loader ts-node/esm node_modules/.bin/webpack --config webpack/webpack.prod.ts", "build:server": "tsc --project tsconfig.build.json", "build": "npm run build:client && npm run build:server", "test": "jest", @@ -20,40 +24,40 @@ "license": "ISC", "dependencies": { "@emotion/react": "11.11.4", - "@emotion/styled": "^11.11.5", - "@kth/canvas-api": "4.2.5", - "@mui/icons-material": "5.15.14", - "@mui/material": "5.15.14", + "@emotion/styled": "11.11.5", + "@kth/canvas-api": "4.2.6", + "@mui/icons-material": "5.15.15", + "@mui/material": "5.15.15", "@nestjs/axios": "3.0.2", - "@nestjs/common": "10.3.3", - "@nestjs/config": "3.2.0", - "@nestjs/core": "10.3.3", + "@nestjs/common": "10.3.7", + "@nestjs/config": "3.2.2", + "@nestjs/core": "10.3.7", "@nestjs/jwt": "10.2.0", "@nestjs/passport": "10.0.3", - "@nestjs/platform-express": "10.3.3", + "@nestjs/platform-express": "10.3.7", "@nestjs/sequelize": "10.0.1", - "@nestjs/serve-static": "4.0.1", - "@nestjs/swagger": "7.3.0", + "@nestjs/serve-static": "4.0.2", + "@nestjs/swagger": "7.3.1", "@nestjs/terminus": "10.2.3", "@react-hook/debounce": "4.0.0", - "axios": "1.6.7", + "axios": "1.6.8", "class-transformer": "0.5.1", "class-validator": "0.14.1", "connect-session-sequelize": "7.1.7", "cookie-parser": "1.4.6", - "csrf-csrf": "^3.0.3", - "express": "4.18.3", + "csrf-csrf": "3.0.4", + "express": "4.19.2", "express-session": "1.18.0", "form-data": "4.0.0", - "got": "11.8.5", + "got": "11.8.6", "helmet": "7.1.0", "keycode-js": "3.1.0", - "ltijs": "5.9.3", + "ltijs": "5.9.4", "ltijs-sequelize": "2.4.4", "morgan": "1.10.0", - "mysql2": "3.9.2", + "mysql2": "3.9.4", "notistack": "3.0.1", - "p-limit": "3.1.0", + "p-limit": "4.0.0", "papaparse": "5.4.1", "passport": "0.7.0", "passport-jwt": "4.0.1", @@ -61,49 +65,49 @@ "react-dom": "18.2.0", "react-router-dom": "6.22.3", "rxjs": "7.8.1", - "sequelize": "6.37.1", + "sequelize": "6.37.2", "sequelize-typescript": "2.1.6", "swagger-ui-express": "5.0.0", - "umzug": "3.7.0", + "umzug": "3.8.0", "wait-port": "1.1.0", - "winston": "3.11.0", + "winston": "3.13.0", "yup": "1.4.0" }, "devDependencies": { - "@nestjs/testing": "10.3.1", + "@nestjs/testing": "10.3.7", "@types/cookie-parser": "1.4.7", "@types/express": "4.17.21", "@types/express-session": "1.18.0", "@types/html-webpack-plugin": "3.2.9", - "@types/jest": "28.1.4", + "@types/jest": "29.5.12", "@types/morgan": "1.9.9", - "@types/node": "20.11.24", + "@types/node": "20.12.7", "@types/papaparse": "5.3.14", "@types/passport": "1.0.16", "@types/passport-jwt": "4.0.1", - "@types/react": "18.2.74", - "@types/react-dom": "18.2.23", + "@types/react": "18.2.77", + "@types/react-dom": "18.2.25", "@types/react-router-dom": "5.3.3", - "@types/supertest": "2.0.12", + "@types/supertest": "6.0.2", "@types/webpack": "5.28.5", "@typescript-eslint/eslint-plugin": "6.4.0", "@typescript-eslint/parser": "6.4.0", "clean-webpack-plugin": "4.0.0", - "css-loader": "6.10.0", + "css-loader": "7.1.1", "eslint": "8.57.0", "eslint-config-standard-with-typescript": "43.0.1", - "eslint-plugin-react": "7.33.2", + "eslint-plugin-react": "7.34.1", "html-webpack-plugin": "5.6.0", - "jest": "28.1.2", + "jest": "29.7.0", "nodemon": "3.1.0", - "style-loader": "3.3.4", - "supertest": "6.2.4", - "ts-jest": "28.0.5", + "style-loader": "4.0.0", + "supertest": "6.3.4", + "ts-jest": "29.1.2", "ts-loader": "9.5.1", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "typescript": "5.3.3", - "webpack": "5.90.3", + "typescript": "5.4.5", + "webpack": "5.91.0", "webpack-cli": "5.1.4", "webpack-merge": "5.10.0" }, diff --git a/ccm_web/server/localTypes/express/index.d.ts b/ccm_web/server/localTypes/express/index.d.ts index 5a9bb8366..22cd64387 100644 --- a/ccm_web/server/localTypes/express/index.d.ts +++ b/ccm_web/server/localTypes/express/index.d.ts @@ -3,7 +3,7 @@ Reference(s): - https://github.com/DefinitelyTyped/DefinitelyTyped/issues/23976#issuecomment-546404481 */ -type UserModel = import('../../src/user/user.model').User +type UserModel = import('../../src/user/user.model.js').User declare namespace Express { export interface User extends UserModel {} diff --git a/ccm_web/server/src/api/api.admin.handler.ts b/ccm_web/server/src/api/api.admin.handler.ts index 8c427b991..0f3564488 100644 --- a/ccm_web/server/src/api/api.admin.handler.ts +++ b/ccm_web/server/src/api/api.admin.handler.ts @@ -1,8 +1,7 @@ import CanvasRequestor from '@kth/canvas-api' - -import { CourseApiHandler } from './api.course.handler' -import { TooManyResultsError } from './api.errors' -import { APIErrorData, isAPIErrorData } from './api.interfaces' +import { CourseApiHandler } from './api.course.handler.js' +import { TooManyResultsError } from './api.errors.js' +import { APIErrorData, isAPIErrorData } from './api.interfaces.js' import { checkForUniqueIdError, createLimitedPromises, @@ -10,19 +9,19 @@ import { HttpMethod, makeResponse, NS_PER_SEC -} from './api.utils' -import { ExternalUserDto } from './dtos/api.external.users.dto' +} from './api.utils.js' +import { ExternalUserDto } from './dtos/api.external.users.dto.js' import { CanvasAccount, CanvasCourse, CanvasUser, CourseWithSections, CourseWorkflowState -} from '../canvas/canvas.interfaces' +} from '../canvas/canvas.interfaces.js' -import baseLogger from '../logger' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) interface AccountCoursesQueryParams extends Record { 'state': CourseWorkflowState[] @@ -37,11 +36,11 @@ Handler class for Canvas API calls dealing with an admin's accounts (i.e. those or account-scoped operations that make use of other handler instances for Canvas entities */ export class AdminApiHandler { - requestor: CanvasRequestor + requestor: CanvasRequestor.default userLoginId: string maxSearchCourses: number - constructor (requestor: CanvasRequestor, userLoginId?: string, maxSearchCourses = 400) { + constructor (requestor: any, userLoginId?: string, maxSearchCourses = 400) { this.requestor = requestor this.userLoginId = userLoginId !== undefined ? `"${userLoginId}"` : '(undefined)' this.maxSearchCourses = maxSearchCourses diff --git a/ccm_web/server/src/api/api.controller.ts b/ccm_web/server/src/api/api.controller.ts index 81517702d..062d36a26 100644 --- a/ccm_web/server/src/api/api.controller.ts +++ b/ccm_web/server/src/api/api.controller.ts @@ -1,4 +1,4 @@ -import { SessionData } from 'express-session' +import type { SessionData } from 'express-session' import { BadRequestException, Body, @@ -17,19 +17,20 @@ import { } from '@nestjs/common' import { ApiQuery, ApiSecurity } from '@nestjs/swagger' -import { Globals, isAPIErrorData, ExternalUserData } from './api.interfaces' -import { APIService } from './api.service' -import { InvalidTokenInterceptor } from './invalid.token.interceptor' -import { TooManyResultsInterceptor } from './too.many.results.interceptor' -import { CourseNameDto } from './dtos/api.course.name.dto' -import { CreateSectionsDto } from './dtos/api.create.sections.dto' -import { GetSectionsAdminQueryDto } from './dtos/api.get.sections.admin.dto' -import { GetSectionsInstructorQueryDto } from './dtos/api.get.sections.instructor.dto' -import { SectionEnrollmentsDto } from './dtos/api.section.enrollment.dto' -import { SectionIdsDto } from './dtos/api.section.ids.dto' -import { SectionUserDto, SectionUsersDto } from './dtos/api.section.users.dto' -import { JwtAuthGuard } from '../auth/jwt-auth.guard' -import { SessionGuard } from '../auth/session.guard' +import type { Globals, ExternalUserData } from './api.interfaces.js' +import { isAPIErrorData } from './api.interfaces.js' +import { APIService } from './api.service.js' +import { InvalidTokenInterceptor } from './invalid.token.interceptor.js' +import { TooManyResultsInterceptor } from './too.many.results.interceptor.js' +import { CourseNameDto } from './dtos/api.course.name.dto.js' +import { CreateSectionsDto } from './dtos/api.create.sections.dto.js' +import { GetSectionsAdminQueryDto } from './dtos/api.get.sections.admin.dto.js' +import { GetSectionsInstructorQueryDto } from './dtos/api.get.sections.instructor.dto.js' +import { SectionEnrollmentsDto } from './dtos/api.section.enrollment.dto.js' +import { SectionIdsDto } from './dtos/api.section.ids.dto.js' +import { SectionUserDto, SectionUsersDto } from './dtos/api.section.users.dto.js' +import { JwtAuthGuard } from '../auth/jwt-auth.guard.js' +import { SessionGuard } from '../auth/session.guard.js' import { CanvasCourseBase, CanvasCourseSection, @@ -37,12 +38,12 @@ import { CanvasEnrollment, CanvasUserCondensed, CourseWithSections -} from '../canvas/canvas.interfaces' -import { UserDec } from '../user/user.decorator' -import { User } from '../user/user.model' +} from '../canvas/canvas.interfaces.js' +import { UserDec } from '../user/user.decorator.js' +import { User } from '../user/user.model.js' import { ExternalUserDto, ExternalUsersDto -} from './dtos/api.external.users.dto' +} from './dtos/api.external.users.dto.js' @UseGuards(JwtAuthGuard, SessionGuard) @Controller('api') diff --git a/ccm_web/server/src/api/api.course.handler.ts b/ccm_web/server/src/api/api.course.handler.ts index 90e3163d6..99f3f0857 100644 --- a/ccm_web/server/src/api/api.course.handler.ts +++ b/ccm_web/server/src/api/api.course.handler.ts @@ -1,26 +1,26 @@ import CanvasRequestor from '@kth/canvas-api' -import { APIErrorData, isAPIErrorData } from './api.interfaces' -import { SectionApiHandler } from './api.section.handler' -import { createLimitedPromises, handleAPIError, HttpMethod, makeResponse } from './api.utils' +import { APIErrorData, isAPIErrorData } from './api.interfaces.js' +import { SectionApiHandler } from './api.section.handler.js' +import { createLimitedPromises, handleAPIError, HttpMethod, makeResponse } from './api.utils.js' import { CanvasCourse, CanvasCourseBase, CanvasCourseInput, CanvasCourseSection, CanvasCourseSectionBase, CourseWithSections -} from '../canvas/canvas.interfaces' +} from '../canvas/canvas.interfaces.js' -import baseLogger from '../logger' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) /* Handler class for Canvas API calls dealing with a specific course (i.e. those beginning with "/courses/:id") or course-scoped operations that make use of other handler instances for Canvas entities */ export class CourseApiHandler { - requestor: CanvasRequestor + requestor: CanvasRequestor.default courseId: number - constructor (requestor: CanvasRequestor, courseId: number) { + constructor (requestor: CanvasRequestor.default, courseId: number) { this.requestor = requestor this.courseId = courseId } @@ -70,7 +70,7 @@ export class CourseApiHandler { logger.debug(`Sending request to Canvas (get all pages) - Endpoint: ${endpoint}; Method: GET`) const sectionsFull = await this.requestor.listItems(endpoint, queryParams).toArray() logger.debug('Received response (status code unknown)') - return sectionsFull.map(s => ({ + return sectionsFull.map((s: CanvasCourseSection) => ({ id: s.id, name: s.name, course_id: s.course_id, diff --git a/ccm_web/server/src/api/api.interfaces.ts b/ccm_web/server/src/api/api.interfaces.ts index f0d5813e1..24a0e6530 100644 --- a/ccm_web/server/src/api/api.interfaces.ts +++ b/ccm_web/server/src/api/api.interfaces.ts @@ -1,6 +1,6 @@ -import { hasKeys } from '../typeUtils' +import { hasKeys } from '../typeUtils.js' -import { CirrusErrorData } from '../invitation/cirrus-invitation.interfaces' +import { CirrusErrorData } from '../invitation/cirrus-invitation.interfaces.js' export interface Globals { environment: 'production' | 'development' diff --git a/ccm_web/server/src/api/api.module.ts b/ccm_web/server/src/api/api.module.ts index 70fc3e902..bb4602c75 100644 --- a/ccm_web/server/src/api/api.module.ts +++ b/ccm_web/server/src/api/api.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common' import { ConfigModule } from '@nestjs/config' -import { APIController } from './api.controller' -import { APIService } from './api.service' -import { CanvasModule } from '../canvas/canvas.module' -import { CanvasService } from '../canvas/canvas.service' -import { CirrusInvitationModule } from '../invitation/cirrus-invitation.module' -import { CirrusInvitationService } from '../invitation/cirrus-invitation.service' +import { APIController } from './api.controller.js' +import { APIService } from './api.service.js' +import { CanvasModule } from '../canvas/canvas.module.js' +import { CanvasService } from '../canvas/canvas.service.js' +import { CirrusInvitationModule } from '../invitation/cirrus-invitation.module.js' +import { CirrusInvitationService } from '../invitation/cirrus-invitation.service.js' @Module({ imports: [CanvasModule, ConfigModule, CirrusInvitationModule], diff --git a/ccm_web/server/src/api/api.section.handler.ts b/ccm_web/server/src/api/api.section.handler.ts index 5246e2e65..ccab25651 100644 --- a/ccm_web/server/src/api/api.section.handler.ts +++ b/ccm_web/server/src/api/api.section.handler.ts @@ -1,27 +1,27 @@ import CanvasRequestor from '@kth/canvas-api' -import { APIErrorData } from './api.interfaces' -import { createLimitedPromises, handleAPIError, HttpMethod, makeResponse } from './api.utils' -import { SectionUserDto } from './dtos/api.section.users.dto' +import { APIErrorData } from './api.interfaces.js' +import { createLimitedPromises, handleAPIError, HttpMethod, makeResponse } from './api.utils.js' +import { SectionUserDto } from './dtos/api.section.users.dto.js' import { CanvasCourseSection, CanvasCourseSectionBase, CanvasEnrollment, CanvasEnrollmentWithUser, UserEnrollmentType, CustomCanvasRoleType, getCanvasRole -} from '../canvas/canvas.interfaces' +} from '../canvas/canvas.interfaces.js' -import baseLogger from '../logger' -import { CustomCanvasRoleData } from '../config' +import baseLogger from '../logger.js' +import { CustomCanvasRoleData } from '../config.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) /* Handler class for Canvas API calls dealing with a specific section (i.e. those beginning with "/sections/:id") */ export class SectionApiHandler { - requestor: CanvasRequestor + requestor: CanvasRequestor.default sectionId: number showSectionIdErrReport = false customCanvasRoles?: CustomCanvasRoleData - constructor (requestor: CanvasRequestor, sectionId: number, showSectionIdErrReport = false, customCanvasRoles?: CustomCanvasRoleData) { + constructor (requestor: CanvasRequestor.default, sectionId: number, showSectionIdErrReport = false, customCanvasRoles?: CustomCanvasRoleData) { this.requestor = requestor this.sectionId = sectionId this.showSectionIdErrReport = showSectionIdErrReport @@ -49,7 +49,7 @@ export class SectionApiHandler { const errResponse = handleAPIError(error) return { statusCode: errResponse.canvasStatusCode, errors: [errResponse] } } - return enrollmentsResult.map(e => e.user.login_id) + return enrollmentsResult.map((e: CanvasEnrollmentWithUser) => e.user.login_id) } async enrollUser (user: SectionUserDto): Promise { diff --git a/ccm_web/server/src/api/api.service.ts b/ccm_web/server/src/api/api.service.ts index e0967016c..767b674ef 100644 --- a/ccm_web/server/src/api/api.service.ts +++ b/ccm_web/server/src/api/api.service.ts @@ -2,16 +2,16 @@ import { SessionData } from 'express-session' import { Injectable } from '@nestjs/common' import { ConfigService } from '@nestjs/config' -import { AdminApiHandler } from './api.admin.handler' -import { CourseApiHandler } from './api.course.handler' +import { AdminApiHandler } from './api.admin.handler.js' +import { CourseApiHandler } from './api.course.handler.js' import { APIErrorData, APIErrorPayload, ExternalUserCreationResult, ExternalUserData, Globals, isAPIErrorData -} from './api.interfaces' -import { SectionApiHandler } from './api.section.handler' -import { createLimitedPromises, determineStatusCode, handleAPIError, makeResponse } from './api.utils' -import { SectionEnrollmentDto } from './dtos/api.section.enrollment.dto' -import { SectionUserDto } from './dtos/api.section.users.dto' -import { ExternalUserDto } from './dtos/api.external.users.dto' +} from './api.interfaces.js' +import { SectionApiHandler } from './api.section.handler.js' +import { createLimitedPromises, determineStatusCode, handleAPIError, makeResponse } from './api.utils.js' +import { SectionEnrollmentDto } from './dtos/api.section.enrollment.dto.js' +import { SectionUserDto } from './dtos/api.section.users.dto.js' +import { ExternalUserDto } from './dtos/api.external.users.dto.js' import { CanvasCourse, CanvasCourseBase, @@ -20,16 +20,16 @@ import { CanvasEnrollment, CanvasUserCondensed, CourseWithSections -} from '../canvas/canvas.interfaces' -import { CanvasService } from '../canvas/canvas.service' -import { CirrusErrorData, CirrusInvitationResponse, isCirrusErrorData } from '../invitation/cirrus-invitation.interfaces' -import { CirrusInvitationService } from '../invitation/cirrus-invitation.service' -import { User } from '../user/user.model' +} from '../canvas/canvas.interfaces.js' +import { CanvasService } from '../canvas/canvas.service.js' +import { CirrusErrorData, CirrusInvitationResponse, isCirrusErrorData } from '../invitation/cirrus-invitation.interfaces.js' +import { CirrusInvitationService } from '../invitation/cirrus-invitation.service.js' +import { User } from '../user/user.model.js' -import { Config } from '../config' -import baseLogger from '../logger' +import { Config } from '../config.js' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) @Injectable() export class APIService { diff --git a/ccm_web/server/src/api/api.utils.ts b/ccm_web/server/src/api/api.utils.ts index d7305346d..75de686ae 100644 --- a/ccm_web/server/src/api/api.utils.ts +++ b/ccm_web/server/src/api/api.utils.ts @@ -4,12 +4,12 @@ import pLimit from 'p-limit' import { APIErrorData, APIErrorPayload, isAPIErrorData -} from './api.interfaces' -import { isCanvasMessageErrorBody, isCanvasMessageErrorsBody, isCanvasUniqueIdErrorsBody } from '../canvas/canvas.interfaces' +} from './api.interfaces.js' +import { isCanvasMessageErrorBody, isCanvasMessageErrorsBody, isCanvasUniqueIdErrorsBody } from '../canvas/canvas.interfaces.js' -import baseLogger from '../logger' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) export const NS_PER_SEC = BigInt(1e9) diff --git a/ccm_web/server/src/api/dtos/api.section.enrollment.dto.ts b/ccm_web/server/src/api/dtos/api.section.enrollment.dto.ts index f75cbadbb..38f0239b1 100644 --- a/ccm_web/server/src/api/dtos/api.section.enrollment.dto.ts +++ b/ccm_web/server/src/api/dtos/api.section.enrollment.dto.ts @@ -4,7 +4,7 @@ import { import { ApiProperty } from '@nestjs/swagger' import { Type } from 'class-transformer' -import { ClientEnrollmentType } from '../../canvas/canvas.interfaces' +import { ClientEnrollmentType } from '../../canvas/canvas.interfaces.js' export class SectionEnrollmentDto { @ApiProperty() diff --git a/ccm_web/server/src/api/dtos/api.section.users.dto.ts b/ccm_web/server/src/api/dtos/api.section.users.dto.ts index 81080473b..5d1cda3a9 100644 --- a/ccm_web/server/src/api/dtos/api.section.users.dto.ts +++ b/ccm_web/server/src/api/dtos/api.section.users.dto.ts @@ -8,7 +8,7 @@ import { } from 'class-validator' import { ApiProperty } from '@nestjs/swagger' import { Type } from 'class-transformer' -import { ClientEnrollmentType } from '../../canvas/canvas.interfaces' +import { ClientEnrollmentType } from '../../canvas/canvas.interfaces.js' export class SectionUserDto { @ApiProperty() diff --git a/ccm_web/server/src/api/invalid.token.interceptor.ts b/ccm_web/server/src/api/invalid.token.interceptor.ts index 98ad7c128..45e72b5e8 100644 --- a/ccm_web/server/src/api/invalid.token.interceptor.ts +++ b/ccm_web/server/src/api/invalid.token.interceptor.ts @@ -6,10 +6,10 @@ import { import { Observable } from 'rxjs' import { catchError } from 'rxjs/operators' -import { isAPIErrorData } from './api.interfaces' -import { CanvasTokenNotFoundError, InvalidTokenRefreshError } from '../canvas/canvas.errors' -import { CanvasService } from '../canvas/canvas.service' -import { RequestWithoutUserError } from '../user/user.errors' +import { isAPIErrorData } from './api.interfaces.js' +import { CanvasTokenNotFoundError, InvalidTokenRefreshError } from '../canvas/canvas.errors.js' +import { CanvasService } from '../canvas/canvas.service.js' +import { RequestWithoutUserError } from '../user/user.errors.js' const INVALID_TOKEN_TEXT = 'invalid access token' const INSUFFICIENT_SCOPES_TEXT = 'insufficient scopes on access token' diff --git a/ccm_web/server/src/api/too.many.results.interceptor.ts b/ccm_web/server/src/api/too.many.results.interceptor.ts index 2214ed196..518269eb1 100644 --- a/ccm_web/server/src/api/too.many.results.interceptor.ts +++ b/ccm_web/server/src/api/too.many.results.interceptor.ts @@ -4,7 +4,7 @@ import { import { Observable } from 'rxjs' import { catchError } from 'rxjs/operators' -import { TooManyResultsError } from './api.errors' +import { TooManyResultsError } from './api.errors.js' @Injectable() export class TooManyResultsInterceptor implements NestInterceptor { diff --git a/ccm_web/server/src/app.module.ts b/ccm_web/server/src/app.module.ts index 4c2efd704..93c244c61 100644 --- a/ccm_web/server/src/app.module.ts +++ b/ccm_web/server/src/app.module.ts @@ -1,27 +1,28 @@ -import path from 'path' +import path from 'node:path' import helmet from 'helmet' -import { NoCacheInterceptor } from './no.cache.interceptor' import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common' import { APP_INTERCEPTOR } from '@nestjs/core' import { ConfigModule, ConfigService } from '@nestjs/config' import { SequelizeModule } from '@nestjs/sequelize' import { ServeStaticModule } from '@nestjs/serve-static' -import { APIModule } from './api/api.module' -import { AuthModule } from './auth/auth.module' -import { CanvasModule } from './canvas/canvas.module' -import { CanvasToken } from './canvas/canvas.model' -import { HealthModule } from './health/health.module' -import { LTIModule } from './lti/lti.module' -import { UserModule } from './user/user.module' -import { User } from './user/user.model' -import { UserService } from './user/user.service' +import { APIModule } from './api/api.module.js' +import { AuthModule } from './auth/auth.module.js' +import { CanvasModule } from './canvas/canvas.module.js' +import { CanvasToken } from './canvas/canvas.model.js' +import { NoCacheInterceptor } from './no.cache.interceptor.js' +import { HealthModule } from './health/health.module.js' +import { LTIModule } from './lti/lti.module.js' +import { UserModule } from './user/user.module.js' +import { User } from './user/user.model.js' +import { UserService } from './user/user.service.js' -import { Config, validateConfig } from './config' -import baseLogger from './logger' +import { Config, validateConfig } from './config.js' +import baseLogger from './logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const __dirname = import.meta.dirname +const logger = baseLogger.child({ filePath: import.meta.filename }) @Module({ imports: [ diff --git a/ccm_web/server/src/auth/auth.controller.ts b/ccm_web/server/src/auth/auth.controller.ts index 6f1692165..9f6c732fb 100644 --- a/ccm_web/server/src/auth/auth.controller.ts +++ b/ccm_web/server/src/auth/auth.controller.ts @@ -1,9 +1,9 @@ -import { Request, Response } from 'express' +import type { Request, Response } from 'express' import { Controller, ForbiddenException, Get, Req, Res, UseGuards } from '@nestjs/common' import { ApiExcludeEndpoint } from '@nestjs/swagger' -import { JwtAuthGuard } from './jwt-auth.guard' -import { SessionGuard } from './session.guard' -import { CSRFTokenResponse } from './auth.interfaces' +import { JwtAuthGuard } from './jwt-auth.guard.js' +import { SessionGuard } from './session.guard.js' +import { CSRFTokenResponse } from './auth.interfaces.js' @UseGuards(JwtAuthGuard, SessionGuard) @Controller('auth') diff --git a/ccm_web/server/src/auth/auth.module.ts b/ccm_web/server/src/auth/auth.module.ts index d4a52bdd0..c752e689d 100644 --- a/ccm_web/server/src/auth/auth.module.ts +++ b/ccm_web/server/src/auth/auth.module.ts @@ -2,16 +2,16 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common' import { ConfigModule, ConfigService } from '@nestjs/config' import { JwtModule } from '@nestjs/jwt' import { PassportModule } from '@nestjs/passport' +import { APP_FILTER } from '@nestjs/core' -import { AuthController } from './auth.controller' -import { AuthService } from './auth.service' -import { CSRFExceptionFilter } from './csrf.exception.filter' -import { DoubleCSRFProtectionMiddleware } from './double.csrf.middleware' -import { JwtStrategy } from './jwt.strategy' -import { UserModule } from '../user/user.module' +import { AuthController } from './auth.controller.js' +import { AuthService } from './auth.service.js' +import { CSRFExceptionFilter } from './csrf.exception.filter.js' +import { DoubleCSRFProtectionMiddleware } from './double.csrf.middleware.js' +import { JwtStrategy } from './jwt.strategy.js' +import { UserModule } from '../user/user.module.js' -import { Config } from '../config' -import { APP_FILTER } from '@nestjs/core' +import { Config } from '../config.js' @Module({ imports: [ diff --git a/ccm_web/server/src/auth/auth.service.ts b/ccm_web/server/src/auth/auth.service.ts index 6174a2a2a..b130483f5 100644 --- a/ccm_web/server/src/auth/auth.service.ts +++ b/ccm_web/server/src/auth/auth.service.ts @@ -3,10 +3,10 @@ import { Injectable } from '@nestjs/common' import { ConfigService } from '@nestjs/config' import { JwtService } from '@nestjs/jwt' -import { UserToUpsert } from '../user/user.interfaces' -import { UserService } from '../user/user.service' +import { UserToUpsert } from '../user/user.interfaces.js' +import { UserService } from '../user/user.service.js' -import { Config } from '../config' +import { Config } from '../config.js' @Injectable() export class AuthService { diff --git a/ccm_web/server/src/auth/csrf.exception.filter.ts b/ccm_web/server/src/auth/csrf.exception.filter.ts index 22e47926d..a8d1902da 100644 --- a/ccm_web/server/src/auth/csrf.exception.filter.ts +++ b/ccm_web/server/src/auth/csrf.exception.filter.ts @@ -2,9 +2,9 @@ import { Response } from 'express' import { ArgumentsHost, Catch, HttpStatus } from '@nestjs/common' import { BaseExceptionFilter } from '@nestjs/core' -import { MaybeCSRFError } from './auth.interfaces' +import { MaybeCSRFError } from './auth.interfaces.js' -import baseLogger from '../logger' +import baseLogger from '../logger.js' /* Resource(s): @@ -13,7 +13,7 @@ Resource(s): - https://github.com/expressjs/csurf#custom-error-handling */ -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) @Catch() export class CSRFExceptionFilter extends BaseExceptionFilter { diff --git a/ccm_web/server/src/auth/double.csrf.middleware.ts b/ccm_web/server/src/auth/double.csrf.middleware.ts index d3bf6879a..8199097bc 100644 --- a/ccm_web/server/src/auth/double.csrf.middleware.ts +++ b/ccm_web/server/src/auth/double.csrf.middleware.ts @@ -3,8 +3,8 @@ import { doubleCsrf } from 'csrf-csrf' import { NextFunction, Request, Response } from 'express' import { ConfigService } from '@nestjs/config' -import { Config } from '../config' -import { AuthService } from './auth.service' +import { Config } from '../config.js' +import { AuthService } from './auth.service.js' @Injectable() export class DoubleCSRFProtectionMiddleware implements NestMiddleware { diff --git a/ccm_web/server/src/auth/jwt.strategy.ts b/ccm_web/server/src/auth/jwt.strategy.ts index a36ac90a6..40f01214f 100644 --- a/ccm_web/server/src/auth/jwt.strategy.ts +++ b/ccm_web/server/src/auth/jwt.strategy.ts @@ -4,12 +4,12 @@ import { Injectable } from '@nestjs/common' import { ConfigService } from '@nestjs/config' import { PassportStrategy } from '@nestjs/passport' -import { JwtPayload } from './auth.interfaces' -import { UserNotFoundError } from '../user/user.errors' -import { User } from '../user/user.model' -import { UserService } from '../user/user.service' +import { JwtPayload } from './auth.interfaces.js' +import { UserNotFoundError } from '../user/user.errors.js' +import { User } from '../user/user.model.js' +import { UserService } from '../user/user.service.js' -import { Config } from '../config' +import { Config } from '../config.js' @Injectable() export class JwtStrategy extends PassportStrategy(PassportJwtStrategy) { diff --git a/ccm_web/server/src/canvas/canvas.controller.ts b/ccm_web/server/src/canvas/canvas.controller.ts index e6d95bb0f..1e2bc2f81 100644 --- a/ccm_web/server/src/canvas/canvas.controller.ts +++ b/ccm_web/server/src/canvas/canvas.controller.ts @@ -1,24 +1,24 @@ import crypto from 'crypto' import { promisify } from 'util' -import { Request, Response } from 'express' +import type { Request, Response } from 'express' import { BadRequestException, Controller, Get, InternalServerErrorException, Query, Req, Res, UnauthorizedException, UseGuards } from '@nestjs/common' import { ApiExcludeEndpoint } from '@nestjs/swagger' -import { isOAuthGoodResponseQuery, isOAuthErrorResponseQuery } from './canvas.interfaces' -import { CanvasService } from './canvas.service' -import { CanvasOAuthReturnQueryDto } from './dtos/canvas.oauth.query.dto' -import { JwtAuthGuard } from '../auth/jwt-auth.guard' -import { SessionGuard } from '../auth/session.guard' -import { UserDec } from '../user/user.decorator' -import { User } from '../user/user.model' +import { isOAuthGoodResponseQuery, isOAuthErrorResponseQuery } from './canvas.interfaces.js' +import { CanvasService } from './canvas.service.js' +import { CanvasOAuthReturnQueryDto } from './dtos/canvas.oauth.query.dto.js' +import { JwtAuthGuard } from '../auth/jwt-auth.guard.js' +import { SessionGuard } from '../auth/session.guard.js' +import { UserDec } from '../user/user.decorator.js' +import { User } from '../user/user.model.js' -import baseLogger from '../logger' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) const generateToken = promisify(crypto.randomBytes) diff --git a/ccm_web/server/src/canvas/canvas.interfaces.ts b/ccm_web/server/src/canvas/canvas.interfaces.ts index dec01b6fd..b2cdb9d1d 100644 --- a/ccm_web/server/src/canvas/canvas.interfaces.ts +++ b/ccm_web/server/src/canvas/canvas.interfaces.ts @@ -1,5 +1,6 @@ -import { CanvasOAuthReturnQueryDto } from './dtos/canvas.oauth.query.dto' -import { hasKeys } from '../typeUtils' +import CanvasRequestor from '@kth/canvas-api' +import { CanvasOAuthReturnQueryDto } from './dtos/canvas.oauth.query.dto.js' +import { hasKeys } from '../typeUtils.js' // OAuth diff --git a/ccm_web/server/src/canvas/canvas.model.ts b/ccm_web/server/src/canvas/canvas.model.ts index 20edc9a6c..e9524ed9f 100644 --- a/ccm_web/server/src/canvas/canvas.model.ts +++ b/ccm_web/server/src/canvas/canvas.model.ts @@ -1,7 +1,7 @@ import { BelongsTo, Column, ForeignKey, Model, Table } from 'sequelize-typescript' import { DataTypes, Optional } from 'sequelize' -import { User } from '../user/user.model' +import { User } from '../user/user.model.js' interface CanvasTokenAttributes { id: bigint @@ -24,13 +24,13 @@ export class CanvasToken extends Model User) @Column({ type: DataTypes.BIGINT }) - userId!: bigint + declare userId: bigint @BelongsTo(() => User) user!: User @@ -38,17 +38,17 @@ export class CanvasToken extends Model new Date(this.expiresAt) diff --git a/ccm_web/server/src/canvas/canvas.module.ts b/ccm_web/server/src/canvas/canvas.module.ts index 4c1d7a565..61fb495bc 100644 --- a/ccm_web/server/src/canvas/canvas.module.ts +++ b/ccm_web/server/src/canvas/canvas.module.ts @@ -3,9 +3,9 @@ import { Module } from '@nestjs/common' import { ConfigModule } from '@nestjs/config' import { SequelizeModule } from '@nestjs/sequelize' -import { CanvasController } from './canvas.controller' -import { CanvasToken } from './canvas.model' -import { CanvasService } from './canvas.service' +import { CanvasController } from './canvas.controller.js' +import { CanvasToken } from './canvas.model.js' +import { CanvasService } from './canvas.service.js' @Module({ imports: [ diff --git a/ccm_web/server/src/canvas/canvas.service.ts b/ccm_web/server/src/canvas/canvas.service.ts index ddc367ca4..e4460226e 100644 --- a/ccm_web/server/src/canvas/canvas.service.ts +++ b/ccm_web/server/src/canvas/canvas.service.ts @@ -7,17 +7,17 @@ import { Injectable } from '@nestjs/common' import { ConfigService } from '@nestjs/config' import { InjectModel } from '@nestjs/sequelize' -import { CanvasOAuthAPIError, CanvasTokenNotFoundError, InvalidTokenRefreshError } from './canvas.errors' -import { TokenCodeResponseBody, TokenRefreshResponseBody } from './canvas.interfaces' -import { CanvasToken } from './canvas.model' -import canvasScopes from './canvas.scopes' -import { User } from '../user/user.model' +import { CanvasOAuthAPIError, CanvasTokenNotFoundError, InvalidTokenRefreshError } from './canvas.errors.js' +import { TokenCodeResponseBody, TokenRefreshResponseBody } from './canvas.interfaces.js' +import { CanvasToken } from './canvas.model.js' +import canvasScopes from './canvas.scopes.js' +import { User } from '../user/user.model.js' -import { Config } from '../config' -import { DatabaseError } from '../errors' -import baseLogger from '../logger' +import { Config } from '../config.js' +import { DatabaseError } from '../errors.js' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) type SupportedAPIEndpoint = '/api/v1/' | '/api/graphql/' @@ -25,7 +25,7 @@ const requestorOptions: GotOptions = { retry: { limit: 3, methods: ['POST', 'GET', 'PUT', 'DELETE'], - statusCodes: got.defaults.options.retry.statusCodes.concat([403]), + statusCodes: got.default.defaults.options.retry.statusCodes.concat([403]), calculateDelay: ({ attemptCount, retryOptions, error, computedValue }) => { const delay = computedValue === 0 ? 0 : 2000 @@ -231,7 +231,7 @@ export class CanvasService { } } - async createRequestorForUser (user: User, endpoint: SupportedAPIEndpoint): Promise { + async createRequestorForUser (user: User, endpoint: SupportedAPIEndpoint): Promise { if (user.canvasToken === null) throw new CanvasTokenNotFoundError(user.loginId) let token = user.canvasToken @@ -240,12 +240,14 @@ export class CanvasService { logger.debug('Token for user has expired; refreshing token...') token = await this.refreshToken(token) } - const requestor = new CanvasRequestor(this.url + endpoint, token.accessToken, requestorOptions) + const CanvasAPI = CanvasRequestor.default + const requestor = new CanvasAPI(this.url + endpoint, token.accessToken, requestorOptions) return requestor } - - createRequestorForAdmin (endpoint: SupportedAPIEndpoint): CanvasRequestor { - const requestor = new CanvasRequestor(this.url + endpoint, this.adminToken, requestorOptions) + + createRequestorForAdmin (endpoint: SupportedAPIEndpoint): CanvasRequestor.default { + const CanvasAPI = CanvasRequestor.default + const requestor = new CanvasAPI(this.url + endpoint, this.adminToken, requestorOptions) return requestor } } diff --git a/ccm_web/server/src/config.ts b/ccm_web/server/src/config.ts index eb4f97824..bdb304f40 100644 --- a/ccm_web/server/src/config.ts +++ b/ccm_web/server/src/config.ts @@ -1,4 +1,4 @@ -import baseLogger from './logger' +import baseLogger from './logger.js' export type LogLevel = 'debug' | 'info' | 'warn' | 'error' @@ -62,7 +62,7 @@ export interface Config { baseHelpURL: string } -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) const isString = (v: unknown): v is string => typeof v === 'string' const isNotEmpty = (v: string): boolean => v.length > 0 diff --git a/ccm_web/server/src/health/health.module.ts b/ccm_web/server/src/health/health.module.ts index c0a9761f1..8a9ecb66f 100644 --- a/ccm_web/server/src/health/health.module.ts +++ b/ccm_web/server/src/health/health.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common' import { TerminusModule } from '@nestjs/terminus' -import { HealthController } from './health.controller' +import { HealthController } from './health.controller.js' @Module({ controllers: [HealthController], diff --git a/ccm_web/server/src/init.ts b/ccm_web/server/src/init.ts index 982191228..54456f785 100644 --- a/ccm_web/server/src/init.ts +++ b/ccm_web/server/src/init.ts @@ -1,10 +1,10 @@ import { NestFactory } from '@nestjs/core' -import { AppModule } from './app.module' +import { AppModule } from './app.module.js' -import baseLogger from './logger' +import baseLogger from './logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) /* Running this before clustering ensures that ltijs database tables have been set up initially diff --git a/ccm_web/server/src/invitation/cirrus-invitation.interfaces.ts b/ccm_web/server/src/invitation/cirrus-invitation.interfaces.ts index 079500a87..270d4b793 100644 --- a/ccm_web/server/src/invitation/cirrus-invitation.interfaces.ts +++ b/ccm_web/server/src/invitation/cirrus-invitation.interfaces.ts @@ -1,4 +1,4 @@ -import { hasKeys } from '../typeUtils' +import { hasKeys } from '../typeUtils.js' export const cirrusAPIVersion = '/api/v1' export const cirrusAPIEndPoint = '/batchInviteCsv' diff --git a/ccm_web/server/src/invitation/cirrus-invitation.module.ts b/ccm_web/server/src/invitation/cirrus-invitation.module.ts index b2df0ddc0..73ebd6e47 100644 --- a/ccm_web/server/src/invitation/cirrus-invitation.module.ts +++ b/ccm_web/server/src/invitation/cirrus-invitation.module.ts @@ -2,7 +2,7 @@ import { HttpModule } from '@nestjs/axios' import { Module } from '@nestjs/common' import { ConfigModule } from '@nestjs/config' -import { CirrusInvitationService } from './cirrus-invitation.service' +import { CirrusInvitationService } from './cirrus-invitation.service.js' @Module({ imports: [ diff --git a/ccm_web/server/src/invitation/cirrus-invitation.service.ts b/ccm_web/server/src/invitation/cirrus-invitation.service.ts index 40a3f85fe..d5edf7914 100644 --- a/ccm_web/server/src/invitation/cirrus-invitation.service.ts +++ b/ccm_web/server/src/invitation/cirrus-invitation.service.ts @@ -8,13 +8,13 @@ import { Injectable } from '@nestjs/common' import { cirrusAPIEndPoint, cirrusAPIVersion, CirrusErrorData, CirrusInvitationResponse, isCirrusAPIErrorData -} from './cirrus-invitation.interfaces' -import { InvitationAPIError } from './invitation.errors' +} from './cirrus-invitation.interfaces.js' +import { InvitationAPIError } from './invitation.errors.js' -import { Config } from '../config' -import baseLogger from '../logger' +import { Config } from '../config.js' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) @Injectable() export class CirrusInvitationService { diff --git a/ccm_web/server/src/logger.ts b/ccm_web/server/src/logger.ts index d32349eda..154d74053 100644 --- a/ccm_web/server/src/logger.ts +++ b/ccm_web/server/src/logger.ts @@ -1,4 +1,4 @@ -import path from 'path' +import path from 'node:path' import winston, { format } from 'winston' const logFormat = format.printf( diff --git a/ccm_web/server/src/lti/lti.middleware.ts b/ccm_web/server/src/lti/lti.middleware.ts index e3585c3f8..f3c5545e6 100644 --- a/ccm_web/server/src/lti/lti.middleware.ts +++ b/ccm_web/server/src/lti/lti.middleware.ts @@ -1,7 +1,7 @@ import { Express, Request, Response, NextFunction } from 'express' import { Injectable, NestMiddleware } from '@nestjs/common' -import { LTIService } from './lti.service' +import { LTIService } from './lti.service.js' @Injectable() export class LTIMiddleware implements NestMiddleware { diff --git a/ccm_web/server/src/lti/lti.module.ts b/ccm_web/server/src/lti/lti.module.ts index 65d434eee..d001fc49d 100644 --- a/ccm_web/server/src/lti/lti.module.ts +++ b/ccm_web/server/src/lti/lti.module.ts @@ -1,11 +1,11 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common' import { ConfigService } from '@nestjs/config' -import { AuthModule } from '../auth/auth.module' -import { AuthService } from '../auth/auth.service' -import { Config } from '../config' +import { AuthModule } from '../auth/auth.module.js' +import { AuthService } from '../auth/auth.service.js' +import { Config } from '../config.js' -import { LTIMiddleware } from './lti.middleware' -import { LTIService } from './lti.service' +import { LTIMiddleware } from './lti.middleware.js' +import { LTIService } from './lti.service.js' @Module({ imports: [AuthModule], diff --git a/ccm_web/server/src/lti/lti.service.ts b/ccm_web/server/src/lti/lti.service.ts index 4879dc92f..9556a16dc 100644 --- a/ccm_web/server/src/lti/lti.service.ts +++ b/ccm_web/server/src/lti/lti.service.ts @@ -4,13 +4,13 @@ import { ConfigService } from '@nestjs/config' import { IdToken, Provider as LTIProvider } from 'ltijs' import Database from 'ltijs-sequelize' -import { AuthService } from '../auth/auth.service' +import { AuthService } from '../auth/auth.service.js' -import baseLogger from '../logger' -import { Config } from '../config' -import { LTIEnrollmentType } from '../canvas/canvas.interfaces' +import baseLogger from '../logger.js' +import { Config } from '../config.js' +import { LTIEnrollmentType } from '../canvas/canvas.interfaces.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) const createLaunchErrorResponse = (res: Response, action?: string): Response => { const message = ( diff --git a/ccm_web/server/src/main.ts b/ccm_web/server/src/main.ts index a9648ee23..279ae7fdc 100644 --- a/ccm_web/server/src/main.ts +++ b/ccm_web/server/src/main.ts @@ -1,3 +1,5 @@ +import { fileURLToPath } from 'node:url' +import process from 'node:process' import cookieParser from 'cookie-parser' import ConnectSessionSequelize from 'connect-session-sequelize' import { urlencoded, json } from 'express' @@ -10,12 +12,12 @@ import { NestFactory } from '@nestjs/core' import { NestExpressApplication } from '@nestjs/platform-express' import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger' -import { AppModule } from './app.module' +import { AppModule } from './app.module.js' -import { Config, ServerConfig } from './config' -import baseLogger from './logger' +import { Config, ServerConfig } from './config.js' +import baseLogger from './logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) type PartialServerConfig = Omit @@ -104,8 +106,6 @@ async function bootstrap (): Promise { ) } -if (require.main === module) { - bootstrap() - .then(() => logger.info('The application started successfully!')) - .catch((e) => logger.error('An error occurred while starting the application: ', e)) -} +bootstrap() + .then(() => logger.info('The application started successfully!')) + .catch((e) => logger.error('An error occurred while starting the application: ', e)) \ No newline at end of file diff --git a/ccm_web/server/src/migrations/2021.06.16T19.36.19.create-user.ts b/ccm_web/server/src/migrations/2021.06.16T19.36.19.create-user.ts index 58fc5edc0..bb122a9af 100644 --- a/ccm_web/server/src/migrations/2021.06.16T19.36.19.create-user.ts +++ b/ccm_web/server/src/migrations/2021.06.16T19.36.19.create-user.ts @@ -1,5 +1,5 @@ import { DataTypes } from 'sequelize' -import { Migration } from '../migrator' +import { Migration } from '../migrator.js' export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('user', { diff --git a/ccm_web/server/src/migrations/2021.06.16T19.36.43.create-canvas-token.ts b/ccm_web/server/src/migrations/2021.06.16T19.36.43.create-canvas-token.ts index 198ee370c..193b2c8c6 100644 --- a/ccm_web/server/src/migrations/2021.06.16T19.36.43.create-canvas-token.ts +++ b/ccm_web/server/src/migrations/2021.06.16T19.36.43.create-canvas-token.ts @@ -1,5 +1,5 @@ import { DataTypes } from 'sequelize' -import { Migration } from '../migrator' +import { Migration } from '../migrator.js' export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('canvas_token', { diff --git a/ccm_web/server/src/migrations/2021.06.30T19.52.46.add-canvas-token-expires-at.ts b/ccm_web/server/src/migrations/2021.06.30T19.52.46.add-canvas-token-expires-at.ts index 85888c31c..357ceac42 100644 --- a/ccm_web/server/src/migrations/2021.06.30T19.52.46.add-canvas-token-expires-at.ts +++ b/ccm_web/server/src/migrations/2021.06.30T19.52.46.add-canvas-token-expires-at.ts @@ -1,5 +1,5 @@ import Sequelize, { DataTypes } from 'sequelize' -import { Migration } from '../migrator' +import { Migration } from '../migrator.js' export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().addColumn( diff --git a/ccm_web/server/src/migrations/2021.09.08T21.21.06.add-unique-constraint-to-user-id.ts b/ccm_web/server/src/migrations/2021.09.08T21.21.06.add-unique-constraint-to-user-id.ts index 311d905e9..02965eb89 100644 --- a/ccm_web/server/src/migrations/2021.09.08T21.21.06.add-unique-constraint-to-user-id.ts +++ b/ccm_web/server/src/migrations/2021.09.08T21.21.06.add-unique-constraint-to-user-id.ts @@ -1,4 +1,4 @@ -import { Migration } from '../migrator' +import { Migration } from '../migrator.js' export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().addConstraint( diff --git a/ccm_web/server/src/migrator.ts b/ccm_web/server/src/migrator.ts index a812c525f..aa018a2ff 100644 --- a/ccm_web/server/src/migrator.ts +++ b/ccm_web/server/src/migrator.ts @@ -1,9 +1,12 @@ +import { fileURLToPath } from 'node:url' +import process from 'node:process' import { Umzug, SequelizeStorage } from 'umzug' import { Sequelize } from 'sequelize' -import { validateConfig } from './config' -import baseLogger from './logger' +import { validateConfig } from './config.js' +import baseLogger from './logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const __dirname = import.meta.dirname +const logger = baseLogger.child({ filePath: import.meta.filename }) const databaseConfig = validateConfig().db @@ -31,7 +34,7 @@ export const umzug = new Umzug({ export type Migration = typeof umzug._types.migration -if (require.main === module) { +if (process.argv[1] === fileURLToPath(import.meta.url)) { logger.info('Running migrations CLI...') umzug .runAsCLI() @@ -39,4 +42,6 @@ if (require.main === module) { .catch((e) => logger.error('An error occured when running the migration tasks: ', e) ) +}else{ + logger.error('Running migrations failed...') } diff --git a/ccm_web/server/src/user/user.decorator.ts b/ccm_web/server/src/user/user.decorator.ts index 66970bc03..61296e19f 100644 --- a/ccm_web/server/src/user/user.decorator.ts +++ b/ccm_web/server/src/user/user.decorator.ts @@ -1,8 +1,8 @@ import { Request } from 'express' import { createParamDecorator, ExecutionContext } from '@nestjs/common' -import { User } from './user.model' -import { RequestWithoutUserError } from './user.errors' +import { User } from './user.model.js' +import { RequestWithoutUserError } from './user.errors.js' export const UserDec = createParamDecorator( (data: unknown, ctx: ExecutionContext): User => { diff --git a/ccm_web/server/src/user/user.model.ts b/ccm_web/server/src/user/user.model.ts index 960707699..cfe6cd4d0 100644 --- a/ccm_web/server/src/user/user.model.ts +++ b/ccm_web/server/src/user/user.model.ts @@ -1,6 +1,6 @@ import { Column, HasOne, Model, Table, Unique } from 'sequelize-typescript' import { Optional, DataTypes } from 'sequelize' -import { CanvasToken } from '../canvas/canvas.model' +import { CanvasToken } from '../canvas/canvas.model.js' // https://www.npmjs.com/package/sequelize-typescript#more-strict @@ -28,29 +28,29 @@ export class User extends Model { autoIncrement: true, type: DataTypes.BIGINT }) - id!: bigint + declare id: bigint @Column({ type: DataTypes.STRING }) - firstName!: string + declare firstName: string @Column({ type: DataTypes.STRING }) - lastName!: string + declare lastName: string @Column({ type: DataTypes.STRING }) - email!: string + declare email: string @Unique @Column({ type: DataTypes.STRING }) - loginId!: string + declare loginId: string @HasOne(() => CanvasToken) - canvasToken!: CanvasToken | null + declare canvasToken: CanvasToken | null } diff --git a/ccm_web/server/src/user/user.module.ts b/ccm_web/server/src/user/user.module.ts index f5d2555de..eeb13ef7a 100644 --- a/ccm_web/server/src/user/user.module.ts +++ b/ccm_web/server/src/user/user.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common' import { SequelizeModule } from '@nestjs/sequelize' -import { CanvasToken } from '../canvas/canvas.model' -import { UserService } from './user.service' -import { User } from './user.model' +import { CanvasToken } from '../canvas/canvas.model.js' +import { UserService } from './user.service.js' +import { User } from './user.model.js' @Module({ imports: [SequelizeModule.forFeature([CanvasToken, User])], diff --git a/ccm_web/server/src/user/user.service.ts b/ccm_web/server/src/user/user.service.ts index 59380a6e1..12dd400f8 100644 --- a/ccm_web/server/src/user/user.service.ts +++ b/ccm_web/server/src/user/user.service.ts @@ -1,14 +1,14 @@ import { Injectable } from '@nestjs/common' import { InjectModel } from '@nestjs/sequelize' -import { CanvasToken } from '../canvas/canvas.model' -import { UserToUpsert } from './user.interfaces' -import { User } from './user.model' +import { CanvasToken } from '../canvas/canvas.model.js' +import { UserToUpsert } from './user.interfaces.js' +import { User } from './user.model.js' -import { DatabaseError } from '../errors' -import baseLogger from '../logger' +import { DatabaseError } from '../errors.js' +import baseLogger from '../logger.js' -const logger = baseLogger.child({ filePath: __filename }) +const logger = baseLogger.child({ filePath: import.meta.filename }) @Injectable() export class UserService { diff --git a/ccm_web/start.sh b/ccm_web/start.sh index 70b3762b0..b507136be 100755 --- a/ccm_web/start.sh +++ b/ccm_web/start.sh @@ -2,10 +2,10 @@ set -e echo "Running any un-applied migrations" -node server/src/migrator up +node server/src/migrator.js up echo "Checking initialization and config before clustering" node server/src/init.js echo "Starting pm2 cluster" -exec pm2-runtime ecosystem.config.js +exec pm2-runtime ecosystem.config.cjs diff --git a/ccm_web/tsconfig.json b/ccm_web/tsconfig.json index c5080afa2..17435ddf8 100644 --- a/ccm_web/tsconfig.json +++ b/ccm_web/tsconfig.json @@ -5,9 +5,9 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "incremental": true, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", + "target": "ES2022", + "module": "node16", + "moduleResolution": "node16", "resolveJsonModule": true, "isolatedModules": true, "strict": true, @@ -19,6 +19,11 @@ "noFallthroughCasesInSwitch": true, "outDir": "./dist" }, + "ts-node": { + // Tell ts-node CLI to install the --loader automatically, explained below + "esm": true, + "transpileOnly": true + }, "include": [ /* client is compiled separately through webpack. */ "server", diff --git a/ccm_web/webpack/webpack.common.ts b/ccm_web/webpack/webpack.common.ts index eb165cf60..5e9580471 100644 --- a/ccm_web/webpack/webpack.common.ts +++ b/ccm_web/webpack/webpack.common.ts @@ -1,8 +1,9 @@ -import * as path from 'path' +import path from 'node:path' import * as webpack from 'webpack' import { CleanWebpackPlugin } from 'clean-webpack-plugin' import HtmlWebpackPlugin from 'html-webpack-plugin' +const __dirname = import.meta.dirname const clientPath = path.resolve(__dirname, '..', 'client') const commonConfig: webpack.Configuration = { @@ -31,7 +32,11 @@ const commonConfig: webpack.Configuration = { ] }, resolve: { - extensions: ['.tsx', '.ts', '.js'] + extensions: ['.tsx', '.ts', '.js'], + extensionAlias: { + '.js': ['.ts', '.js', '.tsx', '.jsx'], + '.mjs': ['.mts', '.mjs'], + }, }, plugins: [ new HtmlWebpackPlugin({ diff --git a/ccm_web/webpack/webpack.dev.ts b/ccm_web/webpack/webpack.dev.ts index 8a4354031..8d8c8bb2d 100644 --- a/ccm_web/webpack/webpack.dev.ts +++ b/ccm_web/webpack/webpack.dev.ts @@ -1,7 +1,7 @@ import * as webpack from 'webpack' import { merge } from 'webpack-merge' -import commonConfig from './webpack.common' +import commonConfig from './webpack.common.js' const devConfig: webpack.Configuration = merge(commonConfig, { mode: 'development', diff --git a/ccm_web/webpack/webpack.prod.ts b/ccm_web/webpack/webpack.prod.ts index 6d9e8026b..82fcaba9d 100644 --- a/ccm_web/webpack/webpack.prod.ts +++ b/ccm_web/webpack/webpack.prod.ts @@ -1,7 +1,7 @@ import * as webpack from 'webpack' import { merge } from 'webpack-merge' -import commonConfig from './webpack.common' +import commonConfig from './webpack.common.js' const prodConfig: webpack.Configuration = merge(commonConfig, { mode: 'production',