From 6ffb427e64f5bcc7633e6df65d4dd5c5ea6573a5 Mon Sep 17 00:00:00 2001 From: Thibault Reidy <147397675+ReidyT@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:29:37 +0200 Subject: [PATCH] deps(msw): migrates to v.2 (#389) * feat: mocks upload app settings files Co-authored-by: LinaYahya --- README.md | 59 ++- package.json | 2 +- src/mockServer/fixtures.ts | 2 + src/mockServer/msw/dexie-db.ts | 11 +- src/mockServer/msw/handlers.ts | 236 ++++++---- src/mockServer/msw/mock-img.png | Bin 0 -> 34615 bytes src/mockServer/msw/server.ts | 15 +- src/types.ts | 3 + yarn.lock | 772 ++++++++++++-------------------- 9 files changed, 506 insertions(+), 594 deletions(-) create mode 100644 src/mockServer/msw/mock-img.png diff --git a/README.md b/README.md index 9fce4b12..25c5e1b1 100644 --- a/README.md +++ b/README.md @@ -101,19 +101,16 @@ if (process.env.REACT_APP_ENABLE_MOCK_API === 'true') { ```js import { buildDatabase } from '@graasp/apps-query-client'; -Cypress.Commands.add( - 'setUpApi', - ({ currentMember = CURRENT_MEMBER, database = {}, appContext } = {}) => { - // mock api and database - Cypress.on('window:before:load', (win) => { - win.database = buildDatabase({ - members: Object.values(MEMBERS), - ...database, - }); - win.appContext = appContext; +Cypress.Commands.add('setUpApi', ({ currentMember = CURRENT_MEMBER, database = {}, appContext } = {}) => { + // mock api and database + Cypress.on('window:before:load', (win) => { + win.database = buildDatabase({ + members: Object.values(MEMBERS), + ...database, }); - }, -); + win.appContext = appContext; + }); +}); ``` 3. Then in all your tests you will need to set up the database and context. The default values are configured so you can easily mount an empty and operational database. @@ -131,3 +128,41 @@ cy.setUpApi({ }, }); ``` + +### Mock Uploaded files + +If you need to have files in the mocked server, you can use the `uploadedFiles` array of the `setupApi`. The following are steps to follow if you want to upload and retrieve a file for an app. + +1. Create a new `AppSetting` and add it in the `appSettings` array of the `setupApi` (in the Cypress test of the frontend). + +```ts +// MOCK_FILE_APP_SETTING +{ + id: mockFileSettingId, + name: 'file', // should be named `file`! Do not change it! + data: { + path: `apps/app-setting/${item.id}/${mockFileSettingId}`, // This path should be mocked in the MSW! If you want to use another path, you just have to mock it. + }, + item, + creator, + createdAt, + updatedAt, +}; +``` + +2. Load a file and transform it into a `File` type. With Cypress, have a look to `cy.fixtures` (put the `setupApi` in the `then` callback). +3. Add the loaded file in the array. + +```ts +uploadedFiles: [ + { + id: MOCK_FILE_APP_SETTING.id, + file, + }, +], +``` + +4. Use the mocked route `GET /app-items/app-settings/:appSettingId/download` (or your mocked route) to retrieve the path of the file. +5. Use the result of the previous request to download the file. In this example, it's the route `GET /download-app-setting-url/:appSettingId`. + +Another solution could be to upload your file from the Cypress test, by using the route `/app-items/app-settings-/upload?id=:itemId` for example. diff --git a/package.json b/package.json index 3133ccd7..de20606e 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "dexie": "4.0.8", "http-status-codes": "2.3.0", "miragejs": "0.1.48", - "msw": "1.3.3", + "msw": "2.3.5", "uuid": "10.0.0" }, "devDependencies": { diff --git a/src/mockServer/fixtures.ts b/src/mockServer/fixtures.ts index 08904a81..fa3e4181 100644 --- a/src/mockServer/fixtures.ts +++ b/src/mockServer/fixtures.ts @@ -58,10 +58,12 @@ export const buildDatabase = ({ appSettings = [], members = [MOCK_SERVER_MEMBER], items = [MOCK_SERVER_ITEM], + uploadedFiles = [], }: Partial = {}): Database => ({ appData, appActions, appSettings, members, items, + uploadedFiles, }); diff --git a/src/mockServer/msw/dexie-db.ts b/src/mockServer/msw/dexie-db.ts index 411f07fe..18105292 100644 --- a/src/mockServer/msw/dexie-db.ts +++ b/src/mockServer/msw/dexie-db.ts @@ -2,7 +2,7 @@ import { AppAction, AppData, AppSetting, DiscriminatedItem, Member } from '@graa import Dexie from 'dexie'; -import { Database, LocalContext } from '../../types'; +import { Database, LocalContext, MockUploadedFile } from '../../types'; type OptionalIndexed = { [Key in keyof T as Key extends P ? Key : never]?: T[Key]; @@ -27,6 +27,8 @@ export class AppMocks extends Dexie { appAction!: Dexie.Table; + uploadedFiles!: Dexie.Table; + constructor(name?: string) { super(name ?? 'graasp-app-mocks'); @@ -42,6 +44,10 @@ export class AppMocks extends Dexie { appSetting: 'id, item.id, name', appAction: 'id, memberId', }); + + this.version(2).stores({ + uploadedFiles: 'id', + }); } seed(data: Partial & { appContext?: LocalContext }): void { @@ -64,6 +70,9 @@ export class AppMocks extends Dexie { if (data.appActions?.length) { this.appAction.bulkAdd(data.appActions); } + if (data.uploadedFiles?.length) { + this.uploadedFiles.bulkAdd(data.uploadedFiles); + } } resetDB(data?: Partial & { appContext?: LocalContext }): void { diff --git a/src/mockServer/msw/handlers.ts b/src/mockServer/msw/handlers.ts index bb688e16..23d7c880 100644 --- a/src/mockServer/msw/handlers.ts +++ b/src/mockServer/msw/handlers.ts @@ -8,10 +8,10 @@ import { PermissionLevel, } from '@graasp/sdk'; -import { RestHandler, rest } from 'msw'; +import { HttpResponse, RequestHandler, http } from 'msw'; import { v4 } from 'uuid'; -import { API_ROUTES } from '../../api/routes'; +import { API_ROUTES, buildUploadAppSettingFilesRoute } from '../../api/routes'; import { Database, LocalContext, MockAppSetting } from '../../types'; import { AppMocks } from './dexie-db'; @@ -25,6 +25,7 @@ const { // todo: implement mock file upload // eslint-disable-next-line @typescript-eslint/no-unused-vars buildDownloadAppDataFileRoute, + buildDownloadAppSettingFileRoute, buildGetAppActionsRoute, buildGetAppSettingsRoute, buildPatchAppSettingRoute, @@ -48,10 +49,13 @@ export const buildMSWMocks = ( appContext: LocalContext, database?: Database, dbName?: string, -): { handlers: RestHandler[]; db: AppMocks } => { +): { handlers: RequestHandler[]; db: AppMocks } => { const { apiHost } = appContext; const db = new AppMocks(dbName); + const buildAppSettingDownloadUrl = (id: string): string => + `${apiHost}/download-app-setting-url/${id}`; + const getPermissionForMember = async (memberId: string): Promise => { const localContextForMember = await db.appContext.get(memberId); if (!localContextForMember) { @@ -83,11 +87,11 @@ export const buildMSWMocks = ( // ************************* // GET /app-items/:itemId/app-data - rest.get(`${apiHost}/${buildGetAppDataRoute(':itemId')}`, async (req, res, ctx) => { - const reqItemId = req.params.itemId; - const dataType = new URL(req.url).searchParams.get('type'); + http.get(`${apiHost}/${buildGetAppDataRoute(':itemId')}`, async ({ params, request }) => { + const reqItemId = params.itemId; + const dataType = new URL(request.url).searchParams.get('type'); - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const permission = await getPermissionForMember(memberId); let value; if (permission === PermissionLevel.Admin) { @@ -115,21 +119,21 @@ export const buildMSWMocks = ( .toArray(); } - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }), // POST /app-items/:itemId/app-data - rest.post( + http.post( `${apiHost}/${buildPostAppDataRoute({ itemId: ':itemId' })}`, - async (req, res, ctx) => { - const reqItemId = req.params.itemId; + async ({ request, params }) => { + const reqItemId = params.itemId; const item = await getItemFromId(reqItemId as string); - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const member = await getMemberFromId(memberId); - const body: Pick & { + const body = (await request.json()) as Pick & { visibility?: AppData['visibility']; - } = await req.json(); + }; const appData: AppData = { id: v4(), @@ -144,19 +148,19 @@ export const buildMSWMocks = ( const newId = await db.appData.add(appData); const value = await db.appData.get(newId); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), // PATCH /app-items/:itemId/app-data/:id - rest.patch( + http.patch( `${apiHost}/${buildPatchAppDataRoute({ itemId: ':itemId', id: ':id' })}`, - async (req, res, ctx) => { - const { id } = req.params; + async ({ params, request }) => { + const { id } = params; - const body: Pick & { + const body = (await request.json()) as Pick & { visibility?: AppData['visibility']; - } = await req.json(); + }; const appData: Partial = { updatedAt: new Date().toISOString(), @@ -165,20 +169,20 @@ export const buildMSWMocks = ( await db.appData.update(id as string, appData); const value = await db.appData.get(id as string); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), // DELETE /app-items/:itemId/app-data/:id - rest.delete( + http.delete( `${apiHost}/${buildDeleteAppDataRoute({ itemId: ':itemId', id: ':id' })}`, - async (req, res, ctx) => { - const { id } = req.params; + async ({ params }) => { + const { id } = params; const value = await db.appData.get(id as string); await db.appData.delete(id as string); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), @@ -187,10 +191,10 @@ export const buildMSWMocks = ( // ************************* // GET /app-items/:itemId/app-settings - rest.get(`${apiHost}/${buildGetAppSettingsRoute(':itemId')}`, async (req, res, ctx) => { - const reqItemId = req.params.itemId; + http.get(`${apiHost}/${buildGetAppSettingsRoute(':itemId')}`, async ({ params, request }) => { + const reqItemId = params.itemId; - const url = new URL(req.url); + const url = new URL(request.url); const settingName = url.searchParams.get('name'); const value = await db.appSetting @@ -199,25 +203,25 @@ export const buildMSWMocks = ( // filter settings and return only setting with the given name if parameter was set otherwise return everything .and((x) => (settingName ? x.name === settingName : true)) .toArray(); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }), // POST /app-items/:itemId/app-settings - rest.post( + http.post( `${apiHost}/${buildPostAppSettingRoute({ itemId: ':itemId' })}`, - async (req, res, ctx) => { - const reqItemId = req.params.itemId; + async ({ params, request }) => { + const reqItemId = params.itemId; const item = await getItemFromId(reqItemId as string); - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const member = await getMemberFromId(memberId); const permission = await getPermissionForMember(memberId); // when member is not an admin -> return an error if (PermissionLevel.Admin !== permission) { - return res(ctx.status(403), ctx.json({ message: 'member can not admin' })); + return new HttpResponse('member can not admin', { status: 403 }); } - const body: Pick = await req.json(); + const body = (await request.json()) as Pick; const appSetting: AppSetting = { id: v4(), createdAt: new Date().toISOString(), @@ -229,28 +233,28 @@ export const buildMSWMocks = ( const newId = await db.appSetting.add(appSetting); const value = await db.appSetting.get(newId); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), // PATCH /app-items/:itemId/app-settings/:id - rest.patch( + http.patch( `${apiHost}/${buildPatchAppSettingRoute({ itemId: ':itemId', id: ':id', })}`, - async (req, res, ctx) => { - const { id } = req.params; + async ({ params, request }) => { + const { id } = params; - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const permission = await getPermissionForMember(memberId); // when member is not an admin -> return an error if (PermissionLevel.Admin !== permission) { - return res(ctx.status(403), ctx.json({ message: 'member can not admin' })); + return new HttpResponse('member can not admin', { status: 403 }); } - const body: Pick = await req.json(); + const body = (await request.json()) as Pick; const appSetting: Partial = { updatedAt: new Date().toISOString(), ...body, @@ -258,41 +262,118 @@ export const buildMSWMocks = ( await db.appSetting.update(id as string, appSetting); const value = await db.appSetting.get(id as string); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), // DELETE /app-items/:itemId/app-setting/:id - rest.delete( + http.delete( `${apiHost}/${buildDeleteAppSettingRoute({ itemId: ':itemId', id: ':id', })}`, - async (req, res, ctx) => { - const { id } = req.params; + async ({ params, request }) => { + const { id } = params; - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const permission = await getPermissionForMember(memberId); // when member is not an admin -> return an error if (PermissionLevel.Admin !== permission) { - return res(ctx.status(403), ctx.json({ message: 'member can not admin' })); + return new HttpResponse('member can not admin', { status: 403 }); } const value = await db.appSetting.get(id as string); await db.appSetting.delete(id as string); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), + // mock upload file + http.post(`${apiHost}/${buildUploadAppSettingFilesRoute(':id')}`, async ({ request }) => { + const url = new URL(request.url); + const itemId = url.searchParams.get('id'); + + const data = await request.formData(); + const file = data.get('file'); + + if (!file) { + return new HttpResponse('Missing document', { status: 400 }); + } + + if (!(file instanceof File)) { + return new HttpResponse('Uploaded document is not a File', { + status: 400, + }); + } + + const item = await getItemFromId(itemId as string); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); + const member = await getMemberFromId(memberId); + const permission = await getPermissionForMember(memberId); + + // when member is not an admin -> return an error + if (PermissionLevel.Admin !== permission) { + return new HttpResponse('member can not admin', { status: 403 }); + } + + const appSettingId = v4(); + const path = `apps/app-setting/${item.id}/${appSettingId}`; + const appSetting: AppSetting = { + id: appSettingId, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + item, + creator: member, + name: 'file', + data: { + path, + }, + }; + const newId = await db.appSetting.add(appSetting); + const value = await db.appSetting.get(newId); + + // save the file in the mocked database + await db.uploadedFiles.add({ id: appSettingId, file }); + + return HttpResponse.json(value); + }), + // GET /app-items/app-settings/:appSettingId/download + http.get( + `${apiHost}/${buildDownloadAppSettingFileRoute(':appSettingId')}`, + async ({ params }) => { + const { appSettingId } = params; + const url = buildAppSettingDownloadUrl(appSettingId as string); + + return HttpResponse.text(url); + }, + ), + // GET /download-app-setting-url/:id + http.get(`${buildAppSettingDownloadUrl(':appSettingId')}`, async ({ params }) => { + const { appSettingId } = params; + + try { + // retrieve the file from the mocked db (in prod, it's retrieving the path on AWS) + const res = await db.uploadedFiles.get(appSettingId as string); + if (!res) { + throw new Error('The file was not found'); + } + + return new HttpResponse(res.file); + } catch (e) { + console.error(e); + return HttpResponse.json({ error: 'file not found' }, { status: 404 }); + } + }), + // ************************* // App Action // ************************* // GET /app-items/:itemId/app-action - rest.get(`${apiHost}/${buildGetAppActionsRoute(':itemId')}`, async (req, res, ctx) => { - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + http.get(`${apiHost}/${buildGetAppActionsRoute(':itemId')}`, async ({ request }) => { + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const permission = await getPermissionForMember(memberId); let value; switch (permission) { @@ -307,19 +388,19 @@ export const buildMSWMocks = ( value = await db.appAction.where('memberId').equals(memberId).toArray(); break; } - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }), // POST /app-items/:itemId/app-action - rest.post( + http.post( `${apiHost}/${buildPostAppActionRoute({ itemId: ':itemId' })}`, - async (req, res, ctx) => { - const reqItemId = req.params.itemId; + async ({ params, request }) => { + const reqItemId = params.itemId; const item = await getItemFromId(reqItemId as string); - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const member = await getMemberFromId(memberId); - const body: Pick = await req.json(); + const body = (await request.json()) as Pick; const appAction: AppAction = { id: v4(), createdAt: new Date().toISOString(), @@ -329,7 +410,7 @@ export const buildMSWMocks = ( }; const value = await db.appAction.add(appAction); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }, ), @@ -337,49 +418,48 @@ export const buildMSWMocks = ( // App Context // ************************* // /app-items/:itemId/context - rest.get(`${apiHost}/${buildGetContextRoute(':itemId')}`, async (req, res, ctx) => { - const { itemId: reqItemId } = req.params; + http.get(`${apiHost}/${buildGetContextRoute(':itemId')}`, async ({ params }) => { + const { itemId: reqItemId } = params; const value = { members: await db.member.toArray(), ...(await db.item.get(reqItemId as string)), }; - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }), // ************************* // Chatbot // ************************* // /app-items/:itemId/chat-bot - rest.post(`${apiHost}/${buildPostChatBotRoute(':itemId')}`, async (_req, res, ctx) => - res( - ctx.status(200), - ctx.json({ completion: 'biiip boop I am a chatbot', model: 'fake-gpt' }), - ), + http.post(`${apiHost}/${buildPostChatBotRoute(':itemId')}`, async () => + HttpResponse.json({ completion: 'biiip boop I am a chatbot', model: 'fake-gpt' }), ), // plumbing - rest.delete('/__mocks/reset', (_req, res, ctx) => { + http.delete('/__mocks/reset', () => { db.resetDB({ ...database, appContext }); - return res(ctx.status(200)); + return new HttpResponse(); }), - rest.post('/__mocks/seed', async (req, res, ctx) => { - const seedData = await req.json(); + http.post('/__mocks/seed', async ({ request }) => { + const seedData = (await request.json()) as { data?: Partial } & { + appContext?: LocalContext; + }; db.resetDB(seedData); - return res(ctx.status(200)); + return new HttpResponse(); }), - rest.get('/__mocks/context', async (req, res, ctx) => { - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); + http.get('/__mocks/context', async ({ request }) => { + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); const value = await db.appContext.where('memberId').equals(memberId).first(); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }), - rest.post('/__mocks/context', async (req, res, ctx) => { - const memberId = getMemberIdFromToken(req.headers.get('Authorization')); - const body: Partial = await req.json(); + http.post('/__mocks/context', async ({ request }) => { + const memberId = getMemberIdFromToken(request.headers.get('Authorization')); + const body = (await request.json()) as Partial; await db.appContext.update(memberId, body); const value = await db.appContext.where('memberId').equals(memberId).first(); - return res(ctx.status(200), ctx.json(value)); + return HttpResponse.json(value); }), ]; diff --git a/src/mockServer/msw/mock-img.png b/src/mockServer/msw/mock-img.png new file mode 100644 index 0000000000000000000000000000000000000000..678e539471d0a9924a41b0aea69377e20d73f7fd GIT binary patch literal 34615 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 E2Uy@aNdN!< literal 0 HcmV?d00001 diff --git a/src/mockServer/msw/server.ts b/src/mockServer/msw/server.ts index 8818b4e3..0635ae2a 100644 --- a/src/mockServer/msw/server.ts +++ b/src/mockServer/msw/server.ts @@ -1,4 +1,4 @@ -import { SetupWorker, setupWorker } from 'msw'; +import { SetupWorker, setupWorker } from 'msw/browser'; import { Database, LocalContext } from '../../types'; import { buildMockLocalContext } from '../fixtures'; @@ -22,21 +22,24 @@ export const mockServiceWorkerServer = ({ if (database) { // seed database with data console.debug('Populating the DB with provided mock data'); - if (database.items.length) { + if (database.items?.length) { transaction.table('item').bulkAdd(database?.items); } - if (database.members.length) { + if (database.members?.length) { transaction.table('member').bulkAdd(database.members); } - if (database.appData.length) { + if (database.appData?.length) { transaction.table('appData').bulkAdd(database.appData); } - if (database.appActions.length) { + if (database.appActions?.length) { transaction.table('appAction').bulkAdd(database.appActions); } - if (database.appSettings.length) { + if (database.appSettings?.length) { transaction.table('appSetting').bulkAdd(database.appSettings); } + if (database.uploadedFiles?.length) { + transaction.table('uploadedFiles').bulkAdd(database.uploadedFiles); + } transaction.table('appContext').add(fullAppContext, fullAppContext.memberId); } else { console.debug('There was no data to populate the database'); diff --git a/src/types.ts b/src/types.ts index ff44a162..2cf2c654 100644 --- a/src/types.ts +++ b/src/types.ts @@ -97,6 +97,7 @@ export type MockAppSetting = Omit & { itemId: string; creatorId: string; }; +export type MockUploadedFile = { id: string; file: File }; export interface Database { appData: AppData[]; @@ -105,6 +106,8 @@ export interface Database { // we pass the members as `CompleteMember` to be able to access all their properties, but they will be exposed as `Member` members: CompleteMember[]; items: DiscriminatedItem[]; + // allows to mock uploaded files normally stored in AWS + uploadedFiles: MockUploadedFile[]; } export type ChatBotCompletion = { diff --git a/yarn.lock b/yarn.lock index 3353d73e..56673808 100644 --- a/yarn.lock +++ b/yarn.lock @@ -458,6 +458,34 @@ __metadata: languageName: node linkType: hard +"@bundled-es-modules/cookie@npm:^2.0.0": + version: 2.0.0 + resolution: "@bundled-es-modules/cookie@npm:2.0.0" + dependencies: + cookie: "npm:^0.5.0" + checksum: 10/c8ef02aa5d3f6c786cfa407e1c93b4af29c600eb09990973f47a7a49e4771c1bec37c8f8e567638bb9cbc41f4e38d065ff1d8eaf9bf91f0c3613a6d60bc82c8c + languageName: node + linkType: hard + +"@bundled-es-modules/statuses@npm:^1.0.1": + version: 1.0.1 + resolution: "@bundled-es-modules/statuses@npm:1.0.1" + dependencies: + statuses: "npm:^2.0.1" + checksum: 10/9bf6a2bcf040a66fb805da0e1446041fd9def7468bb5da29c5ce02adf121a3f7cec123664308059a62a46fcaee666add83094b76df6dce72e5cafa8e6bebe60d + languageName: node + linkType: hard + +"@bundled-es-modules/tough-cookie@npm:^0.1.6": + version: 0.1.6 + resolution: "@bundled-es-modules/tough-cookie@npm:0.1.6" + dependencies: + "@types/tough-cookie": "npm:^4.0.5" + tough-cookie: "npm:^4.1.4" + checksum: 10/4f24a820f02c08c3ca0ff21272317357152093f76f9c8cc182517f61fa426ae53dadc4d68a3d6da5078e8d73f0ff8c0907a9f994c0be756162ba9c7358533e57 + languageName: node + linkType: hard + "@commitlint/cli@npm:19.3.0": version: 19.3.0 resolution: "@commitlint/cli@npm:19.3.0" @@ -1293,7 +1321,7 @@ __metadata: http-status-codes: "npm:2.3.0" husky: "npm:9.1.4" miragejs: "npm:0.1.48" - msw: "npm:1.3.3" + msw: "npm:2.3.5" nock: "npm:13.5.4" prettier: "npm:3.3.3" react: "npm:18.3.1" @@ -1347,6 +1375,53 @@ __metadata: languageName: node linkType: hard +"@inquirer/confirm@npm:^3.0.0": + version: 3.1.22 + resolution: "@inquirer/confirm@npm:3.1.22" + dependencies: + "@inquirer/core": "npm:^9.0.10" + "@inquirer/type": "npm:^1.5.2" + checksum: 10/14e547ae3194c6447d41bb87135c03aa5598fd340fced19e4e8bae1be4ae54a9ad3cf335a9c3c6dc54e2ffb7928319e0f4b428531b8ce720cd23d2444292ca36 + languageName: node + linkType: hard + +"@inquirer/core@npm:^9.0.10": + version: 9.0.10 + resolution: "@inquirer/core@npm:9.0.10" + dependencies: + "@inquirer/figures": "npm:^1.0.5" + "@inquirer/type": "npm:^1.5.2" + "@types/mute-stream": "npm:^0.0.4" + "@types/node": "npm:^22.1.0" + "@types/wrap-ansi": "npm:^3.0.0" + ansi-escapes: "npm:^4.3.2" + cli-spinners: "npm:^2.9.2" + cli-width: "npm:^4.1.0" + mute-stream: "npm:^1.0.0" + signal-exit: "npm:^4.1.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10/1bcb1deb7393d78f2dac5b8774d10692ad50b70e3ebc24684d13259d0c6c863dd1bce8ab4d4a806a6e90d5a2517aa8f9981993b1a256c9be68d9ef5e748481c6 + languageName: node + linkType: hard + +"@inquirer/figures@npm:^1.0.5": + version: 1.0.5 + resolution: "@inquirer/figures@npm:1.0.5" + checksum: 10/60a51b2cdef03c89be25071c23d8c4ae427c56d8ac1b00bf054ca7be446674adc4edd66c15465fe6a81ff0726b024bf37f8a2903a8387ef968d33058da3e7a15 + languageName: node + linkType: hard + +"@inquirer/type@npm:^1.5.2": + version: 1.5.2 + resolution: "@inquirer/type@npm:1.5.2" + dependencies: + mute-stream: "npm:^1.0.0" + checksum: 10/90d9203b5d7da8530e210c5421630b577f24554c8b683a4b45ea0f5c6a89c451771170aa34f2b62ca57e4be4de41d6761c941475e25c54c82b527c05644f181f + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -1508,29 +1583,17 @@ __metadata: languageName: node linkType: hard -"@mswjs/cookies@npm:^0.2.2": - version: 0.2.2 - resolution: "@mswjs/cookies@npm:0.2.2" +"@mswjs/interceptors@npm:^0.29.0": + version: 0.29.1 + resolution: "@mswjs/interceptors@npm:0.29.1" dependencies: - "@types/set-cookie-parser": "npm:^2.4.0" - set-cookie-parser: "npm:^2.4.6" - checksum: 10/f1b3b82a6821219494390d77d86383febc5f9d5bc21b0f47cc4d57d11af08cac1952d845011d8842ec6448a95e49efd0f35f6d56650c76a98848d70d9c78466d - languageName: node - linkType: hard - -"@mswjs/interceptors@npm:^0.17.10": - version: 0.17.10 - resolution: "@mswjs/interceptors@npm:0.17.10" - dependencies: - "@open-draft/until": "npm:^1.0.3" - "@types/debug": "npm:^4.1.7" - "@xmldom/xmldom": "npm:^0.8.3" - debug: "npm:^4.3.3" - headers-polyfill: "npm:3.2.5" + "@open-draft/deferred-promise": "npm:^2.2.0" + "@open-draft/logger": "npm:^0.3.0" + "@open-draft/until": "npm:^2.0.0" + is-node-process: "npm:^1.2.0" outvariant: "npm:^1.2.1" - strict-event-emitter: "npm:^0.2.4" - web-encoding: "npm:^1.1.5" - checksum: 10/0bbadfc3c925016d9f26f5bc0aa8833a1ec0065a04933c30f5d7b1f636f39c3458f5dc653d6418e5733523846626e84049a72ec913f70282d7b53bfef2a1aa81 + strict-event-emitter: "npm:^0.5.1" + checksum: 10/6a6ee6eb3db0fed60bbeb710288f8c1e2cac84f08254756b684dbd553b04449dfe4cce1261fcc83772ee114be2043d9777e2ee6d72bc8d14fd394f961827e528 languageName: node linkType: hard @@ -1737,10 +1800,27 @@ __metadata: languageName: node linkType: hard -"@open-draft/until@npm:^1.0.3": - version: 1.0.3 - resolution: "@open-draft/until@npm:1.0.3" - checksum: 10/323e92ebef0150ed0f8caedc7d219b68cdc50784fa4eba0377eef93533d3f46514eb2400ced83dda8c51bddc3d2c7b8e9cf95e5ec85ab7f62dfc015d174f62f2 +"@open-draft/deferred-promise@npm:^2.2.0": + version: 2.2.0 + resolution: "@open-draft/deferred-promise@npm:2.2.0" + checksum: 10/bc3bb1668a555bb87b33383cafcf207d9561e17d2ca0d9e61b7ce88e82b66e36a333d3676c1d39eb5848022c03c8145331fcdc828ba297f88cb1de9c5cef6c19 + languageName: node + linkType: hard + +"@open-draft/logger@npm:^0.3.0": + version: 0.3.0 + resolution: "@open-draft/logger@npm:0.3.0" + dependencies: + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.0" + checksum: 10/7a280f170bcd4e91d3eedbefe628efd10c3bd06dd2461d06a7fdbced89ef457a38785847f88cc630fb4fd7dfa176d6f77aed17e5a9b08000baff647433b5ff78 + languageName: node + linkType: hard + +"@open-draft/until@npm:^2.0.0, @open-draft/until@npm:^2.1.0": + version: 2.1.0 + resolution: "@open-draft/until@npm:2.1.0" + checksum: 10/622be42950afc8e89715d0fd6d56cbdcd13e36625e23b174bd3d9f06f80e25f9adf75d6698af93bca1e1bf465b9ce00ec05214a12189b671fb9da0f58215b6f4 languageName: node linkType: hard @@ -2219,19 +2299,10 @@ __metadata: languageName: node linkType: hard -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 10/427c9220217d3d74f3e5d53d68cd39502f3bbebdb1af4ecf0d05076bcbe9ddab299ad6369fe0f517389296ba4ca49ddf9a8c22f68e5e9eb8ae6d0076cfab90b2 - languageName: node - linkType: hard - -"@types/debug@npm:^4.1.7": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "npm:*" - checksum: 10/47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 +"@types/cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "@types/cookie@npm:0.6.0" + checksum: 10/b883348d5bf88695fbc2c2276b1c49859267a55cae3cf11ea1dccc1b3be15b466e637ce3242109ba27d616c77c6aa4efe521e3d557110b4fdd9bc332a12445c2 languageName: node linkType: hard @@ -2242,13 +2313,6 @@ __metadata: languageName: node linkType: hard -"@types/js-levenshtein@npm:^1.1.1": - version: 1.1.3 - resolution: "@types/js-levenshtein@npm:1.1.3" - checksum: 10/eb338696da976925ea8448a42d775d7615a14323dceeb08909f187d0b3d3b4c1f67a1c36ef586b1c2318b70ab141bba8fc58311ba1c816711704605aec09db8b - languageName: node - linkType: hard - "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -2256,10 +2320,12 @@ __metadata: languageName: node linkType: hard -"@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: 10/f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a +"@types/mute-stream@npm:^0.0.4": + version: 0.0.4 + resolution: "@types/mute-stream@npm:0.0.4" + dependencies: + "@types/node": "npm:*" + checksum: 10/af8d83ad7b68ea05d9357985daf81b6c9b73af4feacb2f5c2693c7fd3e13e5135ef1bd083ce8d5bdc8e97acd28563b61bb32dec4e4508a8067fcd31b8a098632 languageName: node linkType: hard @@ -2281,6 +2347,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.1.0": + version: 22.3.0 + resolution: "@types/node@npm:22.3.0" + dependencies: + undici-types: "npm:~6.18.2" + checksum: 10/c31a798ed722a7417727f018ea6d621db038a613c626da643174cc6f3dcf4ce2fc9933a010aec289103d9564da2c2f9b054c9aa398828f00e17269a78c64d4ec + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -2348,12 +2423,17 @@ __metadata: languageName: node linkType: hard -"@types/set-cookie-parser@npm:^2.4.0": - version: 2.4.7 - resolution: "@types/set-cookie-parser@npm:2.4.7" - dependencies: - "@types/node": "npm:*" - checksum: 10/01ef803e24b8cd33e49fe7463f32a562da45ce3f960381b90cccf67ea71b1830d2273df044255b040069c0a92ea25b4bf21c39ac2f85b50c01818ded5e918554 +"@types/statuses@npm:^2.0.4": + version: 2.0.5 + resolution: "@types/statuses@npm:2.0.5" + checksum: 10/3f2609f660b45a878c6782f2fb2cef9f08bbd4e89194bf7512e747b8a73b056839be1ad6f64b1353765528cd8a5e93adeffc471cde24d0d9f7b528264e7154e5 + languageName: node + linkType: hard + +"@types/tough-cookie@npm:^4.0.5": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 10/01fd82efc8202670865928629697b62fe9bf0c0dcbc5b1c115831caeb073a2c0abb871ff393d7df1ae94ea41e256cb87d2a5a91fd03cdb1b0b4384e08d4ee482 languageName: node linkType: hard @@ -2364,6 +2444,13 @@ __metadata: languageName: node linkType: hard +"@types/wrap-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/wrap-ansi@npm:3.0.0" + checksum: 10/8aa644946ca4e859668c36b8e2bcf2ac4bdee59dac760414730ea57be8a93ae9166ebd40a088f2ab714843aaea2a2a67f0e6e6ec11cfc9c8701b2466ca1c4089 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" @@ -2675,20 +2762,6 @@ __metadata: languageName: node linkType: hard -"@xmldom/xmldom@npm:^0.8.3": - version: 0.8.10 - resolution: "@xmldom/xmldom@npm:0.8.10" - checksum: 10/62400bc5e0e75b90650e33a5ceeb8d94829dd11f9b260962b71a784cd014ddccec3e603fe788af9c1e839fa4648d8c521ebd80d8b752878d3a40edabc9ce7ccf - languageName: node - linkType: hard - -"@zxing/text-encoding@npm:0.9.0": - version: 0.9.0 - resolution: "@zxing/text-encoding@npm:0.9.0" - checksum: 10/268e4ef64b8eaa32b990240bdfd1f7b3e2b501a6ed866a565f7c9747f04ac884fbe0537fe12bb05d9241b98fb111270c0fd0023ef0a02d23a6619b4589e98f6b - languageName: node - linkType: hard - "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -2835,7 +2908,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": +"ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -3160,13 +3233,6 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10/669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - "binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" @@ -3174,17 +3240,6 @@ __metadata: languageName: node linkType: hard -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: "npm:^5.5.0" - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.4.0" - checksum: 10/b7904e66ed0bdfc813c06ea6c3e35eafecb104369dbf5356d0f416af90c1546de3b74e5b63506f0629acf5e16a6f87c3798f16233dcff086e9129383aa02ab55 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -3227,16 +3282,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10/997434d3c6e3b39e0be479a80288875f71cd1c07d75a3855e6f08ef848a3c966023f79534e22e415ff3a5112708ce06127277ab20e527146d55c84566405c7c6 - languageName: node - linkType: hard - "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -3315,7 +3360,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -3332,13 +3377,6 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 10/b0ec668fba5eeec575ed2559a0917ba41a6481f49063c8445400e476754e0957ee09e44dc032310f526182b8f1bf25e9d4ed371f74050af7be1383e06bc44952 - languageName: node - linkType: hard - "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -3346,7 +3384,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.1": +"chokidar@npm:^3.5.1": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -3379,26 +3417,17 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: "npm:^3.1.0" - checksum: 10/2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": +"cli-spinners@npm:^2.9.2": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" checksum: 10/a0a863f442df35ed7294424f5491fa1756bd8d2e4ff0c8736531d886cec0ece4d85e8663b77a5afaf1d296e3cbbebff92e2e99f52bbea89b667cbe789b994794 languageName: node linkType: hard -"cli-width@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-width@npm:3.0.0" - checksum: 10/8730848b04fb189666ab037a35888d191c8f05b630b1d770b0b0e4c920b47bb5cc14bddf6b8ffe5bfc66cee97c8211d4d18e756c1ffcc75d7dbe7e1186cd7826 +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10/b58876fbf0310a8a35c79b72ecfcf579b354e18ad04e6b20588724ea2b522799a758507a37dfe132fafaf93a9922cafd9514d9e1598e6b2cd46694853aed099f languageName: node linkType: hard @@ -3413,13 +3442,6 @@ __metadata: languageName: node linkType: hard -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10/d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd - languageName: node - linkType: hard - "clsx@npm:^2.1.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" @@ -3573,10 +3595,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:^0.4.2": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: 10/2e1de9fdedca54881eab3c0477aeb067f281f3155d9cfee9d28dfb252210d09e85e9d175c0a60689661feb9e35e588515352f2456bc1f8e8db4267e05fd70137 +"cookie@npm:^0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 10/aae7911ddc5f444a9025fbd979ad1b5d60191011339bce48e555cb83343d0f98b865ff5c4d71fecdfb8555a5cafdc65632f6fce172f32aaf6936830a883a0380 languageName: node linkType: hard @@ -3718,7 +3740,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3803,15 +3825,6 @@ __metadata: languageName: node linkType: hard -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: "npm:^1.0.2" - checksum: 10/3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a - languageName: node - linkType: hard - "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -4714,13 +4727,6 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.3.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be - languageName: node - linkType: hard - "execa@npm:^8.0.1": version: 8.0.1 resolution: "execa@npm:8.0.1" @@ -4745,17 +4751,6 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: "npm:^0.7.0" - iconv-lite: "npm:^0.4.24" - tmp: "npm:^0.0.33" - checksum: 10/776dff1d64a1d28f77ff93e9e75421a81c062983fd1544279d0a32f563c0b18c52abbb211f31262e2827e48edef5c9dc8f960d06dd2d42d1654443b88568056b - languageName: node - linkType: hard - "fake-xml-http-request@npm:^2.1.2": version: 2.1.2 resolution: "fake-xml-http-request@npm:2.1.2" @@ -4820,15 +4815,6 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.0.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10/a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 - languageName: node - linkType: hard - "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -5305,10 +5291,10 @@ __metadata: languageName: node linkType: hard -"headers-polyfill@npm:3.2.5": - version: 3.2.5 - resolution: "headers-polyfill@npm:3.2.5" - checksum: 10/3aa62d23091576c05722e8043879a3a6beb9fdd85719780248d628ef8df232eb8261522ae2edb8dd6d0a991d7c744f7382c22e279bc81690f8da39502bc62c4c +"headers-polyfill@npm:^4.0.2": + version: 4.0.3 + resolution: "headers-polyfill@npm:4.0.3" + checksum: 10/3a008aa2ef71591e2077706efb48db1b2729b90cf646cc217f9b69744e35cca4ba463f39debb6000904aa7de4fada2e5cc682463025d26bcc469c1d99fa5af27 languageName: node linkType: hard @@ -5371,15 +5357,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 - languageName: node - linkType: hard - "iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -5389,13 +5366,6 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10/d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 - languageName: node - linkType: hard - "ignore@npm:^5.2.0, ignore@npm:^5.3.1": version: 5.3.1 resolution: "ignore@npm:5.3.1" @@ -5448,13 +5418,6 @@ __metadata: languageName: node linkType: hard -"inherits@npm:^2.0.3, inherits@npm:^2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 - languageName: node - linkType: hard - "ini@npm:4.1.1": version: 4.1.1 resolution: "ini@npm:4.1.1" @@ -5462,29 +5425,6 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:^8.2.0": - version: 8.2.6 - resolution: "inquirer@npm:8.2.6" - dependencies: - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.1.1" - cli-cursor: "npm:^3.1.0" - cli-width: "npm:^3.0.0" - external-editor: "npm:^3.0.3" - figures: "npm:^3.0.0" - lodash: "npm:^4.17.21" - mute-stream: "npm:0.0.8" - ora: "npm:^5.4.1" - run-async: "npm:^2.4.0" - rxjs: "npm:^7.5.5" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - through: "npm:^2.3.6" - wrap-ansi: "npm:^6.0.1" - checksum: 10/f642b9e5a94faaba54f277bdda2af0e0a6b592bd7f88c60e1614b5795b19336c7025e0c2923915d5f494f600a02fe8517413779a794415bb79a9563b061d68ab - languageName: node - linkType: hard - "internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" @@ -5506,7 +5446,7 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": +"is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" dependencies: @@ -5627,7 +5567,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -5645,13 +5585,6 @@ __metadata: languageName: node linkType: hard -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 10/824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 - languageName: node - linkType: hard - "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -5784,7 +5717,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": +"is-typed-array@npm:^1.1.13": version: 1.1.13 resolution: "is-typed-array@npm:1.1.13" dependencies: @@ -5793,13 +5726,6 @@ __metadata: languageName: node linkType: hard -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: 10/a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - "is-weakmap@npm:^2.0.1": version: 2.0.1 resolution: "is-weakmap@npm:2.0.1" @@ -5910,13 +5836,6 @@ __metadata: languageName: node linkType: hard -"js-levenshtein@npm:^1.1.6": - version: 1.1.6 - resolution: "js-levenshtein@npm:1.1.6" - checksum: 10/bb034043fdebab606122fe5b5c0316036f1bb0ea352038af8b0ba4cda4b016303b24f64efb59d9918f66e3680eea97ff421396ff3c153cb00a6f982908f61f8a - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -6204,16 +6123,6 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: 10/fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -6359,13 +6268,6 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10/d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - "mimic-fn@npm:^4.0.0": version: 4.0.0 resolution: "mimic-fn@npm:4.0.0" @@ -6547,37 +6449,35 @@ __metadata: languageName: node linkType: hard -"msw@npm:1.3.3": - version: 1.3.3 - resolution: "msw@npm:1.3.3" +"msw@npm:2.3.5": + version: 2.3.5 + resolution: "msw@npm:2.3.5" dependencies: - "@mswjs/cookies": "npm:^0.2.2" - "@mswjs/interceptors": "npm:^0.17.10" - "@open-draft/until": "npm:^1.0.3" - "@types/cookie": "npm:^0.4.1" - "@types/js-levenshtein": "npm:^1.1.1" - chalk: "npm:^4.1.1" - chokidar: "npm:^3.4.2" - cookie: "npm:^0.4.2" + "@bundled-es-modules/cookie": "npm:^2.0.0" + "@bundled-es-modules/statuses": "npm:^1.0.1" + "@bundled-es-modules/tough-cookie": "npm:^0.1.6" + "@inquirer/confirm": "npm:^3.0.0" + "@mswjs/interceptors": "npm:^0.29.0" + "@open-draft/until": "npm:^2.1.0" + "@types/cookie": "npm:^0.6.0" + "@types/statuses": "npm:^2.0.4" + chalk: "npm:^4.1.2" graphql: "npm:^16.8.1" - headers-polyfill: "npm:3.2.5" - inquirer: "npm:^8.2.0" + headers-polyfill: "npm:^4.0.2" is-node-process: "npm:^1.2.0" - js-levenshtein: "npm:^1.1.6" - node-fetch: "npm:^2.6.7" - outvariant: "npm:^1.4.0" + outvariant: "npm:^1.4.2" path-to-regexp: "npm:^6.2.0" - strict-event-emitter: "npm:^0.4.3" - type-fest: "npm:^2.19.0" - yargs: "npm:^17.3.1" + strict-event-emitter: "npm:^0.5.1" + type-fest: "npm:^4.9.0" + yargs: "npm:^17.7.2" peerDependencies: - typescript: ">= 4.4.x" + typescript: ">= 4.7.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: 10/8a3b02e873c5642a3b160310f45d8927ca2e42170f904858c037796cad886ef1e690eb2b1072ba2782a7f8d2790d02e0d80067da538213961de4858b2127cee7 + checksum: 10/c7c14f517bf4011de4d8758212f84b355433ac8087840f94a605690a1f41ea8f4a4b6e07161f734f823b2563ba0a8ea168036f59a6ccdfc895817db6eed64418 languageName: node linkType: hard @@ -6588,10 +6488,10 @@ __metadata: languageName: node linkType: hard -"mute-stream@npm:0.0.8": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: 10/a2d2e79dde87e3424ffc8c334472c7f3d17b072137734ca46e6f221131f1b014201cc593b69a38062e974fb2394d3d1cb4349f80f012bbf8b8ac1b28033e515f +"mute-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10/36fc968b0e9c9c63029d4f9dc63911950a3bdf55c9a87f58d3a266289b67180201cade911e7699f8b2fa596b34c9db43dad37649e3f7fdd13c3bb9edb0017ee7 languageName: node linkType: hard @@ -6629,20 +6529,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10/b24f8a3dc937f388192e59bcf9d0857d7b6940a2496f328381641cb616efccc9866e89ec43f2ec956bbd6c3d3ee05524ce77fe7b29ccd34692b3a16f237d6676 - languageName: node - linkType: hard - "node-gyp@npm:latest": version: 10.0.1 resolution: "node-gyp@npm:10.0.1" @@ -6829,15 +6715,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.0": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10/e9fd0695a01cf226652f0385bf16b7a24153dbbb2039f764c8ba6d2306a8506b0e4ce570de6ad99c7a6eb49520743afdb66edd95ee979c1a342554ed49a9aadd - languageName: node - linkType: hard - "onetime@npm:^6.0.0": version: 6.0.0 resolution: "onetime@npm:6.0.0" @@ -6861,30 +6738,6 @@ __metadata: languageName: node linkType: hard -"ora@npm:^5.4.1": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: "npm:^4.1.0" - chalk: "npm:^4.1.0" - cli-cursor: "npm:^3.1.0" - cli-spinners: "npm:^2.5.0" - is-interactive: "npm:^1.0.0" - is-unicode-supported: "npm:^0.1.0" - log-symbols: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - wcwidth: "npm:^1.0.1" - checksum: 10/8d071828f40090a8e1c6e8f350c6eb065808e9ab2b3e57fa37e0d5ae78cb46dac00117c8f12c3c8b8da2923454afbd8265e08c10b69881170c5b269f451e7fef - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 10/5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - "outvariant@npm:^1.2.1, outvariant@npm:^1.4.0": version: 1.4.2 resolution: "outvariant@npm:1.4.2" @@ -6892,6 +6745,13 @@ __metadata: languageName: node linkType: hard +"outvariant@npm:^1.4.2": + version: 1.4.3 + resolution: "outvariant@npm:1.4.3" + checksum: 10/3a7582745850cb344d49641867a4c080858c54f4091afd91b9c0765ba6e471c2bc841348f0fff344845ddd0a4db42fd5d68c6f7ebaf32d4b676a3a9987b2488a + languageName: node + linkType: hard + "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -7187,13 +7047,27 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"psl@npm:^1.1.33": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 10/d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 10/46ab16f252fd892fc29d6af60966d338cdfeea68a231e9457631ffd22d67cec1e00141e0a5236a2eb16c0d7d74175d9ec1d6f963660c6f2b1c2fc85b194c5680 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -7297,17 +7171,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.4.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10/d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -7372,6 +7235,13 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10/878880ee78ccdce372784f62f52a272048e2d0827c29ae31e7f99da18b62a2b9463ea03a75f277352f4697c100183debb0532371ad515a2d49d4bfe596dd4c20 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -7445,16 +7315,6 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10/f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -7584,13 +7444,6 @@ __metadata: languageName: node linkType: hard -"run-async@npm:^2.4.0": - version: 2.4.1 - resolution: "run-async@npm:2.4.1" - checksum: 10/c79551224dafa26ecc281cb1efad3510c82c79116aaf681f8a931ce70fdf4ca880d58f97d3b930a38992c7aad7955a08e065b32ec194e1dd49d7790c874ece50 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -7600,15 +7453,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.5": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10/b10cac1a5258f885e9dd1b70d23c34daeb21b61222ee735d2ec40a8685bdca40429000703a44f0e638c27a684ac139e1c37e835d2a0dc16f6fc061a138ae3abb - languageName: node - linkType: hard - "safe-array-concat@npm:^1.1.0": version: 1.1.0 resolution: "safe-array-concat@npm:1.1.0" @@ -7633,13 +7477,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 - languageName: node - linkType: hard - "safe-regex-test@npm:^1.0.3": version: 1.0.3 resolution: "safe-regex-test@npm:1.0.3" @@ -7651,7 +7488,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 @@ -7698,13 +7535,6 @@ __metadata: languageName: node linkType: hard -"set-cookie-parser@npm:^2.4.6": - version: 2.6.0 - resolution: "set-cookie-parser@npm:2.6.0" - checksum: 10/8d451ebadb760989f93b634942c79de3c925ca7a986d133d08a80c40b5ae713ce12e354f0d5245c49f288c52daa7bd6554d5dc52f8a4eecaaf5e192881cf2b1f - languageName: node - linkType: hard - "set-function-length@npm:^1.2.1": version: 1.2.1 resolution: "set-function-length@npm:1.2.1" @@ -7778,13 +7608,6 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - "signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" @@ -7892,6 +7715,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:^2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 10/18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + languageName: node + linkType: hard + "std-env@npm:^3.7.0": version: 3.7.0 resolution: "std-env@npm:3.7.0" @@ -7908,19 +7738,10 @@ __metadata: languageName: node linkType: hard -"strict-event-emitter@npm:^0.2.4": - version: 0.2.8 - resolution: "strict-event-emitter@npm:0.2.8" - dependencies: - events: "npm:^3.3.0" - checksum: 10/6ac06fe72a6ee6ae64d20f1dd42838ea67342f1b5f32b03b3050d73ee6ecee44b4d5c4ed2965a7154b47991e215f373d4e789e2b2be2769cd80e356126c2ca53 - languageName: node - linkType: hard - -"strict-event-emitter@npm:^0.4.3": - version: 0.4.6 - resolution: "strict-event-emitter@npm:0.4.6" - checksum: 10/abdbf59b6c45b599cc2f227fa473765d1510d155ebd22533e8ecb06110dfacb2ff07aece7fd528dde2b4f9e379d60f2687eee8af3fa2877c3ed88ee5b7ed2707 +"strict-event-emitter@npm:^0.5.1": + version: 0.5.1 + resolution: "strict-event-emitter@npm:0.5.1" + checksum: 10/25c84d88be85940d3547db665b871bfecea4ea0bedfeb22aae8db48126820cfb2b0bc2fba695392592a09b1aa36b686d6eede499e1ecd151593c03fe5a50d512 languageName: node linkType: hard @@ -8060,15 +7881,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10/54d23f4a6acae0e93f999a585e673be9e561b65cd4cca37714af1e893ab8cd8dfa52a9e4f58f48f87b4a44918d3a9254326cb80ed194bf2e4c226e2b21767e56 - languageName: node - linkType: hard - "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -8203,7 +8015,7 @@ __metadata: languageName: node linkType: hard -"through@npm:>=2.2.7 <3, through@npm:^2.3.6": +"through@npm:>=2.2.7 <3": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10/5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 @@ -8245,15 +8057,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: "npm:~1.0.2" - checksum: 10/09c0abfd165cff29b32be42bc35e80b8c64727d97dedde6550022e88fa9fd39a084660415ed8e3ebaa2aca1ee142f86df8b31d4196d4f81c774a3a20fd4b6abf - languageName: node - linkType: hard - "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -8270,10 +8073,15 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10/8f1f5aa6cb232f9e1bdc86f485f916b7aa38caee8a778b378ffec0b70d9307873f253f5cbadbe2955ece2ac5c83d0dc14a77513166ccd0a0c7fe197e21396695 +"tough-cookie@npm:^4.1.4": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" + dependencies: + psl: "npm:^1.1.33" + punycode: "npm:^2.1.1" + universalify: "npm:^0.2.0" + url-parse: "npm:^1.5.3" + checksum: 10/75663f4e2cd085f16af0b217e4218772adf0617fb3227171102618a54ce0187a164e505d61f773ed7d65988f8ff8a8f935d381f87da981752c1171b076b4afac languageName: node linkType: hard @@ -8336,7 +8144,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.6.2": +"tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -8359,10 +8167,10 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.19.0": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: 10/7bf9e8fdf34f92c8bb364c0af14ca875fac7e0183f2985498b77be129dc1b3b1ad0a6b3281580f19e48c6105c037fb966ad9934520c69c6434d17fd0af4eed78 +"type-fest@npm:^4.9.0": + version: 4.24.0 + resolution: "type-fest@npm:4.24.0" + checksum: 10/60efd6ec71f5113ef0a0fcabe61fc722bb2520ea082bc23e4b4dfb44204234dc691560a5e837f939160d7c18b410ed8fae32ddb752d57bed009248e0f61dce6b languageName: node linkType: hard @@ -8498,6 +8306,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.18.2": + version: 6.18.2 + resolution: "undici-types@npm:6.18.2" + checksum: 10/5c863f3cc65d012498cf0f8562b9d81e785c2b8b8a8d66343b9f4351ff40a3a29b500fbaea10667626fd91a32433d4c876810aafa5ab561369de702b62d4b323 + languageName: node + linkType: hard + "unicorn-magic@npm:^0.1.0": version: 0.1.0 resolution: "unicorn-magic@npm:0.1.0" @@ -8530,6 +8345,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: 10/e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.1 resolution: "universalify@npm:2.0.1" @@ -8560,6 +8382,16 @@ __metadata: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: "npm:^2.1.1" + requires-port: "npm:^1.0.0" + checksum: 10/c9e96bc8c5b34e9f05ddfeffc12f6aadecbb0d971b3cc26015b58d5b44676a99f50d5aeb1e5c9e61fa4d49961ae3ab1ae997369ed44da51b2f5ac010d188e6ad + languageName: node + linkType: hard + "use-sync-external-store@npm:^1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" @@ -8569,26 +8401,6 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10/474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"util@npm:^0.12.3": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: "npm:^2.0.3" - is-arguments: "npm:^1.0.4" - is-generator-function: "npm:^1.0.7" - is-typed-array: "npm:^1.1.3" - which-typed-array: "npm:^1.1.2" - checksum: 10/61a10de7753353dd4d744c917f74cdd7d21b8b46379c1e48e1c4fd8e83f8190e6bd9978fc4e5102ab6a10ebda6019d1b36572fa4a325e175ec8b789a121f6147 - languageName: node - linkType: hard - "uuid@npm:10.0.0": version: 10.0.0 resolution: "uuid@npm:10.0.0" @@ -8907,35 +8719,6 @@ __metadata: languageName: node linkType: hard -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: "npm:^1.0.3" - checksum: 10/182ebac8ca0b96845fae6ef44afd4619df6987fe5cf552fdee8396d3daa1fb9b8ec5c6c69855acb7b3c1231571393bd1f0a4cdc4028d421575348f64bb0a8817 - languageName: node - linkType: hard - -"web-encoding@npm:^1.1.5": - version: 1.1.5 - resolution: "web-encoding@npm:1.1.5" - dependencies: - "@zxing/text-encoding": "npm:0.9.0" - util: "npm:^0.12.3" - dependenciesMeta: - "@zxing/text-encoding": - optional: true - checksum: 10/243518cfa8388ac05eeb4041bd330d38c599476ff9a93239b386d1ba2af130089a2fcefb0cf65b385f989105ff460ae69dca7e42236f4d98dc776b04e558cdb5 - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10/b65b9f8d6854572a84a5c69615152b63371395f0c5dcd6729c45789052296df54314db2bc3e977df41705eacb8bc79c247cee139a63fa695192f95816ed528ad - languageName: node - linkType: hard - "webidl-conversions@npm:^7.0.0": version: 7.0.0 resolution: "webidl-conversions@npm:7.0.0" @@ -8950,16 +8733,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10/f95adbc1e80820828b45cc671d97da7cd5e4ef9deb426c31bcd5ab00dc7103042291613b3ef3caec0a2335ed09e0d5ed026c940755dbb6d404e2b27f940fdf07 - languageName: node - linkType: hard - "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -9018,7 +8791,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.9": version: 1.1.14 resolution: "which-typed-array@npm:1.1.14" dependencies: @@ -9076,7 +8849,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1": +"wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" dependencies: @@ -9133,7 +8906,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.3.1": +"yargs@npm:^17.0.0, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -9168,3 +8941,10 @@ __metadata: checksum: 10/2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 languageName: node linkType: hard + +"yoctocolors-cjs@npm:^2.1.2": + version: 2.1.2 + resolution: "yoctocolors-cjs@npm:2.1.2" + checksum: 10/d731e3ba776a0ee19021d909787942933a6c2eafb2bbe85541f0c59aa5c7d475ce86fcb860d5803105e32244c3dd5ba875b87c4c6bf2d6f297da416aa54e556f + languageName: node + linkType: hard