From 5125954bd2c56a4632da5d270d09e1bcb3a4e370 Mon Sep 17 00:00:00 2001 From: ArnaudTA Date: Mon, 5 Jun 2023 14:27:57 +0200 Subject: [PATCH] feat: :sparkles: add admin log page --- .../cypress/e2e/specs/admin/logs.e2e.js | 26 + apps/client/package.json | 4 +- apps/client/src/api/api.js | 11 + apps/client/src/components/CIForm.vue | 1 + apps/client/src/components/SideMenu.vue | 11 +- apps/client/src/icons.js | 4 + apps/client/src/main.ts | 3 + apps/client/src/router/index.js | 8 +- apps/client/src/stores/admin/log.js | 17 + apps/client/src/stores/admin/log.spec.js | 45 ++ apps/client/src/views/ServicesHealth.vue | 6 +- apps/client/src/views/admin/ListLogs.vue | 158 +++++ apps/client/uno.config.ts | 8 + apps/server/src/controllers/admin/logs.ts | 34 + apps/server/src/init/db/setup-projects.ts | 6 + apps/server/src/models/queries/log-queries.ts | 11 +- apps/server/src/routes/admin/index.ts | 4 + apps/server/src/routes/admin/log.spec.ts | 133 ++++ apps/server/src/routes/admin/log.ts | 13 + ....timestamp-1686318961807-3e1749f6e2a54.mjs | 16 + packages/shared/src/utils/const.js | 9 + packages/shared/src/utils/date.js | 5 + packages/test-utils/src/imports/data.js | 620 ++++++++++++++++++ packages/test-utils/src/random-utils.js | 10 +- pnpm-lock.yaml | 574 +++++++--------- 25 files changed, 1387 insertions(+), 350 deletions(-) create mode 100644 apps/client/cypress/e2e/specs/admin/logs.e2e.js create mode 100644 apps/client/src/stores/admin/log.js create mode 100644 apps/client/src/stores/admin/log.spec.js create mode 100644 apps/client/src/views/admin/ListLogs.vue create mode 100644 apps/client/uno.config.ts create mode 100644 apps/server/src/controllers/admin/logs.ts create mode 100644 apps/server/src/routes/admin/log.spec.ts create mode 100644 apps/server/src/routes/admin/log.ts create mode 100644 apps/server/vite.config.ts.timestamp-1686318961807-3e1749f6e2a54.mjs diff --git a/apps/client/cypress/e2e/specs/admin/logs.e2e.js b/apps/client/cypress/e2e/specs/admin/logs.e2e.js new file mode 100644 index 0000000000..78b77f0ffd --- /dev/null +++ b/apps/client/cypress/e2e/specs/admin/logs.e2e.js @@ -0,0 +1,26 @@ +describe('Administration logs', () => { + let logCount + let logs + + beforeEach(() => { + cy.intercept('GET', 'api/v1/admin/logs/count').as('countLogs') + cy.intercept('GET', 'api/v1/admin/logs/0/5').as('getAllLogs') + + cy.kcLogin('tcolin') + cy.visit('/admin/logs') + cy.url().should('contain', '/admin/logs') + cy.wait('@countLogs', { timeout: 10000 }).its('response').then(response => { + logCount = response?.body + }) + cy.wait('@getAllLogs', { timeout: 10000 }).its('response').then(response => { + logs = response?.body + }) + }) + + it('Should display logs list, loggedIn as admin', () => { + cy.getByDataTestid('logCountInfo').should('contain', `Total : ${logCount} logs`) + logs.forEach(log => { + cy.getByDataTestid(`${log.id}-json`) + }) + }) +}) diff --git a/apps/client/package.json b/apps/client/package.json index b0cdd40df5..f856b1210c 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -34,7 +34,8 @@ "shared": "workspace:^1.0.0", "typescript": "^5.1.3", "vue": "^3.3.4", - "vue-router": "^4.2.2" + "vue-router": "^4.2.2", + "vue3-json-viewer": "^2.2.2" }, "devDependencies": { "@rushstack/eslint-patch": "^1.3.1", @@ -42,6 +43,7 @@ "@types/markdown-it-emoji": "^2.0.2", "@types/markdown-it-link-attributes": "^3.0.1", "@types/node": "^18.16.16", + "@unocss/transformer-directives": "^0.53.1", "@vitejs/plugin-vue": "^4.2.3", "@vitest/coverage-v8": "^0.32.0", "@vue/eslint-config-typescript": "^11.0.3", diff --git a/apps/client/src/api/api.js b/apps/client/src/api/api.js index c6a996c290..0b0458d430 100644 --- a/apps/client/src/api/api.js +++ b/apps/client/src/api/api.js @@ -155,3 +155,14 @@ export const getAllProjects = async () => { const response = await apiClient.get('/admin/projects') return response.data } + +// Admin - Logs +export const getAllLogs = async ({ offset, limit }) => { + const response = await apiClient.get(`/admin/logs/${offset}/${limit}`) + return response.data +} + +export const countAllLogs = async () => { + const response = await apiClient.get('/admin/logs/count') + return response.data +} diff --git a/apps/client/src/components/CIForm.vue b/apps/client/src/components/CIForm.vue index a7bd78f9f9..9f88b8a3ee 100644 --- a/apps/client/src/components/CIForm.vue +++ b/apps/client/src/components/CIForm.vue @@ -95,6 +95,7 @@ const prepareForDownload = async () => { const copyContent = async (key) => { try { await navigator.clipboard.writeText(generatedCI.value[key]) + snackbarStore.setMessage('Fichier copié', 'success') } catch (error) { snackbarStore.setMessage(error?.message, 'error') } diff --git a/apps/client/src/components/SideMenu.vue b/apps/client/src/components/SideMenu.vue index b00c7ef578..0ae1e988c8 100644 --- a/apps/client/src/components/SideMenu.vue +++ b/apps/client/src/components/SideMenu.vue @@ -31,7 +31,7 @@ function toggleExpand (key) { } watch(routePath, (routePath) => { - if (/projects*/.test(routePath)) { + if (/^\/projects*/.test(routePath)) { isExpanded.value.projects = true isExpanded.value.administration = false return @@ -232,6 +232,15 @@ onMounted(() => { Liste des projets + + + Liste des logs + + diff --git a/apps/client/src/icons.js b/apps/client/src/icons.js index abfb6b65b6..af71969eef 100644 --- a/apps/client/src/icons.js +++ b/apps/client/src/icons.js @@ -24,4 +24,8 @@ export { RiArchiveFill, RiHeartPulseLine, RiLoader4Line, + RiArrowDropRightLine, + RiArrowDropLeftLine, + RiArrowDropLeftFill, + RiArrowDropRightFill, } from 'oh-vue-icons/icons/ri/index.js' diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 1e39d93330..7d19dd7bda 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -2,6 +2,7 @@ import '@gouvfr/dsfr/dist/dsfr.min.css' import '@gouvfr/dsfr/dist/utility/icons/icons.min.css' import '@gouvfr/dsfr/dist/utility/utility.main.min.css' import '@gouvminint/vue-dsfr/styles' +import 'vue3-json-viewer/dist/index.css' import { createApp } from 'vue' import { createPinia } from 'pinia' @@ -12,6 +13,7 @@ import VueDsfr from '@gouvminint/vue-dsfr' import App from './App.vue' import router from './router/index' import * as icons from './icons' +import JsonViewer from 'vue3-json-viewer' import 'virtual:uno.css' import 'uno.css' @@ -29,5 +31,6 @@ import './main.css' .use(createPinia()) .use(router) .use(VueDsfr, { icons: Object.values(icons) }) + .use(JsonViewer) .mount('#app') })() diff --git a/apps/client/src/router/index.js b/apps/client/src/router/index.js index 23c6bc3af0..f89e12495e 100644 --- a/apps/client/src/router/index.js +++ b/apps/client/src/router/index.js @@ -3,7 +3,7 @@ import { useUserStore } from '@/stores/user.js' import { useProjectStore } from '@/stores/project.js' import { useSnackbarStore } from '@/stores/snackbar.js' -import DsoHome from '@/views/DsoHome.vue' +const DsoHome = () => import('@/views/DsoHome.vue') const ServicesHealth = () => import('@/views/ServicesHealth.vue') const CreateProject = () => import('@/views/CreateProject.vue') const ManageEnvironments = () => import('@/views/projects/ManageEnvironments.vue') @@ -16,6 +16,7 @@ const DsoDoc = () => import('@/views/DsoDoc.vue') const ListUser = () => import('@/views/admin/ListUser.vue') const ListOrganizations = () => import('@/views/admin/ListOrganizations.vue') const ListProjects = () => import('@/views/admin/ListProjects.vue') +const ListLogs = () => import('@/views/admin/ListLogs.vue') const MAIN_TITLE = 'Console Cloud π Native' @@ -101,6 +102,11 @@ const routes = [ name: 'ListProjects', component: ListProjects, }, + { + path: '/admin/logs', + name: 'ListLogs', + component: ListLogs, + }, { path: '/doc', name: 'Doc', diff --git a/apps/client/src/stores/admin/log.js b/apps/client/src/stores/admin/log.js new file mode 100644 index 0000000000..0c9d9e7aeb --- /dev/null +++ b/apps/client/src/stores/admin/log.js @@ -0,0 +1,17 @@ +import { defineStore } from 'pinia' +import api from '@/api/index.js' + +export const useAdminLogStore = defineStore('admin-log', () => { + const getAllLogs = async ({ offset, limit } = { offset: 0, limit: 100 }) => { + return api.getAllLogs({ offset, limit }) + } + + const countAllLogs = async () => { + return api.countAllLogs() + } + + return { + getAllLogs, + countAllLogs, + } +}) diff --git a/apps/client/src/stores/admin/log.spec.js b/apps/client/src/stores/admin/log.spec.js new file mode 100644 index 0000000000..68c858dd5b --- /dev/null +++ b/apps/client/src/stores/admin/log.spec.js @@ -0,0 +1,45 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest' +import { setActivePinia, createPinia } from 'pinia' +import { apiClient } from '../../api/xhr-client.js' +import { useAdminLogStore } from './log.js' + +vi.spyOn(apiClient, 'get') +vi.spyOn(apiClient, 'post') +vi.spyOn(apiClient, 'put') +vi.spyOn(apiClient, 'patch') +vi.spyOn(apiClient, 'delete') + +describe('Counter Store', () => { + beforeEach(() => { + vi.resetAllMocks() + // creates a fresh pinia and make it active so it's automatically picked + // up by any useStore() call without having to pass it to it: `useStore(pinia)` + setActivePinia(createPinia()) + }) + + it('Should get organization list by api call', async () => { + const data = [ + { id: 'thisIsAnId', data: {}, action: 'Create Project', userId: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565' }, + ] + apiClient.get.mockReturnValueOnce(Promise.resolve({ data })) + const adminLogStore = useAdminLogStore() + + const res = await adminLogStore.getAllLogs({ offset: 5, limit: 10 }) + + expect(res).toBe(data) + expect(apiClient.get).toHaveBeenCalledTimes(1) + expect(apiClient.get.mock.calls[0][0]).toBe('/admin/logs/5/10') + }) + + it('Should count logs by api call', async () => { + const data = 12 + apiClient.get.mockReturnValueOnce(Promise.resolve({ data })) + const adminLogStore = useAdminLogStore() + + const res = await adminLogStore.countAllLogs() + + expect(res).toBe(data) + expect(apiClient.get).toHaveBeenCalledTimes(1) + expect(apiClient.get.mock.calls[0][0]).toBe('/admin/logs/count') + }) +}) diff --git a/apps/client/src/views/ServicesHealth.vue b/apps/client/src/views/ServicesHealth.vue index 286dfb794f..9727fdaec6 100644 --- a/apps/client/src/views/ServicesHealth.vue +++ b/apps/client/src/views/ServicesHealth.vue @@ -9,9 +9,9 @@ const services = computed(() => serviceStore.services) const servicesHealth = computed(() => serviceStore.servicesHealth) const checkServicesHealth = async () => { - isUpdating.value = ref(true) + isUpdating.value = true await serviceStore.checkServicesHealth() - isUpdating.value = ref(false) + isUpdating.value = false } onBeforeMount(async () => { @@ -37,7 +37,7 @@ onBeforeMount(async () => { secondary icon-only icon="ri-refresh-fill" - :disabled="isUpdating.value === true" + :disabled="isUpdating === true" @click="checkServicesHealth()" /> diff --git a/apps/client/src/views/admin/ListLogs.vue b/apps/client/src/views/admin/ListLogs.vue new file mode 100644 index 0000000000..e16f3a874e --- /dev/null +++ b/apps/client/src/views/admin/ListLogs.vue @@ -0,0 +1,158 @@ + + + diff --git a/apps/client/uno.config.ts b/apps/client/uno.config.ts new file mode 100644 index 0000000000..2889bc5cfc --- /dev/null +++ b/apps/client/uno.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'unocss' +import transformerDirectives from '@unocss/transformer-directives' + +export default defineConfig({ + transformers: [ + transformerDirectives(), + ], +}) diff --git a/apps/server/src/controllers/admin/logs.ts b/apps/server/src/controllers/admin/logs.ts new file mode 100644 index 0000000000..81445d8a5b --- /dev/null +++ b/apps/server/src/controllers/admin/logs.ts @@ -0,0 +1,34 @@ +import { getAllLogs, countAllLogs } from '../../models/queries/log-queries.js' +import { sendNotFound, sendOk } from '../../utils/response.js' +import { addReqLogs } from '../../utils/logger.js' + +export const getAllLogsController = async (req, res) => { + const { offset, limit } = req.params + try { + const logs = await getAllLogs({ offset, limit }) + + addReqLogs({ + req, + description: 'Logs récupérés avec succès', + }) + sendOk(res, logs) + } catch (error) { + const description = 'Echec de la récupération des logs' + sendNotFound(res, description) + } +} + +export const countAllLogsController = async (req, res) => { + try { + const logsLength = await countAllLogs() + + addReqLogs({ + req, + description: 'Logs comptés avec succès', + }) + sendOk(res, logsLength) + } catch (error) { + const description = 'Echec du comptage des logs' + sendNotFound(res, description) + } +} diff --git a/apps/server/src/init/db/setup-projects.ts b/apps/server/src/init/db/setup-projects.ts index 998a0aad00..5c1f2d05b9 100644 --- a/apps/server/src/init/db/setup-projects.ts +++ b/apps/server/src/init/db/setup-projects.ts @@ -5,6 +5,7 @@ import { getOrganizationByName } from '../../models/queries/organization-queries import { initializeRepository, updateRepositoryCreated, updateRepositoryFailed } from '../../models/queries/repository-queries.js' import app from '../../app.js' import { getUserById } from '../../models/queries/user-queries.js' +import { addLogs } from '../../models/queries/log-queries.js' export default async (projects) => { app.log.info('Creating projects...') @@ -68,6 +69,11 @@ export default async (projects) => { } }) + // Create logs + project.logs?.forEach(async log => { + await addLogs(log.action, log.data, log.userId) + }) + app.log.info(`Project '${project.name}' created !`) } catch (err) { app.log.error(err) diff --git a/apps/server/src/models/queries/log-queries.ts b/apps/server/src/models/queries/log-queries.ts index dd9aa48094..f4070c6e98 100644 --- a/apps/server/src/models/queries/log-queries.ts +++ b/apps/server/src/models/queries/log-queries.ts @@ -12,11 +12,18 @@ export const getAllLogsForUser = async (user, offset = 0) => { }) return res } +export const countAllLogs = async () => { + const res = await getLogModel().count() + return res +} -export const getAllLogs = async (offset = 0) => { +export const getAllLogs = async ({ offset, limit }) => { const res = await getLogModel().findAll({ - limit: 100, + order: [ + ['createdAt', 'DESC'], + ], offset, + limit, }) return res } diff --git a/apps/server/src/routes/admin/index.ts b/apps/server/src/routes/admin/index.ts index 904f61666e..15b56c8b6f 100644 --- a/apps/server/src/routes/admin/index.ts +++ b/apps/server/src/routes/admin/index.ts @@ -1,6 +1,7 @@ import userRouter from './user.js' import organizationRouter from './organization.js' import projectRouter from './project.js' +import logRouter from './log.js' import { checkAdminGroup } from '../../utils/controller.js' const router = async (app, _opt) => { @@ -13,6 +14,9 @@ const router = async (app, _opt) => { // Enregistrement du sous routeur project await app.register(projectRouter, { prefix: '/projects' }) + + // Enregistrement du sous routeur logs + await app.register(logRouter, { prefix: '/logs' }) } export default router diff --git a/apps/server/src/routes/admin/log.spec.ts b/apps/server/src/routes/admin/log.spec.ts new file mode 100644 index 0000000000..e56bb837b1 --- /dev/null +++ b/apps/server/src/routes/admin/log.spec.ts @@ -0,0 +1,133 @@ +import { vi, describe, it, expect, beforeAll, afterEach, afterAll } from 'vitest' +import fastify from 'fastify' +import fastifySession from '@fastify/session' +import fastifyCookie from '@fastify/cookie' +import fp from 'fastify-plugin' +import { sessionConf } from '../../utils/keycloak.js' +import { getConnection, closeConnections } from '../../connect.js' +import logRouter from './log.js' +import { adminGroupPath } from 'shared' +import { getRandomLog, repeatFn } from 'test-utils' +import { checkAdminGroup } from '../../utils/controller.js' +import { sequelize } from '../../../vitest-init' +import { getLogModel } from '../../models/log.js' + +vi.mock('fastify-keycloak-adapter', () => ({ default: fp(async () => vi.fn()) })) + +const app = fastify({ logger: false }) + .register(fastifyCookie) + .register(fastifySession, sessionConf) + +const mockSessionPlugin = (app, opt, next) => { + app.addHook('onRequest', (req, res, next) => { + if (req.headers.admin) { + req.session = { user: { groups: [adminGroupPath] } } + } else { + req.session = { user: {} } + } + next() + }) + next() +} + +const mockSession = (app) => { + app.addHook('preHandler', checkAdminGroup) + .register(fp(mockSessionPlugin)) + .register(logRouter) +} + +describe('Admin logs routes', () => { + let Log + + beforeAll(async () => { + mockSession(app) + await getConnection() + Log = getLogModel() + }) + + afterAll(async () => { + return closeConnections() + }) + + afterEach(() => { + vi.clearAllMocks() + sequelize.$clearQueue() + Log.$clearQueue() + }) + + // GET + describe('getAllLogsController', () => { + it('Should retrieve all logs', async () => { + const logs = repeatFn(5)(getRandomLog) + + Log.$queueResult(logs) + + const response = await app.inject({ headers: { admin: 'admin' } }) + .get('/0/100') + .end() + + expect(response.statusCode).toEqual(200) + expect(JSON.stringify(response.json())).toMatchObject(JSON.stringify(logs)) + }) + + it('Should return an error if retrieve logs failed', async () => { + Log.$queueFailure() + + const response = await app.inject({ headers: { admin: 'admin' } }) + .get('/0/100') + .end() + + expect(response.statusCode).toEqual(404) + expect(response.body).toEqual('Echec de la récupération des logs') + }) + + it('Should return an error if requestor is not admin', async () => { + const response = await app.inject() + .get('/0/100') + .end() + + expect(response.statusCode).toEqual(403) + expect(response.body).toEqual('Vous n\'avez pas les droits administrateur') + }) + }) + + describe('countAllLogsController', () => { + it.skip('Should count all logs', async () => { + // TODO : _vite_ssr_import_1__.getLogModel(...).count is not a function + + const logs = (repeatFn(5)(getRandomLog)).map(log => Log.build(log)) + const logsCount = 5 + + Log.$queueResult(logs) + sequelize.$queueResult(logsCount) + + const response = await app.inject({ headers: { admin: 'admin' } }) + .get('/count') + .end() + + expect(response.statusCode).toEqual(200) + expect(JSON.stringify(response.json())).toMatchObject(JSON.stringify(logsCount)) + }) + + it.skip('Should return an error if retrieve logs failed', async () => { + // TODO : _vite_ssr_import_1__.getLogModel(...).count is not a function + Log.$queueFailure() + + const response = await app.inject({ headers: { admin: 'admin' } }) + .get('/count') + .end() + + expect(response.statusCode).toEqual(404) + expect(response.body).toEqual('Echec du comptage des logs') + }) + + it('Should return an error if requestor is not admin', async () => { + const response = await app.inject() + .get('/0/100') + .end() + + expect(response.statusCode).toEqual(403) + expect(response.body).toEqual('Vous n\'avez pas les droits administrateur') + }) + }) +}) diff --git a/apps/server/src/routes/admin/log.ts b/apps/server/src/routes/admin/log.ts new file mode 100644 index 0000000000..91a1825a6b --- /dev/null +++ b/apps/server/src/routes/admin/log.ts @@ -0,0 +1,13 @@ +import { + getAllLogsController, + countAllLogsController, +} from '../../controllers/admin/logs.js' + +const router = async (app, _opt) => { + // Récupérer des logs + await app.get('/:offset/:limit', getAllLogsController) + // Compter tous les logs + await app.get('/count', countAllLogsController) +} + +export default router diff --git a/apps/server/vite.config.ts.timestamp-1686318961807-3e1749f6e2a54.mjs b/apps/server/vite.config.ts.timestamp-1686318961807-3e1749f6e2a54.mjs new file mode 100644 index 0000000000..ff4fb58272 --- /dev/null +++ b/apps/server/vite.config.ts.timestamp-1686318961807-3e1749f6e2a54.mjs @@ -0,0 +1,16 @@ +// vite.config.ts +import { fileURLToPath, URL } from "url"; +import { defineConfig } from "file:///app/node_modules/.pnpm/vite@4.3.5_@types+node@18.16.8/node_modules/vite/dist/node/index.js"; +var __vite_injected_original_import_meta_url = "file:///app/apps/server/vite.config.ts"; +var vite_config_default = defineConfig({ + plugins: [], + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url)) + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvYXBwL2FwcHMvc2VydmVyXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvYXBwL2FwcHMvc2VydmVyL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9hcHAvYXBwcy9zZXJ2ZXIvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBVUkwgfSBmcm9tICd1cmwnXG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwbHVnaW5zOiBbXG4gIF0sXG4gIHJlc29sdmU6IHtcbiAgICBhbGlhczoge1xuICAgICAgJ0AnOiBmaWxlVVJMVG9QYXRoKG5ldyBVUkwoJy4vc3JjJywgaW1wb3J0Lm1ldGEudXJsKSksXG4gICAgfSxcbiAgfSxcbn0pXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQWtPLFNBQVMsZUFBZSxXQUFXO0FBQ3JRLFNBQVMsb0JBQW9CO0FBRDJHLElBQU0sMkNBQTJDO0FBR3pMLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FDVDtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBLE1BQ0wsS0FBSyxjQUFjLElBQUksSUFBSSxTQUFTLHdDQUFlLENBQUM7QUFBQSxJQUN0RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/packages/shared/src/utils/const.js b/packages/shared/src/utils/const.js index 9ce87d5ce0..a19936b22b 100644 --- a/packages/shared/src/utils/const.js +++ b/packages/shared/src/utils/const.js @@ -48,6 +48,15 @@ export const achievedStatus = [ 'failed', ] +export const logActions = [ + 'Create Project', + 'Create Repository', + 'Create Environment', + 'Delete Project', + 'Delete Repository', + 'Delete Environment', +] + // ! Un environnement ne doit pas faire plus de 11 caractères export const allEnv = [ 'dev', diff --git a/packages/shared/src/utils/date.js b/packages/shared/src/utils/date.js index ebe7a1c4bc..a4914284f9 100644 --- a/packages/shared/src/utils/date.js +++ b/packages/shared/src/utils/date.js @@ -2,3 +2,8 @@ export const formatDate = (dateString) => { const date = new Date(dateString) return new Intl.DateTimeFormat('default', { dateStyle: 'long' }).format(date) } + +export const formatDateTime = (dateTimeString) => { + const date = new Date(dateTimeString) + return new Intl.DateTimeFormat('default', { dateStyle: 'short', timeStyle: 'short' }).format(date) +} diff --git a/packages/test-utils/src/imports/data.js b/packages/test-utils/src/imports/data.js index c075573ddc..8e0d5ff5f3 100644 --- a/packages/test-utils/src/imports/data.js +++ b/packages/test-utils/src/imports/data.js @@ -70,6 +70,512 @@ export const data = { }, status: 'created', locked: false, + logs: [ + { + action: 'create Project', + userId: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + data: { + argo: { + status: { + result: 'OK', + }, + }, + args: { + owner: { + id: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + email: 'claire.nollet@interieur.gouv.fr', + lastName: 'Nollet', + createdAt: '2023-06-08T14:57:58.401Z', + firstName: 'Claire', + updatedAt: '2023-06-08T14:57:58.401Z', + }, + project: 'int-2', + environment: 'staging', + organization: 'ministere-interieur', + registryHost: 'blabla.com', + repositories: [], + }, + vault: { + status: { + result: 'OK', + }, + pullSecret: { + data: { + HOST: 'blabla.com', + TOKEN: 'token', + USERNAME: 'robot$ministere-interieur-int-2+ci', + DOCKER_CONFIG: '{"auths":{"blabla.com":{"auth":"token","email":""}}}', + }, + metadata: { + version: 1, + destroyed: false, + created_time: '2023-06-08T15:14:56.087835715Z', + deletion_time: '', + custom_metadata: null, + }, + }, + }, + keycloak: { + group: { + id: '6ce9c548-d0f6-490b-b32d-6e62c20e5eff', + }, + status: { + result: 'OK', + }, + roGroup: '/ministere-interieur-int-2/staging/RO', + rwGroup: '/ministere-interieur-int-2/staging/RW', + }, + kubernetes: { + ns: { + kind: 'Namespace', + spec: { + finalizers: [ + 'kubernetes', + ], + }, + status: { + phase: 'Active', + }, + metadata: { + uid: 'facaa8a7-956c-4bbb-88d9-b6598ca90b43', + name: 'ministere-interieur-int-2-staging', + labels: { + 'dso/projet': 'int-2', + 'dso/owner.id': 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + 'dso/environment': 'staging', + 'dso/organization': 'ministere-interieur', + 'dso/owner.lastName': 'Nollet', + 'dso/owner.firstName': 'Claire', + 'kubernetes.io/metadata.name': 'ministere-interieur-int-2-staging', + }, + managedFields: [ + { + time: '2023-06-08T15:16:44.000Z', + manager: 'unknown', + fieldsV1: { + 'f:metadata': { + 'f:labels': { + '.': {}, + 'f:dso/projet': {}, + 'f:dso/owner.id': {}, + 'f:dso/environment': {}, + 'f:dso/organization': {}, + 'f:dso/owner.lastName': {}, + 'f:dso/owner.firstName': {}, + 'f:kubernetes.io/metadata.name': {}, + }, + }, + }, + operation: 'Update', + apiVersion: 'v1', + fieldsType: 'FieldsV1', + }, + ], + resourceVersion: '140498752', + creationTimestamp: '2023-06-08T15:16:44.000Z', + }, + apiVersion: 'v1', + }, + status: { + result: 'OK', + message: 'Updated', + }, + }, + }, + }, + { + action: 'Create Repository', + userId: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + data: { + argo: { + status: { + result: 'OK', + message: 'Not an infra repository', + }, + }, + args: { + id: 'bd934af0-6de2-41b2-a111-6b0c45b82384', + status: 'initializing', + isInfra: false, + project: 'int-2', + services: { + gitlab: { + id: 252, + }, + registry: { + id: 63, + }, + }, + createdAt: '2023-06-08T15:15:56.692Z', + isPrivate: false, + projectId: '1e4fdb28-f9ea-46d4-ad16-607c7f1aa8b6', + updatedAt: '2023-06-08T15:15:56.692Z', + environment: [], + internalUrl: 'https://blabla.com/bla/projects/ministere-interieur/int-2/repo.git', + organization: 'ministere-interieur', + externalToken: '', + externalRepoUrl: 'https://github.com/dnum-mi/dso-console.git', + externalUserName: '', + internalRepoName: 'repo', + }, + vault: { + status: { + result: 'OK', + }, + recordsSaved: 1, + }, + gitlab: { + vault: [ + { + data: { + PROJECT_NAME: 'int-2', + GIT_INPUT_URL: 'github.com/dnum-mi/dso-console.git', + GIT_INPUT_USER: '', + GIT_OUTPUT_URL: 'blabla.com/bla/projects/ministere-interieur/int-2/repo.git', + GIT_OUTPUT_USER: 'root', + ORGANIZATION_NAME: 'ministere-interieur', + GIT_INPUT_PASSWORD: '', + GIT_PIPELINE_TOKEN: 'token', + GIT_OUTPUT_PASSWORD: 'password', + }, + name: 'repo-mirror', + }, + ], + status: { + result: 'OK', + message: 'Created', + }, + }, + }, + }, + { + action: 'Create Environment', + userId: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + data: { + args: { + id: '1e4fdb28-f9ea-46d4-ad16-607c7f1aa8b6', + owner: { + id: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + email: 'claire.nollet@interieur.gouv.fr', + lastName: 'Nollet', + createdAt: '2023-06-08T14:57:58.401Z', + firstName: 'Claire', + updatedAt: '2023-06-08T14:57:58.401Z', + }, + locked: true, + status: 'initializing', + project: 'int-2', + services: null, + createdAt: '2023-06-08T15:14:53.517Z', + updatedAt: '2023-06-08T15:14:53.517Z', + description: null, + organization: 'ministere-interieur', + }, + nexus: { + user: { + roles: [ + 'ministere-interieur-int-2-ID', + ], + source: 'default', + status: 'active', + userId: 'ministere-interieur-int-2', + lastName: 'Luffy', + readOnly: false, + firstName: 'Monkey D.', + emailAddress: 'claire.nollet@interieur.gouv.fr', + externalRoles: [], + }, + vault: [ + { + data: { + NEXUS_PASSWORD: 'password', + NEXUS_USERNAME: 'ministere-interieur-int-2', + }, + name: 'NEXUS', + }, + ], + status: { + result: 'OK', + message: 'User Created', + }, + }, + vault: { + status: { + result: 'OK', + }, + recordsSaved: 4, + }, + gitlab: { + vault: [ + { + data: { + PROJECT_NAME: 'int-2', + ORGANIZATION_NAME: 'ministere-interieur', + }, + name: 'GITLAB', + }, + ], + result: { + user: { + id: 4, + bio: '', + bot: false, + name: 'claire.nollet.interieur.gouv.fr', + note: null, + email: 'claire.nollet@interieur.gouv.fr', + skype: '', + state: 'active', + discord: '', + twitter: '', + web_url: 'https://blabla.com/claire.nollet.interieur.gouv.fr', + external: false, + is_admin: false, + linkedin: '', + location: '', + pronouns: null, + theme_id: 1, + username: 'claire.nollet.interieur.gouv.fr', + followers: 0, + following: 0, + job_title: '', + avatar_url: 'https://secure.gravatar.com/avatar/8788671a0d7a433f128a49fe1953ac34?s=80&d=identicon', + created_at: '2023-05-11T17:19:29.797Z', + created_by: { + id: 1, + name: 'Administrator', + state: 'active', + web_url: 'https://blabla.com/root', + username: 'root', + avatar_url: 'https://secure.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + }, + identities: [], + local_time: null, + is_followed: false, + website_url: '', + commit_email: 'claire.nollet@interieur.gouv.fr', + confirmed_at: '2023-05-11T17:19:29.605Z', + namespace_id: 38, + organization: '', + public_email: null, + projects_limit: 100000, + color_scheme_id: 1, + last_sign_in_at: null, + private_profile: false, + can_create_group: false, + last_activity_on: null, + work_information: null, + can_create_project: true, + current_sign_in_at: null, + two_factor_enabled: false, + using_license_seat: false, + shared_runners_minutes_limit: null, + extra_shared_runners_minutes_limit: null, + }, + group: { + id: 252, + name: 'int-2', + path: 'int-2', + ldap_cn: null, + web_url: 'https://blabla.com/groups/forge-mi/projects/ministere-interieur/int-2', + full_name: 'forge-mi / projects / ministere-interieur / int-2', + full_path: 'forge-mi/projects/ministere-interieur/int-2', + parent_id: 250, + avatar_url: null, + created_at: '2023-06-08T15:14:54.262Z', + visibility: 'private', + description: '', + ldap_access: null, + lfs_enabled: true, + emails_disabled: null, + membership_lock: false, + mentions_disabled: null, + wiki_access_level: 'enabled', + shared_with_groups: [], + auto_devops_enabled: null, + share_with_group_lock: false, + project_creation_level: 'maintainer', + request_access_enabled: true, + subgroup_creation_level: 'owner', + two_factor_grace_period: 48, + default_branch_protection: 0, + shared_runners_minutes_limit: null, + prevent_forking_outside_group: null, + require_two_factor_authentication: false, + extra_shared_runners_minutes_limit: null, + }, + groupMember: { + id: 4, + name: 'claire.nollet.interieur.gouv.fr', + state: 'active', + web_url: 'https://blabla.com/claire.nollet.interieur.gouv.fr', + username: 'claire.nollet.interieur.gouv.fr', + avatar_url: 'https://secure.gravatar.com/avatar/8788671a0d7a433f128a49fe1953ac34?s=80&d=identicon', + created_at: '2023-06-08T15:14:54.918Z', + created_by: { + id: 1, + name: 'Administrator', + state: 'active', + web_url: 'https://blabla.com/root', + username: 'root', + avatar_url: 'https://secure.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + }, + expires_at: null, + access_level: 40, + membership_state: 'active', + }, + }, + status: { + result: 'OK', + message: 'Created', + }, + }, + keycloak: { + group: { + id: '4a767b5c-1bf4-43b9-8164-5da76ded49a0', + }, + status: { + result: 'OK', + }, + }, + registry: { + vault: [ + { + data: { + HOST: 'blabla.com', + TOKEN: 'token', + USERNAME: 'robot$ministere-interieur-int-2+ci', + DOCKER_CONFIG: '{"auths":{"blabla.com":{"auth":"token","email":""}}}', + }, + name: 'REGISTRY', + }, + ], + result: { + robot: { + id: 70, + name: 'robot$ministere-interieur-int-2+ci', + secret: 'token', + expires_at: -1, + creation_time: '2023-06-08T15:14:55.813Z', + }, + project: { + name: 'ministere-interieur-int-2', + metadata: { + public: 'false', + }, + owner_id: 1, + owner_name: 'admin', + project_id: 63, + repo_count: 0, + update_time: '2023-06-08T15:14:55.363Z', + creation_time: '2023-06-08T15:14:55.363Z', + cve_allowlist: { + id: 65, + items: [], + project_id: 63, + update_time: '0001-01-01T00:00:00.000Z', + creation_time: '0001-01-01T00:00:00.000Z', + }, + current_user_role_id: 1, + current_user_role_ids: [ + 1, + ], + }, + }, + status: { + result: 'OK', + message: 'Created', + }, + }, + sonarqube: { + user: { + user: { + name: 'ministere-interieur-int-2', + email: 'claire.nollet@interieur.gouv.fr', + local: true, + login: 'ministere-interieur-int-2', + active: true, + scmAccounts: [], + }, + }, + vault: [ + { + data: { + SONAR_TOKEN: 'token', + SONAR_PASSWORD: 'password', + SONAR_USERNAME: 'ministere-interieur-int-2', + }, + name: 'SONAR', + }, + ], + result: {}, + status: { + result: 'OK', + message: 'User Created', + }, + }, + }, + }, + { + action: 'Delete Project', + userId: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + data: { + args: { + id: '1e4fdb28-f9ea-46d4-ad16-607c7f1aa8b6', + locked: false, + status: 'created', + project: 'int-2', + services: { + gitlab: { + id: 252, + }, + registry: { + id: 63, + }, + }, + createdAt: '2023-06-08T15:14:53.517Z', + updatedAt: '2023-06-08T15:16:49.011Z', + description: null, + organization: 'ministere-interieur', + }, + nexus: { + status: { + result: 'OK', + message: 'User deleted', + }, + }, + vault: { + status: { + result: 'OK', + }, + secretsDestroyed: 5, + }, + gitlab: { + status: { + result: 'OK', + message: 'Deleted', + }, + }, + keycloak: { + status: { + result: 'OK', + message: 'Deleted', + }, + }, + registry: { + status: { + result: 'OK', + message: 'Deleted', + }, + }, + sonarqube: { + status: { + result: 'OK', + message: 'User anonymized', + }, + }, + }, + }, + ], }, { id: '83833faf-f654-40dd-bcd5-cf2e944fc702', @@ -122,6 +628,120 @@ export const data = { }, status: 'failed', locked: true, + logs: [ + { + action: 'create Project', + userId: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + data: { + argo: { + status: { + result: 'OK', + }, + }, + args: { + owner: { + id: 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + email: 'claire.nollet@interieur.gouv.fr', + lastName: 'Nollet', + createdAt: '2023-06-08T14:57:58.401Z', + firstName: 'Claire', + updatedAt: '2023-06-08T14:57:58.401Z', + }, + project: 'int-2', + environment: 'staging', + organization: 'ministere-interieur', + registryHost: 'blabla.com', + repositories: [], + }, + vault: { + status: { + result: 'OK', + }, + pullSecret: { + data: { + HOST: 'blabla.com', + TOKEN: 'token', + USERNAME: 'robot$ministere-interieur-int-2+ci', + DOCKER_CONFIG: '{"auths":{"blabla.com":{"auth":"token","email":""}}}', + }, + metadata: { + version: 1, + destroyed: false, + created_time: '2023-06-08T15:14:56.087835715Z', + deletion_time: '', + custom_metadata: null, + }, + }, + }, + keycloak: { + group: { + id: '6ce9c548-d0f6-490b-b32d-6e62c20e5eff', + }, + status: { + result: 'OK', + }, + roGroup: '/ministere-interieur-int-2/staging/RO', + rwGroup: '/ministere-interieur-int-2/staging/RW', + }, + kubernetes: { + ns: { + kind: 'Namespace', + spec: { + finalizers: [ + 'kubernetes', + ], + }, + status: { + phase: 'Active', + }, + metadata: { + uid: 'facaa8a7-956c-4bbb-88d9-b6598ca90b43', + name: 'ministere-interieur-int-2-staging', + labels: { + 'dso/projet': 'int-2', + 'dso/owner.id': 'cb8e5b4b-7b7b-40f5-935f-594f48ae6565', + 'dso/environment': 'staging', + 'dso/organization': 'ministere-interieur', + 'dso/owner.lastName': 'Nollet', + 'dso/owner.firstName': 'Claire', + 'kubernetes.io/metadata.name': 'ministere-interieur-int-2-staging', + }, + managedFields: [ + { + time: '2023-06-08T15:16:44.000Z', + manager: 'unknown', + fieldsV1: { + 'f:metadata': { + 'f:labels': { + '.': {}, + 'f:dso/projet': {}, + 'f:dso/owner.id': {}, + 'f:dso/environment': {}, + 'f:dso/organization': {}, + 'f:dso/owner.lastName': {}, + 'f:dso/owner.firstName': {}, + 'f:kubernetes.io/metadata.name': {}, + }, + }, + }, + operation: 'Update', + apiVersion: 'v1', + fieldsType: 'FieldsV1', + }, + ], + resourceVersion: '140498752', + creationTimestamp: '2023-06-08T15:16:44.000Z', + }, + apiVersion: 'v1', + }, + status: { + result: 'OK', + message: 'Updated', + }, + }, + }, + }, + ] }, { id: '22e7044f-8414-435d-9c4a-2df42a65034b', diff --git a/packages/test-utils/src/random-utils.js b/packages/test-utils/src/random-utils.js index 92a28e475c..c1c4a29304 100644 --- a/packages/test-utils/src/random-utils.js +++ b/packages/test-utils/src/random-utils.js @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker' -import { achievedStatus, projectRoles } from 'shared' +import { achievedStatus, projectRoles, logActions } from 'shared' export const getRandomProjectName = () => { return faker.lorem.word() @@ -83,3 +83,11 @@ export const getRandomPerm = (environmentId = faker.string.uuid(), user = getRan user, } } + +export const getRandomLog = (action = faker.helpers.arrayElement(logActions), userId = faker.string.uuid()) => { + return { + id: faker.string.uuid(), + action, + userId, + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c87d2fa398..1116ed7b0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,6 +70,9 @@ importers: vue-router: specifier: ^4.2.2 version: 4.2.2(vue@3.3.4) + vue3-json-viewer: + specifier: ^2.2.2 + version: 2.2.2(vue@3.3.4) optionalDependencies: '@cypress/vue': specifier: ^5.0.5 @@ -93,6 +96,9 @@ importers: '@types/node': specifier: ^18.16.16 version: 18.16.16 + '@unocss/transformer-directives': + specifier: ^0.53.1 + version: 0.53.1 '@vitejs/plugin-vue': specifier: ^4.2.3 version: 4.2.3(vite@4.3.9)(vue@3.3.4) @@ -173,7 +179,7 @@ importers: version: 0.32.0(jsdom@22.1.0) vue-tsc: specifier: ^1.6.5 - version: 1.6.5(typescript@5.1.3) + version: 1.7.0(typescript@5.1.3) apps/server: dependencies: @@ -218,7 +224,7 @@ importers: version: 4.0.2 node-vault-client: specifier: ^0.6.1 - version: 0.6.1(aws-sdk@2.1377.0)(config@3.3.9) + version: 0.6.1(aws-sdk@2.1394.0)(config@3.3.9) pg: specifier: 8.11.0 version: 8.11.0 @@ -303,7 +309,7 @@ importers: version: 0.32.0(@types/node@18.16.16) vitest: specifier: ^0.32.0 - version: 0.32.0 + version: 0.32.0(jsdom@22.1.0) packages/shared: dependencies: @@ -337,7 +343,7 @@ importers: version: 4.3.9(@types/node@18.16.16) vitest: specifier: ^0.32.0 - version: 0.32.0 + version: 0.32.0(jsdom@22.1.0) packages/test-utils: dependencies: @@ -381,54 +387,54 @@ packages: find-up: 5.0.0 dev: true - /@antfu/utils@0.7.2: - resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} + /@antfu/utils@0.7.4: + resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} dev: true - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.5 dev: true - /@babel/helper-string-parser@7.21.5: - resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser@7.21.8: - resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==} + /@babel/parser@7.22.5: + resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 - /@babel/runtime@7.21.5: - resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} + /@babel/runtime@7.22.5: + resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: false - /@babel/types@7.21.5: - resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 /@bcoe/v8-coverage@0.2.3: @@ -961,8 +967,8 @@ packages: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} dev: false - /@fastify/error@3.2.0: - resolution: {integrity: sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==} + /@fastify/error@3.2.1: + resolution: {integrity: sha512-scZVbcpPNWw/yyFmzzO7cf1daTeJp53spN2n7dBTHZd+cV7791fcWJCPP1Tfhdbre+8vDiCyQyqqXfQnYMntYQ==} dev: false /@fastify/fast-json-stringify-compiler@4.3.0: @@ -981,7 +987,7 @@ packages: /@fastify/jwt@6.7.1: resolution: {integrity: sha512-pvRcGeyF2H1U+HXaxlRBd6s1y99vbSZjhpxTWECIGIhMXKRxBTBSUPRF7LJGONlW1/pZstQ0/Dp/ZxBFlDuEnw==} dependencies: - '@fastify/error': 3.2.0 + '@fastify/error': 3.2.1 '@lukeed/ms': 2.0.1 fast-jwt: 2.2.3 fastify-plugin: 4.5.0 @@ -1024,7 +1030,7 @@ packages: engines: {node: '>=14.2.0'} dependencies: form-data: 4.0.0 - qs: 6.11.1 + qs: 6.11.2 xcase: 2.0.1 dev: false @@ -1042,8 +1048,8 @@ packages: vue-router: ^4.1.6 dependencies: '@gouvfr/dsfr': 1.9.3 - focus-trap: 7.4.1 - focus-trap-vue: 4.0.2(focus-trap@7.4.1)(vue@3.3.4) + focus-trap: 7.4.3 + focus-trap-vue: 4.0.2(focus-trap@7.4.3)(vue@3.3.4) oh-vue-icons: 1.0.0-rc3(vue@3.3.4) vue: 3.3.4 vue-router: 4.2.2(vue@3.3.4) @@ -1083,11 +1089,11 @@ packages: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: true - /@iconify/utils@2.1.5: - resolution: {integrity: sha512-6MvDI+I6QMvXn5rK9KQGdpEE4mmLTcuQdLZEiX5N+uZB+vc4Yw9K1OtnOgkl8mp4d9X0UrILREyZgF1NUwUt+Q==} + /@iconify/utils@2.1.6: + resolution: {integrity: sha512-WJNcj/mmFQoYok+576EexlCQe/g2tZ8X9jR4QLo++z6DlVqrjwt7FBYetTQ3iyTtrPMFHcAx0JiCqtUz30XG5A==} dependencies: '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.2 + '@antfu/utils': 0.7.4 '@iconify/types': 2.0.0 debug: 4.3.4(supports-color@8.1.1) kolorist: 1.8.0 @@ -1102,7 +1108,7 @@ packages: dependencies: string-width: 5.1.2 string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 @@ -1184,7 +1190,7 @@ packages: '@types/js-yaml': 4.0.5 '@types/node': 18.16.16 '@types/request': 2.48.8 - '@types/ws': 8.5.4 + '@types/ws': 8.5.5 byline: 5.0.0 isomorphic-ws: 5.0.0(ws@8.13.0) js-yaml: 4.1.0 @@ -1192,9 +1198,9 @@ packages: request: 2.88.2 rfc4648: 1.5.2 stream-buffers: 3.0.2 - tar: 6.1.14 + tar: 6.1.15 tmp-promise: 3.0.3 - tslib: 2.5.0 + tslib: 2.5.3 underscore: 1.13.6 ws: 8.13.0 optionalDependencies: @@ -1326,8 +1332,8 @@ packages: resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} dependencies: '@types/ms': 0.7.31 dev: false @@ -1356,8 +1362,8 @@ packages: parse5: 7.1.2 dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true /@types/json5@0.0.29: @@ -1405,8 +1411,8 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false - /@types/node@14.18.47: - resolution: {integrity: sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw==} + /@types/node@14.18.48: + resolution: {integrity: sha512-iL0PIMwejpmuVHgfibHpfDwOdsbmB50wr21X71VnF5d7SsBF7WK+ZvP/SCcFm7Iwb9iiYSap9rlrdhToNAWdxg==} dev: false optional: true @@ -1453,8 +1459,8 @@ packages: resolution: {integrity: sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==} dev: false - /@types/ws@8.5.4: - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + /@types/ws@8.5.5: + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 18.16.16 dev: false @@ -1678,7 +1684,7 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.59.1 '@typescript-eslint/types': 5.59.1 @@ -1698,7 +1704,7 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.59.9 '@typescript-eslint/types': 5.59.9 @@ -1808,9 +1814,9 @@ packages: /@unocss/preset-icons@0.53.1: resolution: {integrity: sha512-itL92ZSoplYjJA22TjMQnlJVOheFL8KWy9yPvXpNc4LA+eAhfCLXK2f5DoBNE5ehg3xGRvc8nhI0lP5xKJURWQ==} dependencies: - '@iconify/utils': 2.1.5 + '@iconify/utils': 2.1.6 '@unocss/core': 0.53.1 - ofetch: 1.0.1 + ofetch: 1.1.0 transitivePeerDependencies: - supports-color dev: true @@ -1847,7 +1853,7 @@ packages: resolution: {integrity: sha512-UwAYDkdIVwydw1UxXFVQ7HufzIPxY6Nf3ATb3cKgC134xLNGxbzIQx7DQRFSGe6hmqYC2S86U+URayboGlL1iA==} dependencies: '@unocss/core': 0.53.1 - ofetch: 1.0.1 + ofetch: 1.1.0 dev: true /@unocss/preset-wind@0.53.1: @@ -1976,7 +1982,7 @@ packages: /@vitest/spy@0.32.0: resolution: {integrity: sha512-MruAPlM0uyiq3d53BkwTeShXY0rYEfhNGQzVO5GHBmmX3clsxcWp79mMnkOVcV244sNTeDcHbcPFWIjOI4tZvw==} dependencies: - tinyspy: 2.1.0 + tinyspy: 2.1.1 dev: true /@vitest/utils@0.32.0: @@ -1987,55 +1993,31 @@ packages: pretty-format: 27.5.1 dev: true - /@volar/language-core@1.4.1: - resolution: {integrity: sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==} + /@volar/language-core@1.5.4: + resolution: {integrity: sha512-l0pmKb/DPPjcD2IUwK3myYuTQW7qLLfXYBHKSGVZ7cnC168V55ecpddTA5a9AYsbCFSWx8neRj5r4JWq93QpZQ==} dependencies: - '@volar/source-map': 1.4.1 + '@volar/source-map': 1.5.4 dev: true - /@volar/source-map@1.4.1: - resolution: {integrity: sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==} + /@volar/source-map@1.5.4: + resolution: {integrity: sha512-BkvouUYFFLPxof2q6kKAZtyUKRqlS2O/WZKmzTVfPIo5uqqmZTR0+SwN1Xa1qpuezMVUOg61wkqmWP7cY2ezJg==} dependencies: muggle-string: 0.2.2 dev: true - /@volar/typescript@1.4.1-patch.2(typescript@5.1.3): - resolution: {integrity: sha512-lPFYaGt8OdMEzNGJJChF40uYqMO4Z/7Q9fHPQC/NRVtht43KotSXLrkPandVVMf9aPbiJ059eAT+fwHGX16k4w==} + /@volar/typescript@1.5.4(typescript@5.1.3): + resolution: {integrity: sha512-mVJJ7ZGY2RBDj6PAircUvLBLbFJJRNmqN5IYNpIUyFwnxdKxn1t3NhxaLYSPi/A0gdMDbCBtq0a4Azc0IuIOfQ==} peerDependencies: typescript: '*' dependencies: - '@volar/language-core': 1.4.1 - typescript: 5.1.3 - dev: true - - /@volar/vue-language-core@1.6.5: - resolution: {integrity: sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==} - dependencies: - '@volar/language-core': 1.4.1 - '@volar/source-map': 1.4.1 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-sfc': 3.3.4 - '@vue/reactivity': 3.3.2 - '@vue/shared': 3.3.4 - minimatch: 9.0.0 - muggle-string: 0.2.2 - vue-template-compiler: 2.7.14 - dev: true - - /@volar/vue-typescript@1.6.5(typescript@5.1.3): - resolution: {integrity: sha512-er9rVClS4PHztMUmtPMDTl+7c7JyrxweKSAEe/o/Noeq2bQx6v3/jZHVHBe8ZNUti5ubJL/+Tg8L3bzmlalV8A==} - peerDependencies: - typescript: '*' - dependencies: - '@volar/typescript': 1.4.1-patch.2(typescript@5.1.3) - '@volar/vue-language-core': 1.6.5 + '@volar/language-core': 1.5.4 typescript: 5.1.3 dev: true /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.22.5 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -2049,7 +2031,7 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.22.5 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 @@ -2091,21 +2073,29 @@ packages: - supports-color dev: true + /@vue/language-core@1.7.0: + resolution: {integrity: sha512-gaf2ZzA7TbbNCpmCUyM3k6ApPUf1xVINH31g5SC0t2VBriBF6+io2e4tNAd0q4kIm0NLM/yhIezFs2281juBng==} + dependencies: + '@volar/language-core': 1.5.4 + '@volar/source-map': 1.5.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + minimatch: 9.0.1 + muggle-string: 0.2.2 + vue-template-compiler: 2.7.14 + dev: true + /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.22.5 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 magic-string: 0.30.0 - /@vue/reactivity@3.3.2: - resolution: {integrity: sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g==} - dependencies: - '@vue/shared': 3.3.2 - dev: true - /@vue/reactivity@3.3.4: resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} dependencies: @@ -2133,10 +2123,6 @@ packages: '@vue/shared': 3.3.4 vue: 3.3.4 - /@vue/shared@3.3.2: - resolution: {integrity: sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==} - dev: true - /@vue/shared@3.3.4: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} @@ -2144,13 +2130,23 @@ packages: resolution: {integrity: sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==} dev: false + /@vue/typescript@1.7.0(typescript@5.1.3): + resolution: {integrity: sha512-/EcwHTezjY8DknfO/+9S04s9lXQWl7dLDJMTNjgEAWUrgJILN9cbooQ0UfTqC5Z1PPXBHHtdFyqKajrhTlSJ4A==} + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.5.4(typescript@5.1.3) + '@vue/language-core': 1.7.0 + typescript: 5.1.3 + dev: true + /@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@4.2.3)(jsdom@22.1.0)(vite@4.3.9): resolution: {integrity: sha512-qc6HyfqtuS06FvA5rK0L62Nmc1LnarVOt8/V/mTX2DBZlpTfIDpudpbE/7/kxjme9pP4PFMCk7cPSrprLEorjw==} dependencies: '@types/markdown-it': 12.2.3 '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@22.1.0) - fp-ts: 2.15.0 - inferred-types: 0.37.6(jsdom@22.1.0) + fp-ts: 2.16.0 + inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@22.1.0) markdown-it: 13.0.1 vite-plugin-md: 0.22.5(@vitejs/plugin-vue@4.2.3)(jsdom@22.1.0)(vite@4.3.9) transitivePeerDependencies: @@ -2174,7 +2170,7 @@ packages: resolution: {integrity: sha512-TLtRc/mxI74ahP3s+fJpIi+lBFAhuJuVjiQhmyi/xEwJ2pDepuWMRXT6UfJOA1cGkZ5/XGa9NFw/SQR6M5jfoQ==} engines: {node: '>=14.0'} dependencies: - inferred-types: 0.37.6(jsdom@22.1.0) + inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@22.1.0) js-yaml: 4.1.0 kind-of: 6.0.3 section-matter: 1.0.0 @@ -2197,7 +2193,7 @@ packages: /@yankeeinlondon/happy-wrapper@2.10.1(jsdom@22.1.0): resolution: {integrity: sha512-kS3HT26QSQqcZa8Me2yrb6oc/j0BTmTRR76ITRGcYlO8G1snz9wii1eCrBTx+gAo58P+e3UkxB8PTVrmjTowVA==} dependencies: - fp-ts: 2.15.0 + fp-ts: 2.16.0 happy-dom: 8.9.0 native-dash: 1.25.0(happy-dom@8.9.0)(jsdom@22.1.0) transitivePeerDependencies: @@ -2498,8 +2494,8 @@ packages: - supports-color dev: false - /aws-sdk@2.1377.0: - resolution: {integrity: sha512-59T3v/o40fk2I2zpgh2E0Z/BBK5awBQUva7VLjLHo9rsMvTM58mgya667hYTua00rHC1A3GJSCNORUhXvhomYQ==} + /aws-sdk@2.1394.0: + resolution: {integrity: sha512-Co33zmBHfVkQ/PxM5AZQ5HVKmhQFT9yGAiP+dfCgIxHTGjZ4t1tlc/cPEoA5bd1fbIP29EGOd11+Tu9UAYwB+w==} engines: {node: '>= 10.0.0'} dependencies: buffer: 4.9.2 @@ -2525,7 +2521,7 @@ packages: /axios-retry@3.5.0: resolution: {integrity: sha512-g48qNrLX30VU6ECWltpFCPegKK6dWzMDYv2o83W2zUL/Zh/SLXbT6ksGoKqYZHtghzqeeXhZBcSXJkO1fPbCcw==} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.5 is-retry-allowed: 2.2.0 dev: false @@ -2630,28 +2626,6 @@ packages: - terser dev: true - /brilliant-errors@0.7.3(jsdom@22.1.0): - resolution: {integrity: sha512-WT9BkAze4SUOJfr7LUwJWNDAvynEAvUMvMPuFKu8QQKnRq+WMx3DAtHfOBJjHmHRxf748JY3CNVytSk6HH2yGg==} - engines: {node: '>=14.0.0'} - dependencies: - bumpp: 8.2.1 - callsites: 4.0.0 - inferred-types: 0.37.6(jsdom@22.1.0) - vitest: 0.25.8(happy-dom@8.9.0)(jsdom@22.1.0) - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@vitest/browser' - - '@vitest/ui' - - happy-dom - - jsdom - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} dev: false @@ -2728,8 +2702,8 @@ packages: engines: {node: '>=10.6.0'} dev: false - /cacheable-request@7.0.2: - resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} dependencies: clone-response: 1.0.3 @@ -2893,6 +2867,14 @@ packages: string-width: 5.1.2 dev: true + /clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + dev: false + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2973,7 +2955,7 @@ packages: dependencies: date-time: 3.1.0 esutils: 2.0.3 - fast-diff: 1.2.0 + fast-diff: 1.3.0 js-string-escape: 1.0.1 lodash: 4.17.21 md5-hex: 3.0.1 @@ -3154,7 +3136,7 @@ packages: dependencies: '@cypress/request': 2.88.11 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.47 + '@types/node': 14.18.48 '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.3 arch: 2.2.0 @@ -3168,7 +3150,7 @@ packages: cli-table3: 0.6.3 commander: 6.2.1 common-tags: 1.8.2 - dayjs: 1.11.7 + dayjs: 1.11.8 debug: 4.3.4(supports-color@8.1.1) enquirer: 2.3.6 eventemitter2: 6.4.7 @@ -3222,7 +3204,7 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.5 dev: false /date-time@3.1.0: @@ -3236,8 +3218,8 @@ packages: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /dayjs@1.11.7: - resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + /dayjs@1.11.8: + resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==} dev: false optional: true @@ -3348,6 +3330,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + /delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + dev: false + /destr@1.2.2: resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} dev: true @@ -3424,8 +3410,8 @@ packages: engines: {node: '>=12'} dev: false - /dottie@2.0.3: - resolution: {integrity: sha512-4liA0PuRkZWQFQjwBypdxPfZaRWiv5tkhMXY2hzsa2pNf5s7U3m9cwUchfNKe8wZQxdGPQQzO6Rm2uGe0rvohQ==} + /dottie@2.0.4: + resolution: {integrity: sha512-iz64WUOmp/ECQhWMJjTWFzJN/wQ7RJ5v/a6A2OiCwjaGCpNo66WGIjlSf+IULO9DQd0b4cFawLOTbiKSrpKodw==} dev: false /duplexer@0.1.2: @@ -3634,7 +3620,7 @@ packages: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7(supports-color@5.5.0) - is-core-module: 2.12.0 + is-core-module: 2.12.1 resolve: 1.22.2 transitivePeerDependencies: - supports-color @@ -3738,7 +3724,7 @@ packages: eslint-import-resolver-node: 0.3.7 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.1)(eslint-import-resolver-node@0.3.7)(eslint@8.42.0) has: 1.0.3 - is-core-module: 2.12.0 + is-core-module: 2.12.1 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 @@ -3771,7 +3757,7 @@ packages: eslint-import-resolver-node: 0.3.7 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint@8.42.0) has: 1.0.3 - is-core-module: 2.12.0 + is-core-module: 2.12.1 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 @@ -3795,7 +3781,7 @@ packages: eslint: 8.42.0 eslint-plugin-es-x: 6.2.1(eslint@8.42.0) ignore: 5.2.4 - is-core-module: 2.12.0 + is-core-module: 2.12.1 minimatch: 3.1.2 resolve: 1.22.2 semver: 7.5.1 @@ -3820,7 +3806,7 @@ packages: eslint: 8.42.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.12 + postcss-selector-parser: 6.0.13 semver: 7.5.1 vue-eslint-parser: 9.3.0(eslint@8.42.0) xml-name-validator: 4.0.0 @@ -4068,8 +4054,8 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true /fast-glob@3.2.12: @@ -4110,14 +4096,14 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-querystring@1.1.1: - resolution: {integrity: sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==} + /fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 dev: false - /fast-redact@3.1.2: - resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + /fast-redact@3.2.0: + resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} engines: {node: '>=6'} dev: false @@ -4166,14 +4152,14 @@ packages: resolution: {integrity: sha512-tzuY1tgWJo2Y6qEKwmLhFvACUmr68Io2pqP/sDKU71KRM6A6R3DrCDqLGqANbeLZcKUfdfY58ut35CGqemcTgg==} dependencies: '@fastify/ajv-compiler': 3.5.0 - '@fastify/error': 3.2.0 + '@fastify/error': 3.2.1 '@fastify/fast-json-stringify-compiler': 4.3.0 abstract-logging: 2.0.1 avvio: 8.2.1 fast-content-type-parse: 1.0.0 fast-json-stringify: 5.7.0 find-my-way: 7.6.2 - light-my-request: 5.9.1 + light-my-request: 5.10.0 pino: 8.14.1 process-warning: 2.2.0 proxy-addr: 2.0.7 @@ -4243,7 +4229,7 @@ packages: engines: {node: '>=14'} dependencies: fast-deep-equal: 3.1.3 - fast-querystring: 1.1.1 + fast-querystring: 1.1.2 safe-regex2: 2.0.0 dev: false @@ -4275,18 +4261,18 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /focus-trap-vue@4.0.2(focus-trap@7.4.1)(vue@3.3.4): + /focus-trap-vue@4.0.2(focus-trap@7.4.3)(vue@3.3.4): resolution: {integrity: sha512-2iQN2xKCSCzyhcD90VpueQcTIAhaCRxxo67fkz7RSqLmEd16QKjfGslCr3KxvBx0LfpVN9j0IAyKKuJKw3Intg==} peerDependencies: focus-trap: ^7.0.0 vue: ^3.0.0 dependencies: - focus-trap: 7.4.1 + focus-trap: 7.4.3 vue: 3.3.4 dev: false - /focus-trap@7.4.1: - resolution: {integrity: sha512-rnXP5ERIjlo1gEZp7hQb4ekYqUxRuSDQeyWvxhahH3/GkWtd8h8g1C8Eu/KGpuvbUWNVeogK0kuzzrM4u2Z9jA==} + /focus-trap@7.4.3: + resolution: {integrity: sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==} dependencies: tabbable: 6.1.2 dev: false @@ -4350,13 +4336,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /fp-ts@2.15.0: - resolution: {integrity: sha512-3o6EllAvGuCsDgjM+frscLKDRPR9pqbrg13tJ13z86F4eni913kBV8h85rM6zpu2fEvJ8RWA0ouYlUWwHEmxTg==} - dev: true - /fp-ts@2.16.0: resolution: {integrity: sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==} - dev: false /from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} @@ -4503,10 +4484,10 @@ packages: hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.0 + jackspeak: 2.2.1 minimatch: 9.0.1 - minipass: 5.0.0 - path-scurry: 1.8.0 + minipass: 6.0.2 + path-scurry: 1.9.2 dev: true /glob@7.2.3: @@ -4596,6 +4577,12 @@ packages: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} dev: true + /good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + dependencies: + delegate: 3.2.0 + dev: false + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -4610,7 +4597,7 @@ packages: '@types/cacheable-request': 6.0.3 '@types/responselike': 1.0.0 cacheable-lookup: 5.0.4 - cacheable-request: 7.0.2 + cacheable-request: 7.0.4 decompress-response: 6.0.0 http2-wrapper: 1.0.3 lowercase-keys: 2.0.0 @@ -4933,24 +4920,6 @@ packages: - terser dev: true - /inferred-types@0.37.6(jsdom@22.1.0): - resolution: {integrity: sha512-CfL5g1wR5rVwX2K5S6wSL+h9eODScum/LBwlhGRrcBIvfYppvUQM0aeRJ1BZS+QE38kGzd3v+U526+nQR7ZUkg==} - dependencies: - brilliant-errors: 0.7.3(jsdom@22.1.0) - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@vitest/browser' - - '@vitest/ui' - - happy-dom - - jsdom - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /inflection@1.13.4: resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} engines: {'0': node >= 0.4.0} @@ -5049,8 +5018,8 @@ packages: dev: false optional: true - /is-core-module@2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} dependencies: has: 1.0.3 dev: true @@ -5276,8 +5245,8 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jackspeak@2.2.0: - resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} + /jackspeak@2.2.1: + resolution: {integrity: sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -5360,12 +5329,12 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.4 + nwsapi: 2.2.5 parse5: 7.1.2 rrweb-cssom: 0.6.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.2 + tough-cookie: 4.1.3 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 @@ -5559,8 +5528,8 @@ packages: immediate: 3.0.6 dev: false - /light-my-request@5.9.1: - resolution: {integrity: sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==} + /light-my-request@5.10.0: + resolution: {integrity: sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==} dependencies: cookie: 0.5.0 process-warning: 2.2.0 @@ -5599,7 +5568,7 @@ packages: object-inspect: 1.12.3 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.2.2 + yaml: 2.3.1 transitivePeerDependencies: - enquirer - supports-color @@ -5769,8 +5738,8 @@ packages: dependencies: yallist: 4.0.0 - /lru-cache@9.1.1: - resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} + /lru-cache@9.1.2: + resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} engines: {node: 14 || >=16.14} dev: true @@ -5967,13 +5936,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.0: - resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} @@ -6003,6 +5965,12 @@ packages: /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + dev: false + + /minipass@6.0.2: + resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -6018,8 +5986,8 @@ packages: hasBin: true dev: false - /mlly@1.2.1: - resolution: {integrity: sha512-1aMEByaWgBPEbWV2BOPEMySRrzl7rIHXmQxam4DM8jVjalTQDjpN2ZKOLUrwyhfZQO7IXHml2StcHMhooDeEEQ==} + /mlly@1.3.0: + resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==} dependencies: acorn: 8.8.2 pathe: 1.1.1 @@ -6105,8 +6073,8 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-fetch-native@1.1.1: - resolution: {integrity: sha512-9VvspTSUp2Sxbl+9vbZTlFGq9lHwE8GDVVekxx6YsNd1YH59sb3Ba8v3Y3cD8PkLNcileGGcA21PFjVl0jzDaw==} + /node-fetch-native@1.2.0: + resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} dev: true /node-fetch@2.6.11: @@ -6121,7 +6089,7 @@ packages: whatwg-url: 5.0.0 dev: true - /node-vault-client@0.6.1(aws-sdk@2.1377.0)(config@3.3.9): + /node-vault-client@0.6.1(aws-sdk@2.1394.0)(config@3.3.9): resolution: {integrity: sha512-38wZwAsNz+8YGRv+oO8+q5SNCpBi3Z/EII3z5+4vxcoG1h5KLmanaGH5P5DVCUUmDAWm5+4//7ua44PHSc6dAQ==} engines: {node: '>=6.0.0'} peerDependencies: @@ -6129,7 +6097,7 @@ packages: config: '>=1 <4' dependencies: assign-deep: 1.0.1 - aws-sdk: 2.1377.0 + aws-sdk: 2.1394.0 aws4: 1.12.0 bluebird: 3.7.2 config: 3.3.9 @@ -6179,7 +6147,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.12.0 + is-core-module: 2.12.1 semver: 7.5.1 validate-npm-package-license: 3.0.4 dev: true @@ -6229,8 +6197,8 @@ packages: boolbase: 1.0.0 dev: true - /nwsapi@2.2.4: - resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} + /nwsapi@2.2.5: + resolution: {integrity: sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==} dev: true /oauth-sign@0.9.0: @@ -6274,11 +6242,11 @@ packages: resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} dev: false - /ofetch@1.0.1: - resolution: {integrity: sha512-icBz2JYfEpt+wZz1FRoGcrMigjNKjzvufE26m9+yUiacRQRHwnNlGRPiDnW4op7WX/MR6aniwS8xw8jyVelF2g==} + /ofetch@1.1.0: + resolution: {integrity: sha512-yjq2ZUUMto1ITpge2J5vNlUfteLzxfHn9aJC55WtVGD3okKwSfPoLaKpcHXmmKd2kZZUGo+jdkFuuj09Blyeig==} dependencies: destr: 1.2.2 - node-fetch-native: 1.1.1 + node-fetch-native: 1.2.0 ufo: 1.1.2 dev: true @@ -6428,7 +6396,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -6472,12 +6440,12 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.8.0: - resolution: {integrity: sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==} + /path-scurry@1.9.2: + resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 9.1.1 - minipass: 5.0.0 + lru-cache: 9.1.2 + minipass: 6.0.2 dev: true /path-type@3.0.0: @@ -6492,10 +6460,6 @@ packages: engines: {node: '>=8'} dev: true - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true @@ -6671,7 +6635,7 @@ packages: hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.1.2 + fast-redact: 3.2.0 on-exit-leak-free: 2.1.0 pino-abstract-transport: 1.0.0 pino-std-serializers: 6.2.1 @@ -6687,7 +6651,7 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.2.1 + mlly: 1.3.0 pathe: 1.1.1 dev: true @@ -6723,14 +6687,6 @@ packages: postcss: 8.4.24 dev: true - /postcss-selector-parser@6.0.12: - resolution: {integrity: sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - /postcss-selector-parser@6.0.13: resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} engines: {node: '>=4'} @@ -6743,15 +6699,6 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - /postcss@8.4.24: resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} engines: {node: ^10 || ^12 || >=14} @@ -6895,13 +6842,6 @@ packages: dev: false optional: true - /qs@6.11.1: - resolution: {integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} @@ -7157,7 +7097,7 @@ packages: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.12.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -7209,8 +7149,8 @@ packages: glob: 10.2.7 dev: true - /rollup@3.21.7: - resolution: {integrity: sha512-KXPaEuR8FfUoK2uHwNjxTmJ18ApyvD6zJpYv9FOJSqLStmt6xOY84l1IjK2dSolQmoXknrhEFRaPRgOPdqCT5w==} + /rollup@3.24.0: + resolution: {integrity: sha512-OgraHOIg2YpHQTjl0/ymWfFNBEyPucB7lmhXrQUh38qNOegxLapSPFs9sNr0qKR75awW41D93XafoR2QfhBdUQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -7230,7 +7170,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.0 + tslib: 2.5.3 /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -7283,6 +7223,10 @@ packages: /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -7360,10 +7304,10 @@ packages: tedious: optional: true dependencies: - '@types/debug': 4.1.7 + '@types/debug': 4.1.8 '@types/validator': 13.7.17 debug: 4.3.4(supports-color@8.1.1) - dottie: 2.0.3 + dottie: 2.0.4 inflection: 1.13.4 lodash: 4.17.21 moment: 2.29.4 @@ -7631,7 +7575,7 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /string.prototype.padend@3.1.4: @@ -7686,8 +7630,8 @@ packages: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 @@ -7882,8 +7826,8 @@ packages: strip-ansi: 6.0.1 dev: true - /tar@6.1.14: - resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -7937,6 +7881,10 @@ packages: engines: {node: '>=4'} dev: true + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + /tiny-lru@11.0.1: resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==} engines: {node: '>=12'} @@ -7961,8 +7909,8 @@ packages: engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} engines: {node: '>=14.0.0'} dev: true @@ -8014,8 +7962,8 @@ packages: punycode: 2.3.0 dev: false - /tough-cookie@4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} dependencies: psl: 1.9.0 @@ -8096,8 +8044,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} /tsutils@3.21.0(typescript@5.1.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -8270,7 +8218,7 @@ packages: /unconfig@0.3.9: resolution: {integrity: sha512-8yhetFd48M641mxrkWA+C/lZU4N0rCOdlo3dFsyFPnBHBjMJfjT/3eAZBRT2RxCRqeBMAKBVgikejdS6yeBjMw==} dependencies: - '@antfu/utils': 0.7.2 + '@antfu/utils': 0.7.4 defu: 6.1.2 jiti: 1.18.2 dev: true @@ -8441,8 +8389,8 @@ packages: dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@8.1.1) - mlly: 1.2.1 - pathe: 1.1.0 + mlly: 1.3.0 + pathe: 1.1.1 picocolors: 1.0.0 vite: 4.3.9(@types/node@18.16.16) transitivePeerDependencies: @@ -8537,8 +8485,8 @@ packages: dependencies: '@types/node': 18.16.16 esbuild: 0.17.19 - postcss: 8.4.23 - rollup: 3.21.7 + postcss: 8.4.24 + rollup: 3.24.0 optionalDependencies: fsevents: 2.3.2 dev: true @@ -8590,71 +8538,6 @@ packages: - terser dev: true - /vitest@0.32.0: - resolution: {integrity: sha512-SW83o629gCqnV3BqBnTxhB10DAwzwEx3z+rqYZESehUB+eWsJxwcBQx7CKy0otuGMJTYh7qCVuUX23HkftGl/Q==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 18.16.16 - '@vitest/expect': 0.32.0 - '@vitest/runner': 0.32.0 - '@vitest/snapshot': 0.32.0 - '@vitest/spy': 0.32.0 - '@vitest/utils': 0.32.0 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4(supports-color@8.1.1) - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.3.3 - strip-literal: 1.0.1 - tinybench: 2.5.0 - tinypool: 0.5.0 - vite: 4.3.9(@types/node@18.16.16) - vite-node: 0.32.0(@types/node@18.16.16) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@0.32.0(jsdom@22.1.0): resolution: {integrity: sha512-SW83o629gCqnV3BqBnTxhB10DAwzwEx3z+rqYZESehUB+eWsJxwcBQx7CKy0otuGMJTYh7qCVuUX23HkftGl/Q==} engines: {node: '>=v14.18.0'} @@ -8703,7 +8586,7 @@ packages: jsdom: 22.1.0 local-pkg: 0.4.3 magic-string: 0.30.0 - pathe: 1.1.0 + pathe: 1.1.1 picocolors: 1.0.0 std-env: 3.3.3 strip-literal: 1.0.1 @@ -8785,18 +8668,27 @@ packages: he: 1.2.0 dev: true - /vue-tsc@1.6.5(typescript@5.1.3): - resolution: {integrity: sha512-Wtw3J7CC+JM2OR56huRd5iKlvFWpvDiU+fO1+rqyu4V2nMTotShz4zbOZpW5g9fUOcjnyZYfBo5q5q+D/q27JA==} + /vue-tsc@1.7.0(typescript@5.1.3): + resolution: {integrity: sha512-WXRQ6StfLrXHq1uIe29o9OOKh6aXR2LdxT7z951ZZzEJj3y+dCoaqCOT9NVtvCK5C2m6PbFKRx5sG7t/jbtmjg==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/vue-language-core': 1.6.5 - '@volar/vue-typescript': 1.6.5(typescript@5.1.3) + '@vue/language-core': 1.7.0 + '@vue/typescript': 1.7.0(typescript@5.1.3) semver: 7.5.1 typescript: 5.1.3 dev: true + /vue3-json-viewer@2.2.2(vue@3.3.4): + resolution: {integrity: sha512-56l3XDGggnpwEqZieXsSMhNT4NhtO6d7zuSAxHo4i0UVxymyY2jRb7UMQOU1ztChKALZCAzX7DlgrsnEhxu77A==} + peerDependencies: + vue: ^3.2.0 + dependencies: + clipboard: 2.0.11 + vue: 3.3.4 + dev: false + /vue@3.3.4: resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} dependencies: @@ -8949,7 +8841,7 @@ packages: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /wrappy@1.0.2: @@ -9014,8 +8906,8 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.2.2: - resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} dev: true