diff --git a/.changeset/funny-gorillas-design.md b/.changeset/funny-gorillas-design.md new file mode 100644 index 00000000..1682797f --- /dev/null +++ b/.changeset/funny-gorillas-design.md @@ -0,0 +1,5 @@ +--- +'@lightmill/log-server': major +--- + +Clients now keep access to a run after having canceled or completed it. One must delete the session to remove a client's access to a run. diff --git a/.changeset/giant-eagles-tickle.md b/.changeset/giant-eagles-tickle.md new file mode 100644 index 00000000..7226dc6e --- /dev/null +++ b/.changeset/giant-eagles-tickle.md @@ -0,0 +1,5 @@ +--- +'@lightmill/log-client': minor +--- + +Log client logout diff --git a/.changeset/late-kangaroos-bow.md b/.changeset/late-kangaroos-bow.md new file mode 100644 index 00000000..c54f7b43 --- /dev/null +++ b/.changeset/late-kangaroos-bow.md @@ -0,0 +1,6 @@ +--- +'@lightmill/log-server': minor +'@lightmill/log-api': minor +--- + +Add endpoint to get run info diff --git a/.changeset/lemon-moles-smoke.md b/.changeset/lemon-moles-smoke.md new file mode 100644 index 00000000..39d5d48d --- /dev/null +++ b/.changeset/lemon-moles-smoke.md @@ -0,0 +1,5 @@ +--- +'@lightmill/log-client': minor +--- + +resumeRun returns the log after which the run has been resumed diff --git a/.changeset/long-games-crash.md b/.changeset/long-games-crash.md new file mode 100644 index 00000000..f446bc27 --- /dev/null +++ b/.changeset/long-games-crash.md @@ -0,0 +1,6 @@ +--- +'@lightmill/log-server': minor +'@lightmill/log-api': minor +--- + +Add the ability to resume a running or canceled run. diff --git a/.changeset/proud-carrots-hide.md b/.changeset/proud-carrots-hide.md new file mode 100644 index 00000000..6c1bcf2a --- /dev/null +++ b/.changeset/proud-carrots-hide.md @@ -0,0 +1,5 @@ +--- +'@lightmill/react-experiment': minor +--- + +Add resumeAfter Run prop diff --git a/.changeset/silly-points-grow.md b/.changeset/silly-points-grow.md new file mode 100644 index 00000000..ac859fe9 --- /dev/null +++ b/.changeset/silly-points-grow.md @@ -0,0 +1,5 @@ +--- +'@lightmill/runner': major +--- + +Update Runner interface. diff --git a/.changeset/tidy-taxis-grow.md b/.changeset/tidy-taxis-grow.md new file mode 100644 index 00000000..62f06c4e --- /dev/null +++ b/.changeset/tidy-taxis-grow.md @@ -0,0 +1,5 @@ +--- +'@lightmill/log-server': patch +--- + +Prevent resuming a run when there is already another run running diff --git a/.changeset/weak-months-dance.md b/.changeset/weak-months-dance.md new file mode 100644 index 00000000..bf1ba943 --- /dev/null +++ b/.changeset/weak-months-dance.md @@ -0,0 +1,5 @@ +--- +'@lightmill/log-server': patch +--- + +Fix run start being blocked when there run in the session but they're all completed diff --git a/.github/workflows/node.js.yaml b/.github/workflows/node.js.yaml index ce67a840..204cb188 100644 --- a/.github/workflows/node.js.yaml +++ b/.github/workflows/node.js.yaml @@ -36,7 +36,7 @@ jobs: restore-keys: | ${{ runner.os }}-pnpm-store- - run: pnpm install --frozen-lockfile - - run: pnpm run -r build + - run: pnpm run build-all test: needs: ['build'] @@ -65,8 +65,8 @@ jobs: restore-keys: | ${{ runner.os }}-pnpm-store- - run: pnpm install --frozen-lockfile - - run: pnpm run -r build - - run: pnpm run -r test + - run: pnpm run build-all + - run: pnpm run test-all lint: runs-on: ubuntu-latest diff --git a/package.json b/package.json index 2c52e3dc..8e39c044 100644 --- a/package.json +++ b/package.json @@ -2,21 +2,23 @@ "name": "lightmill", "license": "MIT", "type": "module", - "packageManager": "pnpm@7.27.0", + "packageManager": "pnpm@8.10.2", "private": false, "scripts": { "lint": "eslint . && prettier --check .", + "build-all": "pnpm -r build", + "test-all": "pnpm -r test run", "changeset": "changeset", "release": "pnpm -r build && changeset publish" }, "dependencies": { "@changesets/cli": "^2.26.2", - "@typescript-eslint/eslint-plugin": "^6.4.0", - "@typescript-eslint/parser": "^6.4.0", - "eslint": "8.47.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "8.54.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-import": "2.28.0", - "prettier": "3.0.2", - "typescript": "5.1.6" + "eslint-plugin-import": "2.29.0", + "prettier": "3.1.0", + "typescript": "5.3.2" } } diff --git a/packages/convert-touchstone/package.json b/packages/convert-touchstone/package.json index 1dae9f74..5ccee83c 100644 --- a/packages/convert-touchstone/package.json +++ b/packages/convert-touchstone/package.json @@ -1,9 +1,9 @@ { "name": "@lightmill/convert-touchstone", - "packageManager": "pnpm@7.13.4", "version": "3.0.0-alpha.8", "type": "module", "description": "Converts touchstone XML exports to lightmill format.", + "packageManager": "pnpm@8.10.2", "exports": { "default": "./dist/convert-touchstone.js", "*": "./dist/*" @@ -23,7 +23,7 @@ "@lightmill/static-design": "workspace:*", "@types/sax": "^1.2.4", "cross-env": "^7.0.3", - "typescript": "5.1.6", + "typescript": "5.2.2", "vite": "^4.4.8", "vitest": "^0.34.1" }, diff --git a/packages/convert-touchstone/tsconfig.build.json b/packages/convert-touchstone/tsconfig.build.json index cad66391..016650c3 100644 --- a/packages/convert-touchstone/tsconfig.build.json +++ b/packages/convert-touchstone/tsconfig.build.json @@ -5,5 +5,5 @@ "rootDir": "src", "outDir": "dist" }, - "include": ["src/**/*.ts"] + "include": ["./src/**/*.ts"] } diff --git a/packages/log-api/package.json b/packages/log-api/package.json index cb6a07e6..5edcb934 100644 --- a/packages/log-api/package.json +++ b/packages/log-api/package.json @@ -21,7 +21,7 @@ "prepublish": "pnpm run build" }, "devDependencies": { - "typescript": "5.1.6", + "typescript": "5.2.2", "vite": "^4.4.8", "vitest": "^0.34.1" }, @@ -29,5 +29,5 @@ "@zodios/core": "^10.9.2", "zod": "^3.21.4" }, - "packageManager": "pnpm@7.17.0" + "packageManager": "pnpm@8.10.2" } diff --git a/packages/log-api/src/api.ts b/packages/log-api/src/api.ts index 26dbc243..3e587ce3 100644 --- a/packages/log-api/src/api.ts +++ b/packages/log-api/src/api.ts @@ -16,7 +16,7 @@ const ErrorResponse = z.object({ status: z.literal('error'), message: z.string(), }); -const Role = z.enum(['admin', 'participant']); +const Role = z.enum(['host', 'participant']); const LogParameter = z.object({ type: z.string(), // Required because requests can arrive out of order. @@ -42,7 +42,9 @@ export const api = makeApi([ ], response: OkResponse.extend({ role: Role, - runs: z.array(z.string()), + runs: z.array( + z.object({ runId: z.string(), experimentId: z.string() }).strict(), + ), }).strict(), errors: [ { status: 400, schema: ErrorResponse }, @@ -54,7 +56,7 @@ export const api = makeApi([ path: '/sessions/current', response: OkResponse.extend({ runs: z.array( - z.object({ id: z.string(), experiment: z.string() }).strict(), + z.object({ runId: z.string(), experimentId: z.string() }).strict(), ), role: Role, }).strict(), @@ -76,8 +78,8 @@ export const api = makeApi([ { schema: z .object({ - id: z.string().optional(), - experiment: z.string().optional(), + runId: z.string().optional(), + experimentId: z.string().optional(), }) .strict() .optional(), @@ -86,23 +88,42 @@ export const api = makeApi([ }, ], response: OkResponse.extend({ - run: z.string(), - experiment: z.string(), - links: z + runId: z.string(), + experimentId: z.string(), + }).strict(), + errors: [{ status: 403, schema: ErrorResponse.strict() }], + }, + { + method: 'get', + path: '/experiments/:experimentId/runs/:runId', + response: OkResponse.extend({ + run: z .object({ - logs: z.string(), - run: z.string(), + runId: z.string(), + experimentId: z.string(), + status: z.union([ + z.literal('completed'), + z.literal('canceled'), + z.literal('running'), + ]), + logs: z.array( + z + .object({ + type: z.string(), + count: z.number(), + pending: z.number(), + lastNumber: z.number(), + }) + .strict(), + ), }) .strict(), }).strict(), - errors: [ - { status: 403, schema: ErrorResponse.strict() }, - { status: 400, schema: ErrorResponse.strict() }, - ], + errors: [{ status: 403, schema: ErrorResponse.strict() }], }, { method: 'patch', - path: '/experiments/:experiment/runs/:run', + path: '/experiments/:experimentId/runs/:runId', response: OkResponse.strict(), errors: [ { status: 404, schema: ErrorResponse.strict() }, @@ -111,11 +132,14 @@ export const api = makeApi([ ], parameters: [ { - schema: z - .object({ - status: z.union([z.literal('completed'), z.literal('canceled')]), - }) - .strict(), + schema: z.union([ + z + .object({ + status: z.union([z.literal('completed'), z.literal('canceled')]), + }) + .strict(), + z.object({ resumeFrom: z.number() }).strict(), + ]), name: 'body', type: 'Body', }, @@ -123,7 +147,7 @@ export const api = makeApi([ }, { method: 'post', - path: '/experiments/:experiment/runs/:run/logs', + path: '/experiments/:experimentId/runs/:runId/logs', parameters: [ { schema: z.union([ @@ -139,7 +163,7 @@ export const api = makeApi([ }, { method: 'get', - path: '/experiments/:experiment/logs', + path: '/experiments/:experimentId/logs', parameters: [ { name: 'type', @@ -175,7 +199,7 @@ export type Response< export type Error< M extends Method, P extends ZodiosPathsByMethod, - Status extends number, + Status extends number = number, > = ZodiosErrorByPath; export type ErrorStatus< M extends Method, diff --git a/packages/log-api/tsconfig.build.json b/packages/log-api/tsconfig.build.json index cc23d88c..122d223d 100644 --- a/packages/log-api/tsconfig.build.json +++ b/packages/log-api/tsconfig.build.json @@ -6,7 +6,7 @@ "outDir": "dist", "target": "es2020", "lib": ["es2020"], - "module": "ES2020", + "module": "Node16", "moduleResolution": "Node16", "allowSyntheticDefaultImports": true, "noImplicitAny": true, diff --git a/packages/log-api/tsconfig.json b/packages/log-api/tsconfig.json index 3c36fd27..fbb956ca 100644 --- a/packages/log-api/tsconfig.json +++ b/packages/log-api/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "target": "es2020", "lib": ["es2020"], - "module": "ES2020", + "module": "Node16", "moduleResolution": "Node16", "allowSyntheticDefaultImports": true, "noImplicitAny": true, diff --git a/packages/log-client/__tests__/main.test.ts b/packages/log-client/__tests__/main.test.ts index 1e4dfed4..6ad11fc8 100644 --- a/packages/log-client/__tests__/main.test.ts +++ b/packages/log-client/__tests__/main.test.ts @@ -1,9 +1,13 @@ -import { LogClient } from '../src/main.js'; +import { LogClient } from '../src/log-client.js'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { afterAll, afterEach, beforeAll } from 'vitest'; -import type { Response as ApiResponse, Path } from '@lightmill/log-api'; +import type { + Response as ApiResponse, + Path, + Body as ApiBody, +} from '@lightmill/log-api'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; // This does not work well because it does not prevent string from containing // a slash, so some incorrect paths are allowed, @@ -11,86 +15,152 @@ import { rest } from 'msw'; type TemplatizedPath

= P extends `${infer Start}/:${string}/${infer End}` ? `${Start}/${string}/${TemplatizedPath}` : P extends `${infer Start}/:${string}` - ? `${Start}/${string}` - : P; + ? `${Start}/${string}` + : P; type ServerPath = `https://server.test/api${TemplatizedPath}`; const server = setupServer( - rest.post( - 'https://server.test/api/experiments/experiment-id/runs/run-id/logs' satisfies ServerPath, - (req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ status: 'ok' } satisfies ApiResponse< - 'post', - '/experiments/:experiment/runs/:run/logs' - >), - ); + http.delete( + 'https://server.test/api/sessions/current' satisfies ServerPath, + () => { + return HttpResponse.json({ status: 'ok' } satisfies ApiResponse< + 'delete', + '/sessions/current' + >); }, ), - rest.post( + http.post( 'https://server.test/api/runs' satisfies ServerPath, - async (req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ - status: 'ok', - run: 'run-id', - experiment: 'experiment-id', - links: { - logs: '/experiments/experiment-id/runs/run-id/logs', - run: '/experiments/experiment-id/runs/run-id', - }, - } satisfies ApiResponse<'post', '/runs'>), - ); + async ({ request }) => { + let body = (await request.json()) as ApiBody<'post', '/runs'>; + return HttpResponse.json({ + status: 'ok', + runId: body?.runId ?? 'default-run-id', + experimentId: body?.experimentId ?? 'default-experiment-id', + } satisfies ApiResponse<'post', '/runs'>); }, ), - rest.patch( - 'https://server.test/api/experiments/experiment-id/runs/run-id' satisfies ServerPath, - (req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ status: 'ok' } satisfies ApiResponse< - 'patch', - '/experiments/:experiment/runs/:run' - >), - ); + http.get( + 'https://server.test/api/sessions/current' satisfies ServerPath, + () => { + return HttpResponse.json({ + status: 'ok', + role: 'participant', + runs: [], + } satisfies ApiResponse<'get', '/sessions/current'>); }, ), ); -let requests: Array<{ url: string; method: string }> = []; -let requestBodies: Array> = []; - -async function waitForRequestJsonBodies() { - let bodies = await Promise.all(requestBodies); - return bodies - .map((body) => JSON.parse(body)) - .map((body, i) => ({ - body, - ...requests[i], - })); +function setServerRuns( + runs: Array<{ + runId: string; + experimentId: string; + status?: 'completed' | 'canceled' | 'running'; + logs?: Array<{ + type: string; + count: number; + lastNumber: number; + pending: number; + }>; + }>, +) { + server.use( + http.get( + 'https://server.test/api/sessions/current' satisfies ServerPath, + () => { + return HttpResponse.json({ + status: 'ok', + role: 'participant', + runs, + } satisfies ApiResponse<'get', '/sessions/current'>); + }, + ), + ...runs.flatMap((run) => [ + http.get( + `https://server.test/api/experiments/${run.experimentId}/runs/${run.runId}` satisfies ServerPath, + () => { + return HttpResponse.json({ + status: 'ok', + run: { status: 'running', logs: [], ...run }, + } satisfies ApiResponse< + 'get', + '/experiments/:experimentId/runs/:runId' + >); + }, + ), + http.patch( + `https://server.test/api/experiments/${run.experimentId}/runs/${run.runId}` satisfies ServerPath, + () => { + return HttpResponse.json({ status: 'ok' } satisfies ApiResponse< + 'patch', + '/experiments/:experimentId/runs/:runId' + >); + }, + ), + ]), + ...runs.flatMap((run) => [ + http.post( + `https://server.test/api/experiments/${run.experimentId}/runs/${run.runId}/logs` satisfies ServerPath, + () => { + return HttpResponse.json({ status: 'ok' } satisfies ApiResponse< + 'post', + '/experiments/:experimentId/runs/:runId/logs' + >); + }, + ), + http.patch( + `https://server.test/api/experiments/${run.experimentId}/runs/${run.runId}` satisfies ServerPath, + () => { + return HttpResponse.json({ status: 'ok' } satisfies ApiResponse< + 'patch', + '/experiments/:experimentId/runs/:runId' + >); + }, + ), + ]), + ); +} + +let requests: Array = []; + +async function waitForRequests() { + return Promise.all( + requests.map(async (r) => { + let body = r.body == null ? null : await r.json(); + return { method: r.method, url: r.url, body }; + }), + ); +} + +// In most cases, these are the one we care about because these are the one +// that actually change the state of the server. +const HTTP_CHANGE_METHODS = ['PUT', 'PATCH', 'POST', 'DELETE']; +async function waitForChangeRequests() { + let requests = await waitForRequests(); + return requests.filter((r) => HTTP_CHANGE_METHODS.includes(r.method)); } function clearRequests() { requests = []; - requestBodies = []; } // Start server before all tests. -beforeAll(() => server.listen()); +beforeAll(() => { + server.listen({ onUnhandledRequest: 'error' }); +}); // Close server after all tests. -afterAll(() => server.close()); +afterAll(() => { + server.close(); +}); beforeEach(() => { vi.useFakeTimers(); - server.events.on('request:start', (req) => { - requests.push({ - url: req.url.toString(), - method: req.method, - }); - requestBodies.push(req.text()); + server.events.on('request:start', ({ request }) => { + // We need to clone the request because it is a stream and may be + // consumed by the server. + requests.push(request.clone()); }); }); @@ -108,7 +178,7 @@ describe('RunLogger#startRun', () => { apiRoot: 'https://server.test/api', }); await logger.startRun(); - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/runs', method: 'POST', @@ -120,27 +190,190 @@ describe('RunLogger#startRun', () => { it('should send a start request with parameters', async () => { const logger = new LogClient({ apiRoot: 'https://server.test/api', - run: 'test-run', - experiment: 'test-experiment', + runId: 'test-run', + experimentId: 'test-experiment', }); await logger.startRun(); - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/runs', method: 'POST', - body: { id: 'test-run', experiment: 'test-experiment' }, + body: { runId: 'test-run', experimentId: 'test-experiment' }, }, ]); }); }); +describe('RunLogger#resumeRun', () => { + it('should resume an existing run using a type to resume after', async () => { + setServerRuns([ + { + runId: 'test-run', + experimentId: 'test-experiment', + status: 'running', + logs: [ + { type: 'test-type', count: 4, lastNumber: 5, pending: 1 }, + { type: 'other-type', count: 3, lastNumber: 7, pending: 4 }, + ], + }, + ]); + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + runId: 'test-run', + experimentId: 'test-experiment', + }); + await logger.resumeRun({ resumeAfterLast: 'test-type' }); + await expect(waitForChangeRequests()).resolves.toEqual([ + { + url: 'https://server.test/api/experiments/test-experiment/runs/test-run', + method: 'PATCH', + body: { resumeFrom: 6 }, + }, + ]); + }); -describe('RunLogger#addLog', () => { + it('should resume an existing run using multiple types to resume after', async () => { + setServerRuns([ + { + runId: 'test-run', + experimentId: 'test-experiment', + status: 'running', + logs: [ + { type: 'test-type1', count: 3, lastNumber: 5, pending: 2 }, + { type: 'test-type2', count: 1, lastNumber: 1, pending: 1 }, + { type: 'other-type', count: 3, lastNumber: 7, pending: 0 }, + ], + }, + ]); + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + runId: 'test-run', + experimentId: 'test-experiment', + }); + await logger.resumeRun({ resumeAfterLast: ['test-type1', 'test-type2'] }); + await expect(waitForChangeRequests()).resolves.toEqual([ + { + url: 'https://server.test/api/experiments/test-experiment/runs/test-run', + method: 'PATCH', + body: { resumeFrom: 6 }, + }, + ]); + }); + + it('should be able to use the runId and experimentId from its parameter', async () => { + setServerRuns([ + { + runId: 'test-run', + experimentId: 'test-experiment', + status: 'running', + logs: [ + { type: 'test-type1', count: 3, lastNumber: 5, pending: 2 }, + { type: 'test-type2', count: 1, lastNumber: 1, pending: 1 }, + { type: 'other-type', count: 3, lastNumber: 7, pending: 0 }, + ], + }, + ]); + const logger = new LogClient({ apiRoot: 'https://server.test/api' }); + await logger.resumeRun({ + resumeAfterLast: ['test-type1', 'test-type2'], + experimentId: 'test-experiment', + runId: 'test-run', + }); + await expect(waitForChangeRequests()).resolves.toEqual([ + { + url: 'https://server.test/api/experiments/test-experiment/runs/test-run', + method: 'PATCH', + body: { resumeFrom: 6 }, + }, + ]); + }); + + it("should use resumeRun's parameter if the constructor did not provide a run or an experiment", async () => { + setServerRuns([ + { + runId: 'test-run', + experimentId: 'test-experiment', + status: 'running', + logs: [ + { type: 'test-type1', count: 3, lastNumber: 5, pending: 2 }, + { type: 'test-type2', count: 1, lastNumber: 1, pending: 1 }, + { type: 'other-type', count: 3, lastNumber: 7, pending: 0 }, + ], + }, + ]); + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + }); + await logger.resumeRun({ + resumeAfterLast: ['test-type1', 'test-type2'], + experimentId: 'test-experiment', + runId: 'test-run', + }); + await expect(waitForChangeRequests()).resolves.toEqual([ + { + url: 'https://server.test/api/experiments/test-experiment/runs/test-run', + method: 'PATCH', + body: { resumeFrom: 6 }, + }, + ]); + }); + + it("should refuse to overwrite the constructor's experimentId", async () => { + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + experimentId: 'original-experiment', + }); + await expect( + logger.resumeRun({ + resumeAfterLast: ['test-type1', 'test-type2'], + experimentId: 'test-experiment', + runId: 'test-run', + }), + ).rejects.toThrowError(Error); + }); + + it("should refuse to overwrite the constructor's runId", async () => { + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + runId: 'original-run', + }); + await expect( + logger.resumeRun({ + resumeAfterLast: 'test-type', + experimentId: 'test-experiment', + runId: 'test-run', + }), + ).rejects.toThrowError(Error); + }); + + it("should refuse to resume a run if the experimentId isn't defined", async () => { + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + runId: 'original-run', + }); + await expect( + logger.resumeRun({ resumeAfterLast: 'test-type' }), + ).rejects.toThrowError(Error); + }); + + it("should refuse to resume a run if the runId isn't defined", async () => { + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + experimentId: 'original-run', + }); + await expect( + logger.resumeRun({ resumeAfterLast: 'test-type' }), + ).rejects.toThrowError(Error); + }); +}); + +describe('RunLogger#addLog (after start)', () => { let logger: LogClient; beforeEach(async () => { + setServerRuns([{ runId: 'run-id', experimentId: 'experiment-id' }]); logger = new LogClient({ apiRoot: 'https://server.test/api' }); - await logger.startRun(); + await logger.startRun({ experimentId: 'experiment-id', runId: 'run-id' }); clearRequests(); }); @@ -152,7 +385,7 @@ describe('RunLogger#addLog', () => { }); vi.runAllTimers(); await p; - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/experiments/experiment-id/runs/run-id/logs', method: 'POST', @@ -179,17 +412,17 @@ describe('RunLogger#addLog', () => { logger.addLog({ type: 'mock-log', val: 2, - date: new Date('2021-06-03T02:00:00.000Z'), + date: new Date('2021-06-03T02:00:10.000Z'), }), logger.addLog({ type: 'mock-log', val: 3, - date: new Date('2021-06-03T02:00:00.000Z'), + date: new Date('2021-06-03T02:00:20.000Z'), }), ]); vi.runAllTimers(); await p; - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/experiments/experiment-id/runs/run-id/logs', method: 'POST', @@ -203,12 +436,12 @@ describe('RunLogger#addLog', () => { { type: 'mock-log', number: 2, - values: { val: 2, date: '2021-06-03T02:00:00.000Z' }, + values: { val: 2, date: '2021-06-03T02:00:10.000Z' }, }, { type: 'mock-log', number: 3, - values: { val: 3, date: '2021-06-03T02:00:00.000Z' }, + values: { val: 3, date: '2021-06-03T02:00:20.000Z' }, }, ], }, @@ -222,7 +455,7 @@ describe('RunLogger#addLog', () => { let p = logger.addLog({ type: 'mock-log', val: 1 }); vi.runAllTimers(); await p; - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/experiments/experiment-id/runs/run-id/logs', method: 'POST', @@ -247,7 +480,7 @@ describe('RunLogger#addLog', () => { p = logger.addLog({ type: 'mock-log', val: 2 }); vi.runAllTimers(); await p; - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/experiments/experiment-id/runs/run-id/logs', method: 'POST', @@ -275,7 +508,7 @@ describe('RunLogger#addLog', () => { let p = logger.addLog({ type: 'mock-log' }); vi.runAllTimers(); await p; - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/experiments/experiment-id/runs/run-id/logs', method: 'POST', @@ -293,12 +526,78 @@ describe('RunLogger#addLog', () => { }); }); +describe('RunLogger#addLog (after resume)', () => { + it('should properly start numbering after a run has been resumed', async () => { + setServerRuns([ + { + experimentId: 'test-experiment', + runId: 'test-run', + status: 'running', + logs: [ + { type: 'test-type', count: 3, lastNumber: 4, pending: 2 }, + { type: 'other-type', count: 3, lastNumber: 6, pending: 0 }, + ], + }, + ]); + const logger = new LogClient({ apiRoot: 'https://server.test/api' }); + await logger.resumeRun({ + resumeAfterLast: 'test-type', + experimentId: 'test-experiment', + runId: 'test-run', + }); + clearRequests(); + let p = Promise.all([ + logger.addLog({ + type: 'mock-log', + val: 1, + date: new Date('2021-06-03T02:00:00.000Z'), + }), + logger.addLog({ + type: 'mock-log', + val: 2, + date: new Date('2021-06-03T02:00:10.000Z'), + }), + logger.addLog({ + type: 'mock-log', + val: 3, + date: new Date('2021-06-03T02:00:20.000Z'), + }), + ]); + vi.runAllTimers(); + await p; + await expect(waitForChangeRequests()).resolves.toEqual([ + { + url: 'https://server.test/api/experiments/test-experiment/runs/test-run/logs', + method: 'POST', + body: { + logs: [ + { + type: 'mock-log', + number: 5, + values: { val: 1, date: '2021-06-03T02:00:00.000Z' }, + }, + { + type: 'mock-log', + number: 6, + values: { val: 2, date: '2021-06-03T02:00:10.000Z' }, + }, + { + type: 'mock-log', + number: 7, + values: { val: 3, date: '2021-06-03T02:00:20.000Z' }, + }, + ], + }, + }, + ]); + }); +}); + describe('RunLogger#flush', () => { it('should flush', async () => { - const logger = new LogClient({ - apiRoot: 'https://server.test/api', - }); - await logger.startRun(); + setServerRuns([{ runId: 'run-id', experimentId: 'experiment-id' }]); + const logger = new LogClient({ apiRoot: 'https://server.test/api' }); + await logger.startRun({ runId: 'run-id', experimentId: 'experiment-id' }); clearRequests(); logger.addLog({ type: 'mock-log', @@ -317,7 +616,7 @@ describe('RunLogger#flush', () => { }); // No timer this time, flush should send the request immediately. await logger.flush(); - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { url: 'https://server.test/api/experiments/experiment-id/runs/run-id/logs', method: 'POST', @@ -347,13 +646,12 @@ describe('RunLogger#flush', () => { describe('RunLogger#completeRun', () => { it('should complete', async () => { - const logger = new LogClient({ - apiRoot: 'https://server.test/api', - }); - await logger.startRun(); + setServerRuns([{ runId: 'run-id', experimentId: 'experiment-id' }]); + const logger = new LogClient({ apiRoot: 'https://server.test/api' }); + await logger.startRun({ runId: 'run-id', experimentId: 'experiment-id' }); clearRequests(); await logger.completeRun(); - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { method: 'PATCH', url: 'https://server.test/api/experiments/experiment-id/runs/run-id', @@ -365,13 +663,12 @@ describe('RunLogger#completeRun', () => { describe('RunLogger#cancelRun', () => { it('should cancel', async () => { - const logger = new LogClient({ - apiRoot: 'https://server.test/api', - }); - await logger.startRun(); + setServerRuns([{ runId: 'run-id', experimentId: 'experiment-id' }]); + const logger = new LogClient({ apiRoot: 'https://server.test/api' }); + await logger.startRun({ runId: 'run-id', experimentId: 'experiment-id' }); clearRequests(); await logger.cancelRun(); - expect(await waitForRequestJsonBodies()).toEqual([ + await expect(waitForChangeRequests()).resolves.toEqual([ { method: 'PATCH', url: 'https://server.test/api/experiments/experiment-id/runs/run-id', @@ -380,3 +677,21 @@ describe('RunLogger#cancelRun', () => { ]); }); }); + +describe('RunLogger#logout', () => { + it('should close the session', async () => { + const logger = new LogClient({ + apiRoot: 'https://server.test/api', + }); + await logger.startRun(); + clearRequests(); + await logger.logout(); + await expect(waitForChangeRequests()).resolves.toEqual([ + { + method: 'DELETE', + url: 'https://server.test/api/sessions/current', + body: null, + }, + ]); + }); +}); diff --git a/packages/log-client/package.json b/packages/log-client/package.json index ea8e771b..1872e6ab 100644 --- a/packages/log-client/package.json +++ b/packages/log-client/package.json @@ -14,9 +14,9 @@ "devDependencies": { "@types/throttle-debounce": "^5.0.0", "cross-env": "^7.0.3", - "msw": "^1.2.3", + "msw": "^2.0.2", "type-fest": "^4.1.0", - "typescript": "5.1.6", + "typescript": "5.2.2", "vitest": "^0.34.1" }, "dependencies": { diff --git a/packages/log-client/src/utils.ts b/packages/log-client/src/fetch.ts similarity index 64% rename from packages/log-client/src/utils.ts rename to packages/log-client/src/fetch.ts index e63d01e9..810f6336 100644 --- a/packages/log-client/src/utils.ts +++ b/packages/log-client/src/fetch.ts @@ -12,19 +12,22 @@ type JsonFetchOptions = Omit< function makeJsonFetchMethod( method: string, opt: { noBody: true }, -): (url: JsonFetchUrl, options: JsonFetchOptions) => Promise; +): (url: JsonFetchUrl, options?: JsonFetchOptions) => Promise; function makeJsonFetchMethod( method: string, opt?: { noBody: false }, -): (url: JsonFetchUrl, options: JsonFetchOptions) => Promise; +): (url: JsonFetchUrl, options?: JsonFetchOptions) => Promise; function makeJsonFetchMethod(method: string, { noBody = false } = {}) { return async function fetchMethod( url: JsonFetchUrl, - options: JsonFetchOptions, + options?: JsonFetchOptions, ) { - let body = noBody ? undefined : JSON.stringify(options.body); + let body = + noBody || options?.body == null + ? undefined + : JSON.stringify(options.body); let headers: JsonFetchOptions['headers'] = { - ...options.headers, + ...options?.headers, Accept: 'application/json', }; if (body != null) { @@ -35,7 +38,7 @@ function makeJsonFetchMethod(method: string, { noBody = false } = {}) { if (response.ok) { return json as unknown; } else { - throw new Error(json.message ?? 'Unknown error'); + throw new RequestError(response, json.message); } }; } @@ -45,3 +48,15 @@ export const put = makeJsonFetchMethod('PUT'); export const get = makeJsonFetchMethod('GET', { noBody: true }); export const del = makeJsonFetchMethod('DELETE'); export const patch = makeJsonFetchMethod('PATCH'); + +export class RequestError extends Error { + readonly name = 'RequestError'; + readonly status: number; + readonly statusText: string; + + constructor(response: Response, message?: string) { + super(message); + this.status = response.status; + this.statusText = response.statusText; + } +} diff --git a/packages/log-client/src/log-client.ts b/packages/log-client/src/log-client.ts new file mode 100644 index 00000000..f6029e16 --- /dev/null +++ b/packages/log-client/src/log-client.ts @@ -0,0 +1,353 @@ +import { throttle } from 'throttle-debounce'; +import type { JsonValue } from 'type-fest'; +import * as Interface from './log-server-interface.js'; +import { RequestError } from './fetch.js'; + +interface Typed { + type: Type; +} +interface OptionallyDated { + date?: Date; +} + +type AnyLog = Record & + Typed & + OptionallyDated; + +type ValuesSerializer = ( + i: ServerLog['values'], +) => Record; + +type ServerLog = { + number: number; + type: NonNullable; + values: Omit & { date: NonNullable }; +}; + +export class LogClient { + #logQueue: Array> = []; + #resolveLogQueue: (() => void) | null = null; + #rejectLogQueue: ((error: unknown) => void) | null = null; + #serializeValues: ValuesSerializer; + #logQueuePromise: Promise | null = null; + #runId?: string; + #experimentId?: string; + #apiRoot: string; + #postLogs: throttle<() => void>; + #runStatus: + | 'idle' + | 'starting' + | 'running' + | 'completed' + | 'canceled' + | 'error' = 'idle'; + #logCount = 0; + + constructor({ + experimentId, + runId, + apiRoot, + serializeLog, + requestThrottle = 500, + }: { + experimentId?: string; + runId?: string; + apiRoot: string; + requestThrottle?: number; + } & (Exclude extends never + ? // We use `Exclude` above to check if all possible `ClientLog` values + // extends `AnyLog`'s value. `InputLog extends AnyLog` may possibly not be + // serializable by default because `ClientLog` may contain types of values + // that are not accepted by `AnyLog`. For example + // { type: 't1' } | { type: 't2', x: BigInt } do extend `AnyLog` but + // BigInt is not serializable by default. In this case, a custom + // `serializeLog` function must be provided. + // See https://github.com/QuentinRoy/lightmill-js/issues/138. + { serializeLog?: ValuesSerializer } + : { serializeLog: ValuesSerializer })) { + // If serializeLog is not provided, we know that InputLog is a subset of + // AnyLog, so we can use the default serializer. + this.#serializeValues = serializeLog ?? anyLogSerializer; + this.#postLogs = throttle( + requestThrottle, + this.#unthrottledPostLogs.bind(this), + { noTrailing: false, noLeading: true }, + ); + this.#experimentId = experimentId; + this.#runId = runId; + this.#apiRoot = apiRoot.endsWith('/') ? apiRoot.slice(0, -1) : apiRoot; + } + + async getResumableRuns() { + let sessionInfo = await Interface.getSessionInfo({ + apiRoot: this.#apiRoot, + }).catch((error) => { + if (error instanceof RequestError && error.status === 404) { + return { runs: [] }; + } + throw error; + }); + + let matchingRuns = (sessionInfo?.runs ?? []).filter( + (r) => + (this.#runId == null || r.runId === this.#runId) && + (this.#experimentId == null || r.experimentId === this.#experimentId), + ); + let matchingRunInfos = await Promise.all( + matchingRuns.map((r) => + Interface.getRunInfo({ apiRoot: this.#apiRoot, ...r }).then( + (r) => r.run, + ), + ), + ); + return matchingRunInfos + .filter((r) => r.status === 'running' || r.status === 'canceled') + .map((r) => ({ + runId: r.runId, + experimentId: r.experimentId, + status: r.status as 'running' | 'canceled', + })); + } + + async resumeRun({ + runId, + experimentId, + resumeAfterLast, + }: { + runId?: string; + experimentId?: string; + resumeAfterLast: T | T[]; + }) { + if (this.#runStatus !== 'idle') { + throw new Error( + `Can only resume a run when the logger is idle. Logger is ${this.#runStatus}`, + ); + } + if (this.#runStatus !== 'idle') { + throw new Error( + `Can only start a run when the logger is idle. Logger is ${this.#runStatus}`, + ); + } + if (this.#runId != null && runId != null && this.#runId !== runId) { + throw new Error( + `Trying to start a run with a different runId. Current runId is ${this.#runId} and new runId is ${runId}`, + ); + } + if ( + this.#experimentId != null && + experimentId != null && + this.#experimentId !== experimentId + ) { + throw new Error( + `Trying to start a run with a different experimentId. Current experimentId is ${this.#experimentId} and new experimentId is ${experimentId}`, + ); + } + let runIdToResume = runId ?? this.#runId; + let experimentIdToResume = experimentId ?? this.#experimentId; + if (runIdToResume == null) { + throw new Error('Cannot resume a run without a runId'); + } + if (experimentIdToResume == null) { + throw new Error('Cannot resume a run without an experimentId'); + } + try { + this.#runStatus = 'starting'; + let { run: runInfo } = await Interface.getRunInfo({ + apiRoot: this.#apiRoot, + runId: runIdToResume, + experimentId: experimentIdToResume, + }); + let resumeAfterLastSet = new Set( + Array.isArray(resumeAfterLast) ? resumeAfterLast : [resumeAfterLast], + ); + let lastLog = runInfo.logs + .filter((l): l is { type: T } & typeof l => + resumeAfterLastSet.has(l.type), + ) + .reduce((maxLog, log) => + maxLog.lastNumber > log.lastNumber ? maxLog : log, + ); + await Interface.resumeRun({ + apiRoot: this.#apiRoot, + runId: runIdToResume, + experimentId: experimentIdToResume, + resumeFrom: lastLog.lastNumber + 1, + }); + this.#runId = runId; + this.#experimentId = experimentId; + this.#runStatus = 'running'; + this.#logCount = lastLog.lastNumber; + return { type: lastLog.type, number: lastLog.count }; + } catch (err) { + this.#runStatus = 'error'; + throw err; + } + } + + async startRun({ + runId, + experimentId, + }: { runId?: string; experimentId?: string } = {}) { + if (this.#runStatus !== 'idle') { + throw new Error( + `Can only start a run when the logger is idle. Logger is ${this.#runStatus}`, + ); + } + if (this.#runId != null && runId != null && this.#runId !== runId) { + throw new Error( + `Trying to start a run with a different runId. Current runId is ${this.#runId} and new runId is ${runId}`, + ); + } + if ( + this.#experimentId != null && + experimentId != null && + this.#experimentId !== experimentId + ) { + throw new Error( + `Trying to start a run with a different experimentId. Current experimentId is ${this.#experimentId} and new experimentId is ${experimentId}`, + ); + } + try { + this.#runStatus = 'starting'; + // We trust the server to return the correct type. + let createRunResponse = await Interface.createNewRun({ + apiRoot: this.#apiRoot, + experimentId: experimentId ?? this.#experimentId, + runId: runId ?? this.#runId, + }); + this.#runId = createRunResponse.runId; + this.#experimentId = createRunResponse.experimentId; + this.#runStatus = 'running'; + } catch (err) { + this.#runStatus = 'error'; + throw err; + } + } + + async addLog({ type, ...values }: ClientLog) { + if (this.#runStatus !== 'running') { + throw new Error( + `Can only add logs when logger is running. Loggers is ${this.#runStatus}`, + ); + } + if (type == null) { + throw new Error( + 'Trying to add a logs without a type. Logs must have a type', + ); + } + this.#logCount += 1; + this.#logQueue.push({ + type, + number: this.#logCount, + values: { date: new Date(), ...values }, + }); + let promise = this.#logQueuePromise; + if (promise == null) { + this.#logQueuePromise = new Promise((resolve, reject) => { + this.#resolveLogQueue = resolve; + this.#rejectLogQueue = reject; + }); + promise = this.#logQueuePromise; + } + this.#postLogs(); + await promise; + } + + async #unthrottledPostLogs() { + if (this.#rejectLogQueue == null || this.#resolveLogQueue == null) { + throw new Error('Sending logs without a promise'); + } + + let logQueue = this.#logQueue; + let reject = this.#rejectLogQueue; + let resolve = this.#resolveLogQueue; + this.#logQueuePromise = null; + this.#resolveLogQueue = null; + this.#rejectLogQueue = null; + this.#logQueue = []; + + if (this.#runId == null) { + reject( + new Error('Internal RunLogger error: runId is null but run is started'), + ); + return; + } + if (this.#experimentId == null) { + reject( + new Error( + 'Internal RunLogger error: experimentId is null but run is started', + ), + ); + return; + } + + await Interface.postLog({ + apiRoot: this.#apiRoot, + runId: this.#runId, + experimentId: this.#experimentId, + logs: logQueue.map((log) => ({ + type: log.type, + number: log.number, + values: this.#serializeValues(log.values), + })), + }).then(resolve, reject); + } + + async flush() { + if (this.#logQueue.length > 0) { + this.#postLogs.cancel(); + await this.#unthrottledPostLogs(); + } + } + + async completeRun() { + await this.#endRun('completed'); + } + + async cancelRun() { + await this.#endRun('canceled'); + } + + async logout() { + await this.flush(); + await Interface.deleteSession({ apiRoot: this.#apiRoot }); + } + + async #endRun(status: 'canceled' | 'completed') { + if (this.#runStatus !== 'running') { + throw new Error(`Cannot end a run that is not running. Run is ${status}`); + } + if (this.#runId == null) { + throw new Error( + 'Internal RunLogger error: runId is null but run is started', + ); + } + if (this.#experimentId == null) { + throw new Error( + 'Internal RunLogger error: experimentId is null but run is started', + ); + } + this.#runStatus = status; + await this.flush(); + await Interface.updateRunStatus({ + runId: this.#runId, + experimentId: this.#experimentId, + apiRoot: this.#apiRoot, + status, + }); + } +} + +const anyLogSerializer: ValuesSerializer = (obj) => { + let result: Record = {}; + // I am not using for ... of to avoid the need for the regenerator + // runtime in older browsers. + Object.entries(obj).forEach(([key, value]) => { + if (value instanceof Date) { + result[key] = value.toISOString(); + } else if (value !== undefined) { + result[key] = value; + } + }); + return result; +}; diff --git a/packages/log-client/src/log-server-interface.ts b/packages/log-client/src/log-server-interface.ts new file mode 100644 index 00000000..f2701db3 --- /dev/null +++ b/packages/log-client/src/log-server-interface.ts @@ -0,0 +1,125 @@ +import type { + Body as ApiBody, + Response as ApiResponse, +} from '@lightmill/log-api'; +import { post, patch, del, get } from './fetch.js'; + +type RunEndpointConfig = { + apiRoot?: string; + runId: string; + experimentId: string; +}; + +type CreateNewSessionParameter = { + apiRoot?: string; + role: 'participant' | 'host'; + password?: string; +}; +export async function createNewSession({ + apiRoot = '', + role, + password, +}: CreateNewSessionParameter) { + let body: ApiBody<'post', '/sessions'> = { role, password }; + let r = await post(`${apiRoot}/sessions`, { body, credentials: 'include' }); + return r as ApiResponse<'post', '/sessions'>; +} + +type GetSessionInfoParameter = { apiRoot?: string }; +export async function getSessionInfo({ + apiRoot = '', +}: GetSessionInfoParameter) { + let r = await get(`${apiRoot}/sessions/current`, { + credentials: 'include', + }); + return r as ApiResponse<'get', '/sessions/current'>; +} + +type DeleteSessionParameter = { apiRoot?: string }; +export async function deleteSession({ apiRoot = '' }: DeleteSessionParameter) { + let r = await del(`${apiRoot}/sessions/current`, { + credentials: 'include', + }); + return r as ApiResponse<'delete', '/sessions/current'>; +} + +type CreateNewRunParameter = { apiRoot?: string } & ApiBody<'post', '/runs'>; +export async function createNewRun({ + apiRoot = '', + ...body +}: CreateNewRunParameter) { + let r = await post(`${apiRoot}/runs`, { body, credentials: 'include' }); + return r as ApiResponse<'post', '/runs'>; +} + +type GetRunInfoParameter = RunEndpointConfig; +export async function getRunInfo({ + apiRoot = '', + runId, + experimentId, +}: GetRunInfoParameter) { + let r = await get(`${apiRoot}/experiments/${experimentId}/runs/${runId}`); + return r as ApiResponse<'get', '/experiments/:experimentId/runs/:runId'>; +} + +type UpdateRunStatusParameter = RunEndpointConfig & { + status: 'completed' | 'canceled'; +}; +export async function updateRunStatus({ + apiRoot = '', + runId, + experimentId, + status, +}: UpdateRunStatusParameter) { + let body: ApiBody<'patch', '/experiments/:experimentId/runs/:runId'> = { + status, + }; + let r = await patch(`${apiRoot}/experiments/${experimentId}/runs/${runId}`, { + body, + credentials: 'include', + // This request is sometimes sent from a browser tab that is about to be + // closed. We want to make sure that the request is sent before the tab is + // closed. + keepalive: true, + }); + return r as ApiResponse<'patch', '/experiments/:experimentId/runs/:runId'>; +} + +type ResumeRunParameter = RunEndpointConfig & { resumeFrom: number }; +export async function resumeRun({ + apiRoot = '', + runId, + experimentId, + resumeFrom, +}: ResumeRunParameter) { + let body: ApiBody<'patch', '/experiments/:experimentId/runs/:runId'> = { + resumeFrom, + }; + let r = await patch(`${apiRoot}/experiments/${experimentId}/runs/${runId}`, { + body, + credentials: 'include', + }); + return r as ApiResponse<'patch', '/experiments/:experimentId/runs/:runId'>; +} + +type PostLogParameter = RunEndpointConfig & + ApiBody<'post', '/experiments/:experimentId/runs/:runId/logs'>; +export async function postLog({ + apiRoot = '', + runId, + experimentId, + ...body +}: PostLogParameter) { + let r = await post( + `${apiRoot}/experiments/${experimentId}/runs/${runId}/logs`, + { + body, + credentials: 'include', + keepalive: true, + }, + ); + return r as ApiResponse< + 'post', + '/experiments/:experimentId/runs/:runId/logs' + >; +} diff --git a/packages/log-client/src/main.ts b/packages/log-client/src/main.ts index 1d075ec0..7fef06e8 100644 --- a/packages/log-client/src/main.ts +++ b/packages/log-client/src/main.ts @@ -1,228 +1 @@ -import type { - Body as ApiBody, - Response as ApiResponse, -} from '@lightmill/log-api'; -import { throttle } from 'throttle-debounce'; -import type { JsonValue } from 'type-fest'; -import { post, patch } from './utils.js'; - -interface BaseLog { - type: string; - date?: Date; -} - -type AnyLog = Record & BaseLog; - -type LogSerializer = ( - i: OutputLog['values'], -) => Record; - -type OutputLog = { - number: number; - type: NonNullable; - values: Omit & { date: NonNullable }; -}; - -type RunEndpoints = { - run: string; - logs: string; -}; - -export class LogClient { - #logQueue: Array> = []; - #resolveLogQueue: (() => void) | null = null; - #rejectLogQueue: ((error: unknown) => void) | null = null; - #serializeLog: LogSerializer; - #logQueuePromise: Promise | null = null; - #run?: string; - #experiment?: string; - #apiRoot: string; - #postLogs: throttle<() => void>; - #runStatus: 'idle' | 'running' | 'completed' | 'canceled' = 'idle'; - // If the run is started, these will be set. Otherwise, they will be null. - #endpoints: RunEndpoints | null = null; - #logCount = 0; - - constructor({ - experiment, - run, - apiRoot, - serializeLog, - requestThrottle = 500, - }: { - experiment?: string; - run?: string; - apiRoot: string; - requestThrottle?: number; - } & (Exclude extends never - ? // We use `Exclude` above to check if any possible `InputLog` is a subset of - // `AnyLog`. `InputLog extends AnyLog` would pass even if any but not all - // possible values of `InputLog` is a subset of `AnyLog`. - // See https://github.com/QuentinRoy/lightmill-js/issues/138. - { serializeLog?: LogSerializer } - : { serializeLog: LogSerializer })) { - // If serializeLog is not provided, we know that InputLog is a subset of - // AnyLog, so we can use the default serializer. - this.#serializeLog = (serializeLog ?? - defaultSerialize) as LogSerializer; - this.#postLogs = throttle( - requestThrottle, - this.#unthrottledPostLogs.bind(this), - { - noTrailing: false, - noLeading: true, - }, - ); - this.#experiment = experiment; - this.#run = run; - this.#apiRoot = apiRoot.endsWith('/') ? apiRoot.slice(0, -1) : apiRoot; - } - - #isStarting = false; - async startRun() { - if (this.#runStatus !== 'idle') { - throw new Error( - `Can only start a run when the run is idle. Run is ${this.#runStatus}`, - ); - } - if (this.#isStarting) { - throw new Error('Run is already starting'); - } - this.#isStarting = false; - let body: ApiBody<'post', '/runs'> = { - experiment: this.#experiment, - id: this.#run, - }; - let url = `${this.#apiRoot}/runs`; - let { links } = (await post(url, { - body, - credentials: 'include', - })) as ApiResponse<'post', '/runs'>; // We trust the server to return the correct type. - this.#endpoints = links; - this.#runStatus = 'running'; - } - - async addLog({ type, ...values }: InputLog) { - if (this.#runStatus !== 'running') { - throw new Error( - `Can only add logs to a running run. Run is ${this.#runStatus}`, - ); - } - if (type == null) { - throw new Error( - 'Trying to add a logs without type. Logs must have a type', - ); - } - this.#logCount += 1; - this.#logQueue.push({ - number: this.#logCount, - type, - values: { date: new Date(), ...values }, - }); - let promise = this.#logQueuePromise; - if (promise == null) { - this.#logQueuePromise = new Promise((resolve, reject) => { - this.#resolveLogQueue = resolve; - this.#rejectLogQueue = reject; - }); - promise = this.#logQueuePromise; - } - this.#postLogs(); - await promise; - } - - async #unthrottledPostLogs() { - if (this.#rejectLogQueue == null || this.#resolveLogQueue == null) { - throw new Error('Sending logs without a promise'); - } - - let logQueue = this.#logQueue; - let reject = this.#rejectLogQueue; - let resolve = this.#resolveLogQueue; - this.#logQueuePromise = null; - this.#resolveLogQueue = null; - this.#rejectLogQueue = null; - this.#logQueue = []; - - if (this.#endpoints == null) { - reject( - new Error( - 'Internal RunLogger error: endpoints are null but run is started', - ), - ); - return; - } - let logs = logQueue.map((log) => { - return { - type: log.type, - number: log.number, - values: this.#serializeLog(log.values), - }; - }); - type PostLogBody = ApiBody< - 'post', - '/experiments/:experiment/runs/:run/logs' - >; - let body: PostLogBody = { logs }; - try { - await post(`${this.#apiRoot}${this.#endpoints.logs}`, { - body, - credentials: 'include', - keepalive: true, - }); - resolve(); - } catch (error) { - reject(error); - } - } - - async flush() { - if (this.#logQueue.length > 0) { - this.#postLogs.cancel(); - await this.#unthrottledPostLogs(); - } - } - - async completeRun() { - await this.#endRun('completed'); - } - - async cancelRun() { - await this.#endRun('canceled'); - } - - async #endRun(status: 'canceled' | 'completed') { - if (this.#runStatus !== 'running') { - throw new Error(`Cannot end a run that is not running. Run is ${status}`); - } - if (this.#endpoints == null) { - throw new Error( - 'Internal RunLogger error: endpoints are null but run is started', - ); - } - this.#runStatus = status; - await this.flush(); - let body: ApiBody<'patch', '/experiments/:experiment/runs/:run'> = { - status, - }; - await patch(`${this.#apiRoot}${this.#endpoints.run}`, { - body, - credentials: 'include', - keepalive: true, - }); - } -} - -function defaultSerialize(obj: OutputLog['values']) { - let result: Record = {}; - // I am not using for ... of to avoid the need for the regenerator - // runtime in older browsers. - Object.entries(obj).forEach(([key, value]) => { - if (value instanceof Date) { - result[key] = value.toISOString(); - } else if (value !== undefined) { - result[key] = value; - } - }); - return result; -} +export { LogClient } from './log-client.js'; diff --git a/packages/log-server/__tests__/app.test.ts b/packages/log-server/__tests__/app.test.ts index 41d006a2..0baf3d06 100644 --- a/packages/log-server/__tests__/app.test.ts +++ b/packages/log-server/__tests__/app.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + import request from 'supertest'; import { afterEach, describe, beforeEach, it, vi, expect, Mock } from 'vitest'; import { Log, Store, StoreError } from '../src/store.js'; @@ -12,28 +14,34 @@ type MockStore = { function MockStore(): MockStore { return { - addRun: vi.fn( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async (...args) => { - return { runId: 'addRun:runId', experimentId: 'addRun:experimentId' }; - }, - ), - // eslint-disable-next-line @typescript-eslint/no-unused-vars + addRun: vi.fn(async (...args) => { + return { runId: 'addRun:runId', experimentId: 'addRun:experimentId' }; + }), + resumeRun: vi.fn(async (...args) => { + return { + runId: 'resumeRun:runId', + experimentId: 'resumeRun:experimentId', + }; + }), getRun: vi.fn(async (...args) => { return { runId: 'getRun:runId', experimentId: 'getRun:experimentId', createdAt: vi.getMockedSystemTime(), - status: 'running' as const, - }; + status: 'running', + } as const; }), - // eslint-disable-next-line @typescript-eslint/no-unused-vars setRunStatus: vi.fn((...args) => Promise.resolve()), - // eslint-disable-next-line @typescript-eslint/no-unused-vars addLogs: vi.fn((...args) => Promise.resolve()), getLogValueNames: vi.fn(() => Promise.resolve(['mock-col1', 'mock-col2', 'mock-col3']), ), + getLogSummary: vi.fn((...args) => + Promise.resolve([ + { type: 'summary:type-1', count: 11, lastNumber: 12, pending: 13 }, + { type: 'summary:type-2', count: 21, lastNumber: 22, pending: 23 }, + ]), + ), getLogs: vi.fn(async function* (): AsyncGenerator { yield { experimentId: 'getLogs:experimentId-1', @@ -88,43 +96,43 @@ describe('sessions', () => { await api.post('/sessions').send({ role: 'fake' }).expect(400); }); - it('should accept the creation of an admin session if there is no admin password set on the server', async () => { - await api.post('/sessions').send({ role: 'admin' }).expect(201, { - role: 'admin', + it('should accept the creation of an host session if there is no host password set on the server', async () => { + await api.post('/sessions').send({ role: 'host' }).expect(201, { + role: 'host', runs: [], status: 'ok', }); }); - it('should accept the creation of an admin role if the provided password is correct', async () => { + it('should accept the creation of an host role if the provided password is correct', async () => { let app = LogServer({ store: MockStore(), secret: 'secret', - adminPassword: 'admin password', + hostPassword: 'host password', }); let api = request(app); await api .post('/sessions') - .send({ role: 'admin', password: 'admin password' }) + .send({ role: 'host', password: 'host password' }) .expect(201, { - role: 'admin', + role: 'host', runs: [], status: 'ok', }); }); - it('should refuse the creation of an admin role if the provided password is incorrect', async () => { + it('should refuse the creation of an host role if the provided password is incorrect', async () => { let app = LogServer({ store: MockStore(), secret: 'secret', - adminPassword: 'admin password', + hostPassword: 'host password', }); let req = request(app); await req .post('/sessions') - .send({ role: 'admin', password: 'not the admin password' }) + .send({ role: 'host', password: 'not the host password' }) .expect(403, { - message: 'Forbidden role: admin', + message: 'Forbidden role: host', status: 'error', }); }); @@ -187,14 +195,10 @@ describe('runs', () => { it('should create a run', async () => { await api .post('/runs') - .send({ experiment: 'exp-id', id: 'run-id' }) + .send({ experimentId: 'exp-id', runId: 'run-id' }) .expect(201, { - experiment: 'exp-id', - links: { - logs: '/experiments/exp-id/runs/run-id/logs', - run: '/experiments/exp-id/runs/run-id', - }, - run: 'run-id', + experimentId: 'exp-id', + runId: 'run-id', status: 'ok', }); expect(store.addRun).toHaveBeenCalledWith({ @@ -205,18 +209,11 @@ describe('runs', () => { }); it('should use the default experiment if the experiment is not named', async () => { - await api - .post('/runs') - .send({ id: 'run' }) - .expect(201, { - status: 'ok', - experiment: 'default', - run: 'run', - links: { - logs: '/experiments/default/runs/run/logs', - run: '/experiments/default/runs/run', - }, - }); + await api.post('/runs').send({ runId: 'run' }).expect(201, { + status: 'ok', + experimentId: 'default', + runId: 'run', + }); expect(store.addRun).toHaveBeenCalledWith({ experimentId: 'default', runId: 'run', @@ -227,19 +224,11 @@ describe('runs', () => { it('should generate a unique run id if the run id is not provided', async () => { let resp = await api .post('/runs') - .send({ experiment: 'exp' }) + .send({ experimentId: 'exp' }) .expect(201); - let runId = resp.body.run; + let { runId } = resp.body; expect(runId).toBeDefined(); - expect(resp.body).toEqual({ - status: 'ok', - experiment: 'exp', - run: runId, - links: { - logs: `/experiments/exp/runs/${runId}/logs`, - run: `/experiments/exp/runs/${runId}`, - }, - }); + expect(resp.body).toEqual({ status: 'ok', experimentId: 'exp', runId }); expect(store.addRun).toHaveBeenCalledWith({ experimentId: 'exp', runId, @@ -250,25 +239,25 @@ describe('runs', () => { it('should add the run to the session', async () => { await api .post('/runs') - .send({ experiment: 'exp-id', id: 'run-id' }) + .send({ experimentId: 'exp-id', runId: 'run-id' }) .expect(201); await api.get('/sessions/current').expect(200, { role: 'participant', - runs: [{ id: 'run-id', experiment: 'exp-id' }], + runs: [{ runId: 'run-id', experimentId: 'exp-id' }], status: 'ok', }); }); - it('should refuse to create a run if the participant already has one running', async () => { + it('should refuse to create a run if participant already has one running', async () => { await api .post('/runs') - .send({ experiment: 'exp-id', id: 'run1' }) + .send({ experimentId: 'exp-id', runId: 'run1' }) .expect(201); await api .post('/runs') - .send({ experiment: 'exp-id', id: 'run2' }) + .send({ experimentId: 'exp-id', runId: 'run2' }) .expect(403, { - message: 'Client already has a started run, end it first', + message: 'Client already has started runs, end them first', status: 'error', }); expect(store.addRun).toHaveBeenCalledTimes(1); @@ -280,16 +269,50 @@ describe('runs', () => { }); await api .post('/runs') - .send({ experiment: 'exp-id', id: 'run-id' }) - .expect(400, { + .send({ experimentId: 'exp-id', runId: 'run-id' }) + .expect(403, { status: 'error', message: 'run "run-id" already exists', }); }); }); + describe('get /experiments/:experiment/runs/:run', () => { + it('should return an error if the client does not have access to the run', async () => { + await api.get('/experiments/exp/runs/not-my-run').expect(403, { + status: 'error', + message: `Client does not have permission to access run "not-my-run" of experiment "exp"`, + }); + expect(store.getRun).not.toHaveBeenCalled(); + }); + + it('should return some run information otherwise', async () => { + await api + .post('/runs') + .send({ experimentId: 'exp-id', runId: 'my-run' }) + .expect(201); + await api.get('/experiments/exp-id/runs/my-run').expect(200, { + status: 'ok', + run: { + runId: 'getRun:runId', + experimentId: 'getRun:experimentId', + status: 'running', + logs: [ + { type: 'summary:type-1', count: 11, lastNumber: 12, pending: 13 }, + { type: 'summary:type-2', count: 21, lastNumber: 22, pending: 23 }, + ], + }, + }); + expect(store.getRun).toHaveBeenCalledWith('exp-id', 'my-run'); + expect(store.getLogSummary).toHaveBeenCalledWith({ + experimentId: 'exp-id', + runId: 'my-run', + }); + }); + }); + describe('patch /experiments/:experiment/runs/:run', () => { - it('should return an error if the client does not have access to any run', async () => { + it('should return an error if the client tries to change the status of the run but does not have access to any run', async () => { await api .patch('/experiments/exp/runs/not-my-run') .send({ status: 'completed' }) @@ -297,12 +320,14 @@ describe('runs', () => { status: 'error', message: `Client does not have permission to update run "not-my-run" of experiment "exp"`, }); + expect(store.resumeRun).not.toHaveBeenCalled(); expect(store.setRunStatus).not.toHaveBeenCalled(); }); - it('should return an error if the client does not have access to this particular run', async () => { + + it('should return an error if the client tries to change the status of the run but does not have access to this particular run', async () => { await api .post('/runs') - .send({ experiment: 'exp-id', id: 'my-run' }) + .send({ experimentId: 'exp-id', runId: 'my-run' }) .expect(201); await api .patch('/experiments/exp/runs/not-my-run') @@ -312,11 +337,41 @@ describe('runs', () => { message: `Client does not have permission to update run "not-my-run" of experiment "exp"`, }); expect(store.setRunStatus).not.toHaveBeenCalled(); + expect(store.resumeRun).not.toHaveBeenCalled(); + }); + + it('should return an error if the client tries to resume a run but does not have access to any run', async () => { + await api + .patch('/experiments/exp/runs/not-my-run') + .send({ resumeFrom: 10 }) + .expect(403, { + status: 'error', + message: `Client does not have permission to update run "not-my-run" of experiment "exp"`, + }); + expect(store.resumeRun).not.toHaveBeenCalled(); + expect(store.setRunStatus).not.toHaveBeenCalled(); + }); + + it('should return an error if the client tries to resume a run but does not have access to this particular run', async () => { + await api + .post('/runs') + .send({ experimentId: 'exp-id', runId: 'my-run' }) + .expect(201); + await api + .patch('/experiments/exp/runs/not-my-run') + .send({ resumeFrom: 10 }) + .expect(403, { + status: 'error', + message: `Client does not have permission to update run "not-my-run" of experiment "exp"`, + }); + expect(store.resumeRun).not.toHaveBeenCalled(); + expect(store.setRunStatus).not.toHaveBeenCalled(); }); + it('should complete a running run if argument is "completed"', async () => { await api .post('/runs') - .send({ experiment: 'exp-id', id: 'my-run' }) + .send({ experimentId: 'exp-id', runId: 'my-run' }) .expect(201); await api .patch('/experiments/exp-id/runs/my-run') @@ -327,11 +382,13 @@ describe('runs', () => { 'my-run', 'completed', ); + expect(store.resumeRun).not.toHaveBeenCalled(); }); + it('should cancel a running run if argument is "canceled"', async () => { await api .post('/runs') - .send({ experiment: 'exp-id', id: 'my-run' }) + .send({ experimentId: 'exp-id', runId: 'my-run' }) .expect(201); await api .patch('/experiments/exp-id/runs/my-run') @@ -342,11 +399,37 @@ describe('runs', () => { 'my-run', 'canceled', ); + expect(store.resumeRun).not.toHaveBeenCalled(); + }); + + it('should refuse to change the status of a canceled run', async () => { + store.getRun.mockImplementation(async () => { + return { + runId: 'getRun:runId', + experimentId: 'getRun:experimentId', + status: 'completed', + } as const; + }); + await api + .post('/runs') + .send({ experimentId: 'exp-id', runId: 'my-run' }) + .expect(201); + await api + .patch('/experiments/exp-id/runs/my-run') + .send({ status: 'canceled' }) + .expect(400, { status: 'error', message: 'Run has already ended' }); + await api + .patch('/experiments/exp-id/runs/my-run') + .send({ status: 'completed' }) + .expect(400, { status: 'error', message: 'Run has already ended' }); + expect(store.setRunStatus).not.toHaveBeenCalled(); + expect(store.resumeRun).not.toHaveBeenCalled(); }); - it('should revoke client access to the run', async () => { + + it('should not revoke client access to the run even if the run has been completed', async () => { await api .post('/runs') - .send({ experiment: 'exp', id: 'my-run' }) + .send({ experimentId: 'exp', runId: 'my-run' }) .expect(201); await api .patch('/experiments/exp/runs/my-run') @@ -354,16 +437,97 @@ describe('runs', () => { .expect(200); await api.get('/sessions/current').expect(200, { role: 'participant', - runs: [], + runs: [{ runId: 'my-run', experimentId: 'exp' }], status: 'ok', }); + }); + + it('should resume a running run if request body contains "resumeFrom"', async () => { + await api + .post('/runs') + .send({ experimentId: 'exp-id', runId: 'my-run' }) + .expect(201); + await api + .patch('/experiments/exp-id/runs/my-run') + .send({ resumeFrom: 15 }) + .expect(200, { status: 'ok' }); + expect(store.setRunStatus).not.toHaveBeenCalled(); + expect(store.resumeRun).toHaveBeenCalledWith({ + experimentId: 'exp-id', + runId: 'my-run', + resumeFrom: 15, + }); + }); + + it('should resume a canceled run if request body contains "resumeFrom"', async () => { + await api + .post('/runs') + .send({ experimentId: 'exp', runId: 'my-run' }) + .expect(201); + store.getRun.mockImplementation(async () => { + return { + runId: 'getRun:runId', + experimentId: 'getRun:experimentId', + status: 'canceled', + } as const; + }); await api .patch('/experiments/exp/runs/my-run') - .send({ status: 'canceled' }) + .send({ resumeFrom: 15 }) + .expect(200, { status: 'ok' }); + expect(store.resumeRun).toHaveBeenCalledWith({ + experimentId: 'exp', + runId: 'my-run', + resumeFrom: 15, + }); + }); + + it('should refuse to resume a completed run', async () => { + await api + .post('/runs') + .send({ experimentId: 'exp', runId: 'my-run' }) + .expect(201); + store.getRun.mockImplementation(async () => { + return { + runId: 'getRun:runId', + experimentId: 'getRun:experimentId', + status: 'completed', + } as const; + }); + await api + .patch('/experiments/exp/runs/my-run') + .send({ resumeFrom: 15 }) + .expect(400, { + status: 'error', + message: `Run has already been completed`, + }); + expect(store.resumeRun).not.toHaveBeenCalled(); + }); + + it('should refuse to resume a run if there is another running run', async () => { + await api + .post('/runs') + .send({ experimentId: 'exp', runId: 'canceled-run' }) + .expect(201); + store.getRun.mockImplementation(async (experimentId, runId) => { + return { + runId: `getRun:${runId}`, + experimentId: `getRun:${experimentId}`, + status: runId === 'canceled-run' ? 'canceled' : 'running', + } as const; + }); + await api + .post('/runs') + .send({ experimentId: 'exp', runId: 'running-run' }) + .expect(201); + await api + .patch('/experiments/exp/runs/canceled-run') + .send({ resumeFrom: 15 }) .expect(403, { status: 'error', - message: `Client does not have permission to update run "my-run" of experiment "exp"`, + message: `Client already has other running runs, end them first`, }); + expect(store.resumeRun).not.toHaveBeenCalled(); }); }); }); @@ -384,13 +548,18 @@ describe('logs', () => { }); api = request.agent(app); await api.post('/sessions').send({ role: 'participant' }); - await api.post('/runs').send({ experiment: 'test-exp', id: 'test-run' }); + await api + .post('/runs') + .send({ experimentId: 'test-exp', runId: 'test-run' }); }); afterEach(() => { vi.useRealTimers(); }); - type PostLogsBody = Body<'post', '/experiments/:experiment/runs/:run/logs'>; + type PostLogsBody = Body< + 'post', + '/experiments/:experimentId/runs/:runId/logs' + >; it('should refuse to add logs if the client does not have access to the run', async () => { await api @@ -457,13 +626,13 @@ describe('logs', () => { secureCookies: false, }); api = request.agent(app); - await api.post('/sessions').send({ role: 'admin' }); + await api.post('/sessions').send({ role: 'host' }); }); afterEach(() => { vi.useRealTimers(); }); - it('should refuse to fetch logs if the client is not logged as an admin', async () => { + it('should refuse to fetch logs if the client is not logged as an host', async () => { await api.delete('/sessions/current').expect(200); await api.post('/sessions').send({ role: 'participant' }).expect(201); await api.get('/experiments/exp/logs').expect(403, { @@ -474,13 +643,13 @@ describe('logs', () => { }); it('should return logs as json by default', async () => { let result = await api.get('/experiments/exp/logs').expect(200); - expect(store.getLogs).toHaveBeenCalledWith({ experiment: 'exp' }); + expect(store.getLogs).toHaveBeenCalledWith({ experimentId: 'exp' }); expect(result.body).toMatchInlineSnapshot(` [ { - "experiment": "getLogs:experimentId-1", + "experimentId": "getLogs:experimentId-1", "number": 1, - "run": "getLogs:runId-1", + "runId": "getLogs:runId-1", "type": "getLogs:type-1", "values": { "mock-col1": "log1-mock-value1", @@ -488,9 +657,9 @@ describe('logs', () => { }, }, { - "experiment": "getLogs:experimentId-2", + "experimentId": "getLogs:experimentId-2", "number": 2, - "run": "getLogs:runId-2", + "runId": "getLogs:runId-2", "type": "getLogs:type-2", "values": { "mock-col1": "log2-mock-value1", @@ -509,13 +678,13 @@ describe('logs', () => { 'application/xml,application/json,text/csv,application/pdf', ) .expect(200); - expect(store.getLogs).toHaveBeenCalledWith({ experiment: 'exp' }); + expect(store.getLogs).toHaveBeenCalledWith({ experimentId: 'exp' }); expect(result.body).toMatchInlineSnapshot(` [ { - "experiment": "getLogs:experimentId-1", + "experimentId": "getLogs:experimentId-1", "number": 1, - "run": "getLogs:runId-1", + "runId": "getLogs:runId-1", "type": "getLogs:type-1", "values": { "mock-col1": "log1-mock-value1", @@ -523,9 +692,9 @@ describe('logs', () => { }, }, { - "experiment": "getLogs:experimentId-2", + "experimentId": "getLogs:experimentId-2", "number": 2, - "run": "getLogs:runId-2", + "runId": "getLogs:runId-2", "type": "getLogs:type-2", "values": { "mock-col1": "log2-mock-value1", @@ -544,9 +713,9 @@ describe('logs', () => { 'application/pdf,text/csv,application/json,application/xml', ) .expect(200); - expect(store.getLogs).toHaveBeenCalledWith({ experiment: 'exp' }); + expect(store.getLogs).toHaveBeenCalledWith({ experimentId: 'exp' }); expect(result.text).toMatchInlineSnapshot(` - "type,run,mock_col1,mock_col2,mock_col3,number + "type,run_id,mock_col1,mock_col2,mock_col3,number getLogs:type-1,getLogs:runId-1,log1-mock-value1,log1-mock-value2,,1 getLogs:type-2,getLogs:runId-2,log2-mock-value1,log2-mock-value2,log2-mock-value3,2 " @@ -557,13 +726,13 @@ describe('logs', () => { .get('/experiments/exp/logs') .set('Accept', 'application/xml') .expect(200); - expect(store.getLogs).toHaveBeenCalledWith({ experiment: 'exp' }); + expect(store.getLogs).toHaveBeenCalledWith({ experimentId: 'exp' }); expect(result.body).toMatchInlineSnapshot(` [ { - "experiment": "getLogs:experimentId-1", + "experimentId": "getLogs:experimentId-1", "number": 1, - "run": "getLogs:runId-1", + "runId": "getLogs:runId-1", "type": "getLogs:type-1", "values": { "mock-col1": "log1-mock-value1", @@ -571,9 +740,9 @@ describe('logs', () => { }, }, { - "experiment": "getLogs:experimentId-2", + "experimentId": "getLogs:experimentId-2", "number": 2, - "run": "getLogs:runId-2", + "runId": "getLogs:runId-2", "type": "getLogs:type-2", "values": { "mock-col1": "log2-mock-value1", @@ -590,7 +759,7 @@ describe('logs', () => { .query({ type: 'log-type' }) .expect(200); expect(store.getLogs).toHaveBeenCalledWith({ - experiment: 'exp', + experimentId: 'exp', type: 'log-type', }); }); diff --git a/packages/log-server/__tests__/store.test.ts b/packages/log-server/__tests__/store.test.ts index be7bfb2a..55fb2be6 100644 --- a/packages/log-server/__tests__/store.test.ts +++ b/packages/log-server/__tests__/store.test.ts @@ -89,6 +89,178 @@ describe('SQLiteStore#getRun', () => { }); }); +describe('SQLiteStore#setRunStatus', () => { + let store: SQLiteStore; + beforeEach(async () => { + store = new SQLiteStore(':memory:'); + await store.migrateDatabase(); + await store.addRun({ runId: 'run1', experimentId: 'experiment' }); + await store.addRun({ runId: 'run2', experimentId: 'experiment' }); + await store.addLogs('experiment', 'run1', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + ]); + }); + afterEach(async () => { + await store.close(); + }); + it('should set the status of the run if it exists', async () => { + await expect( + store.setRunStatus('experiment', 'run1', 'completed'), + ).resolves.toBeUndefined(); + await expect( + store.setRunStatus('experiment', 'run2', 'canceled'), + ).resolves.toBeUndefined(); + }); + it('should refuse to update a completed run', async () => { + await store.setRunStatus('experiment', 'run1', 'completed'); + await expect( + store.setRunStatus('experiment', 'run1', 'completed'), + ).rejects.toThrow(); + await expect( + store.setRunStatus('experiment', 'run1', 'canceled'), + ).rejects.toThrow(); + }); + it('should refuse to update a canceled run', async () => { + await store.setRunStatus('experiment', 'run1', 'canceled'); + await expect( + store.setRunStatus('experiment', 'run1', 'completed'), + ).rejects.toThrow(); + await expect( + store.setRunStatus('experiment', 'run1', 'canceled'), + ).rejects.toThrow(); + }); + it('should be able to complete a resumed run even if it was canceled before', async () => { + await store.setRunStatus('experiment', 'run1', 'canceled'); + await store.resumeRun({ + experimentId: 'experiment', + runId: 'run1', + resumeFrom: 3, + }); + await expect( + store.setRunStatus('experiment', 'run1', 'completed'), + ).resolves.toBeUndefined(); + }); + it('should be able to cancel a resumed run even if it was canceled before', async () => { + await store.setRunStatus('experiment', 'run1', 'canceled'); + await store.resumeRun({ + experimentId: 'experiment', + runId: 'run1', + resumeFrom: 2, + }); + await expect( + store.setRunStatus('experiment', 'run1', 'canceled'), + ).resolves.toBeUndefined(); + }); + it('should throw if the run does not exist', async () => { + await expect( + store.setRunStatus('experiment', 'run4', 'completed'), + ).rejects.toThrow(); + }); +}); + +describe('SQLiteStore#resumeRun', () => { + let store: SQLiteStore; + beforeEach(async () => { + store = new SQLiteStore(':memory:'); + await store.migrateDatabase(); + await store.addRun({ runId: 'run', experimentId: 'exp' }); + }); + afterEach(async () => { + await store.close(); + }); + it('should resume a running run without logs', async () => { + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 1 }), + ).resolves.toEqual({ runId: 'run', experimentId: 'exp' }); + }); + it('should resume a running run with logs', async () => { + await store.addLogs('exp', 'run', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + ]); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 3 }), + ).resolves.toEqual({ runId: 'run', experimentId: 'exp' }); + }); + it('should resume a canceled run without logs', async () => { + await store.setRunStatus('exp', 'run', 'canceled'); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 1 }), + ).resolves.toEqual({ runId: 'run', experimentId: 'exp' }); + }); + it('should resume a canceled run with logs', async () => { + await store.addLogs('exp', 'run', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + ]); + await store.setRunStatus('exp', 'run', 'canceled'); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 3 }), + ).resolves.toEqual({ runId: 'run', experimentId: 'exp' }); + }); + it('should refuse to resume a completed run', async () => { + await store.setRunStatus('exp', 'run', 'completed'); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 4 }), + ).rejects.toThrow(); + }); + it('should refuse to resume from 0', async () => { + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 0 }), + ).rejects.toThrow(); + }); + it('should refuse to resume from any number < 0', async () => { + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: -5 }), + ).rejects.toThrow(); + }); + it('should refuse to resume if it would leave missing logs just before the resume number', async () => { + await store.addLogs('exp', 'run', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + ]); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 4 }), + ).rejects.toThrow(); + }); + it('should refuse to resume if it would leave missing logs in the middle', async () => { + await store.addLogs('exp', 'run', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + { type: 'log', number: 6, values: { x: 2 } }, + { type: 'log', number: 7, values: { x: 2 } }, + ]); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 8 }), + ).rejects.toThrow(); + }); + it('should resume a run even if it would overwrite existing logs', async () => { + await store.addLogs('exp', 'run', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + { type: 'log', number: 3, values: { x: 2 } }, + { type: 'log', number: 4, values: { x: 2 } }, + { type: 'log', number: 6, values: { x: 2 } }, + ]); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 3 }), + ).resolves.toEqual({ runId: 'run', experimentId: 'exp' }); + }); + it('should resume a run even if it would overwrite every existing logs', async () => { + await store.addLogs('exp', 'run', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + { type: 'log', number: 3, values: { x: 2 } }, + { type: 'log', number: 4, values: { x: 2 } }, + { type: 'log', number: 6, values: { x: 2 } }, + ]); + await expect( + store.resumeRun({ experimentId: 'exp', runId: 'run', resumeFrom: 1 }), + ).resolves.toEqual({ runId: 'run', experimentId: 'exp' }); + }); +}); + describe('SQLiteStore#addLogs', () => { let store: SQLiteStore; beforeEach(async () => { @@ -146,13 +318,11 @@ describe('SQLiteStore#addLogs', () => { ).resolves.toBeUndefined(); }); it('should refuse to add two logs with the same number for the same run when added in two different requests', async () => { - await expect( - store.addLogs('experiment1', 'run1', [ - { type: 'log', number: 1, values: { x: 1 } }, - { type: 'log', number: 2, values: { x: 2 } }, - { type: 'log', number: 3, values: { x: 2 } }, - ]), - ).resolves.toBeUndefined(); + await store.addLogs('experiment1', 'run1', [ + { type: 'log', number: 1, values: { x: 1 } }, + { type: 'log', number: 2, values: { x: 2 } }, + { type: 'log', number: 3, values: { x: 2 } }, + ]); await expect( store.addLogs('experiment1', 'run1', [ { type: 'log', number: 2, values: { x: 3 } }, @@ -181,7 +351,7 @@ describe('SQLiteStore#addLogs', () => { ]), ).rejects.toThrow(); }); - it('should be fine with logs with the same number as long as they are in different runs', async () => { + it('should add logs with the same number as long as they are in different runs', async () => { await expect( store.addLogs('experiment1', 'run1', [ { type: 'log', number: 1, values: { x: 1 } }, @@ -242,6 +412,206 @@ describe('SQLiteStore#addLogs', () => { ]), ).resolves.toBeUndefined(); }); + it('should refuse to add logs with number < 1', async () => { + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 0, values: { x: 3 } }, + ]), + ).rejects.toThrow(); + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: -1, values: { x: 3 } }, + ]), + ).rejects.toThrow(); + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: -1, values: { x: 3 } }, + { type: 'log4', number: 1, values: { x: 3 } }, + ]), + ).rejects.toThrow(); + }); + it('should add logs to a resumed run', async () => { + await store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 1, values: { x: 1 } }, + { type: 'log4', number: 2, values: { x: 2 } }, + { type: 'log4', number: 3, values: { x: 3 } }, + ]); + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run1', + resumeFrom: 4, + }); + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 4, values: { x: 3 } }, + { type: 'log4', number: 5, values: { x: 3 } }, + { type: 'log4', number: 6, values: { x: 3 } }, + ]), + ).resolves.toBeUndefined(); + }); + it('should add logs even if they have the same number as other logs added before resuming', async () => { + await store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 1, values: { x: 1 } }, + { type: 'log4', number: 2, values: { x: 2 } }, + { type: 'log4', number: 3, values: { x: 3 } }, + ]); + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run1', + resumeFrom: 2, + }); + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 2, values: { x: 3 } }, + { type: 'log4', number: 3, values: { x: 3 } }, + ]), + ).resolves.toBeUndefined(); + }); + it('should add logs to a resumed even if it creates a gap in log numbers', async () => { + await store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 1, values: { x: 1 } }, + { type: 'log4', number: 2, values: { x: 2 } }, + { type: 'log4', number: 3, values: { x: 3 } }, + ]); + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run1', + resumeFrom: 4, + }); + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 7, values: { x: 3 } }, + { type: 'log4', number: 8, values: { x: 3 } }, + ]), + ).resolves.toBeUndefined(); + }); + it('should refuse to add logs if the run was resumed from a number higher than the log number', async () => { + await store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 1, values: { x: 1 } }, + { type: 'log4', number: 2, values: { x: 1 } }, + ]); + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run1', + resumeFrom: 3, + }); + await expect( + store.addLogs('experiment1', 'run1', [ + { type: 'log4', number: 2, values: { x: 3 } }, + { type: 'log4', number: 3, values: { x: 3 } }, + { type: 'log4', number: 4, values: { x: 3 } }, + ]), + ).rejects.toThrow(); + }); +}); + +describe('SQLiteStore#getLogSummary', () => { + let store: SQLiteStore; + beforeEach(async () => { + store = new SQLiteStore(':memory:'); + await store.migrateDatabase(); + await store.addRun({ + runId: 'run1', + experimentId: 'experiment1', + }); + await store.addRun({ + runId: 'run2', + experimentId: 'experiment1', + }); + await store.addRun({ + runId: 'run1', + experimentId: 'experiment2', + }); + await store.addLogs('experiment1', 'run1', [ + { number: 2, type: 'log1', values: { x: 10 } }, + { number: 3, type: 'log1', values: { x: 11 } }, + ]); + await store.addLogs('experiment1', 'run1', [ + { number: 8, type: 'log1', values: { x: 20 } }, + { number: 5, type: 'log1', values: { x: 21 } }, + ]); + await store.addLogs('experiment1', 'run1', [ + { number: 1, type: 'log2', values: { x: 30 } }, + ]); + await store.addLogs('experiment1', 'run2', [ + { number: 1, type: 'log2', values: { x: 40 } }, + { number: 3, type: 'log1', values: { x: 41 } }, + ]); + await store.addLogs('experiment2', 'run1', [ + { number: 3, type: 'log3', values: { x: 51 } }, + { number: 2, type: 'log2', values: { x: 50 } }, + { number: 5, type: 'log3', values: { x: 52 } }, + ]); + }); + afterEach(async () => { + await store.close(); + }); + it('should be able to return a summary for a particular run', async () => { + await expect( + store.getLogSummary({ experimentId: 'experiment1', runId: 'run1' }), + ).resolves.toEqual([ + { type: 'log1', count: 2, pending: 2, lastNumber: 3 }, + { type: 'log2', count: 1, pending: 0, lastNumber: 1 }, + ]); + await expect( + store.getLogSummary({ experimentId: 'experiment1', runId: 'run2' }), + ).resolves.toEqual([ + { type: 'log1', count: 0, pending: 1, lastNumber: null }, + { type: 'log2', count: 1, pending: 0, lastNumber: 1 }, + ]); + await expect( + store.getLogSummary({ experimentId: 'experiment2', runId: 'run1' }), + ).resolves.toEqual([ + { type: 'log2', count: 0, pending: 1, lastNumber: null }, + { type: 'log3', count: 0, pending: 2, lastNumber: null }, + ]); + }); + it('should be able to filter logs by type', async () => { + await expect( + store.getLogSummary({ + experimentId: 'experiment1', + runId: 'run1', + type: 'log2', + }), + ).resolves.toEqual([{ type: 'log2', count: 1, pending: 0, lastNumber: 1 }]); + await expect( + store.getLogSummary({ + experimentId: 'experiment1', + runId: 'run2', + type: ['log1', 'log2'], + }), + ).resolves.toEqual([ + { type: 'log1', count: 0, pending: 1, lastNumber: null }, + { type: 'log2', count: 1, pending: 0, lastNumber: 1 }, + ]); + await expect( + store.getLogSummary({ + experimentId: 'experiment2', + runId: 'run1', + type: ['log1', 'log2'], + }), + ).resolves.toEqual([ + { type: 'log2', count: 0, pending: 1, lastNumber: null }, + ]); + }); + it('should resolve with an empty array if no log matches the filter', async () => { + await expect( + store.getLogSummary({ + experimentId: 'experiment1', + runId: 'do not exist', + }), + ).resolves.toEqual([]); + await expect( + store.getLogSummary({ experimentId: 'do not exist', runId: 'run1' }), + ).resolves.toEqual([]); + await expect( + store.getLogSummary({ + experimentId: 'experiment1', + runId: 'run1', + type: 'do not exist', + }), + ).resolves.toEqual([]); + }); }); describe('SQLiteStore#getLogValueNames', () => { @@ -312,21 +682,21 @@ describe('SQLiteStore#getLogValueNames', () => { }); it('should be able to filter logs from a particular experiment', async () => { await expect( - store.getLogValueNames({ experiment: 'experiment1' }), + store.getLogValueNames({ experimentId: 'experiment1' }), ).resolves.toEqual(['bar', 'foo', 'message', 'recipient', 'x']); await expect( - store.getLogValueNames({ experiment: 'experiment2' }), + store.getLogValueNames({ experimentId: 'experiment2' }), ).resolves.toEqual(['foo', 'x', 'y']); }); it('should be able to filter logs from a particular run', async () => { - await expect(store.getLogValueNames({ run: 'run1' })).resolves.toEqual([ + await expect(store.getLogValueNames({ runId: 'run1' })).resolves.toEqual([ 'foo', 'message', 'recipient', 'x', 'y', ]); - await expect(store.getLogValueNames({ run: 'run2' })).resolves.toEqual([ + await expect(store.getLogValueNames({ runId: 'run2' })).resolves.toEqual([ 'bar', 'foo', 'message', @@ -335,25 +705,25 @@ describe('SQLiteStore#getLogValueNames', () => { }); it('should be able to filter logs by run, experiment, and type all at once', async () => { await expect( - store.getLogValueNames({ experiment: 'experiment1', type: 'log2' }), + store.getLogValueNames({ experimentId: 'experiment1', type: 'log2' }), ).resolves.toEqual(['foo', 'x']); await expect( store.getLogValueNames({ - experiment: 'experiment1', + experimentId: 'experiment1', type: 'log1', - run: 'run1', + runId: 'run1', }), ).resolves.toEqual(['message', 'recipient']); }); it('should resolve with an empty array if no log matches the filter', async () => { await expect( - store.getLogValueNames({ experiment: 'experiment2', type: 'log1' }), + store.getLogValueNames({ experimentId: 'experiment2', type: 'log1' }), ).resolves.toEqual([]); await expect( - store.getLogValueNames({ experiment: 'do not exist' }), + store.getLogValueNames({ experimentId: 'do not exist' }), ).resolves.toEqual([]); await expect( - store.getLogValueNames({ run: 'do not exist' }), + store.getLogValueNames({ runId: 'do not exist' }), ).resolves.toEqual([]); await expect( store.getLogValueNames({ type: 'do not exist' }), @@ -636,7 +1006,7 @@ describe('SQLiteStore#getLogs', () => { `); }); it('should be able to filter logs from a particular experiment', async () => { - await expect(fromAsync(store.getLogs({ experiment: 'experiment1' }))) + await expect(fromAsync(store.getLogs({ experimentId: 'experiment1' }))) .resolves.toMatchInlineSnapshot(` [ { @@ -692,7 +1062,7 @@ describe('SQLiteStore#getLogs', () => { }, ] `); - await expect(fromAsync(store.getLogs({ experiment: 'experiment2' }))) + await expect(fromAsync(store.getLogs({ experimentId: 'experiment2' }))) .resolves.toMatchInlineSnapshot(` [ { @@ -710,7 +1080,7 @@ describe('SQLiteStore#getLogs', () => { `); }); it('should be able to filter logs from a particular run', async () => { - await expect(fromAsync(store.getLogs({ run: 'run1' }))).resolves + await expect(fromAsync(store.getLogs({ runId: 'run1' }))).resolves .toMatchInlineSnapshot(` [ { @@ -757,7 +1127,7 @@ describe('SQLiteStore#getLogs', () => { }, ] `); - await expect(fromAsync(store.getLogs({ run: 'run2' }))).resolves + await expect(fromAsync(store.getLogs({ runId: 'run2' }))).resolves .toMatchInlineSnapshot(` [ { @@ -785,7 +1155,7 @@ describe('SQLiteStore#getLogs', () => { }); it('should be able to filter logs by run, experiment, and type all at once', async () => { await expect( - fromAsync(store.getLogs({ experiment: 'experiment1', type: 'log2' })), + fromAsync(store.getLogs({ experimentId: 'experiment1', type: 'log2' })), ).resolves.toMatchInlineSnapshot(` [ { @@ -802,7 +1172,11 @@ describe('SQLiteStore#getLogs', () => { `); await expect( fromAsync( - store.getLogs({ experiment: 'experiment1', type: 'log1', run: 'run1' }), + store.getLogs({ + experimentId: 'experiment1', + type: 'log1', + runId: 'run1', + }), ), ).resolves.toMatchInlineSnapshot(` [ @@ -831,18 +1205,136 @@ describe('SQLiteStore#getLogs', () => { }); it('should resolve with an empty array if no log matches the filter', async () => { await expect( - fromAsync(store.getLogs({ experiment: 'experiment2', type: 'log1' })), + fromAsync(store.getLogs({ experimentId: 'experiment2', type: 'log1' })), ).resolves.toEqual([]); await expect( - fromAsync(store.getLogs({ experiment: 'do not exist' })), + fromAsync(store.getLogs({ experimentId: 'do not exist' })), ).resolves.toEqual([]); await expect( - fromAsync(store.getLogs({ run: 'do not exist' })), + fromAsync(store.getLogs({ runId: 'do not exist' })), ).resolves.toEqual([]); await expect( fromAsync(store.getLogs({ type: 'do not exist' })), ).resolves.toEqual([]); }); + it('should return logs added after resuming', async () => { + await store.resumeRun({ + experimentId: 'experiment2', + runId: 'run1', + resumeFrom: 2, + }); + await store.addLogs('experiment2', 'run1', [ + { type: 'log3', number: 2, values: { x: 25, y: 0, foo: true } }, + ]); + await expect( + fromAsync(store.getLogs({ experimentId: 'experiment2', runId: 'run1' })), + ).resolves.toMatchInlineSnapshot(` + [ + { + "experimentId": "experiment2", + "number": 1, + "runId": "run1", + "type": "log2", + "values": { + "foo": true, + "x": 25, + "y": 0, + }, + }, + { + "experimentId": "experiment2", + "number": 2, + "runId": "run1", + "type": "log3", + "values": { + "foo": true, + "x": 25, + "y": 0, + }, + }, + ] + `); + }); + it('should not return logs canceled from resuming', async () => { + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run2', + resumeFrom: 2, + }); + await expect( + fromAsync(store.getLogs({ experimentId: 'experiment1', runId: 'run2' })), + ).resolves.toMatchInlineSnapshot(` + [ + { + "experimentId": "experiment1", + "number": 1, + "runId": "run2", + "type": "log1", + "values": { + "bar": null, + "message": "hola", + }, + }, + ] + `); + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run2', + resumeFrom: 1, + }); + await expect( + fromAsync(store.getLogs({ experimentId: 'experiment1', runId: 'run2' })), + ).resolves.toEqual([]); + }); + it('should return logs overwriting other logs after resuming', async () => { + await store.addLogs('experiment1', 'run2', [ + { type: 'log1', number: 3, values: { x: 5 } }, + { type: 'log1', number: 4, values: { x: 6 } }, + ]); + await store.resumeRun({ + experimentId: 'experiment1', + runId: 'run2', + resumeFrom: 2, + }); + await store.addLogs('experiment1', 'run2', [ + { type: 'overwriting', number: 2, values: { x: 1 } }, + { type: 'overwriting', number: 3, values: { x: 2 } }, + ]); + await expect( + fromAsync(store.getLogs({ experimentId: 'experiment1', runId: 'run2' })), + ).resolves.toMatchInlineSnapshot(` + [ + { + "experimentId": "experiment1", + "number": 1, + "runId": "run2", + "type": "log1", + "values": { + "bar": null, + "message": "hola", + }, + }, + { + "experimentId": "experiment1", + "number": 2, + "runId": "run2", + "type": "overwriting", + "values": { + "x": 1, + }, + }, + { + "experimentId": "experiment1", + "number": 3, + "runId": "run2", + "type": "overwriting", + "values": { + "x": 2, + }, + }, + ] + `); + }); }); async function fromAsync(iterable: AsyncIterable) { diff --git a/packages/log-server/package.json b/packages/log-server/package.json index 0a156b53..69ad3791 100644 --- a/packages/log-server/package.json +++ b/packages/log-server/package.json @@ -27,40 +27,41 @@ "cli-watch": "tsx --watch ./src/cli.ts" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.4", - "@types/body-parser": "^1.19.2", - "@types/cookie-session": "^2.0.44", - "@types/cors": "^2.8.13", - "@types/express": "^4.17.17", - "@types/node": "^18.17.2", - "@types/supertest": "^2.0.12", - "@types/yargs": "^17.0.24", + "@types/better-sqlite3": "^7.6.6", + "@types/body-parser": "^1.19.4", + "@types/cookie-session": "^2.0.46", + "@types/cors": "^2.8.15", + "@types/express": "^4.17.20", + "@types/node": "^18.18.8", + "@types/supertest": "^2.0.15", + "@types/yargs": "^17.0.29", "cross-env": "^7.0.3", "supertest": "^6.3.3", - "tsx": "^3.12.7", - "type-fest": "^4.1.0", - "typescript": "5.1.6", - "vite": "^4.4.8", - "vitest": "^0.34.1" + "tsx": "^3.14.0", + "type-fest": "^4.6.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vitest": "^0.34.6" }, "dependencies": { - "@lightmill/log-api": "workspace:*", - "@paralleldrive/cuid2": "^2.2.1", + "@lightmill/log-api": "workspace:3.0.0-beta.22", + "@paralleldrive/cuid2": "^2.2.2", + "@zodios/core": "^10.9.2", "@zodios/express": "^10.6.1", - "axios": "^1.4.0", - "better-sqlite3": "^8.5.0", + "axios": "^1.6.0", + "better-sqlite3": "^9.0.0", "body-parser": "^1.20.2", - "change-case": "^4.1.2", + "change-case": "^5.1.2", "cookie-session": "^2.0.0", "cors": "^2.8.5", - "csv": "^6.3.1", + "csv": "^6.3.5", "dotenv": "^16.3.1", "express": "^4.18.2", - "kysely": "^0.26.1", + "kysely": "^0.26.3", "loglevel": "^1.8.1", - "remeda": "^1.24.0", + "remeda": "^1.28.0", "yargs": "17.7.2", - "zod": "^3.21.4" + "zod": "^3.22.4" }, - "packageManager": "pnpm@7.17.0" + "packageManager": "pnpm@8.10.2" } diff --git a/packages/log-server/src/app.ts b/packages/log-server/src/app.ts index 30137bbd..e67b5551 100644 --- a/packages/log-server/src/app.ts +++ b/packages/log-server/src/app.ts @@ -17,12 +17,9 @@ const ctx = zodiosContext( z.null(), z .object({ - role: z.union([z.literal('admin'), z.literal('participant')]), + role: z.union([z.literal('host'), z.literal('participant')]), runs: z.array( - z.object({ - runId: z.string(), - experimentId: z.string(), - }), + z.object({ runId: z.string(), experimentId: z.string() }), ), }) .strict(), @@ -33,14 +30,14 @@ const ctx = zodiosContext( type CreateLogServerOptions = { store: Store; secret: string; - adminPassword?: string; + hostPassword?: string; allowCrossOrigin?: boolean; secureCookies?: boolean; }; export function LogServer({ store, secret, - adminPassword, + hostPassword, allowCrossOrigin = true, secureCookies = allowCrossOrigin, }: CreateLogServerOptions): RequestHandler { @@ -65,22 +62,16 @@ export function LogServer({ router.post('/sessions', (req, res) => { if (req.session?.role != null) { - res.status(400).json({ - status: 'error', - message: 'Client already has a session', - }); + res + .status(400) + .json({ status: 'error', message: 'Client already has a session' }); return; } const { role, password } = req.body; - if ( - role === 'admin' && - adminPassword != null && - password !== adminPassword - ) { - res.status(403).json({ - status: 'error', - message: `Forbidden role: ${role}`, - }); + if (role === 'host' && hostPassword != null && password !== hostPassword) { + res + .status(403) + .json({ status: 'error', message: `Forbidden role: ${role}` }); } req.session = { role, runs: [] }; res.status(201).json({ status: 'ok', role, runs: [] }); @@ -88,28 +79,19 @@ export function LogServer({ router.get('/sessions/current', (req, res) => { if (!req.session?.isPopulated) { - res.status(404).json({ - status: 'error', - message: 'No session found', - }); + res.status(404).json({ status: 'error', message: 'No session found' }); return; } res.status(200).json({ status: 'ok', role: req.session.role, - runs: req.session.runs.map((r) => ({ - id: r.runId, - experiment: r.experimentId, - })), + runs: req.session.runs, }); }); router.delete('/sessions/current', (req, res) => { if (req.session?.role == null) { - res.status(404).json({ - status: 'error', - message: 'No session found', - }); + res.status(404).json({ status: 'error', message: 'No session found' }); return; } req.session = null; @@ -122,92 +104,159 @@ export function LogServer({ req.session = { role: 'participant', runs: [] }; } if (req.session.runs.length > 0) { - res.status(403).json({ - status: 'error', - message: 'Client already has a started run, end it first', - }); - return; + const clientRuns = await Promise.all( + req.session.runs.map((r) => store.getRun(r.experimentId, r.runId)), + ); + if (clientRuns.some((r) => r?.status === 'running')) { + res.status(403).json({ + status: 'error', + message: 'Client already has started runs, end them first', + }); + return; + } } - let runId = req.body?.id ?? createId(); - let experimentId = req.body?.experiment ?? 'default'; - const run = { - experimentId, - runId, - createdAt: new Date(), - }; + let runId = req.body?.runId ?? createId(); + let experimentId = req.body?.experimentId ?? 'default'; + const run = { experimentId, runId, createdAt: new Date() }; await store.addRun(run); req.session.runs.push({ runId, experimentId }); res.status(201).json({ status: 'ok', - run: runId, - experiment: experimentId, - links: { - logs: `/experiments/${experimentId}/runs/${runId}/logs`, - run: `/experiments/${experimentId}/runs/${runId}`, - }, + runId, + experimentId, }); } catch (e) { if (e instanceof StoreError && e.code === 'RUN_EXISTS') { - res.status(400).json({ - status: 'error', - message: e.message, - }); + res.status(403).json({ status: 'error', message: e.message }); return; } next(e); } }); - router.patch('/experiments/:experiment/runs/:run', async (req, res, next) => { - let { experiment: experimentId, run: runId } = req.params; - experimentId = String(experimentId); - runId = String(runId); - try { - if ( - req.session?.runs?.find( - (r) => r.runId === runId && r.experimentId === experimentId, - ) == null - ) { - res.status(403).json({ - status: 'error', - message: `Client does not have permission to update run "${runId}" of experiment "${experimentId}"`, + router.get( + '/experiments/:experimentId/runs/:runId', + async (req, res, next) => { + try { + let { experimentId, runId } = req.params; + experimentId = String(experimentId); + runId = String(runId); + if ( + req.session?.runs?.find( + (r) => r.runId === runId && r.experimentId === experimentId, + ) == null + ) { + res.status(403).json({ + status: 'error', + message: `Client does not have permission to access run "${runId}" of experiment "${experimentId}"`, + }); + return; + } + let [run, logCounts] = await Promise.all([ + store.getRun(experimentId, runId), + store.getLogSummary({ experimentId, runId }), + ]); + if (run == null) { + // This will cause an internal server error. It should not happen + // in normal use, except if the participant's session is corrupted, + // or the database is corrupted, or removed. + throw new Error(`Session run not found: ${runId}`); + } + res.status(200).json({ + status: 'ok', + run: { + runId: run.runId, + experimentId: run.experimentId, + status: run.status, + logs: logCounts, + }, }); - return; - } - let run = await store.getRun(experimentId, runId); - if (run == null) { - // This will cause an internal server error. It should not happen - // in normal use, except if the participant's session is corrupted, - // or the database is corrupted, or removed. - throw new Error(`Session run not found: ${runId}`); + } catch (e) { + next(e); } + }, + ); - // At the moment, the only supported put operation is - // { "status": "completed" | "canceled" }, so there is nothing more to - // check here, zodios does it for us already. - if (run.status != 'running') { - // This should not happen in normal use since the client should lose - // access to the run once it is ended. - res.status(400).json({ - status: 'error', - message: 'Run already ended', - }); - return; + router.patch( + '/experiments/:experimentId/runs/:runId', + async (req, res, next) => { + let { experimentId, runId } = req.params; + experimentId = String(experimentId); + runId = String(runId); + try { + if ( + req.session?.runs?.find( + (r) => r.runId === runId && r.experimentId === experimentId, + ) == null + ) { + res.status(403).json({ + status: 'error', + message: `Client does not have permission to update run "${runId}" of experiment "${experimentId}"`, + }); + return; + } + + const targetRun = await store.getRun(experimentId, runId); + + if (targetRun == null) { + // This will cause an internal server error. It should not happen + // in normal use, except if the participant's session is corrupted, + // or the database is corrupted, or removed. + throw new Error(`Session run not found: ${runId}`); + } + + // Case: resume run. + if ('resumeFrom' in req.body) { + let otherRuns = await Promise.all( + req.session.runs + .filter((r) => r.experimentId != experimentId || r.runId != runId) + .map((r) => store.getRun(r.experimentId, r.runId)), + ); + if (otherRuns.some((r) => r?.status === 'running')) { + res.status(403).json({ + status: 'error', + message: 'Client already has other running runs, end them first', + }); + return; + } + + if (targetRun.status === 'completed') { + res.status(400).json({ + status: 'error', + message: 'Run has already been completed', + }); + return; + } + await store.resumeRun({ + experimentId, + runId, + resumeFrom: req.body.resumeFrom, + }); + res.status(200).json({ status: 'ok' }); + return; + } + + // Case: end run. + if (targetRun.status != 'running') { + // This should not happen in normal use since the client should lose + // access to the run once it is ended. + res + .status(400) + .json({ status: 'error', message: 'Run has already ended' }); + return; + } + await store.setRunStatus(experimentId, runId, req.body.status); + res.status(200).json({ status: 'ok' }); + } catch (e) { + next(e); } - await store.setRunStatus(experimentId, runId, req.body.status); - req.session.runs = req.session.runs.filter( - (r) => r.runId !== runId && r.experimentId !== experimentId, - ); - res.status(200).json({ status: 'ok' }); - } catch (e) { - next(e); - } - }); + }, + ); router.post( - '/experiments/:experiment/runs/:run/logs', + '/experiments/:experimentId/runs/:runId/logs', async (req, res, next) => { - let { experiment: experimentId, run: runId } = req.params; + let { experimentId, runId } = req.params; experimentId = String(experimentId); runId = String(runId); try { @@ -247,13 +296,12 @@ export function LogServer({ }, ); - router.get('/experiments/:experiment/logs', async (req, res, next) => { + router.get('/experiments/:experimentId/logs', async (req, res, next) => { try { - if (req.session?.role !== 'admin') { - res.status(403).json({ - status: 'error', - message: 'Access restricted.', - }); + if (req.session?.role !== 'host') { + res + .status(403) + .json({ status: 'error', message: 'Access restricted.' }); return; } let format = 'json'; @@ -270,7 +318,7 @@ export function LogServer({ } } let filter: LogFilter = { - experiment: String(req.params.experiment), + experimentId: String(req.params.experimentId), type: req.query.type, }; if (format === 'csv') { @@ -286,20 +334,14 @@ export function LogServer({ }); router.use('*', (req, res) => { - res.status(404).json({ - status: 'error', - message: 'Not found', - }); + res.status(404).json({ status: 'error', message: 'Not found' }); }); app.use((error: unknown, req: Request, res: Response, next: NextFunction) => { if (res.headersSent) { next(error); } else if (error instanceof Error) { - res.status(500).json({ - status: 'error', - message: error.message, - }); + res.status(500).json({ status: 'error', message: error.message }); } else { log.error('error', error); next(error); diff --git a/packages/log-server/src/cli.ts b/packages/log-server/src/cli.ts index bb4ef456..997d484f 100644 --- a/packages/log-server/src/cli.ts +++ b/packages/log-server/src/cli.ts @@ -23,7 +23,7 @@ const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); const env = z .object({ SECRET: z.string().optional(), - ADMIN_PASSWORD: z.string().optional(), + HOST_PASSWORD: z.string().optional(), PORT: z.number().default(3000), DB_PATH: z.string().default('./data.sqlite'), LOG_LEVEL: z @@ -50,13 +50,13 @@ type StartParameter = { database: string; port: number; secret?: string; - adminPassword?: string; + hostPassword?: string; }; async function start({ database: dbPath, port, secret, - adminPassword, + hostPassword, }: StartParameter) { if (secret == null) { log.error( @@ -79,7 +79,7 @@ async function start({ } let server = express() .use(cors()) - .use(LogServer({ store, secret, adminPassword })) + .use(LogServer({ store, secret, hostPassword })) .listen(port, () => { log.info(`Listening on port ${port}`); }); @@ -176,11 +176,11 @@ yargs(process.argv.slice(2)) type: 'string', default: env.SECRET, }) - .option('admin-password', { - alias: 'a', - desc: 'Password for the admin user', + .option('host-password', { + alias: 'w', + desc: 'Password for the host user', type: 'string', - default: env.ADMIN_PASSWORD, + default: env.HOST_PASSWORD, }) .help() .alias('help', 'h') diff --git a/packages/log-server/src/db-migrations/2023-08-07-init.ts b/packages/log-server/src/db-migrations/2023-08-07-init.ts index 295119ff..fe132561 100644 --- a/packages/log-server/src/db-migrations/2023-08-07-init.ts +++ b/packages/log-server/src/db-migrations/2023-08-07-init.ts @@ -1,70 +1,222 @@ -import { Kysely, sql } from 'kysely'; +import { ColumnType, GeneratedAlways, Kysely, sql } from 'kysely'; -export async function up(db: Kysely) { +// We use ColumnType to prevent the column from being updated. +type RunTable = { + runId: ColumnType; + experimentId: ColumnType; + status: 'running' | 'completed' | 'canceled'; +}; +type LogSequenceTable = { + sequenceId: GeneratedAlways; + experimentId: ColumnType; + runId: ColumnType; + sequenceNumber: ColumnType; + start: ColumnType; +}; +type logTable = { + logId: GeneratedAlways; + sequenceId: ColumnType; + logNumber: ColumnType; + // Logs with no types are used to fill in missing log numbers. + type?: string; +}; +type RunLogView = { + logId: ColumnType; + experimentId: ColumnType; + runId: ColumnType; + sequenceId: ColumnType; + logNumber: ColumnType; + sequenceNumber: ColumnType; + // Logs with no types are used to fill in missing log numbers. + type?: ColumnType; +}; +type LogValueTable = { + logId: ColumnType; + name: ColumnType; + value: ColumnType; +}; +type Database = { + run: RunTable; + logSequence: LogSequenceTable; + log: logTable; + runLogView: RunLogView; + logValue: LogValueTable; +}; + +export async function up(db: Kysely) { await db.transaction().execute(async (trx) => { await trx.schema .createTable('run') - .addColumn('runDbId', 'integer', (column) => column.primaryKey()) - .addColumn('experimentId', 'text', (column) => column.notNull()) .addColumn('runId', 'text', (column) => column.notNull()) + .addColumn('experimentId', 'text', (column) => column.notNull()) .addColumn('status', 'text', (column) => column.notNull()) - .addColumn('createdAt', 'datetime') - .addUniqueConstraint('UniqueRunPerExperiment', ['experimentId', 'runId']) + .addCheckConstraint( + 'RunStatusCheck', + sql`status IN ('running', 'completed', 'canceled')`, + ) + .addPrimaryKeyConstraint('runPrimaryKey', ['experimentId', 'runId']) + .execute(); + + await trx.schema + .createTable('logSequence') + .addColumn('sequenceId', 'integer', (column) => column.primaryKey()) + .addColumn('experimentId', 'text', (column) => column.notNull()) + .addColumn('runId', 'text', (column) => column.notNull()) + .addColumn('sequenceNumber', 'integer', (column) => + column.notNull().check(sql`sequence_number > 0`), + ) + .addColumn('start', 'integer', (column) => + // Make sure that the start number is greater than zero. + column.notNull().check(sql`start > 0`), + ) + // This creates an index on the columns (so no need to create another) and + // prevents duplicate rows. + .addUniqueConstraint('logSequenceUnique', [ + 'experimentId', + 'runId', + 'sequenceNumber', + ]) + .addForeignKeyConstraint( + 'ForeignLogSequenceRun', + ['experimentId', 'runId'], + 'run', + ['experimentId', 'runId'], + ) .execute(); await trx.schema .createTable('log') - .addColumn('logDbId', 'integer', (column) => column.primaryKey()) - .addColumn('runDbId', 'integer', (column) => column.notNull()) + .addColumn('logId', 'integer', (column) => column.primaryKey()) + .addColumn('sequenceId', 'integer', (column) => column.notNull()) + .addColumn('logNumber', 'integer', (column) => column.notNull()) + // Empty means missing log. .addColumn('type', 'text') - .addColumn('number', 'integer', (column) => column.notNull()) - .addColumn('createdAt', 'datetime') - .addForeignKeyConstraint('ForeignLogRunDbId', ['runDbId'], 'run', [ - 'runDbId', - ]) - .addUniqueConstraint('UniqueLogNumberPerRun', ['runDbId', 'number']) + // This creates an index on the columns (so no need to create another) and + // prevents duplicate rows. + .addUniqueConstraint('UniqueLog', ['sequenceId', 'logNumber']) + .addForeignKeyConstraint( + 'ForeignLogSequenceId', + ['sequenceId'], + 'logSequence', + ['sequenceId'], + ) .execute(); - // Prevents updates of log rows whose current type column is not null. + // Prevent updates of log rows whose current type column is not null. await sql` - CREATE TRIGGER PreventLogTypeUpdate + CREATE TRIGGER prevent_log_update BEFORE UPDATE ON log - FOR EACH ROW WHEN OLD.type IS NOT NULL BEGIN SELECT RAISE(ABORT, 'Cannot update existing log'); END; `.execute(trx); + // Prevent deletion of log rows whose current type column is not null. + await sql` + CREATE TRIGGER prevent_log_delete + BEFORE DELETE ON log + WHEN OLD.type IS NOT NULL + BEGIN + SELECT RAISE(ABORT, 'Cannot delete existing log'); + END; + `.execute(trx); + // Prevent inserts of log whose number is smaller than its sequence start. + await sql` + CREATE TRIGGER prevent_log_insert + BEFORE INSERT ON log + WHEN NEW.log_number < ( + SELECT start FROM log_sequence WHERE sequence_id = NEW.sequence_id + ) + BEGIN + SELECT RAISE(ABORT, 'Cannot insert log with log_number smaller than its sequence start'); + END; + `.execute(trx); + // There should already be an index to select logs by sequenceId and + // number, but we need to create an index to select logs by sequenceId, + // type, and number. await trx.schema - .createTable('logValue') - .addColumn('logDbId', 'integer', (column) => column.notNull()) - .addColumn('name', 'text', (column) => column.notNull()) - .addColumn('value', 'json', (column) => column.notNull()) - .addForeignKeyConstraint('ForeignLogValueLogDbId', ['logDbId'], 'log', [ - 'logDbId', - ]) - .addPrimaryKeyConstraint('logValuePrimaryKey', ['logDbId', 'name']) - .execute(); - - await trx.schema - .createIndex('runSort') - .on('run') - .columns(['experimentId', 'runId']) - .execute(); - await trx.schema - .createIndex('logSelectWithoutType') + .createIndex('logSelectWithType') .on('log') - .columns(['runDbId', 'number']) + .columns(['sequenceId', 'type', 'logNumber']) .execute(); + await trx.schema - .createIndex('logSelectWithType') - .on('log') - .columns(['runDbId', 'type', 'number']) + .createView('runLogView') + .as( + trx + .with('logSequenceWithEnd', (query) => + query + .selectFrom('logSequence as seq') + .leftJoin( + ({ selectFrom }) => + selectFrom('logSequence as nextSeq') + .select([ + 'experimentId', + 'runId', + 'sequenceNumber', + 'start', + ]) + .as('nextSeq'), + (join) => + join + .onRef('nextSeq.experimentId', '=', 'seq.experimentId') + .onRef('nextSeq.runId', '=', 'seq.runId') + .onRef('nextSeq.sequenceNumber', '>', 'seq.sequenceNumber'), + ) + .groupBy(['seq.sequenceId']) + .select((eb) => [ + 'seq.sequenceId', + 'seq.experimentId', + 'seq.runId', + 'seq.sequenceNumber', + eb.fn.min('nextSeq.start').as('end'), + ]), + ) + .selectFrom('log') + .innerJoin('logSequenceWithEnd as seq', (join) => + join.onRef('seq.sequenceId', '=', 'log.sequenceId'), + ) + .where((eb) => + eb.or([ + eb('seq.end', 'is', null), + eb('log.logNumber', '<', eb.ref('seq.end')), + ]), + ) + .select([ + 'log.logId', + 'seq.experimentId', + 'seq.runId', + 'seq.sequenceId', + 'seq.sequenceNumber', + 'log.logNumber', + 'log.type', + ]), + ) .execute(); + await trx.schema - .createIndex('logValueLogIdName') - .on('logValue') - .columns(['logDbId', 'name']) + .createTable('logValue') + .addColumn('logId', 'integer', (column) => column.notNull()) + .addColumn('name', 'text', (column) => column.notNull()) + .addColumn('value', 'json', (column) => column.notNull()) + .addForeignKeyConstraint('ForeignLogValuelogId', ['logId'], 'log', [ + 'logId', + ]) + .addPrimaryKeyConstraint('logValuePrimaryKey', ['logId', 'name']) .execute(); + await sql` + CREATE TRIGGER prevent_log_value_update + BEFORE UPDATE ON log_value + BEGIN + SELECT RAISE(ABORT, 'Cannot update existing log value'); + END; + `.execute(trx); + await sql` + CREATE TRIGGER prevent_log_value_delete + BEFORE DELETE ON log_value + BEGIN + SELECT RAISE(ABORT, 'Cannot delete existing log value'); + END; + `.execute(trx); }); } diff --git a/packages/log-server/src/export.ts b/packages/log-server/src/export.ts index 84b1c874..d460a744 100644 --- a/packages/log-server/src/export.ts +++ b/packages/log-server/src/export.ts @@ -5,10 +5,7 @@ import { Log, Store } from './store.js'; import { toSnakeCase } from './utils.js'; const logColumns: Array = ['type', 'experimentId', 'runId']; -const renamedLogColumns: Partial> = { - experimentId: 'experiment', - runId: 'run', -}; +const renamedLogColumns: Partial> = {}; const ignoredLogValues: Array = ['values']; export function csvExportStream( @@ -22,8 +19,8 @@ export function csvExportStream( let logColumnFilter = (columnName: keyof Log) => !valueColumns.includes(columnName) && (filter?.type == null || columnName !== 'type') && - (filter?.experiment == null || columnName !== 'experimentId') && - (filter?.run == null || columnName !== 'runId') && + (filter?.experimentId == null || columnName !== 'experimentId') && + (filter?.runId == null || columnName !== 'runId') && !ignoredLogValues.includes(columnName); let columns = [ ...logColumns diff --git a/packages/log-server/src/store.ts b/packages/log-server/src/store.ts index 397f929c..c864f9f9 100644 --- a/packages/log-server/src/store.ts +++ b/packages/log-server/src/store.ts @@ -1,20 +1,21 @@ import fs from 'node:fs/promises'; import path from 'node:path'; import * as url from 'node:url'; -import SQLiteDB, { SqliteError } from 'better-sqlite3'; +import SQLiteDB from 'better-sqlite3'; import { Kysely, FileMigrationProvider, - Generated, Migrator, SqliteDialect, CamelCasePlugin, DeduplicateJoinsPlugin, InsertObject, + GeneratedAlways, + ColumnType, } from 'kysely'; import { JsonObject } from 'type-fest'; import loglevel, { LogLevelDesc } from 'loglevel'; -import { groupBy, maxBy, minBy } from 'remeda'; +import { groupBy } from 'remeda'; import { arrayify } from './utils.js'; const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); @@ -22,49 +23,65 @@ const migrationFolder = path.join(__dirname, 'db-migrations'); export type Store = Omit; +// We use ColumnType to prevent the column from being updated. type RunTable = { - runDbId: Generated; - runId: string; - experimentId: string; + runId: ColumnType; + experimentId: ColumnType; status: 'running' | 'completed' | 'canceled'; - createdAt?: string; }; -type LogTable = { - logDbId: Generated; - runDbId: number; - number: number; - createdAt?: string; - // Logs with no type are used to fill in missing log numbers. +type LogSequenceTable = { + sequenceId: GeneratedAlways; + experimentId: ColumnType; + runId: ColumnType; + sequenceNumber: ColumnType; + start: ColumnType; +}; +type logTable = { + logId: GeneratedAlways; + sequenceId: ColumnType; + logNumber: ColumnType; + // Logs with no types are used to fill in missing log numbers. type?: string; }; - +type RunLogView = { + logId: ColumnType; + experimentId: ColumnType; + runId: ColumnType; + sequenceId: ColumnType; + logNumber: ColumnType; + sequenceNumber: ColumnType; + // Logs with no types are used to fill in missing log numbers. + type?: ColumnType; +}; type LogValueTable = { - logDbId: number; - name: string; - value: string; + logId: ColumnType; + name: ColumnType; + value: ColumnType; }; - type Database = { run: RunTable; - log: LogTable; + logSequence: LogSequenceTable; + log: logTable; + runLogView: RunLogView; logValue: LogValueTable; }; export class SQLiteStore { #db: Kysely; + constructor( db: string, { logLevel = loglevel.getLevel() }: { logLevel?: LogLevelDesc } = {}, ) { - const log = loglevel.getLogger('store'); - log.setLevel(logLevel); + const logger = loglevel.getLogger('store'); + logger.setLevel(logLevel); this.#db = new Kysely({ dialect: new SqliteDialect({ database: new SQLiteDB(db) }), log: (event) => { if (event.level === 'query') { - log.debug(event.query.sql, event.query.parameters); + logger.debug(event.query.sql, event.query.parameters); } else if (event.level === 'error') { - log.error(event.error); + logger.error(event.error); } }, plugins: [new CamelCasePlugin(), new DeduplicateJoinsPlugin()], @@ -78,30 +95,120 @@ export class SQLiteStore { runId: string; experimentId: string; }) { - try { - let result = await this.#db + return this.#db.transaction().execute(async (trx) => { + let result = await trx .insertInto('run') + .values({ runId, experimentId, status: 'running' }) + .returning(['runId', 'experimentId']) + .executeTakeFirstOrThrow() + .catch((e) => { + if ( + e instanceof Error && + 'code' in e && + e.code === 'SQLITE_CONSTRAINT_PRIMARYKEY' + ) { + throw new StoreError( + `run "${runId}" already exists for experiment "${experimentId}".`, + 'RUN_EXISTS', + e, + ); + } + throw e; + }); + await trx + .insertInto('logSequence') + .values({ ...result, sequenceNumber: 1, start: 1 }) + .execute(); + return result; + }); + } + + async resumeRun({ + runId, + experimentId, + resumeFrom, + }: { + runId: string; + experimentId: string; + resumeFrom: number; + }) { + return this.#db.transaction().execute(async (trx) => { + let resumedRunResult = await trx + .updateTable('run') + .set({ status: 'running' }) + .where((eb) => + eb.and([ + eb('runId', '=', runId), + eb('experimentId', '=', experimentId), + eb('status', '<>', 'completed'), + ]), + ) + .returning(['run.runId', 'run.experimentId']) + .execute(); + if (resumedRunResult.length === 0) { + throw new StoreError( + `Cannot resume run "${runId}" for experiment "${experimentId}".`, + 'RUN_NOT_FOUND', + ); + } + if (resumedRunResult.length > 1) { + throw new Error( + `SQL query returned more than one row for run "${runId}" for experiment "${experimentId}".`, + ); + } + let { lastSeqNumber, firstMissingLogNumber, lastLogNumber } = await trx + .selectFrom('logSequence as seq') + .leftJoin('runLogView as log', (join) => + join + .onRef('log.runId', '=', 'seq.runId') + .onRef('log.experimentId', '=', 'seq.experimentId'), + ) + .where((eb) => + eb.and([ + eb('seq.experimentId', '=', experimentId), + eb('seq.runId', '=', runId), + ]), + ) + .select((eb) => [ + eb.fn.max('seq.sequenceNumber').as('lastSeqNumber'), + eb.fn + .max('log.logNumber') + .filterWhere('log.type', 'is not', null) + .as('lastLogNumber'), + eb.fn + .min('log.logNumber') + .filterWhere('log.type', 'is', null) + .as('firstMissingLogNumber'), + ]) + .executeTakeFirstOrThrow(); + if (lastSeqNumber == null) { + throw new Error( + `Could not find a sequence for run "${runId}" for experiment "${experimentId}".`, + ); + } + let minResumeFrom = 1; + if (firstMissingLogNumber != null) { + minResumeFrom = firstMissingLogNumber; + } else if (lastLogNumber != null) { + minResumeFrom = lastLogNumber + 1; + } + if (minResumeFrom < resumeFrom) { + throw new StoreError( + `Cannot resume run "${runId}" for experiment "${experimentId}" from log number ${resumeFrom} because the minimum is ${minResumeFrom}.`, + 'INVALID_LOG_NUMBER', + ); + } + return trx + .insertInto('logSequence') .values({ runId, experimentId, - status: 'running', - createdAt: new Date().toISOString(), + sequenceNumber: lastSeqNumber + 1, + start: resumeFrom, }) .returning(['runId', 'experimentId']) .executeTakeFirstOrThrow(); - return { runId: result.runId, experimentId: result.experimentId }; - } catch (e) { - if ( - e instanceof SqliteError && - e.code === 'SQLITE_CONSTRAINT_PRIMARYKEY' - ) { - throw new StoreError( - `run "${runId}" already exists for experiment "${experimentId}".`, - 'RUN_EXISTS', - ); - } - throw e; - } + }); } async getRun(experimentId: string, runId: string) { @@ -116,14 +223,24 @@ export class SQLiteStore { async setRunStatus( experimentId: string, runId: string, - status: RunTable['status'], + status: 'completed' | 'canceled', ) { await this.#db .updateTable('run') .where('experimentId', '=', experimentId) .where('runId', '=', runId) + .where('status', '=', 'running') .set({ status }) - .execute(); + // We need to return something or else the query will not fail if nothing + // is updated. + .returning(['runId', 'experimentId', 'status']) + .executeTakeFirstOrThrow( + () => + new StoreError( + `Cannot set status of run "${runId}" for experiment "${experimentId}".`, + 'RUN_NOT_FOUND', + ), + ); } async addLogs( @@ -137,65 +254,72 @@ export class SQLiteStore { ) { if (logs.length === 0) return; await this.#db.transaction().execute(async (trx) => { - let infoQuery = await trx - .selectFrom('run') - .where('experimentId', '=', experimentId) - .where('runId', '=', runId) - .leftJoin('log', 'log.runDbId', 'run.runDbId') - .groupBy('run.runDbId') - .select(({ fn }) => [ - 'run.runDbId as runDbId', - fn.max('log.number').as('currentLogNumber'), + let { start, sequenceId, maxLogNumber } = await trx + .selectFrom('logSequence as seq') + .having((eb) => + eb.and([ + eb('seq.experimentId', '=', experimentId), + eb('seq.runId', '=', runId), + eb('seq.sequenceNumber', '=', eb.fn.max('seq.sequenceNumber')), + ]), + ) + .groupBy(['seq.experimentId', 'seq.runId']) + .leftJoin('log', 'log.sequenceId', 'seq.sequenceId') + .select((eb) => [ + 'seq.sequenceId', + 'seq.start', + eb.fn.max('log.logNumber').as('maxLogNumber'), ]) - .executeTakeFirst(); - if (infoQuery?.runDbId == null) { - throw new Error( - `run "${runId}" of experiment "${experimentId}" not found`, + .executeTakeFirstOrThrow( + () => + new StoreError( + `Cannot add logs to run "${runId}" for experiment "${experimentId}".`, + 'RUN_NOT_FOUND', + ), ); - } let indexedNewLogs = groupBy(logs, (log) => log.number); - let { runDbId } = infoQuery; - let currentLogNumber = infoQuery.currentLogNumber ?? 0; - let futureLogNumber = maxBy(logs, (log) => log.number)?.number ?? 0; - let firstNewLogNumber = minBy(logs, (log) => log.number)?.number ?? 0; - let createdAt = new Date().toISOString(); + let newLogNumbers = logs.map((log) => log.number); + let insertStartNumber = Math.min( + ...newLogNumbers, + maxLogNumber == null ? start : maxLogNumber + 1, + ); + let insertEndNumber = Math.max(...newLogNumbers); // Start by updating existing logs. let logRows = new Array>(); // Add new logs and fill in missing logs. - for (let nb = firstNewLogNumber; nb <= futureLogNumber; nb++) { + for (let nb = insertStartNumber; nb <= insertEndNumber; nb++) { let logs = indexedNewLogs[nb] ?? []; if (logs.length > 0) { // It is forbidden for two logs to have the same number, but if that // happens, the database should be the one to complain. logRows.push( ...logs.map(({ type, number }) => ({ - runDbId, + sequenceId, type, - number, - createdAt, + logNumber: number, })), ); - } else if (nb > currentLogNumber) { - // If the log number is greater than the current log number, then - // there is a missing log. We need to add it to the database. - logRows.push({ runDbId, number: nb }); + } else if (maxLogNumber == null || nb > maxLogNumber) { + // If the log number is greater than maxLogNumber, there is a missing + // log. We need to add it to the database. + logRows.push({ sequenceId, logNumber: nb }); } - // Otherwise do nothing because the log (or missing log) should already - // be in the database. } + await trx + .deleteFrom('log') + .where((eb) => + eb.and([ + eb('sequenceId', '=', sequenceId), + eb('logNumber', 'in', newLogNumbers), + eb('type', 'is', null), + ]), + ) + .execute(); let dbLogs = await trx .insertInto('log') .values(logRows) - .onConflict((oc) => - // This update is safe because it should fail if the log type is not - // null, which would mean that the log already exists. - oc.columns(['runDbId', 'number']).doUpdateSet((eb) => ({ - type: eb.ref('excluded.type'), - createdAt: eb.ref('excluded.createdAt'), - })), - ) - .returning(['logDbId', 'number', 'type']) + .returning(['logId', 'logNumber', 'type']) .execute(); // Sort by number to ensure that the log values are properly @@ -206,8 +330,8 @@ export class SQLiteStore { .flatMap((dbLog) => { // We know there is only one log with this number because of the // loop above. - let values = indexedNewLogs[dbLog.number][0].values; - return deconstructValues(values, { logDbId: dbLog.logDbId }); + let values = indexedNewLogs[dbLog.logNumber][0].values; + return deconstructValues(values, { logId: dbLog.logId }); }); if (logValues.length > 0) { await trx.insertInto('logValue').values(logValues).execute(); @@ -218,22 +342,15 @@ export class SQLiteStore { async getLogValueNames(filter: LogFilter = {}) { let result = await this.#db .selectFrom('logValue') - .$if(filter.experiment != null, (qb) => - qb - .innerJoin('log', 'log.logDbId', 'logValue.logDbId') - .innerJoin('run', 'run.runDbId', 'log.runDbId') - .where('run.experimentId', 'in', arrayify(filter.experiment, true)), + .innerJoin('runLogView as log', 'log.logId', 'logValue.logId') + .$if(filter.experimentId != null, (qb) => + qb.where('log.experimentId', 'in', arrayify(filter.experimentId, true)), ) - .$if(filter.run != null, (qb) => - qb - .innerJoin('log', 'log.logDbId', 'logValue.logDbId') - .innerJoin('run', 'run.runDbId', 'log.runDbId') - .where('run.runId', 'in', arrayify(filter.run, true)), + .$if(filter.runId != null, (qb) => + qb.where('log.runId', 'in', arrayify(filter.runId, true)), ) .$if(filter.type != null, (qb) => - qb - .innerJoin('log', 'log.logDbId', 'logValue.logDbId') - .where('log.type', 'in', arrayify(filter.type, true)), + qb.where('log.type', 'in', arrayify(filter.type, true)), ) .select('logValue.name') .orderBy('name') @@ -242,63 +359,137 @@ export class SQLiteStore { return result.map((it) => it.name); } + async getLogSummary( + // It does not make sense to get the summary of multiple experiments or + // runs, so we do not allow it. + filter: LogFilter & { experimentId: string; runId: string }, + ): Promise< + Array<{ type: string; count: number; pending: number; lastNumber: number }> + > { + let result = await this.#db + .selectFrom('runLogView as log') + .innerJoin('logSequence as seq', 'seq.sequenceId', 'log.sequenceId') + .where((eb) => + eb.and([ + eb('seq.experimentId', '=', filter.experimentId), + eb('seq.runId', '=', filter.runId), + eb('log.type', 'is not', null), + ]), + ) + .$if(filter.type != null, (qb) => + qb.where('log.type', 'in', arrayify(filter.type, true)), + ) + .leftJoin( + ({ selectFrom }) => + selectFrom('runLogView') + .where('type', 'is', null) + .select((eb) => [ + 'sequenceId', + eb.fn.min('logNumber').as('logNumber'), + ]) + .groupBy('sequenceId') + .as('firstMissing'), + (join) => join.onRef('log.sequenceId', '=', 'firstMissing.sequenceId'), + ) + .select((eb) => [ + 'log.type', + eb.fn + .countAll() + .filterWhere( + eb.or([ + eb('firstMissing.logNumber', 'is', null), + eb('log.logNumber', '<', eb.ref('firstMissing.logNumber')), + ]), + ) + .as('count'), + // In theory any logs from a run with no missing logs should not + // be counted because missing.first will be null so the filter will + // be unknown, so the log will not be included. + eb.fn + .countAll() + .filterWhere('log.logNumber', '>', eb.ref('firstMissing.logNumber')) + .as('pending'), + eb.fn + .max('log.logNumber') + .filterWhere( + eb.or([ + eb('firstMissing.logNumber', 'is', null), + eb('log.logNumber', '<', eb.ref('firstMissing.logNumber')), + ]), + ) + .as('lastNumber'), + ]) + .groupBy('type') + .orderBy('type') + .$narrowType<{ type: string }>() + .execute(); + return result.map(({ pending, count, lastNumber, type }) => { + return { + type, + pending: Number(pending), + count: Number(count), + lastNumber, + }; + }); + } + async *getLogs(filter: LogFilter = {}): AsyncGenerator { // It would probably be better not to read everything at once because - // this could be a lot of data. However until this becomes a problem, this + // this could be a lot of data. Instead we could read a few yield, and + // restart with the remaining. However until this becomes a problem, this // is good enough. let result = await this.#db - .selectFrom('logValue') - .innerJoin('log', 'log.logDbId', 'logValue.logDbId') - .innerJoin('run', 'run.runDbId', 'log.runDbId') - .$if(filter.experiment != null, (qb) => - qb.where('run.experimentId', 'in', arrayify(filter.experiment, true)), + .selectFrom('runLogView as l') + .innerJoin('logValue as v', 'l.logId', 'v.logId') + .$if(filter.experimentId != null, (qb) => + qb.where('l.experimentId', 'in', arrayify(filter.experimentId, true)), ) - .$if(filter.run != null, (qb) => - qb.where('run.runId', 'in', arrayify(filter.run, true)), + .$if(filter.runId != null, (qb) => + qb.where('l.runId', 'in', arrayify(filter.runId, true)), ) .$if(filter.type != null, (qb) => - qb.where('log.type', 'in', arrayify(filter.type, true)), + qb.where('l.type', 'in', arrayify(filter.type, true)), ) - .where('log.type', 'is not', null) + .where('l.type', 'is not', null) .select([ - 'run.experimentId as experimentId', - 'run.runId as runId', - 'log.logDbId as logDbId', - 'log.type as logType', - 'log.number as logNumber', - 'logValue.name', - 'logValue.value', + 'l.experimentId as experimentId', + 'l.runId as runId', + 'l.logId as logId', + 'l.type as type', + 'l.logNumber as number', + 'v.name', + 'v.value', ]) + .$narrowType<{ type: string }>() .orderBy('experimentId') .orderBy('runId') - .orderBy('logNumber') + .orderBy('number') .execute(); - let currentLog = null; - let currentLogId = null; - for (let row of result) { - if (currentLog == null || row.logDbId !== currentLogId) { - if (currentLog != null) { - yield currentLog; - } - if (row.logType == null) { - throw new Error('SQL query returned a log with no type'); - } - currentLog = { - experimentId: row.experimentId, - runId: row.runId, - type: row.logType, - number: row.logNumber, - values: {} as JsonObject, - }; - currentLogId = row.logDbId; - } - currentLog.values[row.name] = JSON.parse(row.value); + if (result.length === 0) return; + + function reconstructLog(start: number, end: number) { + let first = result[start]; + return { + experimentId: first.experimentId, + runId: first.runId, + type: first.type, + number: first.number, + values: reconstructValues(result.slice(start, end)), + }; } - // Let us not forget the last one! - if (currentLog != null) { - yield currentLog; + + let currentLogStart = 0; + let currentLogId = result[0].logId; + for (let i = 1; i < result.length; i++) { + let row = result[i]; + if (row.logId !== currentLogId) { + yield reconstructLog(currentLogStart, i); + currentLogStart = i; + currentLogId = row.logId; + } } + yield reconstructLog(currentLogStart, result.length); } async migrateDatabase() { @@ -336,10 +527,20 @@ function deconstructValues( })); } +function reconstructValues( + data: Array<{ name: string; value: string }>, +): JsonObject { + let values: JsonObject = {}; + for (let { name, value } of data) { + values[name] = JSON.parse(value); + } + return values; +} + export type LogFilter = { type?: string | string[]; - run?: string | string[]; - experiment?: string | string[]; + runId?: string | string[]; + experimentId?: string | string[]; }; export type Log = { @@ -350,7 +551,11 @@ export type Log = { values: JsonObject; }; -type StoreErrorCode = 'RUN_EXISTS'; +type StoreErrorCode = + | 'RUN_EXISTS' + | 'INVALID_LOG_NUMBER' + | 'RUN_NOT_FOUND' + | 'RUN_HAS_ENDED'; export class StoreError extends Error { code: StoreErrorCode; cause?: Error; diff --git a/packages/log-server/tsconfig.build.json b/packages/log-server/tsconfig.build.json index cc23d88c..122d223d 100644 --- a/packages/log-server/tsconfig.build.json +++ b/packages/log-server/tsconfig.build.json @@ -6,7 +6,7 @@ "outDir": "dist", "target": "es2020", "lib": ["es2020"], - "module": "ES2020", + "module": "Node16", "moduleResolution": "Node16", "allowSyntheticDefaultImports": true, "noImplicitAny": true, diff --git a/packages/log-server/tsconfig.json b/packages/log-server/tsconfig.json index 3c36fd27..fbb956ca 100644 --- a/packages/log-server/tsconfig.json +++ b/packages/log-server/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "target": "es2020", "lib": ["es2020"], - "module": "ES2020", + "module": "Node16", "moduleResolution": "Node16", "allowSyntheticDefaultImports": true, "noImplicitAny": true, diff --git a/packages/react-experiment/__tests__/run.test.tsx b/packages/react-experiment/__tests__/run.test.tsx index b265d03b..5e38c039 100644 --- a/packages/react-experiment/__tests__/run.test.tsx +++ b/packages/react-experiment/__tests__/run.test.tsx @@ -13,10 +13,16 @@ type Task = { type: 'A'; a: string } | { type: 'B'; b: number }; describe('run', () => { let Task: (props: { type: string; dataProp: string }) => JSX.Element; - let tasks: Task[]; - let asyncTaskGen: ( + const asyncTaskGen = async function* ( taskLoadingTime: number, - ) => AsyncGenerator; + tasks: Task[], + ) { + for (let task of tasks) { + await wait(taskLoadingTime); + yield task; + } + await wait(taskLoadingTime); + }; beforeEach(() => { Task = ({ type, dataProp }) => { @@ -29,18 +35,6 @@ describe('run', () => { ); }; - tasks = [ - { type: 'A', a: 'hello' }, - { type: 'B', b: 42 }, - { type: 'A', a: 'world' }, - ]; - asyncTaskGen = async function* (taskLoadingTime) { - for (let task of tasks) { - await wait(taskLoadingTime); - yield task; - } - await wait(taskLoadingTime); - }; }); it('renders tasks in accordance with the timeline', async () => { @@ -52,7 +46,16 @@ describe('run', () => { }, completed:

, }; - render(); + render( + , + ); expect(screen.getByRole('heading')).toHaveTextContent('Type A'); expect(screen.getByTestId('data')).toHaveTextContent('hello'); await user.click(screen.getByRole('button')); @@ -65,6 +68,37 @@ describe('run', () => { expect(screen.getByTestId('end')).toBeInTheDocument(); }); + it('starts with a later tasks if resumeAfter is provided', async () => { + const user = userEvent.setup(); + render( + , + B: , + }, + completed:
, + }} + timeline={[ + { type: 'A', a: 'hello' }, + { type: 'B', b: 42 }, + { type: 'B', b: 21 }, + { type: 'B', b: 12 }, + { type: 'A', a: 'world' }, + ]} + />, + ); + + expect(screen.getByRole('heading')).toHaveTextContent('Type B'); + expect(screen.getByTestId('data')).toHaveTextContent('12'); + await user.click(screen.getByRole('button')); + expect(screen.getByRole('heading')).toHaveTextContent('Type A'); + expect(screen.getByTestId('data')).toHaveTextContent('world'); + await user.click(screen.getByRole('button')); + expect(screen.getByTestId('end')).toBeInTheDocument(); + }); + it('renders nothing when the experiment is done if no completed element is provided', async () => { const user = userEvent.setup(); let config: RunElements = { @@ -73,7 +107,16 @@ describe('run', () => { B: , }, }; - let { container } = render(); + let { container } = render( + , + ); expect(screen.getByRole('heading')).toHaveTextContent('Type A'); expect(screen.getByTestId('data')).toHaveTextContent('hello'); @@ -98,7 +141,16 @@ describe('run', () => { loading:
, completed:
, }; - render(); + render( + , + ); expect(screen.getByTestId('loading')).toBeInTheDocument(); await act(() => vi.advanceTimersByTime(taskTime)); expect(screen.getByRole('heading')).toHaveTextContent('Type A'); @@ -130,4 +182,98 @@ describe('run', () => { vi.runOnlyPendingTimers(); vi.useRealTimers(); }); + + it('let timeline being undefined as long as loading is true', async () => { + const user = userEvent.setup(); + const tasks: Task[] = [ + { type: 'A', a: 'hello' }, + { type: 'B', b: 42 }, + { type: 'A', a: 'world' }, + ]; + let config: RunElements = { + tasks: { + A: , + B: , + }, + loading:
, + completed:
, + }; + + const { rerender } = render(); + expect(screen.getByTestId('loading')).toBeInTheDocument(); + rerender(); + expect(screen.getByTestId('loading')).toBeInTheDocument(); + + rerender(); + expect(screen.getByRole('heading')).toHaveTextContent('Type A'); + expect(screen.getByTestId('data')).toHaveTextContent('hello'); + await user.click(screen.getByText('Complete')); + expect(screen.getByRole('heading')).toHaveTextContent('Type B'); + expect(screen.getByTestId('data')).toHaveTextContent('42'); + + rerender(); + expect(screen.getByTestId('loading')).toBeInTheDocument(); + + rerender(); + expect(screen.getByRole('heading')).toHaveTextContent('Type B'); + expect(screen.getByTestId('data')).toHaveTextContent('42'); + await user.click(screen.getByText('Complete')); + expect(screen.getByRole('heading')).toHaveTextContent('Type A'); + expect(screen.getByTestId('data')).toHaveTextContent('world'); + await user.click(screen.getByText('Complete')); + expect(screen.getByTestId('end')).toBeInTheDocument(); + }); + + it('throws an error if the timeline is changed', async () => { + const elements = { + tasks: { + A: , + B: , + }, + }; + const { rerender } = render( + , + ); + expect(screen.getByRole('heading')).toHaveTextContent('Type A'); + + // I cannot find a way to test rendering errors without React displaying + // them in the console. + console.log( + "Don't worry about the error below, it's unfortunate but expected", + ); + expect(() => { + rerender( + , + ); + }).toThrow('Timeline cannot be changed once set'); + }); + + it('throws an error if the run should resume after an non existing task', async () => { + // I cannot find a way to test rendering errors without React displaying + // them in the console. + console.log( + "Don't worry about the error below, it's unfortunate but expected", + ); + expect(() => { + render( + , + B: , + }, + completed:
, + }} + timeline={[ + { type: 'A', a: 'hello' }, + { type: 'B', b: 42 }, + { type: 'B', b: 21 }, + { type: 'B', b: 12 }, + { type: 'A', a: 'world' }, + ]} + />, + ); + }).toThrow('Could not find task to resume after'); + }); }); diff --git a/packages/react-experiment/__tests__/setup.ts b/packages/react-experiment/__tests__/setup.ts index e632b79c..63ddc7ab 100644 --- a/packages/react-experiment/__tests__/setup.ts +++ b/packages/react-experiment/__tests__/setup.ts @@ -1,5 +1,5 @@ import { afterEach } from 'vitest'; -import '@testing-library/jest-dom/extend-expect'; +import '@testing-library/jest-dom/vitest'; import { cleanup } from '@testing-library/react'; // runs a cleanup after each test case (e.g. clearing jsdom) diff --git a/packages/react-experiment/package.json b/packages/react-experiment/package.json index 61f41db0..c9fc654e 100644 --- a/packages/react-experiment/package.json +++ b/packages/react-experiment/package.json @@ -32,20 +32,19 @@ "@babel/plugin-syntax-flow": "^7.22.5", "@babel/plugin-transform-react-jsx": "^7.22.5", "@testing-library/dom": "^9.3.1", - "@testing-library/jest-dom": "^5.16.5", + "@testing-library/jest-dom": "^6.1.4", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", "@types/react": "^18.2.18", - "@types/testing-library__jest-dom": "^5.14.9", "@vitejs/plugin-react": "^4.0.4", "cross-env": "^7.0.3", - "eslint": "8.46.0", + "eslint": "8.52.0", "eslint-config-react-app": "^7.0.1", "jsdom": "^22.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "type-fest": "^4.1.0", - "typescript": "5.1.6", + "typescript": "5.2.2", "vite": "^4.4.8", "vitest": "^0.34.1" }, diff --git a/packages/react-experiment/src/config.ts b/packages/react-experiment/src/config.ts index 8224e46a..bd636218 100644 --- a/packages/react-experiment/src/config.ts +++ b/packages/react-experiment/src/config.ts @@ -4,26 +4,21 @@ export interface RegisterExperiment { // log: Log; } -export type BaseLog = { - type: string; -}; - -export type BaseTask = { - type: string; +export type Typed = { + type: T; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any -export type AnyTask = BaseTask & { [key: string]: any }; +export type AnyTask = Typed & { [key: PropertyKey]: any }; export type RegisteredTask = RegisterExperiment extends { task: infer T } - ? T extends BaseTask + ? T extends Typed ? T : never : AnyTask; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type AnyLog = BaseLog & { [key: string]: any }; -export type RegisteredLog = RegisterExperiment extends { log: infer T } - ? T extends BaseLog - ? T +export type AnyLog = Typed & { [key: PropertyKey]: unknown }; +export type RegisteredLog = RegisterExperiment extends { log: infer L } + ? L extends Typed + ? L : never - : BaseLog; + : Typed; diff --git a/packages/react-experiment/src/contexts.ts b/packages/react-experiment/src/contexts.ts index d44e0e01..a6204676 100644 --- a/packages/react-experiment/src/contexts.ts +++ b/packages/react-experiment/src/contexts.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import { RegisteredLog, RegisteredTask } from './config.js'; -import { TimelineState } from './timeline.js'; +import { TimelineState } from './useManagedTimeline.js'; export const timelineContext = React.createContext | null>(null); diff --git a/packages/react-experiment/src/main.tsx b/packages/react-experiment/src/main.tsx index b7e94c71..579716e6 100644 --- a/packages/react-experiment/src/main.tsx +++ b/packages/react-experiment/src/main.tsx @@ -2,4 +2,3 @@ export { Run, RunElements } from './run.js'; export { RegisterExperiment } from './config.js'; export { useLogger } from './useLogger.js'; export { useTask } from './useTask.js'; -export { useError } from './useError.js'; diff --git a/packages/react-experiment/src/run.tsx b/packages/react-experiment/src/run.tsx index 08f8bd46..f06cb5d5 100644 --- a/packages/react-experiment/src/run.tsx +++ b/packages/react-experiment/src/run.tsx @@ -1,114 +1,151 @@ import * as React from 'react'; -import { RegisteredTask, BaseTask, RegisteredLog } from './config.js'; +import { RegisteredTask, Typed, RegisteredLog } from './config.js'; import { loggerContext, timelineContext } from './contexts.js'; -import useManagedTimeline, { Logger, Timeline } from './timeline.js'; +import useManagedTimeline, { + Timeline, + TimelineState, +} from './useManagedTimeline.js'; -export type RunElements = { +export type RunElements = { tasks: Record; loading?: React.ReactElement; completed?: React.ReactElement; - crashed?: React.ReactElement; }; -export type RunProps = { - elements: RunElements; - timeline: Timeline; - logger?: Logger; +export type Logger = (log: Log) => Promise; + +export type RunProps = { + elements: RunElements; confirmBeforeUnload?: boolean; - cancelRunOnUnload?: boolean; - completeRunOnCompletion?: boolean; -}; +} & UseRunParameter; // This component uses explicit return type to prevent the function from // returning undefined, which could indicate a state isn't being handled. export function Run({ - timeline: timelineProp, - logger: loggerProp, - elements: { tasks, completed, loading, crashed }, + elements, confirmBeforeUnload = true, - cancelRunOnUnload = true, - completeRunOnCompletion = true, -}: RunProps): JSX.Element | null { - // Logger and timeline are not controlled. We make sure any change to them - // is ignored, and the previous value is used instead. - let timelineRef = React.useRef(timelineProp); - let loggerRef = React.useRef(loggerProp ?? null); - let timelineState = useManagedTimeline( - timelineRef.current, - loggerRef.current, - { cancelRunOnUnload, completeRunOnCompletion }, - ); - let [loggerState, setLoggerState] = React.useState<{ - status: 'error' | 'ok'; - error?: string; - }>({ status: 'ok' }); - - let addLog = React.useMemo(() => { - if (loggerRef.current == null) return null; - let logger = loggerRef.current; - return (log: RegisteredLog) => { - logger.addLog(log).catch((error) => { - if (error instanceof Error) { - setLoggerState({ error: error.message, status: 'error' }); - } else if (typeof error === 'string') { - setLoggerState({ error, status: 'error' }); - } else { - setLoggerState({ status: 'error' }); - } - }); - }; - }, []); + ...useRunParameter +}: RunProps): JSX.Element | null { + const { log, ...state } = useRun(useRunParameter); + useConfirmBeforeUnload(confirmBeforeUnload && state.status !== 'completed'); - useConfirmBeforeUnload( - confirmBeforeUnload && timelineState.status !== 'completed', - ); - - if (loggerState.status === 'error') { - if (loggerState.error == null) { - throw new Error('Could not add log to logger.'); - } else { - throw new Error('Could not add log to logger: ' + loggerState.error); - } - } - - switch (timelineState.status) { - case 'running': + switch (state.status) { + case 'running': { + let type: T['type'] = state.task.type; + if (!(type in elements.tasks)) { + throw new Error(`No task registered for type ${state.task.type}`); + } return ( - - - {tasks[timelineState.task.type as T['type']]} + + + {elements.tasks[type]} ); + } case 'completed': - return completed == null ? null : ( - - {completed} + return elements.completed == null ? null : ( + + {elements.completed} ); // This may seem surprising to have canceled, idle, and loading in the same // case, but canceled is basically the same as idle, only a run was already - // started and the stopped, e.g. because timeline changed. - case 'loading': + // started and then stopped, e.g. because timeline changed. case 'idle': case 'canceled': - return loading == null ? null : ( - - {loading} - - ); - case 'crashed': - if (crashed == null) throw timelineState.error; + case 'loading': return ( - - {crashed} - + + {elements.loading} + ); + default: + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let _exhaustiveCheck: never = state; + throw new Error('Unhandled timeline state'); } } +type UseRunParameter = { + onCompleted?: () => void; + log?: Logger; + resumeAfter?: { type: Task['type']; number: number }; +} & ( + | { timeline: Timeline; loading?: boolean } + | { timeline?: Timeline | null; loading: true } +); +type RunState = Exclude, { status: 'error' }> & { + log: ((newLog: Log) => void) | null; +}; +function useRun({ + onCompleted, + timeline, + resumeAfter, + loading = false, + log, +}: UseRunParameter): RunState { + const { log: logWrapper, ...loggerState } = useLogWrapper(log); + + let timelineRef = React.useRef(timeline); + // Prevent changes to timeline once set. + React.useLayoutEffect(() => { + const previousTimeline = timelineRef.current; + if (previousTimeline != null && previousTimeline !== timeline) { + throw new Error('Timeline cannot be changed once set'); + } + timelineRef.current = timeline; + }, [timeline]); + + const timelineState = useManagedTimeline({ + timeline: timeline, + resumeAfter, + onTimelineCompleted: onCompleted, + }); + + if (timelineState.status === 'error') { + throw timelineState.error; + } + if (loggerState.status === 'error') { + throw loggerState.error; + } + if (loading) { + return { status: 'loading', log: logWrapper }; + } else if (timeline == null) { + throw new Error('Timeline must be set when loading is false'); + } + return { ...timelineState, log: logWrapper }; +} + +type LoggerState = { status: 'ok' } | { status: 'error'; error: Error }; +function useLogWrapper(log?: Logger): LoggerState & { + log: ((newLog: L) => void) | null; +} { + const [loggerState, setLoggerState] = React.useState({ + status: 'ok', + }); + + const logWrapper = React.useMemo(() => { + if (log == null) return null; + const thisLogger = log; + return function logWrapper(newLog: L) { + thisLogger(newLog).catch((error) => { + if (error instanceof Error) { + let newError = new Error(`Could not add log : ${error.message}`); + newError.stack = error.stack; + setLoggerState({ status: 'error', error: newError }); + } else { + let newError = new Error('Could not add log'); + setLoggerState({ status: 'error', error: newError }); + } + }); + }; + }, [log]); + return { ...loggerState, log: logWrapper }; +} + function useConfirmBeforeUnload(isEnabled: boolean) { React.useEffect(() => { if (isEnabled) { diff --git a/packages/react-experiment/src/timeline.ts b/packages/react-experiment/src/timeline.ts deleted file mode 100644 index 0e54b3e5..00000000 --- a/packages/react-experiment/src/timeline.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { run } from '@lightmill/runner'; -import * as React from 'react'; -import { BaseTask, RegisteredLog } from './config.js'; - -export type TimelineStatus = 'running' | 'completed' | 'loading' | 'idle'; - -export type TimelineState = - | { status: 'completed'; task: null } - | { status: 'loading'; task: null } - | { status: 'idle'; task: null } - | { status: 'canceled'; task: null } - | { status: 'running'; task: Task; onTaskCompleted: () => void } - | { status: 'crashed'; task: null; error: Error }; - -export type Timeline = - | Iterator - | AsyncIterator - | Iterable - | AsyncIterable; - -type TimelineAction = - | { type: 'logger-connecting' } - | { type: 'run-started' } - | { type: 'task-started'; task: T; onTaskCompleted: () => void } - | { type: 'task-completed' } - | { type: 'all-tasks-completed' } - | { type: 'run-canceled' } - | { type: 'run-completed' } - | { type: 'logger-error'; error: Error }; - -export type Logger = { - startRun(): Promise; - addLog(log: RegisteredLog): Promise; - completeRun(): Promise; - cancelRun?(): Promise; -}; - -function timelineReducer( - state: TimelineState, - action: TimelineAction, -): TimelineState { - switch (action.type) { - case 'run-started': - case 'logger-connecting': - return { status: 'loading', task: null }; - case 'task-started': - return { - status: 'running', - task: action.task, - onTaskCompleted: action.onTaskCompleted, - }; - case 'task-completed': - case 'all-tasks-completed': - return { status: 'loading', task: null }; - case 'run-canceled': - return { status: 'canceled', task: null }; - case 'run-completed': - return { status: 'completed', task: null }; - case 'logger-error': - return { status: 'crashed', task: null, error: action.error }; - } -} - -export default function useManagedTimeline( - timeline: Timeline | null, - logger: Logger | null, - { - cancelRunOnUnload, - completeRunOnCompletion, - }: { cancelRunOnUnload: boolean; completeRunOnCompletion: boolean }, -): TimelineState { - const [state, dispatch] = React.useReducer(timelineReducer, { - status: 'idle', - task: null, - }); - - // When the page is closed, one may want to mark the run as canceled. - React.useEffect(() => { - if (!cancelRunOnUnload) return; - let unloadHandler = () => { - logger?.cancelRun?.(); - }; - globalThis.addEventListener('unload', unloadHandler); - return () => { - globalThis.removeEventListener('unload', unloadHandler); - }; - }, [cancelRunOnUnload, logger]); - - React.useEffect(() => { - let hasEnded = false; - async function doRun() { - if (!timeline) return; - if (logger != null) { - dispatch({ type: 'logger-connecting' }); - await cachedLoggerStartRun(logger).catch((error) => { - if (hasEnded) return; - dispatch({ type: 'logger-error', error }); - hasEnded = true; - }); - } - // Every time we await, we need to check if the timeline has ended during - // the await. - if (hasEnded) return; - await run({ - taskIterator: timeline, - runTask(task) { - return new Promise((resolve) => { - let onTaskCompleted = () => { - if (hasEnded) return; - dispatch({ type: 'task-completed' }); - resolve(); - }; - dispatch({ type: 'task-started', task, onTaskCompleted }); - }); - }, - }); - if (hasEnded) return; - dispatch({ type: 'all-tasks-completed' }); - await logger?.completeRun(); - if (hasEnded) return; - dispatch({ type: 'run-completed' }); - hasEnded = true; - } - doRun(); - return () => { - if (!hasEnded) { - // Note: it might be tempting to call `logger.cancelRun()` here, but - // that's not a good idea. The run might be resuming in the future. - // This is especially true in development, where the Run component - // is often unmounted and remounted. - dispatch({ type: 'run-canceled' }); - } - hasEnded = true; - }; - }, [logger, timeline]); - - return state; -} - -// It is important to cache the start of the logger because we don't want to -// start the same run multiple times, which would be refused by the log server. -// This is especially important in development, where the Run component is -// often unmounted and remounted. -const cachedLoggerStarts = new WeakMap>(); -function cachedLoggerStartRun(logger: Logger) { - let cachedStart = cachedLoggerStarts.get(logger); - if (cachedStart == null) { - cachedStart = logger.startRun(); - cachedLoggerStarts.set(logger, cachedStart); - } - return cachedStart; -} diff --git a/packages/react-experiment/src/useError.ts b/packages/react-experiment/src/useError.ts deleted file mode 100644 index 4eb21a80..00000000 --- a/packages/react-experiment/src/useError.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react'; -import { timelineContext } from './contexts.js'; - -export function useError(): Error { - const state = React.useContext(timelineContext); - if (state == null) { - throw new Error( - 'No timeline context found. Is this component rendered in a ?', - ); - } - if (state.status !== 'crashed') { - throw new Error( - 'Timeline did not crash. Is this component rendered in a ?', - ); - } - return state.error; -} diff --git a/packages/react-experiment/src/useManagedTimeline.ts b/packages/react-experiment/src/useManagedTimeline.ts new file mode 100644 index 00000000..06aafe5e --- /dev/null +++ b/packages/react-experiment/src/useManagedTimeline.ts @@ -0,0 +1,106 @@ +import * as React from 'react'; +import { Runner as TimelineRunner } from '@lightmill/runner'; + +export type TimelineStatus = 'running' | 'completed' | 'loading' | 'idle'; + +export type TimelineState = + | { status: 'completed' } + | { status: 'loading' } + | { status: 'idle' } + | { status: 'canceled' } + | { status: 'error'; error: Error } + | { status: 'running'; task: Task; onTaskCompleted: () => void }; + +export type AsyncTimeline = AsyncIterator | AsyncIterable; + +export type SyncTimeline = Iterator | Iterable; + +export type Timeline = AsyncTimeline | SyncTimeline; + +type Options = { + onTimelineCompleted?: () => void; + onTimelineStarted?: () => void; + onTaskStarted?: (task: Task) => void; + onTaskCompleted?: (task: Task) => void; + onTaskLoadingError?: (error: unknown) => void; + timeline?: Timeline | null; + resumeAfter?: { type: Task['type']; number: number }; +}; + +export default function useManagedTimeline( + options: Options, +): TimelineState { + const [state, setState] = React.useState>({ + status: 'idle', + }); + + const optionsRef = React.useRef(options); + optionsRef.current = options; + + React.useEffect(() => { + if (options.timeline == null) return; + let resumeTaskFound = optionsRef.current.resumeAfter == null; + let resumeTaskTypeCount = 0; + const runner = new TimelineRunner({ + timeline: options.timeline, + onTimelineStarted() { + setState({ status: 'loading' }); + optionsRef.current.onTimelineStarted?.(); + }, + onTaskStarted(task) { + if (!resumeTaskFound) { + runner.completeTask(); + return; + } + setState({ + status: 'running', + task, + onTaskCompleted() { + runner.completeTask(); + }, + }); + optionsRef.current.onTaskStarted?.(task); + }, + onTaskCompleted(task) { + if (resumeTaskFound) { + setState({ status: 'loading' }); + optionsRef.current.onTaskCompleted?.(task); + return; + } + if (task.type === optionsRef.current.resumeAfter?.type) { + resumeTaskTypeCount++; + } + if (resumeTaskTypeCount === optionsRef.current.resumeAfter?.number) { + resumeTaskFound = true; + } + }, + onTimelineCompleted() { + if (!resumeTaskFound) { + setState({ + status: 'error', + error: new Error('Could not find task to resume after'), + }); + return; + } + setState({ status: 'completed' }); + optionsRef.current.onTimelineCompleted?.(); + }, + onError(error) { + if (error instanceof Error) { + setState({ status: 'error', error }); + } else { + setState({ status: 'error', error: new Error(String(error)) }); + } + optionsRef.current.onTaskLoadingError?.(error); + }, + }); + runner.start(); + return () => { + if (runner.status !== 'completed') { + runner.cancel(); + } + }; + }, [options.timeline]); + + return state; +} diff --git a/packages/react-experiment/src/utils.ts b/packages/react-experiment/src/utils.ts index db196e14..073c00d4 100644 --- a/packages/react-experiment/src/utils.ts +++ b/packages/react-experiment/src/utils.ts @@ -2,3 +2,12 @@ import { UnionToIntersection } from 'type-fest'; export type IsUnion = [T] extends [UnionToIntersection] ? false : true; export type NotUnion = true extends IsUnion ? never : T; + +export function promisy( + t: T | (() => T) | (() => Promise), +): () => Promise { + if (t instanceof Function) { + return () => Promise.resolve(t()); + } + return () => Promise.resolve(t); +} diff --git a/packages/react-experiment/vitest.config.ts b/packages/react-experiment/vitest.config.ts index 4cfeee70..6c62f142 100644 --- a/packages/react-experiment/vitest.config.ts +++ b/packages/react-experiment/vitest.config.ts @@ -1,3 +1,6 @@ +/// +/// + import { resolve } from 'node:path'; import * as url from 'node:url'; import react from '@vitejs/plugin-react'; @@ -6,7 +9,6 @@ import { defineConfig } from 'vitest/config'; const dirname = url.fileURLToPath(new URL('.', import.meta.url)); export default defineConfig({ - // @ts-expect-error This is badly typed. plugins: [react()], test: { environment: 'jsdom', diff --git a/packages/runner/__tests__/run.test.ts b/packages/runner/__tests__/run.test.ts index 1e76fdf7..04ef03a8 100644 --- a/packages/runner/__tests__/run.test.ts +++ b/packages/runner/__tests__/run.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; -import { run } from '../src/run.js'; +import { runTimeline } from '../src/run.js'; const wait = (t: number) => new Promise((resolve) => { @@ -36,8 +36,8 @@ describe('run', () => { }); }); - it('calls runTask for each tasks, then taskCallback', async () => { - await expect(run({ taskIterator: genTasks(), runTask })).resolves.toBe( + it('calls runTask for each tasks', async () => { + await expect(runTimeline({ timeline: genTasks(), runTask })).resolves.toBe( undefined, ); expect(runTask.mock.calls).toEqual([ @@ -52,7 +52,7 @@ describe('run', () => { if (task.id === 'task2') throw new Error('mock error'); }); await expect( - run({ runTask: throwingRunTask, taskIterator: genTasks() }), + runTimeline({ runTask: throwingRunTask, timeline: genTasks() }), ).rejects.toThrow('mock error'); expect(throwingRunTask.mock.calls).toEqual([ [{ id: 'task1', callIndex: 0 }], @@ -60,7 +60,7 @@ describe('run', () => { ]); }); - it('rejects if the taskIterator rejects', async () => { + it('rejects if the timeline rejects', async () => { const throwingGenTasks = vi.fn(async function* mockGenTasks() { await wait(0); yield { id: 'task1' }; @@ -69,7 +69,7 @@ describe('run', () => { throw new Error('mock error'); }); await expect( - run({ runTask, taskIterator: throwingGenTasks() }), + runTimeline({ runTask, timeline: throwingGenTasks() }), ).rejects.toThrow('mock error'); expect(runTask.mock.calls).toEqual([[{ id: 'task1' }], [{ id: 'task2' }]]); }); diff --git a/packages/runner/__tests__/runner.test.ts b/packages/runner/__tests__/runner.test.ts index 916cfdfd..5fe7014d 100644 --- a/packages/runner/__tests__/runner.test.ts +++ b/packages/runner/__tests__/runner.test.ts @@ -1,6 +1,5 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -import { Runner } from '../src/runner.js'; +import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest'; +import { TimelineRunner } from '../src/runner.js'; function wait(t = 0) { return new Promise((resolve) => { @@ -18,137 +17,146 @@ type Deffered = { function deffer(value: V): Deffered; function deffer(): Deffered; function deffer(value?: V) { - let resolve: () => void; - let reject: (err?: Error) => void; - const promise = new Promise((res, rej) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - resolve = () => res(value as any); + let resolve: (() => void) | null = null; + let reject: ((err?: Error) => void) | null = null; + const promise = new Promise((res, rej) => { + resolve = () => res(value); reject = rej; }); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return { promise, resolve: resolve!, reject: reject! }; + if (resolve == null || reject == null) { + throw new Error('Internal error: No resolve or reject function'); + } + return { promise, resolve, reject }; } -describe('Runner', () => { - let tasks: Task[]; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - let handler = vi.fn((handlerName: string, ...rest: unknown[]) => wait()); +describe('TimelineRunner', () => { + let timeline: Task[]; beforeEach(() => { - tasks = [ - { type: 'typeA' as const, dA: 1 }, - { type: 'typeB' as const, dB: 2 }, - { type: 'typeA' as const, dA: 3 }, + timeline = [ + { type: 'typeA', dA: 1 }, + { type: 'typeB', dB: 2 }, + { type: 'typeA', dA: 3 }, ]; - handler.mockReset(); }); - it('run tasks and calls their corresponding handlers', async () => { - let runner = new Runner({ - tasks: { - typeA: (...args) => handler('typeA', ...args), - typeB: (...args) => handler('typeB', ...args), - }, - }); - await expect(runner.run(tasks)).resolves.toBe(undefined); - expect(handler.mock.calls).toEqual([ - ['typeA', { type: 'typeA', dA: 1 }], - ['typeB', { type: 'typeB', dB: 2 }], - ['typeA', { type: 'typeA', dA: 3 }], - ]); + afterEach(() => { + vi.clearAllMocks(); }); - it('supports progress handlers', async () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - let handler = vi.fn((...args: unknown[]) => wait()); - let runner = new Runner({ - tasks: { - typeA: (...args) => handler('typeA', ...args), - typeB: (...args) => handler('typeB', ...args), + it('run tasks and corresponding handlers', async () => { + let logCall = vi.fn(); + type LogCallArgs = [handlerName: string, ...rest: unknown[]]; + type LogCallResult = Promise; + let runner = new TimelineRunner({ + timeline, + onTaskCompleted(...args) { + logCall('onTaskCompleted', ...args); + }, + onTaskStarted(...args) { + logCall('onTaskStarted', ...args); + }, + onTimelineCompleted(...args) { + logCall('onTimelineCompleted', ...args); + }, + onTimelineStarted(...args) { + logCall('onTimelineStarted', ...args); + }, + onTimelineCanceled(...args) { + logCall('onTimelineCanceled', ...args); + }, + onLoading(...args) { + logCall('onLoading', ...args); + }, + onError(...args) { + logCall('onError', ...args); }, - onExperimentStarted: (...args) => handler('onExperimentStarted', ...args), - onExperimentCompleted: (...args) => - handler('onExperimentCompleted', ...args), - onLoading: (...args) => handler('onLoading', ...args), }); - await expect(runner.run(tasks)).resolves.toBe(undefined); - expect(handler.mock.calls).toEqual([ - ['onExperimentStarted'], - ['onLoading'], - ['typeA', { type: 'typeA', dA: 1 }], - ['onLoading'], - ['typeB', { type: 'typeB', dB: 2 }], - ['onLoading'], - ['typeA', { type: 'typeA', dA: 3 }], - ['onLoading'], - ['onExperimentCompleted'], + + runner.start(); + expect(logCall.mock.calls).toEqual([ + ['onTimelineStarted'], + ['onTaskStarted', { type: 'typeA', dA: 1 }], + ]); + logCall.mockClear(); + runner.completeTask(); + expect(logCall.mock.calls).toEqual([ + ['onTaskCompleted', { type: 'typeA', dA: 1 }], + ['onTaskStarted', { type: 'typeB', dB: 2 }], + ]); + logCall.mockClear(); + runner.completeTask(); + expect(logCall.mock.calls).toEqual([ + ['onTaskCompleted', { type: 'typeB', dB: 2 }], + ['onTaskStarted', { type: 'typeA', dA: 3 }], + ]); + logCall.mockClear(); + runner.completeTask(); + expect(logCall.mock.calls).toEqual([ + ['onTaskCompleted', { type: 'typeA', dA: 3 }], + ['onTimelineCompleted'], ]); }); - it('maintains its state property', async () => { - type HanlerArgs = [string, ...unknown[]]; - let taskDeffers = tasks.map((task) => deffer(task)); + it('maintains its status property', async () => { + let taskDeffers = timeline.map((task) => deffer(task)); async function* taskGen() { for (const deffer of taskDeffers) { yield deffer.promise; } } - let taskHandler = vi.fn>(() => { - expect(runner.state).toBe('running'); - return deffer(); + let onTaskStarted = vi.fn(() => { + expect(runner.status).toBe('running'); }); - let onExperimentStarted = vi.fn(() => { - expect(runner.state).toBe('loading'); + let onTimelineStarted = vi.fn(() => { + expect(runner.status).toBe('running'); }); - let onExperimentCompleted = vi.fn(() => { - expect(runner.state).toBe('completed'); + let onTimelineCompleted = vi.fn(() => { + expect(runner.status).toBe('completed'); }); let onLoading = vi.fn(() => { - expect(runner.state).toBe('loading'); + expect(runner.status).toBe('loading'); }); - let runner = new Runner({ - tasks: { - typeA: (...args) => taskHandler('typeA', ...args).promise, - typeB: (...args) => taskHandler('typeB', ...args).promise, - }, - onExperimentStarted: onExperimentStarted, - onExperimentCompleted: onExperimentCompleted, - onLoading: onLoading, + let runner = new TimelineRunner({ + timeline: taskGen(), + onTaskStarted, + onTimelineStarted, + onTimelineCompleted, + onLoading, }); - expect(runner.state).toBe('idle'); - let runPromise = runner.run(taskGen()); - expect(runner.state).toBe('loading'); - expect(onExperimentStarted.mock.calls).toEqual([[]]); + expect(runner.status).toBe('idle'); + runner.start(); + expect(runner.status).toBe('loading'); + expect(onTimelineStarted.mock.calls).toEqual([[]]); expect(onLoading.mock.calls).toEqual([[]]); taskDeffers[0].resolve(); await wait(); - expect(taskHandler.mock.calls).toEqual([ - ['typeA', { type: 'typeA', dA: 1 }], - ]); - taskHandler.mock.results[0].value.resolve(); + expect(onTaskStarted.mock.calls).toEqual([[{ type: 'typeA', dA: 1 }]]); + runner.completeTask(); await wait(); - expect(runner.state).toBe('loading'); + expect(runner.status).toBe('loading'); expect(onLoading.mock.calls).toEqual([[], []]); taskDeffers[1].resolve(); await wait(); - expect(taskHandler.mock.calls).toEqual([ - ['typeA', { type: 'typeA', dA: 1 }], - ['typeB', { type: 'typeB', dB: 2 }], + expect(onTaskStarted.mock.calls).toEqual([ + [{ type: 'typeA', dA: 1 }], + [{ type: 'typeB', dB: 2 }], ]); await wait(); - taskHandler.mock.results[1].value.resolve(); - await wait(); - expect(runner.state).toBe('loading'); + runner.completeTask(); + expect(runner.status).toBe('loading'); expect(onLoading.mock.calls).toEqual([[], [], []]); taskDeffers[2].resolve(); await wait(); - expect(taskHandler.mock.calls).toEqual([ - ['typeA', { type: 'typeA', dA: 1 }], - ['typeB', { type: 'typeB', dB: 2 }], - ['typeA', { type: 'typeA', dA: 3 }], + expect(onTaskStarted.mock.calls).toEqual([ + [{ type: 'typeA', dA: 1 }], + [{ type: 'typeB', dB: 2 }], + [{ type: 'typeA', dA: 3 }], ]); - taskHandler.mock.results[2].value.resolve(); - await runPromise; - expect(onExperimentCompleted.mock.calls).toEqual([[]]); + runner.completeTask(); + expect(runner.status).toBe('loading'); + expect(onLoading.mock.calls).toEqual([[], [], [], []]); + await wait(); + expect(onTimelineCompleted.mock.calls).toEqual([[]]); }); }); diff --git a/packages/runner/__tests__/utils.test.ts b/packages/runner/__tests__/utils.test.ts deleted file mode 100644 index 588ddb59..00000000 --- a/packages/runner/__tests__/utils.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { asyncForEach } from '../src/utils.js'; - -function wait(t = 0) { - return new Promise((resolve) => { - setTimeout(resolve, t); - }); -} - -const generators = { - sync: () => { - const arr = ['a', 'b', 'c', 'd']; - return arr[Symbol.iterator](); - }, - async: async function* async() { - yield 'a'; - await wait(0); - yield 'b'; - await wait(0); - yield 'c'; - await wait(0); - yield 'd'; - }, -}; -const throwingGenerators = { - sync: function* syncThatThrows() { - yield 'a'; - yield 'b'; - throw new Error('mock-generator-error'); - }, - async: async function* syncThatThrows() { - yield 'a'; - await wait(0); - yield 'b'; - await wait(0); - throw new Error('mock-generator-error'); - }, -}; - -type Deffered = { - promise: Promise; - resolve: () => void; - reject: (err?: Error) => void; -}; -function deffer(value: V): Deffered; -function deffer(): Deffered; -function deffer(value?: V) { - let resolve: () => void; - let reject: (err?: Error) => void; - const promise = new Promise((res, rej) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - resolve = () => res(value as any); - reject = rej; - }); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return { promise, resolve: resolve!, reject: reject! }; -} - -const describeEachSyncs = describe.each(['sync', 'async']); - -describeEachSyncs(`asyncForEach with %s iterator`, (syncArg) => { - const sync = syncArg as 'sync' | 'async'; - it('calls its callback for each values', async () => { - const gen = generators[sync as 'sync' | 'async']; - const callback = vi.fn(); - await asyncForEach(gen(), callback); - expect(callback.mock.calls).toEqual([ - ['a', 0], - ['b', 1], - ['c', 2], - ['d', 3], - ]); - }); - - it('waits for its callback to resolve if it returned a promise', async () => { - const gen = generators[sync]; - const defers: Record> = { - b: deffer(), - d: deffer(), - }; - const log: string[] = []; - const callback = vi.fn((value: string) => { - if (value in defers) { - log.push(`${value}-async-start`); - return defers[value].promise.then(() => { - log.push(`${value}-async-end`); - }); - } else { - log.push(`${value}-sync`); - } - }); - const end = vi.fn(); - let forEachProm = (asyncForEach(gen(), callback) as Promise).then( - () => end(), - ); - expect(end.mock.calls).toEqual([]); - await wait(5); - expect(log).toEqual(['a-sync', 'b-async-start']); - defers.b.resolve(); - await wait(10); - expect(end.mock.calls).toEqual([]); - expect(log).toEqual([ - 'a-sync', - 'b-async-start', - 'b-async-end', - 'c-sync', - 'd-async-start', - ]); - expect(end.mock.calls).toEqual([]); - defers.d.resolve(); - await forEachProm; - expect(log).toEqual([ - 'a-sync', - 'b-async-start', - 'b-async-end', - 'c-sync', - 'd-async-start', - 'd-async-end', - ]); - expect(end.mock.calls).toEqual([[]]); - }); - - it('rejects if a sync callback throws', async () => { - const gen = generators[sync as 'sync' | 'async']; - const callback = vi.fn((v) => { - if (v === 'b') throw new Error('mock-callback-error'); - }); - if (sync === 'sync') { - expect(() => asyncForEach(gen(), callback)).toThrow( - 'mock-callback-error', - ); - } else { - await expect(asyncForEach(gen(), callback)).rejects.toThrow( - 'mock-callback-error', - ); - } - expect(callback.mock.calls).toEqual([ - ['a', 0], - ['b', 1], - ]); - }); - - it('rejects if an async callback throws', async () => { - const gen = generators[sync as 'sync' | 'async']; - const callback = vi.fn((v) => - wait(0).then(() => { - if (v === 'b') throw new Error('mock-callback-error'); - }), - ); - await expect(asyncForEach(gen(), callback)).rejects.toThrow( - 'mock-callback-error', - ); - expect(callback.mock.calls).toEqual([ - ['a', 0], - ['b', 1], - ]); - }); - - it('rejects if the iterator throws', async () => { - const gen = throwingGenerators[sync as 'sync' | 'async']; - const callback = vi.fn(); - if (sync === 'sync') { - expect(() => asyncForEach(gen(), callback)).toThrow( - 'mock-generator-error', - ); - } else { - await expect(asyncForEach(gen(), callback)).rejects.toThrow( - 'mock-generator-error', - ); - } - expect(callback.mock.calls).toEqual([ - ['a', 0], - ['b', 1], - ]); - }); -}); diff --git a/packages/runner/package.json b/packages/runner/package.json index 480bf44e..579fc3af 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -13,7 +13,7 @@ "types": "./dist/main.d.ts", "devDependencies": { "cross-env": "^7.0.3", - "typescript": "5.1.6", + "typescript": "5.2.2", "vite": "^4.4.8", "vitest": "^0.34.1" }, @@ -25,5 +25,6 @@ "keywords": [ "experiment" ], - "private": false + "private": false, + "packageManager": "pnpm@8.10.2" } diff --git a/packages/runner/src/main.ts b/packages/runner/src/main.ts index d4173bba..2f8b1466 100644 --- a/packages/runner/src/main.ts +++ b/packages/runner/src/main.ts @@ -1,2 +1,5 @@ -export { run, RunProps } from './run.js'; -export { Runner, RunnerProps } from './runner.js'; +export { runTimeline as run, RunTimelineParams as RunParams } from './run.js'; +export { + TimelineRunner as Runner, + TimelineRunnerParams as TimelineRunnerParams, +} from './runner.js'; diff --git a/packages/runner/src/run.ts b/packages/runner/src/run.ts index b2473238..45324b0c 100644 --- a/packages/runner/src/run.ts +++ b/packages/runner/src/run.ts @@ -1,21 +1,28 @@ -import { asyncForEach } from './utils.js'; +import { TimelineRunner } from './runner.js'; +import { SuperIterator } from './types.js'; -export type SuperIterator = - | Iterator - | AsyncIterator - | Iterable - | AsyncIterable; - -export type RunProps = { - taskIterator: SuperIterator; +export type RunTimelineParams = { + timeline: SuperIterator; runTask: (task: Task) => PromiseLike; }; -export function run({ taskIterator, runTask }: RunProps) { - if (Symbol.iterator in taskIterator) { - taskIterator = taskIterator[Symbol.iterator](); - } - if (Symbol.asyncIterator in taskIterator) { - taskIterator = taskIterator[Symbol.asyncIterator](); - } - return asyncForEach(taskIterator, (task) => runTask(task)); +export function runTimeline({ + timeline, + runTask, +}: RunTimelineParams) { + return new Promise((resolve, reject) => { + let runner = new TimelineRunner({ + timeline, + onTaskStarted(task) { + runTask(task).then(() => { + runner.completeTask(); + }, reject); + }, + onTimelineCompleted() { + resolve(); + }, + onError(error) { + reject(error); + }, + }).start(); + }); } diff --git a/packages/runner/src/runner.ts b/packages/runner/src/runner.ts index 44366de4..d5f52451 100644 --- a/packages/runner/src/runner.ts +++ b/packages/runner/src/runner.ts @@ -1,57 +1,122 @@ -import { run, SuperIterator } from './run.js'; - -export type BaseTask = { type: string }; -export type RunnerProps = { - tasks: { - [K in Task['type']]: TaskHander; - }; - onExperimentStarted?: () => void; - onLoading?: () => void; - onExperimentCompleted?: () => void; -}; +import { SuperIterator } from './types.js'; -export type TaskHander = (task: Task) => PromiseLike; -export type TaskHandlers = { - [K in Task['type']]: TaskHander; +export type TimelineRunnerParams = { + timeline: SuperIterator; + onTimelineStarted?: () => void; + onLoading?: () => void; + onTaskStarted?: (task: Task) => void; + onTaskCompleted?: (task: Task) => void; + onTimelineCanceled?: () => void; + onError?: (error: unknown) => void; + onTimelineCompleted?: () => void; }; -export class Runner { - #state: 'idle' | 'running' | 'loading' | 'completed' | 'error' = 'idle'; - tasks: TaskHandlers; - onExperimentStarted?: () => void; +export class TimelineRunner { + onTimelineStarted?: () => void; onLoading?: () => void; - onExperimentCompleted?: () => void; + onTaskStarted?: (task: Task) => void; + onTaskCompleted?: (task: Task) => void; + onTimelineCanceled?: () => void; + onError?: (error: unknown) => void; + onTimelineCompleted?: () => void; - constructor(props: RunnerProps) { - this.tasks = { ...props.tasks }; - this.onExperimentStarted = props.onExperimentStarted; - this.onLoading = props.onLoading; - this.onExperimentCompleted = props.onExperimentCompleted; + #iterator: Iterator | AsyncIterator; + #status: + | 'running' + | 'canceled' + | 'completed' + | 'idle' + | 'loading' + | 'crashed' = 'idle'; + #currentTask: Task | null = null; + + constructor(options: TimelineRunnerParams) { + if (Symbol.iterator in options.timeline) { + this.#iterator = options.timeline[Symbol.iterator](); + } else if (Symbol.asyncIterator in options.timeline) { + this.#iterator = options.timeline[Symbol.asyncIterator](); + } else { + this.#iterator = options.timeline; + } + this.onTimelineStarted = options.onTimelineStarted; + this.onTimelineCompleted = options.onTimelineCompleted; + this.onTaskStarted = options.onTaskStarted; + this.onTaskCompleted = options.onTaskCompleted; + this.onLoading = options.onLoading; + this.onError = options.onError; + this.onTimelineCanceled = options.onTimelineCanceled; } - get state() { - return this.#state; + get status() { + return this.#status; } - async #runTask(task: Task) { - let type: Task['type'] = task.type; - this.#state = 'running'; - await this.tasks[type](task); - this.#state = 'loading'; - this.onLoading?.(); + start() { + if (this.#status !== 'idle') { + throw new Error('Runner has already started'); + } + this.#status = 'running'; + this.onTimelineStarted?.(); + this.#toNext(); + return this; + } + + completeTask() { + if (this.#status === 'canceled') { + throw new Error('Cannot complete task when timeline is canceled'); + } + if (this.#status !== 'running') { + throw new Error('No task is currently running'); + } + if (this.#currentTask == null) { + throw new Error('Internal error: current task is null'); + } + this.onTaskCompleted?.(this.#currentTask); + this.#toNext(); + return this; } - async run(taskIterator: SuperIterator) { - try { - this.#state = 'loading'; - this.onExperimentStarted?.(); + cancel() { + if (this.#status === 'canceled') { + throw new Error('TimelineRunner is already canceled'); + } + if (this.#status === 'completed') { + throw new Error('TimelineRunner is already completed'); + } + this.#status = 'canceled'; + return this; + } + + #toNext() { + const next = this.#iterator.next(); + if ('then' in next) { + this.#status = 'loading'; this.onLoading?.(); - await run({ taskIterator, runTask: this.#runTask.bind(this) }); - this.#state = 'completed'; - this.onExperimentCompleted?.(); - } catch (error) { - this.#state = 'error'; + next.then( + (...args) => this.#handleNextTaskResult(...args), + (...args) => this.#handleNextTaskError(...args), + ); + } else { + this.#handleNextTaskResult(next); + } + } + + #handleNextTaskError(error: unknown) { + this.#status = 'crashed'; + if (this.onError == null) { throw error; } + this.onError(error); + } + + #handleNextTaskResult(nextTaskResult: IteratorResult) { + if (nextTaskResult.done) { + this.#status = 'completed'; + this.onTimelineCompleted?.(); + } else { + this.#status = 'running'; + this.#currentTask = nextTaskResult.value; + this.onTaskStarted?.(this.#currentTask); + } } } diff --git a/packages/runner/src/types.ts b/packages/runner/src/types.ts new file mode 100644 index 00000000..b51d7435 --- /dev/null +++ b/packages/runner/src/types.ts @@ -0,0 +1,5 @@ +export type SuperIterator = + | Iterator + | AsyncIterator + | Iterable + | AsyncIterable; diff --git a/packages/runner/src/utils.ts b/packages/runner/src/utils.ts deleted file mode 100644 index 2d56a6a3..00000000 --- a/packages/runner/src/utils.ts +++ /dev/null @@ -1,85 +0,0 @@ -// Creates a promise from a value or another promise. -function pFrom(v: T | PromiseLike): Promise { - return Promise.resolve().then(() => v); -} - -// Make a function asynchronous by creating a promise from its value -// (the function calls remain synchronous though). -function makeAsync( - f: (...args: Args) => R | PromiseLike, -): (...args: Args) => Promise { - return (...args: Args) => pFrom(f(...args)); -} - -function isPromiseLike(p: unknown): p is PromiseLike { - return ( - p !== null && - typeof p === 'object' && - 'then' in p && - typeof p.then === 'function' - ); -} - -// Calls a callback for values from an async iterator. If the callback returns -// a promise, wait for it to be resolved before moving on. -export function asyncForEach( - iterator: Iterator | AsyncIterator, - callback: (value: Item, index: number) => PromiseLike, - forceAsync?: boolean, -): Promise; -export function asyncForEach( - iterator: Iterator, - callback: (value: Item, index: number) => unknown, - forceAsync?: false, -): void; -export function asyncForEach( - iterator: Iterator, - callback: (value: Item, index: number) => unknown, - forceAsync: true, -): Promise; -export function asyncForEach( - iterator: AsyncIterator, - callback: (value: Item, index: number) => unknown, - forceAsync?: boolean, -): Promise; -export function asyncForEach( - iterator: Iterator | AsyncIterator, - callback: (value: Item, index: number) => unknown | PromiseLike, - forceAsync?: boolean, -): Promise | void; -export function asyncForEach( - iterator: Iterator | AsyncIterator, - callback: (value: Item, index: number) => unknown | PromiseLike, - forceAsync = false, -): Promise | void { - callback = forceAsync ? makeAsync(callback) : callback; - function fetchNext(index: number): PromiseLike | void { - const next = forceAsync ? pFrom(iterator.next()) : iterator.next(); - if (isPromiseLike(next)) { - return next.then((result) => onNext(result, index)); - } else { - return onNext(next, index); - } - } - function onNext( - result: IteratorResult, - index: number, - ): PromiseLike | void { - if (result.done) { - return; - } - const callbackResult = callback(result.value, index); - if (isPromiseLike(callbackResult)) { - return callbackResult.then(() => fetchNext(index + 1)); - } else { - return fetchNext(index + 1); - } - } - let result = fetchNext(0); - if (isPromiseLike(result)) { - // Ensures we return a promise and not only a promise like. - return pFrom(result).then(() => { - return; - }); - } -} diff --git a/packages/static-design/package.json b/packages/static-design/package.json index cb2323c8..31be8fae 100644 --- a/packages/static-design/package.json +++ b/packages/static-design/package.json @@ -8,7 +8,7 @@ "access": "public", "devDependencies": { "cross-env": "7.0.3", - "typescript": "5.1.6", + "typescript": "5.2.2", "vite": "^4.4.8", "vitest": "^0.34.1" }, @@ -32,5 +32,6 @@ "files": [ "dist" ], - "private": false + "private": false, + "packageManager": "pnpm@8.10.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 701b5c9f..99cd96a7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,32 +12,32 @@ importers: specifier: ^2.26.2 version: 2.26.2 '@typescript-eslint/eslint-plugin': - specifier: ^6.4.0 - version: 6.4.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6) + specifier: ^6.12.0 + version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) '@typescript-eslint/parser': - specifier: ^6.4.0 - version: 6.4.0(eslint@8.47.0)(typescript@5.1.6) + specifier: ^6.12.0 + version: 6.12.0(eslint@8.54.0)(typescript@5.3.2) eslint: - specifier: 8.47.0 - version: 8.47.0 + specifier: 8.54.0 + version: 8.54.0 eslint-config-prettier: specifier: 9.0.0 - version: 9.0.0(eslint@8.47.0) + version: 9.0.0(eslint@8.54.0) eslint-plugin-import: - specifier: 2.28.0 - version: 2.28.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0) + specifier: 2.29.0 + version: 2.29.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0) prettier: - specifier: 3.0.2 - version: 3.0.2 + specifier: 3.1.0 + version: 3.1.0 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.3.2 + version: 5.3.2 packages/convert-touchstone: dependencies: sax: specifier: ^1.2.4 - version: 1.2.4 + version: 1.3.0 yargs: specifier: 17.7.2 version: 17.7.2 @@ -47,38 +47,38 @@ importers: version: link:../static-design '@types/sax': specifier: ^1.2.4 - version: 1.2.4 + version: 1.2.6 cross-env: specifier: ^7.0.3 version: 7.0.3 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vite: specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.2) + version: 4.5.0(@types/node@18.18.8) vitest: specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + version: 0.34.6(jsdom@22.1.0) packages/log-api: dependencies: '@zodios/core': specifier: ^10.9.2 - version: 10.9.2(axios@1.4.0)(zod@3.21.4) + version: 10.9.6(axios@1.6.2)(zod@3.22.4) zod: specifier: ^3.21.4 - version: 3.21.4 + version: 3.22.4 devDependencies: typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vite: specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.2) + version: 4.5.0(@types/node@18.18.8) vitest: specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + version: 0.34.6(jsdom@22.1.0) packages/log-client: dependencies: @@ -91,46 +91,49 @@ importers: devDependencies: '@types/throttle-debounce': specifier: ^5.0.0 - version: 5.0.0 + version: 5.0.1 cross-env: specifier: ^7.0.3 version: 7.0.3 msw: - specifier: ^1.2.3 - version: 1.2.3(typescript@5.1.6) + specifier: ^2.0.2 + version: 2.0.2(typescript@5.2.2) type-fest: specifier: ^4.1.0 - version: 4.1.0 + version: 4.6.0 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vitest: specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + version: 0.34.6(jsdom@22.1.0) packages/log-server: dependencies: '@lightmill/log-api': - specifier: workspace:* + specifier: workspace:3.0.0-beta.22 version: link:../log-api '@paralleldrive/cuid2': - specifier: ^2.2.1 - version: 2.2.1 + specifier: ^2.2.2 + version: 2.2.2 + '@zodios/core': + specifier: ^10.9.2 + version: 10.9.6(axios@1.6.0)(zod@3.22.4) '@zodios/express': specifier: ^10.6.1 - version: 10.6.1(@zodios/core@10.9.2)(express@4.18.2)(zod@3.21.4) + version: 10.6.1(@zodios/core@10.9.6)(express@4.18.2)(zod@3.22.4) axios: - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.6.0 + version: 1.6.0 better-sqlite3: - specifier: ^8.5.0 - version: 8.5.0 + specifier: ^9.0.0 + version: 9.0.0 body-parser: specifier: ^1.20.2 version: 1.20.2 change-case: - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^5.1.2 + version: 5.1.2 cookie-session: specifier: ^2.0.0 version: 2.0.0 @@ -138,8 +141,8 @@ importers: specifier: ^2.8.5 version: 2.8.5 csv: - specifier: ^6.3.1 - version: 6.3.1 + specifier: ^6.3.5 + version: 6.3.5 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -147,45 +150,45 @@ importers: specifier: ^4.18.2 version: 4.18.2 kysely: - specifier: ^0.26.1 - version: 0.26.1 + specifier: ^0.26.3 + version: 0.26.3 loglevel: specifier: ^1.8.1 version: 1.8.1 remeda: - specifier: ^1.24.0 - version: 1.24.0 + specifier: ^1.28.0 + version: 1.28.0 yargs: specifier: 17.7.2 version: 17.7.2 zod: - specifier: ^3.21.4 - version: 3.21.4 + specifier: ^3.22.4 + version: 3.22.4 devDependencies: '@types/better-sqlite3': - specifier: ^7.6.4 - version: 7.6.4 + specifier: ^7.6.6 + version: 7.6.6 '@types/body-parser': - specifier: ^1.19.2 - version: 1.19.2 + specifier: ^1.19.4 + version: 1.19.4 '@types/cookie-session': - specifier: ^2.0.44 - version: 2.0.44 + specifier: ^2.0.46 + version: 2.0.46 '@types/cors': - specifier: ^2.8.13 - version: 2.8.13 + specifier: ^2.8.15 + version: 2.8.15 '@types/express': - specifier: ^4.17.17 - version: 4.17.17 + specifier: ^4.17.20 + version: 4.17.20 '@types/node': - specifier: ^18.17.2 - version: 18.17.2 + specifier: ^18.18.8 + version: 18.18.8 '@types/supertest': - specifier: ^2.0.12 - version: 2.0.12 + specifier: ^2.0.15 + version: 2.0.15 '@types/yargs': - specifier: ^17.0.24 - version: 17.0.24 + specifier: ^17.0.29 + version: 17.0.29 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -193,20 +196,20 @@ importers: specifier: ^6.3.3 version: 6.3.3 tsx: - specifier: ^3.12.7 - version: 3.12.7 + specifier: ^3.14.0 + version: 3.14.0 type-fest: - specifier: ^4.1.0 - version: 4.1.0 + specifier: ^4.6.0 + version: 4.6.0 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vite: - specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.2) + specifier: ^4.5.0 + version: 4.5.0(@types/node@18.18.8) vitest: - specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + specifier: ^0.34.6 + version: 0.34.6(jsdom@22.1.0) packages/react-experiment: dependencies: @@ -216,43 +219,40 @@ importers: devDependencies: '@babel/core': specifier: ^7.22.9 - version: 7.22.9 + version: 7.23.2 '@babel/plugin-syntax-flow': specifier: ^7.22.5 - version: 7.22.5(@babel/core@7.22.9) + version: 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-react-jsx': specifier: ^7.22.5 - version: 7.22.5(@babel/core@7.22.9) + version: 7.22.15(@babel/core@7.23.2) '@testing-library/dom': specifier: ^9.3.1 - version: 9.3.1 + version: 9.3.3 '@testing-library/jest-dom': - specifier: ^5.16.5 - version: 5.17.0 + specifier: ^6.1.4 + version: 6.1.4(vitest@0.34.6) '@testing-library/react': specifier: ^14.0.0 version: 14.0.0(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.4.3 - version: 14.4.3(@testing-library/dom@9.3.1) + version: 14.5.1(@testing-library/dom@9.3.3) '@types/react': specifier: ^18.2.18 - version: 18.2.18 - '@types/testing-library__jest-dom': - specifier: ^5.14.9 - version: 5.14.9 + version: 18.2.34 '@vitejs/plugin-react': specifier: ^4.0.4 - version: 4.0.4(vite@4.4.8) + version: 4.1.1(vite@4.5.0) cross-env: specifier: ^7.0.3 version: 7.0.3 eslint: - specifier: 8.46.0 - version: 8.46.0 + specifier: 8.52.0 + version: 8.52.0 eslint-config-react-app: specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.46.0)(typescript@5.1.6) + version: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.52.0)(typescript@5.2.2) jsdom: specifier: ^22.1.0 version: 22.1.0 @@ -264,16 +264,16 @@ importers: version: 18.2.0(react@18.2.0) type-fest: specifier: ^4.1.0 - version: 4.1.0 + version: 4.6.0 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vite: specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.2) + version: 4.5.0(@types/node@18.18.8) vitest: specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + version: 0.34.6(jsdom@22.1.0) packages/runner: devDependencies: @@ -281,14 +281,14 @@ importers: specifier: ^7.0.3 version: 7.0.3 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vite: specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.2) + version: 4.5.0(@types/node@18.18.8) vitest: specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + version: 0.34.6(jsdom@22.1.0) packages/static-design: devDependencies: @@ -296,14 +296,14 @@ importers: specifier: 7.0.3 version: 7.0.3 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.2.2 + version: 5.2.2 vite: specifier: ^4.4.8 - version: 4.4.8(@types/node@18.17.2) + version: 4.5.0(@types/node@18.18.8) vitest: specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0) + version: 0.34.6(jsdom@22.1.0) packages: @@ -311,44 +311,45 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@adobe/css-tools@4.2.0: - resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} + /@adobe/css-tools@4.3.1: + resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true - /@ampproject/remapping@2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 dev: true - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.5 + '@babel/highlight': 7.22.20 + chalk: 2.4.2 - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.22.9: - resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 @@ -357,179 +358,153 @@ packages: - supports-color dev: true - /@babel/eslint-parser@7.19.1(@babel/core@7.22.9)(eslint@8.46.0): - resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==} + /@babel/eslint-parser@7.22.15(@babel/core@7.23.2)(eslint@8.52.0): + resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: - '@babel/core': '>=7.11.0' + '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.46.0 + eslint: 8.52.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true - /@babel/generator@7.22.9: - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: - resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.20.12(@babel/core@7.22.9): - resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==} + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.20.7 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - transitivePeerDependencies: - - supports-color + semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.20.5(@babel/core@7.22.9): - resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.2.2 + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.22.9): - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: - '@babel/core': ^7.4.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.2 - semver: 6.3.1 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression@7.18.6: - resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-member-expression-to-functions@7.20.7: - resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-optimise-call-expression@7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -537,68 +512,49 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-replace-supers@7.20.7: - resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.20.7 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: - resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-string-parser@7.22.5: @@ -606,1097 +562,1225 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function@7.20.5: - resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: true - /@babel/helpers@7.22.6: - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.22.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + /@babel/plugin-proposal-decorators@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-class-static-block@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-decorators@7.20.13(@babel/core@7.22.9): - resolution: {integrity: sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw==} + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-syntax-decorators': 7.19.0(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) + '@babel/core': 7.23.2 dev: true - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.23.2): + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-optional-chaining@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.20.5(@babel/core@7.22.9): - resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.19.0(@babel/core@7.22.9): - resolution: {integrity: sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.9): - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.22.9): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.18.6 + '@babel/core': 7.23.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-block-scoping@7.20.11(@babel/core@7.22.9): - resolution: {integrity: sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==} + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-classes@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 dev: true - /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-flow-strip-types@7.19.0(@babel/core@7.22.9): - resolution: {integrity: sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==} + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.22.9): - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-function-name': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.9): - resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-modules-commonjs@7.20.11(@babel/core@7.22.9): - resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.22.9): - resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.22.9): - resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.20.7 - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/types': 7.23.0 dev: true - /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.22.9): - resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.1 + regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-runtime@7.19.6(@babel/core@7.22.9): - resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.18.6 + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.9) + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.9): - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.20.13(@babel/core@7.22.9): - resolution: {integrity: sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==} + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.22.9): - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.20.2(@babel/core@7.22.9): - resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-class-static-block': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-private-property-in-object': 7.20.5(@babel/core@7.22.9) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.22.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoping': 7.20.11(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.22.9) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.20.11(@babel/core@7.22.9) - '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.22.9) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.22.9) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.22.9) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.22.9) - '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.9) - core-js-compat: 3.27.2 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.22.9): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 esutils: 2.0.3 dev: true - /@babel/preset-react@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + /@babel/preset-react@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.22.9) + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/preset-typescript@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} + /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-transform-typescript': 7.20.13(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.20.13: - resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 - dev: false + regenerator-runtime: 0.14.0 + dev: true - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + /@babel/runtime@7.23.4: + resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 - dev: true + regenerator-runtime: 0.14.0 + dev: false - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@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.22.7 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true + /@bundled-es-modules/cookie@2.0.0: + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + dependencies: + cookie: 0.5.0 + dev: true + + /@bundled-es-modules/js-levenshtein@2.0.1: + resolution: {integrity: sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg==} + dependencies: + js-levenshtein: 1.1.6 + dev: true + + /@bundled-es-modules/statuses@1.0.1: + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + dependencies: + statuses: 2.0.1 + dev: true + /@changesets/apply-release-plan@6.1.4: resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/config': 2.3.1 '@changesets/get-version-range-type': 0.3.2 '@changesets/git': 2.0.0 @@ -1714,7 +1798,7 @@ packages: /@changesets/assemble-release-plan@5.2.4: resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/errors': 0.1.4 '@changesets/get-dependents-graph': 1.3.6 '@changesets/types': 5.2.1 @@ -1732,7 +1816,7 @@ packages: resolution: {integrity: sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==} hasBin: true dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/apply-release-plan': 6.1.4 '@changesets/assemble-release-plan': 5.2.4 '@changesets/changelog-git': 0.1.14 @@ -1747,11 +1831,11 @@ packages: '@changesets/types': 5.2.1 '@changesets/write': 0.2.3 '@manypkg/get-packages': 1.1.3 - '@types/is-ci': 3.0.0 - '@types/semver': 7.5.0 + '@types/is-ci': 3.0.4 + '@types/semver': 7.5.6 ansi-colors: 4.1.3 chalk: 2.4.2 - enquirer: 2.3.6 + enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -1759,12 +1843,12 @@ packages: meow: 6.1.1 outdent: 0.5.0 p-limit: 2.3.0 - preferred-pm: 3.0.3 + preferred-pm: 3.1.2 resolve-from: 5.0.0 semver: 7.5.4 spawndamnit: 2.0.0 term-size: 2.2.1 - tty-table: 4.1.6 + tty-table: 4.2.3 dev: false /@changesets/config@2.3.1: @@ -1798,7 +1882,7 @@ packages: /@changesets/get-release-plan@3.0.17: resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/assemble-release-plan': 5.2.4 '@changesets/config': 2.3.1 '@changesets/pre': 1.0.14 @@ -1814,7 +1898,7 @@ packages: /@changesets/git@2.0.0: resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -1839,7 +1923,7 @@ packages: /@changesets/pre@1.0.14: resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -1849,7 +1933,7 @@ packages: /@changesets/read@0.5.9: resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/git': 2.0.0 '@changesets/logger': 0.0.5 '@changesets/parse': 0.3.16 @@ -1870,315 +1954,150 @@ packages: /@changesets/write@0.2.3: resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/types': 5.2.1 fs-extra: 7.0.1 human-id: 1.0.2 - prettier: 2.8.8 - dev: false - - /@esbuild-kit/cjs-loader@2.4.2: - resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} - dependencies: - '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.6.2 - dev: true - - /@esbuild-kit/core-utils@3.1.0: - resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} - dependencies: - esbuild: 0.17.19 - source-map-support: 0.5.21 - dev: true - - /@esbuild-kit/esm-loader@2.5.5: - resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} - dependencies: - '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.6.2 - dev: true - - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.18.17: - resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.18.17: - resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.18.17: - resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.18.17: - resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.18.17: - resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.18.17: - resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.18.17: - resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.18.17: - resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + prettier: 2.8.8 + dev: false - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} - cpu: [arm] - os: [linux] + cpu: [arm64] + os: [android] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.18.17: - resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] - os: [linux] + os: [android] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} - cpu: [ia32] - os: [linux] + cpu: [x64] + os: [android] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32@0.18.17: - resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} - cpu: [ia32] - os: [linux] + cpu: [arm64] + os: [darwin] requiresBuild: true dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} - cpu: [loong64] - os: [linux] + cpu: [x64] + os: [darwin] requiresBuild: true dev: true optional: true - /@esbuild/linux-loong64@0.18.17: - resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} - cpu: [loong64] - os: [linux] + cpu: [arm64] + os: [freebsd] requiresBuild: true dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] + cpu: [x64] + os: [freebsd] requiresBuild: true dev: true optional: true - /@esbuild/linux-mips64el@0.18.17: - resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ppc64@0.18.17: - resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [loong64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-riscv64@0.18.17: - resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [mips64el] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-s390x@0.18.17: - resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} - cpu: [x64] + cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-x64@0.18.17: - resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2186,17 +2105,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.17: - resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2204,17 +2114,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.17: - resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2222,17 +2123,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.17: - resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2240,17 +2132,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.17: - resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2258,8 +2141,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2267,26 +2150,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.17: - resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.18.17: - resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2294,38 +2159,38 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.46.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.46.0 + eslint: 8.52.0 eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 dev: false - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@2.1.1: - resolution: {integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==} + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 + globals: 13.23.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2335,15 +2200,15 @@ packages: - supports-color dev: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 + globals: 13.23.0 + ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2352,21 +2217,21 @@ packages: - supports-color dev: false - /@eslint/js@8.46.0: - resolution: {integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==} + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -2376,54 +2241,27 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - - /@jest/expect-utils@29.3.1: - resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.2.0 - dev: true + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 dev: true - /@jest/types@29.3.1: - resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.17.2 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.20 dev: true - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true @@ -2432,32 +2270,21 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -2466,7 +2293,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.23.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -2474,28 +2301,21 @@ packages: read-yaml-file: 1.1.0 dev: false - /@mswjs/cookies@0.2.2: - resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} + /@mswjs/cookies@1.0.0: + resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} - dependencies: - '@types/set-cookie-parser': 2.4.3 - set-cookie-parser: 2.6.0 dev: true - /@mswjs/interceptors@0.17.9: - resolution: {integrity: sha512-4LVGt03RobMH/7ZrbHqRxQrS9cc2uh+iNKSj8UWr8M26A2i793ju+csaB5zaqYltqJmA2jUq4VeYfKmVqvsXQg==} - engines: {node: '>=14'} + /@mswjs/interceptors@0.25.7: + resolution: {integrity: sha512-U7iFYs/qU/5jfz1VDpoYz3xqX9nzhsBXw7q923dv6GiGTy+m2ZLhD33L80R/shHOW/YWjeH6k16GbIHGw+bAng==} + engines: {node: '>=18'} dependencies: - '@open-draft/until': 1.0.3 - '@types/debug': 4.1.8 - '@xmldom/xmldom': 0.8.10 - debug: 4.3.4 - headers-polyfill: 3.1.2 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 outvariant: 1.4.0 - strict-event-emitter: 0.2.8 - web-encoding: 1.1.5 - transitivePeerDependencies: - - supports-color + strict-event-emitter: 0.5.1 dev: true /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: @@ -2504,8 +2324,8 @@ packages: eslint-scope: 5.1.1 dev: true - /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} dev: false @@ -2527,31 +2347,42 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@open-draft/until@1.0.3: - resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true + + /@open-draft/logger@0.3.0: + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.0 + dev: true + + /@open-draft/until@2.1.0: + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} dev: true - /@paralleldrive/cuid2@2.2.1: - resolution: {integrity: sha512-GJhHYlMhyT2gWemDL7BGMWfTNhspJKkikLKh9wAy3z4GTTINvTYALkUd+eGQK7aLeVkVzPuSA0VCT3H5eEWbbw==} + /@paralleldrive/cuid2@2.2.2: + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} dependencies: - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.3.2 dev: false - /@rushstack/eslint-patch@1.2.0: - resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} + /@rushstack/eslint-patch@1.5.1: + resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} dev: true /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@testing-library/dom@9.3.1: - resolution: {integrity: sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==} + /@testing-library/dom@9.3.3: + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/runtime': 7.22.6 - '@types/aria-query': 5.0.1 + '@babel/code-frame': 7.22.13 + '@babel/runtime': 7.23.2 + '@types/aria-query': 5.0.3 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 @@ -2559,19 +2390,33 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@5.17.0: - resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + /@testing-library/jest-dom@6.1.4(vitest@0.34.6): + resolution: {integrity: sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true dependencies: - '@adobe/css-tools': 4.2.0 - '@babel/runtime': 7.22.6 - '@types/testing-library__jest-dom': 5.14.9 + '@adobe/css-tools': 4.3.1 + '@babel/runtime': 7.23.2 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.5.16 lodash: 4.17.21 redent: 3.0.0 + vitest: 0.34.6(jsdom@22.1.0) dev: true /@testing-library/react@14.0.0(react-dom@18.2.0)(react@18.2.0): @@ -2581,20 +2426,20 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.22.6 - '@testing-library/dom': 9.3.1 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.2 + '@testing-library/dom': 9.3.3 + '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.4.3(@testing-library/dom@9.3.1): - resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} + /@testing-library/user-event@14.5.1(@testing-library/dom@9.3.3): + resolution: {integrity: sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.1 + '@testing-library/dom': 9.3.3 dev: true /@tootallnate/once@2.0.0: @@ -2602,265 +2447,257 @@ packages: engines: {node: '>= 10'} dev: true - /@types/aria-query@5.0.1: - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + /@types/aria-query@5.0.3: + resolution: {integrity: sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==} dev: true - /@types/better-sqlite3@7.6.4: - resolution: {integrity: sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg==} + /@types/babel__core@7.20.3: + resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: - '@types/node': 18.17.2 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 dev: true - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + /@types/babel__generator@7.6.6: + resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} dependencies: - '@types/connect': 3.4.35 - '@types/node': 18.17.2 + '@babel/types': 7.23.0 dev: true - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + /@types/babel__template@7.4.3: + resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} dependencies: - '@types/chai': 4.3.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + /@types/babel__traverse@7.20.3: + resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + dependencies: + '@babel/types': 7.23.0 dev: true - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + /@types/better-sqlite3@7.6.6: + resolution: {integrity: sha512-nuFAptzt0hZYBvyLzKQCbuCCK+RN9PHH4ezar5EJLIg2qpVhwQ/uLvLO/K8A9O7N8DafawgFupiyXQSs0U48Ng==} dependencies: - '@types/node': 18.17.2 + '@types/node': 18.18.8 dev: true - /@types/cookie-session@2.0.44: - resolution: {integrity: sha512-3DheOZ41pql6raSIkqEPphJdhA2dX2bkS+s2Qacv8YMKkoCbAIEXbsDil7351ARzMqvfyDUGNeHGiRZveIzhqQ==} + /@types/body-parser@1.19.4: + resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: - '@types/express': 4.17.17 - '@types/keygrip': 1.0.2 + '@types/connect': 3.4.37 + '@types/node': 18.18.8 dev: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@types/chai-subset@1.3.4: + resolution: {integrity: sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==} + dependencies: + '@types/chai': 4.3.9 dev: true - /@types/cookiejar@2.1.2: - resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} + /@types/chai@4.3.9: + resolution: {integrity: sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==} dev: true - /@types/cors@2.8.13: - resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + /@types/connect@3.4.37: + resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: - '@types/node': 18.17.2 + '@types/node': 18.18.8 dev: true - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + /@types/cookie-session@2.0.46: + resolution: {integrity: sha512-tz1Ekw1XjtF+/SXvd90m+9nmDdi2PF4JvQub7Hj4tTlR4uxACC0p+WvhGxAbaELLR5oc3c5tQIgKsh6paWUt7A==} dependencies: - '@types/ms': 0.7.31 + '@types/express': 4.17.20 + '@types/keygrip': 1.0.4 dev: true - /@types/express-serve-static-core@4.17.35: - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} - dependencies: - '@types/node': 18.17.2 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} dev: true - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.2 + /@types/cookiejar@2.1.3: + resolution: {integrity: sha512-LZ8SD3LpNmLMDLkG2oCBjZg+ETnx6XdCjydUE0HwojDmnDfDUnhMKKbtth1TZh+hzcqb03azrYWoXLS8sMXdqg==} dev: true - /@types/http-errors@2.0.1: - resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + /@types/cors@2.8.15: + resolution: {integrity: sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==} + dependencies: + '@types/node': 18.18.8 dev: true - /@types/is-ci@3.0.0: - resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} + /@types/express-serve-static-core@4.17.39: + resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} dependencies: - ci-info: 3.7.1 - dev: false - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + '@types/node': 18.18.8 + '@types/qs': 6.9.9 + '@types/range-parser': 1.2.6 + '@types/send': 0.17.3 dev: true - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + /@types/express@4.17.20: + resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + '@types/body-parser': 1.19.4 + '@types/express-serve-static-core': 4.17.39 + '@types/qs': 6.9.9 + '@types/serve-static': 1.15.4 dev: true - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 + /@types/http-errors@2.0.3: + resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} dev: true - /@types/jest@29.2.4: - resolution: {integrity: sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==} + /@types/is-ci@3.0.4: + resolution: {integrity: sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==} dependencies: - expect: 29.3.1 - pretty-format: 29.6.1 + ci-info: 3.9.0 + dev: false + + /@types/js-levenshtein@1.1.2: + resolution: {integrity: sha512-/NCbMABw2uacuyE16Iwka1EzREDD50/W2ggRBad0y1WHBvAkvR9OEINxModVY7D428gXBe0igeVX7bUc9GaslQ==} dev: true - /@types/js-levenshtein@1.1.1: - resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} dev: true - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - /@types/keygrip@1.0.2: - resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} + /@types/keygrip@1.0.4: + resolution: {integrity: sha512-/tjWYD8StMrINelsrHNmpXceo9s3/Y22AzePH1qCvXIgmz/aQp2YFFr6HqhNQVIOdcvaVyp5GS+yjHGuF7Rwsg==} dev: true - /@types/mime@1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + /@types/mime@1.3.4: + resolution: {integrity: sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==} dev: true - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + /@types/mime@3.0.3: + resolution: {integrity: sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==} dev: true - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: false - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true - /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: false - /@types/node@18.17.2: - resolution: {integrity: sha512-wBo3KqP/PBqje5TI9UTiuL3yWfP6sdPtjtygSOqcYZWT232dfDeDOnkDps5wqZBP9NgGgYrNejinl0faAuE+HQ==} - dev: true - - /@types/node@20.4.7: - resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} + /@types/node@18.18.8: + resolution: {integrity: sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==} + dependencies: + undici-types: 5.26.5 dev: true - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: false - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + /@types/parse-json@4.0.1: + resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==} dev: true - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.9: + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} dev: true - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} dev: true - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + /@types/range-parser@1.2.6: + resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==} dev: true - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + /@types/react-dom@18.2.14: + resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} dependencies: - '@types/react': 18.2.18 + '@types/react': 18.2.34 dev: true - /@types/react@18.2.18: - resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==} + /@types/react@18.2.34: + resolution: {integrity: sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==} dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 csstype: 3.1.2 dev: true - /@types/sax@1.2.4: - resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + /@types/sax@1.2.6: + resolution: {integrity: sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ==} dependencies: - '@types/node': 20.4.7 + '@types/node': 18.18.8 dev: true - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + /@types/scheduler@0.16.5: + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} dev: true - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - - /@types/send@0.17.1: - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} - dependencies: - '@types/mime': 1.3.2 - '@types/node': 18.17.2 + /@types/semver@7.5.4: + resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} dev: true - /@types/serve-static@1.15.2: - resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} - dependencies: - '@types/http-errors': 2.0.1 - '@types/mime': 3.0.1 - '@types/node': 18.17.2 - dev: true + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: false - /@types/set-cookie-parser@2.4.3: - resolution: {integrity: sha512-7QhnH7bi+6KAhBB+Auejz1uV9DHiopZqu7LfR/5gZZTkejJV5nYeZZpgfFoE0N8aDsXuiYpfKyfyMatCwQhyTQ==} + /@types/send@0.17.3: + resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: - '@types/node': 18.17.2 + '@types/mime': 1.3.4 + '@types/node': 18.18.8 dev: true - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + /@types/serve-static@1.15.4: + resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==} + dependencies: + '@types/http-errors': 2.0.3 + '@types/mime': 3.0.3 + '@types/node': 18.18.8 dev: true - /@types/superagent@4.1.18: - resolution: {integrity: sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==} - dependencies: - '@types/cookiejar': 2.1.2 - '@types/node': 18.17.2 + /@types/statuses@2.0.3: + resolution: {integrity: sha512-NwCYScf83RIwCyi5/9cXocrJB//xrqMh5PMw3mYTSFGaI3DuVjBLfO/PCk7QVAC3Da8b9NjxNmTO9Aj9T3rl/Q==} dev: true - /@types/supertest@2.0.12: - resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + /@types/superagent@4.1.20: + resolution: {integrity: sha512-GfpwJgYSr3yO+nArFkmyqv3i0vZavyEG5xPd/o95RwpKYpsOKJYI5XLdxLpdRbZI3YiGKKdIOFIf/jlP7A0Jxg==} dependencies: - '@types/superagent': 4.1.18 + '@types/cookiejar': 2.1.3 + '@types/node': 18.18.8 dev: true - /@types/testing-library__jest-dom@5.14.9: - resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} + /@types/supertest@2.0.15: + resolution: {integrity: sha512-jUCZZ/TMcpGzoSaed9Gjr8HCf3HehExdibyw3OHHEL1als1KmyzcOZZH4MjbObI8TkWsEr7bc7gsW0WTDni+qQ==} dependencies: - '@types/jest': 29.2.4 + '@types/superagent': 4.1.20 dev: true - /@types/throttle-debounce@5.0.0: - resolution: {integrity: sha512-Pb7k35iCGFcGPECoNE4DYp3Oyf2xcTd3FbFQxXUI9hEYKUl6YX+KLf7HrBmgVcD05nl50LIH6i+80js4iYmWbw==} + /@types/throttle-debounce@5.0.1: + resolution: {integrity: sha512-/fifasjlhpz/r4YsH0r0ZXJvivXFB3F6bmezMnqgsn/NK/fYJn7vN84k7eYn/oALu/aenXo+t8Pv+QlkS6iYBg==} dev: true - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + /@types/yargs-parser@21.0.2: + resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==} dev: true - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + /@types/yargs@17.0.29: + resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} dependencies: - '@types/yargs-parser': 21.0.0 + '@types/yargs-parser': 21.0.2 dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2871,25 +2708,25 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.46.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@6.4.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==} + /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2899,38 +2736,38 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.4.0 - '@typescript-eslint/type-utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.4.0 + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/type-utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4 - eslint: 8.47.0 + eslint: 8.54.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/experimental-utils@5.49.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-veLpCJLYn44Fru7mSvi2doxQMzMCOFSDYdMUQhAzaH1vFYq2RVNpecZ8d18Wh6UMv07yahXkiv/aShWE48iE9Q==} + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.49.0(eslint@8.46.0)(typescript@5.1.6) - eslint: 8.46.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/parser@5.62.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2942,16 +2779,16 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) debug: 4.3.4 - eslint: 8.46.0 - typescript: 5.1.6 + eslint: 8.52.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.4.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==} + /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2960,25 +2797,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.4.0 - '@typescript-eslint/types': 6.4.0 - '@typescript-eslint/typescript-estree': 6.4.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.4.0 + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4 - eslint: 8.47.0 - typescript: 5.1.6 + eslint: 8.54.0 + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@5.49.0: - resolution: {integrity: sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.49.0 - '@typescript-eslint/visitor-keys': 5.49.0 - dev: true - /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2987,15 +2816,15 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@6.4.0: - resolution: {integrity: sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==} + /@typescript-eslint/scope-manager@6.12.0: + resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.4.0 - '@typescript-eslint/visitor-keys': 6.4.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/visitor-keys': 6.12.0 dev: false - /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@5.62.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3005,18 +2834,18 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.46.0 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.52.0 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@6.4.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==} + /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3025,53 +2854,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.4.0(typescript@5.1.6) - '@typescript-eslint/utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) debug: 4.3.4 - eslint: 8.47.0 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.54.0 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@5.49.0: - resolution: {integrity: sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@6.4.0: - resolution: {integrity: sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==} + /@typescript-eslint/types@6.12.0: + resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@5.49.0(typescript@5.1.6): - resolution: {integrity: sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.49.0 - '@typescript-eslint/visitor-keys': 5.49.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3086,14 +2889,14 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.4.0(typescript@5.1.6): - resolution: {integrity: sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==} + /@typescript-eslint/typescript-estree@6.12.0(typescript@5.3.2): + resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -3101,51 +2904,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.4.0 - '@typescript-eslint/visitor-keys': 6.4.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@5.49.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.49.0 - '@typescript-eslint/types': 5.49.0 - '@typescript-eslint/typescript-estree': 5.49.0(typescript@5.1.6) - eslint: 8.46.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.46.0) - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/utils@5.62.0(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - eslint: 8.46.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + eslint: 8.52.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -3153,33 +2936,25 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.4.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==} + /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.4.0 - '@typescript-eslint/types': 6.4.0 - '@typescript-eslint/typescript-estree': 6.4.0(typescript@5.1.6) - eslint: 8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + eslint: 8.54.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@5.49.0: - resolution: {integrity: sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.49.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3188,100 +2963,103 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.4.0: - resolution: {integrity: sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==} + /@typescript-eslint/visitor-keys@6.12.0: + resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.4.0 + '@typescript-eslint/types': 6.12.0 eslint-visitor-keys: 3.4.3 dev: false - /@vitejs/plugin-react@4.0.4(vite@4.4.8): - resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@vitejs/plugin-react@4.1.1(vite@4.5.0): + resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) + '@types/babel__core': 7.20.3 react-refresh: 0.14.0 - vite: 4.4.8(@types/node@18.17.2) + vite: 4.5.0(@types/node@18.18.8) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@0.34.1: - resolution: {integrity: sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==} + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} dependencies: - '@vitest/spy': 0.34.1 - '@vitest/utils': 0.34.1 - chai: 4.3.7 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.3.10 dev: true - /@vitest/runner@0.34.1: - resolution: {integrity: sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==} + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} dependencies: - '@vitest/utils': 0.34.1 + '@vitest/utils': 0.34.6 p-limit: 4.0.0 pathe: 1.1.1 dev: true - /@vitest/snapshot@0.34.1: - resolution: {integrity: sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==} + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} dependencies: - magic-string: 0.30.2 + magic-string: 0.30.5 pathe: 1.1.1 - pretty-format: 29.6.2 + pretty-format: 29.7.0 dev: true - /@vitest/spy@0.34.1: - resolution: {integrity: sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==} + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} dependencies: - tinyspy: 2.1.1 + tinyspy: 2.2.0 dev: true - /@vitest/utils@0.34.1: - resolution: {integrity: sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==} + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} dependencies: - diff-sequences: 29.4.3 - loupe: 2.3.6 - pretty-format: 29.6.2 + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 dev: true - /@xmldom/xmldom@0.8.10: - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - dev: true + /@zodios/core@10.9.6(axios@1.6.0)(zod@3.22.4): + resolution: {integrity: sha512-aH4rOdb3AcezN7ws8vDgBfGboZMk2JGGzEq/DtW65MhnRxyTGRuLJRWVQ/2KxDgWvV2F5oTkAS+5pnjKbl0n+A==} + peerDependencies: + axios: ^0.x || ^1.0.0 + zod: ^3.x + dependencies: + axios: 1.6.0 + zod: 3.22.4 + dev: false - /@zodios/core@10.9.2(axios@1.4.0)(zod@3.21.4): - resolution: {integrity: sha512-aY8FgE6Y+91oBaMfTnqibGoHO62OiKKHoiQAq76PYJbU7InFeWsSRhpnBwpibWopRjz45AlqojxKo3QeSAYC7w==} + /@zodios/core@10.9.6(axios@1.6.2)(zod@3.22.4): + resolution: {integrity: sha512-aH4rOdb3AcezN7ws8vDgBfGboZMk2JGGzEq/DtW65MhnRxyTGRuLJRWVQ/2KxDgWvV2F5oTkAS+5pnjKbl0n+A==} peerDependencies: axios: ^0.x || ^1.0.0 zod: ^3.x dependencies: - axios: 1.4.0 - zod: 3.21.4 + axios: 1.6.2 + zod: 3.22.4 dev: false - /@zodios/express@10.6.1(@zodios/core@10.9.2)(express@4.18.2)(zod@3.21.4): + /@zodios/express@10.6.1(@zodios/core@10.9.6)(express@4.18.2)(zod@3.22.4): resolution: {integrity: sha512-FNgOq8mvwvWP5B2howMKGm6EPp6i/0XFAsQnX5Ov3MLbanzD1oE4WJtBkTL3cmJYvD0nyykbWSeHOh51bCmhUA==} peerDependencies: '@zodios/core': '>=10.4.4 <11.0.0' express: 4.x zod: ^3.x dependencies: - '@zodios/core': 10.9.2(axios@1.4.0)(zod@3.21.4) + '@zodios/core': 10.9.6(axios@1.6.0)(zod@3.22.4) express: 4.18.2 - zod: 3.21.4 + zod: 3.22.4 dev: false - /@zxing/text-encoding@0.9.0: - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - requiresBuild: true - dev: true - optional: true - /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true @@ -3294,20 +3072,20 @@ packages: negotiator: 0.6.3 dev: false - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.2 - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true @@ -3393,73 +3171,74 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-array-buffer: 3.0.2 /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} 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.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-string: 1.0.7 /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + /array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true - /arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 @@ -3476,8 +3255,14 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 dev: true /asynckit@0.4.0: @@ -3487,68 +3272,78 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /axe-core@4.6.3: - resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} dev: true - /axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + /axios@1.6.0: + resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.3 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug dev: false - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: - deep-equal: 2.2.2 + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 dev: true /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 - resolve: 1.22.1 + resolve: 1.22.8 dev: true - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.22.9): - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.22.9): - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) - core-js-compat: 3.27.2 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.22.9): - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) transitivePeerDependencies: - supports-color dev: true @@ -3560,21 +3355,21 @@ packages: /babel-preset-react-app@10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-decorators': 7.20.13(@babel/core@7.22.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-private-property-in-object': 7.20.5(@babel/core@7.22.9) - '@babel/plugin-transform-flow-strip-types': 7.19.0(@babel/core@7.22.9) - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-runtime': 7.19.6(@babel/core@7.22.9) - '@babel/preset-env': 7.20.2(@babel/core@7.22.9) - '@babel/preset-react': 7.18.6(@babel/core@7.22.9) - '@babel/preset-typescript': 7.18.6(@babel/core@7.22.9) - '@babel/runtime': 7.22.6 + '@babel/core': 7.23.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.23.2) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -3594,8 +3389,8 @@ packages: is-windows: 1.0.2 dev: false - /better-sqlite3@8.5.0: - resolution: {integrity: sha512-vbPcv/Hx5WYdyNg/NbcfyaBZyv9s/NVbxb7yCeC5Bq1pVocNxeL2tZmSu3Rlm4IEOTjYdGyzWQgyx0OSdORBzw==} + /better-sqlite3@9.0.0: + resolution: {integrity: sha512-lDxQ9qg/XuUHZG6xzrQaMHkNWl37t35/LPB/VJGV8DdScSuGFNfFSqgscXEd8UIuyk/d9wU8iaMxQa4If5Wqog==} requiresBuild: true dependencies: bindings: 1.5.0 @@ -3618,7 +3413,7 @@ packages: dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} @@ -3672,21 +3467,21 @@ packages: dependencies: fill-range: 7.0.1 - /breakword@1.0.5: - resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + /breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} dependencies: wcwidth: 1.0.1 dev: false - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.475 + caniuse-lite: 1.0.30001559 + electron-to-chromium: 1.4.574 node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.9) + update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true /buffer-from@1.1.2: @@ -3709,23 +3504,17 @@ packages: engines: {node: '>=8'} dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.4.1 - dev: false - /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -3740,27 +3529,19 @@ packages: engines: {node: '>=6'} dev: false - /caniuse-lite@1.0.30001517: - resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} + /caniuse-lite@1.0.30001559: + resolution: {integrity: sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==} dev: true - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.1 - upper-case-first: 2.0.2 - dev: false - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 + check-error: 1.0.3 deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 + get-func-name: 2.0.2 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -3781,14 +3562,6 @@ packages: supports-color: 7.2.0 dev: true - /chalk@4.1.1: - resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -3796,28 +3569,17 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.1 + /change-case@5.1.2: + resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} dev: false /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 dev: true /chokidar@3.5.3: @@ -3832,16 +3594,17 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false - /ci-info@3.7.1: - resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + dev: false /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} @@ -3850,8 +3613,8 @@ packages: restore-cursor: 3.1.0 dev: true - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} engines: {node: '>=6'} dev: true @@ -3914,14 +3677,6 @@ packages: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.1 - upper-case: 2.0.2 - dev: false - /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -3934,8 +3689,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true /cookie-session@2.0.0: @@ -3954,15 +3709,9 @@ packages: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true - /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: false /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -3976,10 +3725,10 @@ packages: keygrip: 1.1.0 dev: false - /core-js-compat@3.27.2: - resolution: {integrity: sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==} + /core-js-compat@3.33.2: + resolution: {integrity: sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==} dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 dev: true /cors@2.8.5: @@ -3994,7 +3743,7 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.1 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -4044,24 +3793,24 @@ packages: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} dev: false - /csv-generate@4.2.6: - resolution: {integrity: sha512-VtnYqhWLcsUocA346ewFOk+rrqcoT663j11vXzD2uelXq9WguQ3QzDeVD8ISso7hhVtkDSHcWl9psdemeiEHDA==} + /csv-generate@4.3.0: + resolution: {integrity: sha512-7KdVId/2RgwPIKfWHaHtjBq7I9mgdi8ICzsUyIhP8is6UwpwVGGSC/aPnrZ8/SkgBcCP20lXrdPuP64Irs1VBg==} dev: false /csv-parse@4.16.3: resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} dev: false - /csv-parse@5.4.0: - resolution: {integrity: sha512-JiQosUWiOFgp4hQn0an+SBoV9IKdqzhROM0iiN4LB7UpfJBlsSJlWl9nq4zGgxgMAzHJ6V4t29VAVD+3+2NJAg==} + /csv-parse@5.5.2: + resolution: {integrity: sha512-YRVtvdtUNXZCMyK5zd5Wty1W6dNTpGKdqQd4EQ8tl/c6KW1aMBB1Kg1ppky5FONKmEqGJ/8WjLlTNLPne4ioVA==} dev: false /csv-stringify@5.6.5: resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} dev: false - /csv-stringify@6.4.0: - resolution: {integrity: sha512-HQsw0QXiN5fdlO+R8/JzCZnR3Fqp8E87YVnhHlaPtNGJjt6ffbV0LpOkieIb1x6V1+xt878IYq77SpXHWAqKkA==} + /csv-stringify@6.4.4: + resolution: {integrity: sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==} dev: false /csv@5.5.3: @@ -4074,14 +3823,14 @@ packages: stream-transform: 2.1.3 dev: false - /csv@6.3.1: - resolution: {integrity: sha512-ZTcWLvr0Ux0IQDz/QzhCToBVIZtF5GDrStMt9I8mRSk0jPnfF9OeYKz0EZTspaAEOK6hf515ag97nKmwoyU8ZA==} + /csv@6.3.5: + resolution: {integrity: sha512-Y+KTCAUljtq2JaGP42ZL1bymqlU5BkfnFpZhxRczGFDZox2VXhlRHnG5DRshyUrwQzmCdEiLjSqNldCfm1OVCA==} engines: {node: '>= 0.1.90'} dependencies: - csv-generate: 4.2.6 - csv-parse: 5.4.0 - csv-stringify: 6.4.0 - stream-transform: 3.2.6 + csv-generate: 4.3.0 + csv-parse: 5.5.2 + csv-stringify: 6.4.4 + stream-transform: 3.2.10 dev: false /damerau-levenshtein@1.0.8: @@ -4164,9 +3913,9 @@ packages: resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 is-arguments: 1.1.1 is-array-buffer: 3.0.2 is-date-object: 1.0.5 @@ -4176,11 +3925,11 @@ packages: object-is: 1.1.5 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 side-channel: 1.0.4 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /deep-extend@0.6.0: @@ -4196,18 +3945,20 @@ packages: dependencies: clone: 1.0.4 - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.0 + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 /delayed-stream@1.0.0: @@ -4246,8 +3997,8 @@ packages: wrappy: 1.0.2 dev: true - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true @@ -4280,13 +4031,6 @@ packages: webidl-conversions: 7.0.0 dev: true - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.1 - dev: false - /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} @@ -4296,8 +4040,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.475: - resolution: {integrity: sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A==} + /electron-to-chromium@1.4.574: + resolution: {integrity: sha512-bg1m8L0n02xRzx4LsTTMbBPiUd9yIR+74iPtS/Ao65CuXvhVZHP0ym1kSdDG3yHFDXqHQQBKujlN1AQ8qZnyFg==} dev: true /emoji-regex@8.0.0: @@ -4318,11 +4062,12 @@ packages: once: 1.4.0 dev: false - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 + strip-ansi: 6.0.1 dev: false /entities@4.5.0: @@ -4335,64 +4080,26 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.21.1: - resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.4 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 + arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + hasown: 2.0.0 + internal-slot: 1.0.6 is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 @@ -4401,27 +4108,27 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 typed-array-buffer: 1.0.0 typed-array-byte-length: 1.0.0 typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 is-arguments: 1.1.1 is-map: 2.0.2 @@ -4431,18 +4138,37 @@ packages: stop-iteration-iterator: 1.0.0 dev: true - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 + get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 + hasown: 2.0.0 - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -4452,64 +4178,34 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - - /esbuild@0.18.17: - resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.17 - '@esbuild/android-arm64': 0.18.17 - '@esbuild/android-x64': 0.18.17 - '@esbuild/darwin-arm64': 0.18.17 - '@esbuild/darwin-x64': 0.18.17 - '@esbuild/freebsd-arm64': 0.18.17 - '@esbuild/freebsd-x64': 0.18.17 - '@esbuild/linux-arm': 0.18.17 - '@esbuild/linux-arm64': 0.18.17 - '@esbuild/linux-ia32': 0.18.17 - '@esbuild/linux-loong64': 0.18.17 - '@esbuild/linux-mips64el': 0.18.17 - '@esbuild/linux-ppc64': 0.18.17 - '@esbuild/linux-riscv64': 0.18.17 - '@esbuild/linux-s390x': 0.18.17 - '@esbuild/linux-x64': 0.18.17 - '@esbuild/netbsd-x64': 0.18.17 - '@esbuild/openbsd-x64': 0.18.17 - '@esbuild/sunos-x64': 0.18.17 - '@esbuild/win32-arm64': 0.18.17 - '@esbuild/win32-ia32': 0.18.17 - '@esbuild/win32-x64': 0.18.17 + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 dev: true /escalade@3.1.1: @@ -4524,25 +4220,20 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier@9.0.0(eslint@8.47.0): + /eslint-config-prettier@9.0.0(eslint@8.54.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.47.0 + eslint: 8.54.0 dev: false - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.46.0)(typescript@5.1.6): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4552,22 +4243,22 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.9 - '@babel/eslint-parser': 7.19.1(@babel/core@7.22.9)(eslint@8.46.0) - '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@babel/core': 7.23.2 + '@babel/eslint-parser': 7.22.15(@babel/core@7.23.2)(eslint@8.52.0) + '@rushstack/eslint-patch': 1.5.1 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.52.0)(typescript@5.2.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.46.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.46.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.46.0)(typescript@5.1.6) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.46.0) - eslint-plugin-react: 7.32.1(eslint@8.46.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.46.0) - eslint-plugin-testing-library: 5.10.0(eslint@8.46.0)(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.52.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.52.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.52.0)(typescript@5.2.2) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.52.0) + eslint-plugin-react: 7.33.2(eslint@8.52.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.52.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.52.0)(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -4577,16 +4268,16 @@ packages: - supports-color dev: true - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 - is-core-module: 2.12.1 - resolve: 1.22.3 + is-core-module: 2.13.1 + resolve: 1.22.8 transitivePeerDependencies: - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint@8.46.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.52.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -4607,15 +4298,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.62.0(eslint@8.52.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.46.0 - eslint-import-resolver-node: 0.3.7 + eslint: 8.52.0 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint@8.54.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -4636,15 +4327,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) debug: 3.2.7 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 + eslint: 8.54.0 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.46.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.52.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4652,15 +4343,15 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) - eslint: 8.46.0 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + eslint: 8.52.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0): - resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0): + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4669,24 +4360,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.6) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.46.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint@8.46.0) - has: 1.0.3 - is-core-module: 2.12.1 + eslint: 8.52.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.52.0) + hasown: 2.0.0 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - resolve: 1.22.3 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -4695,8 +4385,8 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0): - resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0): + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4705,24 +4395,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.1.6) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) - has: 1.0.3 - is-core-module: 2.12.1 + eslint: 8.54.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint@8.54.0) + hasown: 2.0.0 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - resolve: 1.22.3 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -4731,7 +4420,7 @@ packages: - supports-color dev: false - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.46.0)(typescript@5.1.6): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -4744,80 +4433,81 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/experimental-utils': 5.49.0(eslint@8.46.0)(typescript@5.1.6) - eslint: 8.46.0 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.46.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.52.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.23.2 aria-query: 5.3.0 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.6.3 - axobject-query: 3.1.1 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.46.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 + es-iterator-helpers: 1.0.15 + eslint: 8.52.0 + hasown: 2.0.0 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.1 + object.entries: 1.1.7 + object.fromentries: 2.0.7 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.46.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.52.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.46.0 + eslint: 8.52.0 dev: true - /eslint-plugin-react@7.32.1(eslint@8.46.0): - resolution: {integrity: sha512-vOjdgyd0ZHBXNsmvU+785xY8Bfe57EFbTYYk8XrROzWpr9QBvpjITvAXt9xqcE6+8cjR/g1+mfumPToxsl1www==} + /eslint-plugin-react@7.33.2(eslint@8.52.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 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.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 - eslint: 8.46.0 + es-iterator-helpers: 1.0.15 + eslint: 8.52.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + jsx-ast-utils: 3.3.5 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 dev: true - /eslint-plugin-testing-library@5.10.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-aTOsCAEI9trrX3TLOnsskfhe57DmsjP/yMKLPqg4ftdRvfR4qut2PGWUa8TwP7whZbwMzJjh98tgAPcE8vdHow==} + /eslint-plugin-testing-library@5.11.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) - eslint: 8.46.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 transitivePeerDependencies: - supports-color - typescript @@ -4838,42 +4528,28 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils@3.0.0(eslint@8.46.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.46.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys@3.4.2: - resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint@8.46.0: - resolution: {integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.1 - '@eslint/js': 8.46.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -4881,7 +4557,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 @@ -4889,7 +4565,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.23.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -4908,18 +4584,19 @@ packages: - supports-color dev: true - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -4935,9 +4612,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.23.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -4958,8 +4635,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 /esprima@4.0.1: @@ -4998,27 +4675,11 @@ packages: engines: {node: '>= 0.6'} dev: false - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} dev: false - /expect@29.3.1: - resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.3.1 - jest-get-type: 29.2.0 - jest-matcher-utils: 29.3.1 - jest-message-util: 29.3.1 - jest-util: 29.3.1 - dev: true - /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -5109,7 +4770,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.1 /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -5158,18 +4819,19 @@ packages: pkg-dir: 4.2.0 dev: false - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} dependencies: - flatted: 3.2.7 + flatted: 3.2.9 + keyv: 4.5.4 rimraf: 3.0.2 - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -5191,13 +4853,21 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: true + /formidable@2.1.2: resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.0 + qs: 6.11.2 dev: true /forwarded@0.2.0: @@ -5218,7 +4888,7 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: false @@ -5227,7 +4897,7 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: false @@ -5235,24 +4905,24 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 functions-have-names: 1.2.3 /functions-have-names@1.2.3: @@ -5267,27 +4937,27 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - function-bind: 1.1.1 - has: 1.0.3 + function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 - /get-tsconfig@4.6.2: - resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -5323,25 +4993,17 @@ packages: engines: {node: '>=4'} dev: true - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - dev: false /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -5357,10 +5019,11 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -5369,8 +5032,8 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /graphql@16.7.1: - resolution: {integrity: sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==} + /graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: true @@ -5390,10 +5053,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -5409,21 +5072,14 @@ packages: dependencies: has-symbols: 1.0.3 - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - capital-case: 1.0.4 - tslib: 2.4.1 - dev: false + function-bind: 1.1.2 - /headers-polyfill@3.1.2: - resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} + /headers-polyfill@4.0.2: + resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==} dev: true /hexoid@1.0.0: @@ -5498,6 +5154,11 @@ packages: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -5526,12 +5187,12 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 - chalk: 4.1.1 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 external-editor: 3.1.0 @@ -5544,23 +5205,15 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 dev: true - /internal-slot@1.0.4: - resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 /ipaddr.js@1.9.1: @@ -5572,20 +5225,27 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -5602,7 +5262,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 /is-callable@1.2.7: @@ -5613,18 +5273,13 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: - ci-info: 3.7.1 + ci-info: 3.9.0 dev: false - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -5636,6 +5291,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -5697,7 +5358,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 /is-set@2.0.2: @@ -5707,7 +5368,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -5728,21 +5389,11 @@ packages: dependencies: has-symbols: 1.0.3 - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -5756,13 +5407,13 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /is-windows@1.0.2: @@ -5776,56 +5427,14 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /jest-diff@29.3.1: - resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.2.0 - pretty-format: 29.6.1 - dev: true - - /jest-get-type@29.2.0: - resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-matcher-utils@29.3.1: - resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.3.1 - jest-get-type: 29.2.0 - pretty-format: 29.6.1 - dev: true - - /jest-message-util@29.3.1: - resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.5 - '@jest/types': 29.3.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-util@29.3.1: - resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: - '@jest/types': 29.3.1 - '@types/node': 18.17.2 - chalk: 4.1.2 - ci-info: 3.7.1 - graceful-fs: 4.2.10 - picomatch: 2.3.1 + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 dev: true /js-levenshtein@1.1.6: @@ -5880,7 +5489,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 12.0.1 - ws: 8.13.0 + ws: 8.14.2 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -5899,6 +5508,9 @@ packages: hasBin: true dev: true + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -5912,7 +5524,7 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: - minimist: 1.2.7 + minimist: 1.2.8 /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -5927,15 +5539,17 @@ packages: /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: false - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 object.assign: 4.1.4 + object.values: 1.1.7 dev: true /keygrip@1.1.0: @@ -5945,6 +5559,11 @@ packages: tsscmp: 1.0.6 dev: false + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -5955,8 +5574,8 @@ packages: engines: {node: '>=6'} dev: false - /kysely@0.26.1: - resolution: {integrity: sha512-FVRomkdZofBu3O8SiwAOXrwbhPZZr8mBN5ZeUWyprH29jzvy6Inzqbd0IMmGxpd4rcOCL9HyyBNWBa8FBqDAdg==} + /kysely@0.26.3: + resolution: {integrity: sha512-yWSgGi9bY13b/W06DD2OCDDHQmq1kwTGYlQ4wpZkMOJqMGCstVCFIvxCCVG4KfY1/3G0MhDAcZsip/Lw8/vJWw==} engines: {node: '>=14.0.0'} dev: false @@ -5964,8 +5583,9 @@ packages: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: true - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} dependencies: language-subtag-registry: 0.3.22 dev: true @@ -5984,7 +5604,7 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 @@ -6027,7 +5647,7 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 is-unicode-supported: 0.1.0 dev: true @@ -6043,18 +5663,12 @@ packages: js-tokens: 4.0.0 dev: true - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.4.1 - dev: false - /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -6079,8 +5693,8 @@ packages: hasBin: true dev: true - /magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -6105,7 +5719,7 @@ packages: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} dependencies: - '@types/minimist': 1.2.2 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -6187,14 +5801,11 @@ packages: kind-of: 6.0.3 dev: false - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /mixme@0.5.5: - resolution: {integrity: sha512-/6IupbRx32s7jjEwHcycXikJwFD5UujbVNuJFkeKLYje+92OvtuPniF6JhnFm5JCTDUhS+kYK3W/4BWYQYXz7w==} + /mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} dev: false @@ -6202,13 +5813,13 @@ packages: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false - /mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.1.2 + ufo: 1.3.1 dev: true /ms@2.0.0: @@ -6221,40 +5832,43 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msw@1.2.3(typescript@5.1.6): - resolution: {integrity: sha512-Fqy/TaLKR32x4IkMwudJHJysBzVM/v/lSoMPS9f3QaHLOmb3xHN9YurSUnRt+2eEvNXLjVPij1wMBQtLmTbKsg==} - engines: {node: '>=14'} + /msw@2.0.2(typescript@5.2.2): + resolution: {integrity: sha512-loyQnNUDY1x05R/t2naVdtNhP+tfyf+ckEwtvRUuoK9JnDeoh3/ZN3Fu2ZtvO/iJ3IwwuLizWwWaxBxS3sDQUw==} + engines: {node: '>=18'} hasBin: true requiresBuild: true peerDependencies: - typescript: '>= 4.4.x <= 5.1.x' + typescript: '>= 4.7.x <= 5.2.x' peerDependenciesMeta: typescript: optional: true dependencies: - '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.17.9 - '@open-draft/until': 1.0.3 + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/js-levenshtein': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@mswjs/cookies': 1.0.0 + '@mswjs/interceptors': 0.25.7 + '@open-draft/until': 2.1.0 '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.1 - chalk: 4.1.1 + '@types/js-levenshtein': 1.1.2 + '@types/statuses': 2.0.3 + chalk: 4.1.2 chokidar: 3.5.3 - cookie: 0.4.2 - graphql: 16.7.1 - headers-polyfill: 3.1.2 - inquirer: 8.2.5 + formdata-node: 4.4.1 + graphql: 16.8.1 + headers-polyfill: 4.0.2 + inquirer: 8.2.6 is-node-process: 1.2.0 js-levenshtein: 1.1.6 - node-fetch: 2.6.12 + node-fetch: 2.7.0 outvariant: 1.4.0 path-to-regexp: 6.2.1 - strict-event-emitter: 0.4.6 + strict-event-emitter: 0.5.1 type-fest: 2.19.0 - typescript: 5.1.6 + typescript: 5.2.2 yargs: 17.7.2 transitivePeerDependencies: - encoding - - supports-color dev: true /mute-stream@0.0.8: @@ -6283,22 +5897,20 @@ packages: engines: {node: '>= 0.6'} dev: false - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.4.1 - dev: false - - /node-abi@3.45.0: - resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} engines: {node: '>=10'} dependencies: semver: 7.5.4 dev: false - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -6317,7 +5929,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: false @@ -6335,15 +5947,15 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.5 + define-properties: 1.2.1 dev: true /object-keys@1.1.1: @@ -6354,50 +5966,50 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.5 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 - /object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} 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.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: - define-properties: 1.1.4 - es-abstract: 1.21.1 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -6439,9 +6051,9 @@ packages: engines: {node: '>=10'} dependencies: bl: 4.1.0 - chalk: 4.1.1 + chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.1 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -6511,13 +6123,6 @@ packages: engines: {node: '>=6'} dev: false - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.4.1 - dev: false - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -6528,7 +6133,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -6544,20 +6149,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.1 - dev: false - - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.4.1 - dev: false - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6617,12 +6208,12 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.4.0 + mlly: 1.4.2 pathe: 1.1.1 dev: true - /postcss@8.4.27: - resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -6641,7 +6232,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.45.0 + node-abi: 3.51.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -6649,8 +6240,8 @@ packages: tunnel-agent: 0.6.0 dev: false - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} engines: {node: '>=10'} dependencies: find-up: 5.0.0 @@ -6669,8 +6260,8 @@ packages: hasBin: true dev: false - /prettier@3.0.2: - resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} engines: {node: '>=14'} hasBin: true dev: false @@ -6684,20 +6275,11 @@ packages: react-is: 17.0.2 dev: true - /pretty-format@29.6.1: - resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.0 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -6737,8 +6319,8 @@ packages: once: 1.4.0 dev: false - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} /qs@6.11.0: @@ -6746,6 +6328,14 @@ packages: 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'} + dependencies: + side-channel: 1.0.4 + dev: true /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -6841,7 +6431,7 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: - '@types/normalize-package-data': 2.4.1 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -6851,20 +6441,12 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 dev: false - /readable-stream@3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -6872,7 +6454,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -6888,8 +6469,20 @@ packages: indent-string: 4.0.0 strip-indent: 3.0.0 - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 @@ -6899,48 +6492,35 @@ packages: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} - dependencies: - '@babel/runtime': 7.22.6 - dev: true + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 + '@babel/runtime': 7.23.2 dev: true - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 - /regexpu-core@5.2.2: - resolution: {integrity: sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==} + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: + '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsgen: 0.7.1 + regenerate-unicode-properties: 10.1.1 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 dev: true - /regjsgen@0.7.1: - resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==} - dev: true - /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -6948,8 +6528,8 @@ packages: jsesc: 0.5.0 dev: true - /remeda@1.24.0: - resolution: {integrity: sha512-tjLxwU4yLtvX8yHlePnE7CdQXRe2pKatlVY+AunqAQV5t9FNw1yuiIAqKpu6zevd+No5LQHEJ/HK3r3ZFK7KXg==} + /remeda@1.28.0: + resolution: {integrity: sha512-QANcfxsEiRCdiN8PQ7LsPQvW1qVFAO2x4dXEpuWbZKPrzzRG2BA0SXReDnhppD2YZKgLWA/bLpHq0ANenXea1w==} dev: false /require-directory@2.1.1: @@ -6977,36 +6557,19 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /resolve@1.22.3: - resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -7029,12 +6592,12 @@ packages: dependencies: glob: 7.2.3 - /rollup@3.27.2: - resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==} + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /rrweb-cssom@0.6.0: @@ -7054,15 +6617,15 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 @@ -7072,15 +6635,15 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} dev: false /saxes@6.0.0: @@ -7133,14 +6696,6 @@ packages: - supports-color dev: false - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.1 - upper-case-first: 2.0.2 - dev: false - /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -7157,9 +6712,22 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: true + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -7190,9 +6758,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -7222,21 +6790,14 @@ packages: engines: {node: '>=6'} hasBin: true dependencies: - array.prototype.flat: 1.3.1 - breakword: 1.0.5 + array.prototype.flat: 1.3.2 + breakword: 1.0.6 grapheme-splitter: 1.0.4 strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 15.4.1 dev: false - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.4.1 - dev: false - /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -7261,11 +6822,11 @@ packages: signal-exit: 3.0.7 dev: false - /spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.16 dev: false /spdx-exceptions@2.3.0: @@ -7276,24 +6837,17 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.16 dev: false - /spdx-license-ids@3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -7301,37 +6855,30 @@ packages: /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: false - /std-env@3.3.3: - resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + /std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} dev: true /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.5 + internal-slot: 1.0.6 dev: true /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: - mixme: 0.5.5 + mixme: 0.5.10 dev: false - /stream-transform@3.2.6: - resolution: {integrity: sha512-/pyOvaCQFqYTmrFhmMbnAEVo3SsTx1H39eUVPOtYeAgbEUc+rDo7GoP8LbHJgU83mKtzJe/7Nq/ipaAnUOHgJQ==} + /stream-transform@3.2.10: + resolution: {integrity: sha512-Yu+x7zcWbWdyB0Td8dFzHt2JEyD6694CNq2lqh1rbuEBVxPtjb/GZ7xDnZcdYiU5E/RtufM54ClSEOzZDeWguA==} dev: false - /strict-event-emitter@0.2.8: - resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} - dependencies: - events: 3.3.0 - dev: true - - /strict-event-emitter@0.4.6: - resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + /strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} dev: true /string-natural-compare@3.0.1: @@ -7346,40 +6893,41 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 - internal-slot: 1.0.4 - regexp.prototype.flags: 1.4.3 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 side-channel: 1.0.4 dev: true - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -7414,11 +6962,11 @@ packages: /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: true - /superagent@8.0.9: - resolution: {integrity: sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==} + /superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} dependencies: component-emitter: 1.3.0 @@ -7429,7 +6977,7 @@ packages: formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.0 + qs: 6.11.2 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -7440,7 +6988,7 @@ packages: engines: {node: '>=6.4.0'} dependencies: methods: 1.1.2 - superagent: 8.0.9 + superagent: 8.1.2 transitivePeerDependencies: - supports-color dev: true @@ -7502,8 +7050,8 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /tinybench@2.5.0: - resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + /tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} dev: true /tinypool@0.7.0: @@ -7511,8 +7059,8 @@ packages: engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.1.1: - resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} engines: {node: '>=14.0.0'} dev: true @@ -7543,7 +7091,7 @@ packages: engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 dev: true @@ -7556,7 +7104,7 @@ packages: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /trim-newlines@3.0.1: @@ -7564,13 +7112,13 @@ packages: engines: {node: '>=8'} dev: false - /ts-api-utils@1.0.1(typescript@5.1.6): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + /ts-api-utils@1.0.3(typescript@5.3.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.6 + typescript: 5.3.2 dev: false /tsconfig-paths@3.14.2: @@ -7585,41 +7133,38 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - dev: false - - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: false - /tsutils@3.21.0(typescript@5.1.6): + /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.1.6 + typescript: 5.2.2 dev: true - /tsx@3.12.7: - resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + /tsx@3.14.0: + resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} hasBin: true dependencies: - '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.1.0 - '@esbuild-kit/esm-loader': 2.5.5 + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + source-map-support: 0.5.21 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true - /tty-table@4.1.6: - resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} + /tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} engines: {node: '>=8.0.0'} hasBin: true dependencies: @@ -7678,8 +7223,8 @@ packages: engines: {node: '>=12.20'} dev: true - /type-fest@4.1.0: - resolution: {integrity: sha512-VJGJVepayd8OWavP+rgXt4i3bfLk+tSomTV7r4mca2XD/oTCWnkJlNkpXavkxdmtU2aKdAmFGeHvoQutOVHCZg==} + /type-fest@4.6.0: + resolution: {integrity: sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==} engines: {node: '>=16'} dev: true @@ -7695,15 +7240,15 @@ packages: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -7713,7 +7258,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -7721,27 +7266,38 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} engines: {node: '>=14.17'} hasBin: true + dev: false - /ufo@1.1.2: - resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + /ufo@1.3.1: + resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} dev: true /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -7780,33 +7336,21 @@ packages: engines: {node: '>= 0.8'} dev: false - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 dev: true - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - dependencies: - tslib: 2.4.1 - dev: false - - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - dependencies: - tslib: 2.4.1 - dev: false - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -7818,16 +7362,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - /utils-merge@1.0.1: resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} engines: {node: '>= 0.4.0'} @@ -7836,7 +7370,7 @@ packages: /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: - spdx-correct: 3.1.1 + spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: false @@ -7845,17 +7379,17 @@ packages: engines: {node: '>= 0.8'} dev: false - /vite-node@0.34.1(@types/node@18.17.2): - resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} + /vite-node@0.34.6(@types/node@18.18.8): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.4.0 + mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.8(@types/node@18.17.2) + vite: 4.5.0(@types/node@18.18.8) transitivePeerDependencies: - '@types/node' - less @@ -7867,8 +7401,8 @@ packages: - terser dev: true - /vite@4.4.8(@types/node@18.17.2): - resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} + /vite@4.5.0(@types/node@18.18.8): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -7895,16 +7429,16 @@ packages: terser: optional: true dependencies: - '@types/node': 18.17.2 - esbuild: 0.18.17 - postcss: 8.4.27 - rollup: 3.27.2 + '@types/node': 18.18.8 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true - /vitest@0.34.1(jsdom@22.1.0): - resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} + /vitest@0.34.6(jsdom@22.1.0): + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} engines: {node: '>=v14.18.0'} hasBin: true peerDependencies: @@ -7934,30 +7468,30 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 18.17.2 - '@vitest/expect': 0.34.1 - '@vitest/runner': 0.34.1 - '@vitest/snapshot': 0.34.1 - '@vitest/spy': 0.34.1 - '@vitest/utils': 0.34.1 - acorn: 8.10.0 - acorn-walk: 8.2.0 + '@types/chai': 4.3.9 + '@types/chai-subset': 1.3.4 + '@types/node': 18.18.8 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.11.2 + acorn-walk: 8.3.0 cac: 6.7.14 - chai: 4.3.7 + chai: 4.3.10 debug: 4.3.4 jsdom: 22.1.0 local-pkg: 0.4.3 - magic-string: 0.30.2 + magic-string: 0.30.5 pathe: 1.1.1 picocolors: 1.0.0 - std-env: 3.3.3 + std-env: 3.4.3 strip-literal: 1.3.0 - tinybench: 2.5.0 + tinybench: 2.5.1 tinypool: 0.7.0 - vite: 4.4.8(@types/node@18.17.2) - vite-node: 0.34.1(@types/node@18.17.2) + vite: 4.5.0(@types/node@18.18.8) + vite-node: 0.34.6(@types/node@18.18.8) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7981,12 +7515,9 @@ packages: dependencies: defaults: 1.0.4 - /web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} dev: true /webidl-conversions@3.0.1: @@ -8034,6 +7565,24 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: @@ -8043,8 +7592,8 @@ packages: is-weakset: 2.0.2 dev: true - /which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: false /which-pm@2.0.0: @@ -8055,12 +7604,12 @@ packages: path-exists: 4.0.0 dev: false - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -8095,7 +7644,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -8108,8 +7656,8 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -8178,7 +7726,7 @@ packages: require-main-filename: 2.0.0 set-blocking: 2.0.0 string-width: 4.2.3 - which-module: 2.0.0 + which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 dev: false @@ -8204,6 +7752,6 @@ packages: engines: {node: '>=12.20'} dev: true - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false diff --git a/tsconfig.json b/tsconfig.json index f72ec547..d8c6f8a1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "target": "es2020", "lib": ["es2020"], - "module": "ES2020", + "module": "Node16", "moduleResolution": "Node16", "noImplicitAny": true, "strict": true,