From 1bcca55707492131d2c177e215d206e8794da153 Mon Sep 17 00:00:00 2001 From: trishouser Date: Mon, 31 Jul 2023 09:35:36 +0200 Subject: [PATCH] update cli --- packages/cli/package.json | 14 +- packages/cli/src/abby.ts | 15 - packages/cli/src/check.ts | 53 ++ packages/cli/src/consts.ts | 4 +- packages/cli/src/http.ts | 133 ++-- packages/cli/src/index.ts | 77 ++- packages/cli/src/pull.ts | 56 +- packages/cli/src/push.ts | 6 +- packages/cli/src/types.ts | 10 + packages/cli/src/util.ts | 59 +- packages/cli/tests/base.test.ts | 112 ++++ packages/cli/tests/mocks/angularSample.ts | 12 + packages/cli/tests/mocks/handlers.ts | 58 ++ packages/cli/tests/mocks/reactSample.ts | 45 ++ packages/cli/tests/mocks/server.ts | 5 + packages/cli/tests/setup.ts | 20 + packages/cli/tsconfig.json | 2 +- packages/cli/vite.config.ts | 11 + pnpm-lock.yaml | 755 +++++++++++++++++++--- 19 files changed, 1195 insertions(+), 252 deletions(-) delete mode 100644 packages/cli/src/abby.ts create mode 100644 packages/cli/src/check.ts create mode 100644 packages/cli/tests/base.test.ts create mode 100644 packages/cli/tests/mocks/angularSample.ts create mode 100644 packages/cli/tests/mocks/handlers.ts create mode 100644 packages/cli/tests/mocks/reactSample.ts create mode 100644 packages/cli/tests/mocks/server.ts create mode 100644 packages/cli/tests/setup.ts create mode 100644 packages/cli/vite.config.ts diff --git a/packages/cli/package.json b/packages/cli/package.json index 272ea46f..a60afd27 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -8,24 +8,23 @@ }, "scripts": { "start": "pnpm run build && ./dist/index.js", - "start2": "ts-node src/index.ts", - "start:windows": "nodemon --watch 'src/**/*.ts' --exec \"npx ts-node\" src/index.ts", "create": "npm run build && npm run test", "build": "esbuild src/index.ts --bundle --target=node10.4 --bundle --platform=node --format=cjs --outfile=dist/index.js --external:figlet", "build:prod": "tsc --noEmit && pnpm run build", - "buildv2": "npx tsc", - "local": "sudo npm i -g && pizza", - "refresh": "rm -rf ./node_modules ./package-lock.json && npm install" + "refresh": "rm -rf ./node_modules ./package-lock.json && npm install", + "test": "vitest" }, "dependencies": { "chalk": "^5.2.0", "clear": "^0.1.0", "commander": "^10.0.1", "figlet": "^1.6.0", + "msw": "^1.2.2", "node-fetch": "^3.3.1", "path": "^0.12.7", "stringify-object": "^5.0.0", - "tsup": "^6.5.0" + "tsup": "^6.5.0", + "vite": "^4.4.2" }, "devDependencies": { "@tryabby/core": "workspace:^", @@ -35,6 +34,7 @@ "nodemon": "^2.0.22", "ts-node": "^10.9.1", "tsconfig": "workspace:*", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "vitest": "^0.33.0" } } \ No newline at end of file diff --git a/packages/cli/src/abby.ts b/packages/cli/src/abby.ts deleted file mode 100644 index 2bc91270..00000000 --- a/packages/cli/src/abby.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const abby = { - projectId: "environment.ABBY_PROJECT_ID", - currentEnvironment: 'test', - tests: { - AngularTest: { - variants: ['A', 'B', 'C', 'D'], - }, - NotExistingTest: { - variants: ['A', 'B'], - }, - }, - flags: ['AngularFlag', 'AngularFlag2', 'NotExistingFlag'], - apiUrl: 'http://localhost:3000/', - debug: true, -}; \ No newline at end of file diff --git a/packages/cli/src/check.ts b/packages/cli/src/check.ts new file mode 100644 index 00000000..d71606e2 --- /dev/null +++ b/packages/cli/src/check.ts @@ -0,0 +1,53 @@ +import { HttpService } from "./http"; +import { getConfigFromFileString, loadLocalConfig } from "./util"; +import { AbbyConfig } from "@tryabby/core"; + +export async function check(filepath: string, apiKey: string, localhost?: boolean): Promise { + const configFileString: string = await loadLocalConfig(filepath); + const configFromFile: AbbyConfig = getConfigFromFileString(configFileString); + + const configFromAbby = await HttpService.getConfigFromServer(configFromFile.projectId, apiKey, localhost) as AbbyConfig; + + let testsUpToDate = true; + let flagsUpToDate = true; + + let output = false; + + if (configFromAbby && configFromFile) { + if (configFromAbby.tests && configFromFile.tests) { + for (let serverTest in configFromAbby.tests) { + if (!(serverTest in configFromFile.tests)) { + testsUpToDate = false; + } + } + for (let localTest in configFromFile.tests) { + if (!(localTest in configFromAbby.tests)) { + testsUpToDate = false; + } + } + + } else if (configFromAbby.tests || configFromFile.tests) testsUpToDate = false + + if (configFromAbby.flags && configFromFile.flags) { + if (!(configFromAbby.flags != configFromFile.flags)) flagsUpToDate = false + } else if (configFromAbby.flags || configFromFile.flags) flagsUpToDate = false + + if (testsUpToDate && flagsUpToDate) { + output = true; + console.log("all tests are up to date") + } else { + if (!testsUpToDate) { + output = false; + console.log("tests are not up to date") + } + if (!flagsUpToDate) { + output = false; + console.log("flags are not up to date") + } + } + return output + } else { + console.log("Something went wrong. Please check your login"); + return false; + } +} \ No newline at end of file diff --git a/packages/cli/src/consts.ts b/packages/cli/src/consts.ts index 2ecf5027..b6a7e9f0 100644 --- a/packages/cli/src/consts.ts +++ b/packages/cli/src/consts.ts @@ -1,7 +1,7 @@ import path from "path"; import os from "os"; -export const ABBY_BASE_URL = "http://www.tryabby.com"; -export const LOCAL_BASE_URL = "http://localhost:3000"; +export const ABBY_BASE_URL = "https://www.tryabby.com/"; +export const LOCAL_BASE_URL = "http://localhost:3000/"; export const getTokenFilePath = () => path.join(os.homedir(), ".abby"); diff --git a/packages/cli/src/http.ts b/packages/cli/src/http.ts index b10a3bcf..d9d8b388 100644 --- a/packages/cli/src/http.ts +++ b/packages/cli/src/http.ts @@ -3,73 +3,82 @@ import { ConfigData } from "./types"; import { ABBY_BASE_URL, LOCAL_BASE_URL } from "./consts"; import fetch from "node-fetch"; -export async function getConfigFromServer( - projectId: string, - apiKey: string, - localhost?: boolean -): Promise { - let url: string; +export abstract class HttpService { + static async getConfigFromServer( + projectId: string, + apiKey: string, + localhost?: boolean + ): Promise { + let url: string; + - if (localhost) { - console.log("LOCAL"); - url = LOCAL_BASE_URL; - } else { - url = ABBY_BASE_URL; - } - - const response = await fetch(`${url}/api/config/${projectId}?apiKey=${apiKey}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - - const responseJson = await response.json(); - return responseJson; -} - -export async function updateConfigOnServer( - projectId: string, - apiKey: string, - localAbbyConfig: AbbyConfig, - localhost?: boolean -) { - let url: string; - - if (localhost) { - console.log("LOCAL"); - url = LOCAL_BASE_URL; - } else { - url = ABBY_BASE_URL; - } - - try { - const response = await fetch( - `${url}/api/config/${projectId}?apiKey=${apiKey}`, - { - method: "PUT", + if (localhost) { + console.log("LOCAL"); + url = LOCAL_BASE_URL; + } else { + url = ABBY_BASE_URL; + } + try { + const response = await fetch(`${url}/api/config/${projectId}?apiKey=${apiKey}`, { + method: "GET", headers: { "Content-Type": "application/json", }, - body: JSON.stringify(localAbbyConfig), - } - ); - // const res = await response; - const data = await response.json(); - const status: number = response.status; - - if (status == 200) { - console.log("pushed successfully"); - } else if (status == 500) { - console.log( - "Pushed failed \n Please try again later \n 500: Internal server error" - ); - } else if (status == 401) { - console.log("Pushed failed \n Please check your API key \n" + data); + }); + + const responseJson = await response.json(); + return responseJson; + } catch (e) { + console.error(e) + throw e; + } + } + + static async updateConfigOnServer( + projectId: string, + apiKey: string, + localAbbyConfig: AbbyConfig, + localhost?: boolean + ) { + let url: string; + + if (localhost) { + console.log("LOCAL"); + url = LOCAL_BASE_URL; } else { - console.log("Pushed failed: \n" + status + ": " + data); + url = ABBY_BASE_URL; + } + + try { + const response = await fetch( + `${url}api/config/${projectId}?apiKey=${apiKey}`, + { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(localAbbyConfig), + } + ); + // const res = await response; + const data = await response.json(); + const status: number = response.status; + + if (status == 200) { + console.log("pushed successfully"); + } else if (status == 500) { + console.log( + "Pushed failed \n Please try again later \n 500: Internal server error" + ); + } else if (status == 401) { + console.log("Pushed failed \n Please check your API key \n" + data); + } else { + console.log("Pushed failed: \n" + status + ": " + data); + } + } catch (e) { + console.log("Error: " + e); } - } catch (e) { - console.log("Error: " + e); } + } + diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 7dc67734..3e9d48c4 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -6,6 +6,7 @@ import { pull } from "./pull"; import { push } from "./push"; import { getToken, writeTokenFile } from "./auth"; import chalk from "chalk"; +import { check } from "./check"; const program = new Command(); @@ -26,25 +27,61 @@ program } }); -program - .command("push") - .description("push local config to server") - .argument("", "filepath") - .option("-l, --localhost", "localhost") - .action((filepath, options) => { - if (!filepath) { - console.log(chalk.red("Filename is required")); - return; - } - try { - const token: string = getToken(); - console.log(filepath); - console.log(options.localhost); - push(filepath, token, options.localhost); - } catch (e) { - console.log(chalk.red("Please login first")); - return; - } - }); + program + .command("pull") + .argument("", "filepath") + .option("-l, --localhost", "localhost") + .action((filepath, options) => { + if (!filepath) { + console.log(chalk.red("Filename is required")); + return; + } + try { + const token: string = getToken(); + push(filepath, token, options.localhost); + } catch (e) { + console.error(e) + } + }); + + + program + .command("push") + .description("push local config to server") + .argument("", "filepath") + .option("-l, --localhost", "localhost") + .action( async (filepath, options) => { + if (!filepath) { + console.log(chalk.red("Filename is required")); + return; + } + try { + const token: string = getToken(); + push(filepath, token, options.localhost); + } catch (e) { + console.log(chalk.red("Please login first")); + return; + } + }); + + program + .command("check") + .description("check local config against server") + .argument("", "filepath") + .option("-l, --localhost", "localhost") + .action( async (filepath, options) => { + if (!filepath) { + console.log(chalk.red("Filename is required")); + return; + } + try { + const token: string = getToken(); + const upToDate = await check(filepath, token, options.localhost); + } catch (e) { + console.log(chalk.red("Please login first")); + return; + } + }); + program.parse(process.argv); diff --git a/packages/cli/src/pull.ts b/packages/cli/src/pull.ts index 852c7a65..109ff8d9 100644 --- a/packages/cli/src/pull.ts +++ b/packages/cli/src/pull.ts @@ -1,15 +1,33 @@ import * as path from "path"; import * as fs from "fs"; import { AbbyConfig } from "@tryabby/core"; -import { loadLocalConfig, updateConfigFile } from "./util"; +import { getFramework, getParsedJSONString, getRegex, loadLocalConfig } from "./util"; import { getConfigFromFileString } from "./util"; import { ConfigData } from "./types"; -import {getConfigFromServer} from "./http"; +import {HttpService} from "./http"; -async function updateConfig( +export async function updateConfigFile( + updatedConfig: string, + configFileString: string, +) { + + const framework = getFramework(configFileString); + if (!framework) return; + + const updatedContent = configFileString.replace( + framework.replaceRegex, + updatedConfig + ); + + console.log(updatedContent); + + return updatedContent; +} + +export async function updateConfig( configFromFile: AbbyConfig, - configFromAbby: ConfigData + configFromAbby: ConfigData, ): Promise { const newConfig: Omit & { flags: string[] } = { projectId: configFromFile.projectId, @@ -18,20 +36,28 @@ async function updateConfig( flags: configFromAbby.flags ?? configFromFile.flags, }; - let updatedConfigString = JSON.stringify(newConfig, null, 2); - - updatedConfigString = updatedConfigString.replace(/"([^"]+)":/g, "$1:"); - + const updatedConfigString = getParsedJSONString(newConfig); return updatedConfigString; } -export async function pull(): Promise { - const configFileString: string = await loadLocalConfig(); +export async function pull(filePath: string, apiKey: string, localhost?: boolean): Promise { + const configFileString: string = await loadLocalConfig(filePath); const configFromFile: AbbyConfig = getConfigFromFileString(configFileString); - const configFromAbby = await getConfigFromServer("clftg3tzd0004l7085yktpsov", true); // TODO set debug to false - - const updatedConfig = await updateConfig(configFromFile, configFromAbby); - - updateConfigFile(updatedConfig, configFileString); + const configFromAbby = await HttpService.getConfigFromServer(configFromFile.projectId, apiKey, localhost) as any; + if (configFromAbby) { + const updatedConfig = await updateConfig(configFromFile, configFromAbby); + const updatedFileString = await updateConfigFile(updatedConfig, configFileString); + + if (!updatedFileString) {console.error("Config in file not found"); return;} + + fs.writeFile(filePath, updatedFileString, (error) => { + if (error) { + console.error(error); + return; + } + console.log("Config File updated"); + }); + } else console.error("Config in file not found"); } + diff --git a/packages/cli/src/push.ts b/packages/cli/src/push.ts index 5810d4a7..8c9d8d18 100644 --- a/packages/cli/src/push.ts +++ b/packages/cli/src/push.ts @@ -1,12 +1,10 @@ -import { updateConfigOnServer } from "./http"; +import { HttpService } from "./http"; import { getConfigFromFileString, loadLocalConfig } from "./util"; - - export async function push(filePath: string, apiKey: string, localhost?: boolean): Promise { const localConfigString = await loadLocalConfig(filePath); const localAbbyConfig = getConfigFromFileString(localConfigString); const projectId = localAbbyConfig.projectId; - await updateConfigOnServer(projectId, apiKey, localAbbyConfig, localhost); + await HttpService.updateConfigOnServer(projectId, apiKey, localAbbyConfig, localhost); } diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index 7dc17364..22dd9bcb 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -12,3 +12,13 @@ export type ConfigData = { tests: Tests, flags: FlagName[] }; + +export enum Frameworks { + Angular, NextJs, React, Svelte +} + +export type Framework = { + framework: Frameworks, + regex: RegExp, + replaceRegex: RegExp +} \ No newline at end of file diff --git a/packages/cli/src/util.ts b/packages/cli/src/util.ts index 7ac7ad52..94d8ee90 100644 --- a/packages/cli/src/util.ts +++ b/packages/cli/src/util.ts @@ -1,5 +1,6 @@ import { AbbyConfig } from "@tryabby/core"; import * as fs from "fs"; +import { Framework, Frameworks } from "./types"; export function loadLocalConfig(filePath: string): Promise { // TODO search for file. it just works, when the file is in root @@ -14,35 +15,15 @@ export function loadLocalConfig(filePath: string): Promise { }); } -export function updateConfigFile( - updatedConfig: string, - configFileString: string -) { - const existingObjectRegex = /(export\s+const\s+abby\s+=\s+\{[^}]*\};)/; - const updatedContent = configFileString.replace( - existingObjectRegex, - updatedConfig - ); - - const fileName = "src/abby2.ts"; - fs.writeFile(fileName, updatedContent, (error) => { - if (error) { - console.error(error); - return; - } - console.log("Config File updated"); - }); -} - -export function getConfigFromFileString(configFileString: string): AbbyConfig { +export function getRegex(configFileString: string) { const regexAngular = /export const abby = ({[\s\S]*?});/; const regexNext = /createAbby\(({[\s\S]+?})\);/; const regexReact = /createAbby\(({[\s\S]+?})\);/; const regexSvelte = /createAbby\(({[\s\S]+?})\);/; const regexes: RegExp[] = [ - regexAngular, regexReact, regexNext, regexSvelte + regexAngular, regexReact, regexNext, regexSvelte ] let matchedRegex: RegExp | null = null; @@ -52,10 +33,33 @@ export function getConfigFromFileString(configFileString: string): AbbyConfig { matchedRegex = regex; } } + return matchedRegex; +} + +export function getFramework(configFileString: string): Framework | null { + const frameworks = [ + { framework: Frameworks.Angular, regex: /export const abby = ({[\s\S]*?});/, replaceRegex: /(?<=export const abby = )\{[\s\S]*?\};/}, + { framework: Frameworks.React, regex: /createAbby\(({[\s\S]+?})\);/ , replaceRegex: /(?<=createAbby\(({[\s\S]+?})\);)/}, + { framework: Frameworks.NextJs, regex: /createAbby\(({[\s\S]+?})\);/ , replaceRegex: /(?<=createAbby\(({[\s\S]+?})\);)/}, + { framework: Frameworks.Svelte, regex: /createAbby\(({[\s\S]+?})\);/, replaceRegex: /(?<=createAbby\(({[\s\S]+?})\);)/}, + ] + + let matchedFramework: Framework | null = null; - if (matchedRegex) { - console.log("Regex found successfully"); - const match = configFileString.match(matchedRegex); + for (const framework of frameworks) { + if (framework.regex.test(configFileString)) { + matchedFramework = framework; + } + } + + return matchedFramework; +} + +export function getConfigFromFileString(configFileString: string): AbbyConfig { + let framework = getFramework(configFileString); + + if (framework) { + const match = configFileString.match(framework.regex); const objectString = match ? match[1] : ""; const object = eval("(" + objectString + ")"); return object as AbbyConfig; @@ -63,3 +67,8 @@ export function getConfigFromFileString(configFileString: string): AbbyConfig { return {} as AbbyConfig } } + +export function getParsedJSONString(object: any): string { + const string = JSON.stringify(object, null, 2) + return string.replace(/"([^"]+)":/g, "$1:"); +} diff --git a/packages/cli/tests/base.test.ts b/packages/cli/tests/base.test.ts new file mode 100644 index 00000000..fa88c03a --- /dev/null +++ b/packages/cli/tests/base.test.ts @@ -0,0 +1,112 @@ +import { AbbyConfig } from "@tryabby/core"; +import { HttpService } from "../src/http"; +import { push } from "../src/push"; +import { getConfigFromFileString, getParsedJSONString, getRegex, loadLocalConfig, updateConfigFile } from "../src/util"; +import { config } from "process"; +import { pull, updateConfig } from "../src/pull"; +import { get } from "https"; +import { check } from "../src/check"; + +const OLD_ENV = process.env; + +beforeEach(() => { + vi.resetModules(); // Most important - it clears the cache + process.env = { ...OLD_ENV }; // Make a copy +}); + +afterAll(() => { + process.env = OLD_ENV; // Restore old environment +}); + +const sampleLocalConfig = { + projectId: "test", + tests: { + test1: { + variants: ["A", "B", "C", "D"], + }, + test2: { + variants: ["A", "B"], + }, + }, + flags: ["flag1", "flag2"] +}; + +const sampleServerConfig = { + projectId: "test", + tests: { + test1: { + variants: ["A", "B", "C", "D"], + }, + test2: { + variants: ["A", "B"], + }, + test3: { + variants: ["A", "B", "C", "D"], + } + }, + flags: ["flag1", "flag2", "flag3"] +} + + +const filePathAngular = "./tests/mocks/angularSample.ts"; +const filePathReact = "./tests/mocks/reactSample.ts"; + +describe("Abby CLI", () => { + + it("sends put request", async () => { + const spy = vi.spyOn(HttpService, "updateConfigOnServer"); + await push("./tests/mocks/angularSample.ts", "09876543210987654321"); + + expect(spy).toHaveBeenCalledWith( + "test", "09876543210987654321", sampleLocalConfig as AbbyConfig, undefined + ); + + }); + + it("gets angular config from file", async () => { + const expectedConfig = sampleLocalConfig as AbbyConfig; + + const fileString = await loadLocalConfig(filePathAngular); + const config = getConfigFromFileString(fileString); + + expect(config).toEqual(expectedConfig); + }); + + it("gets react config from server", async () => { + const expectedConfig = sampleLocalConfig as AbbyConfig; + + const fileString = await loadLocalConfig(filePathReact); + const config = getConfigFromFileString(fileString); + + expect(config).toEqual(expectedConfig); + }); + + it("pulls data", async () => { + const spy = vi.spyOn(HttpService, "getConfigFromServer"); + const fileString = await loadLocalConfig(filePathAngular); + const configFromFile: AbbyConfig = getConfigFromFileString(fileString); + + const configFromAbby = await HttpService.getConfigFromServer(configFromFile.projectId, "09876543210987654321") as any; + + if (configFromAbby) { + const updatedConfigString = await updateConfig(configFromFile, configFromAbby); + + expect(updatedConfigString).toEqual(getParsedJSONString(sampleServerConfig)); + } else throw new Error("Config in file not found"); + }); + + it("checks flags and tests", async () => { + const spy = vi.spyOn(HttpService, "getConfigFromServer"); + const upToDateFalse = await check(filePathAngular, "09876543210987654321"); + + expect(upToDateFalse).toEqual(false); + + const upToDateTrue = await check(filePathAngular, "test"); + expect(upToDateTrue).toEqual(true); + }); + + it("pull test", async () => { + await pull(filePathReact, "09876543210987654321"); + }); + +}); \ No newline at end of file diff --git a/packages/cli/tests/mocks/angularSample.ts b/packages/cli/tests/mocks/angularSample.ts new file mode 100644 index 00000000..db56b650 --- /dev/null +++ b/packages/cli/tests/mocks/angularSample.ts @@ -0,0 +1,12 @@ +export const abby = { + projectId: "test", + tests: { + test1: { + variants: ["A", "B", "C", "D"], + }, + test2: { + variants: ["A", "B"], + }, + }, + flags: ["flag1", "flag2"] +}; diff --git a/packages/cli/tests/mocks/handlers.ts b/packages/cli/tests/mocks/handlers.ts new file mode 100644 index 00000000..6a30152f --- /dev/null +++ b/packages/cli/tests/mocks/handlers.ts @@ -0,0 +1,58 @@ +import { rest } from "msw"; +import { ABBY_BASE_URL } from "@tryabby/core"; + +export const handlers = [ + rest.get( + `${ABBY_BASE_URL}/api/config/:projectId`, + (req, res, ctx) => { + const apiKey = req.url.searchParams.get('apiKey'); + + if (apiKey == "test") { + return res( + ctx.json( + { + projectId: "test", + tests: { + test1: { + variants: ["A", "B", "C", "D"], + }, + test2: { + variants: ["A", "B"], + }, + }, + flags: ["flag1", "flag2"] + }) + ); + } else { + return res( + ctx.json( + { + projectId: "test", + tests: { + test1: { + variants: ["A", "B", "C", "D"], + }, + test2: { + variants: ["A", "B"], + }, + test3: { + variants: ["A", "B", "C", "D"], + } + }, + flags: ["flag1", "flag2", "flag3"] + }) + ); + } + } + ), + rest.put( + `${ABBY_BASE_URL}api/config/:projectId`, + (req, res, ctx) => { + return res( + ctx.json( + { message: "Config updated" }) + ); + } + + ) +]; diff --git a/packages/cli/tests/mocks/reactSample.ts b/packages/cli/tests/mocks/reactSample.ts new file mode 100644 index 00000000..38fde88a --- /dev/null +++ b/packages/cli/tests/mocks/reactSample.ts @@ -0,0 +1,45 @@ +import { createAbby } from "@tryabby/react"; + +const { AbbyProvider, useAbby } = createAbby({ + projectId: "test", + tests: { + test1: { + variants: ["A", "B", "C", "D"], + }, + test2: { + variants: ["A", "B"], + }, + }, + flags: ["flag1", "flag2"] + });{ + projectId: "test", + tests: { + test1: { + variants: [ + "A", + "B", + "C", + "D" + ] + }, + test2: { + variants: [ + "A", + "B" + ] + }, + test3: { + variants: [ + "A", + "B", + "C", + "D" + ] + } + }, + flags: [ + "flag1", + "flag2", + "flag3" + ] +} \ No newline at end of file diff --git a/packages/cli/tests/mocks/server.ts b/packages/cli/tests/mocks/server.ts new file mode 100644 index 00000000..9bb8a870 --- /dev/null +++ b/packages/cli/tests/mocks/server.ts @@ -0,0 +1,5 @@ +import { setupServer } from "msw/node"; +import { handlers } from "./handlers"; + +// This configures a request mocking server with the given request handlers. +export const server = setupServer(...handlers); diff --git a/packages/cli/tests/setup.ts b/packages/cli/tests/setup.ts new file mode 100644 index 00000000..5ad10fb8 --- /dev/null +++ b/packages/cli/tests/setup.ts @@ -0,0 +1,20 @@ +import { expect, afterEach } from "vitest"; + +import { server } from "./mocks/server"; +import fetch from "node-fetch"; + +/// @ts-ignore +global.fetch = fetch; + +// Establish API mocking before all tests. +beforeAll(() => server.listen()); + +afterAll(() => server.close()); + +// Clean up after the tests are finished. +afterEach(() => { + // Reset any request handlers that we may add during the tests, + // so they don't affect other tests. + server.resetHandlers(); + }); + \ No newline at end of file diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 15100f97..d58a4cb6 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -8,7 +8,7 @@ "outDir": "dist", "rootDir": "", "strict": true, - "types": ["node"], + "types": ["node", "vitest/globals"], "esModuleInterop": true, "resolveJsonModule": true, "skipLibCheck": true diff --git a/packages/cli/vite.config.ts b/packages/cli/vite.config.ts new file mode 100644 index 00000000..0d431636 --- /dev/null +++ b/packages/cli/vite.config.ts @@ -0,0 +1,11 @@ +/// + +import { defineConfig } from "vite"; + +export default defineConfig({ + test: { + globals: true, + environment: "jsdom", + setupFiles: "./tests/setup.ts", + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 059d6237..986256a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: version: link:packages/eslint-config-custom prettier: specifier: latest - version: 2.8.8 + version: 3.0.0 turbo: specifier: latest version: 1.10.3 @@ -581,6 +581,9 @@ importers: figlet: specifier: ^1.6.0 version: 1.6.0 + msw: + specifier: ^1.2.2 + version: 1.2.2(typescript@5.1.3) node-fetch: specifier: ^3.3.1 version: 3.3.1 @@ -593,6 +596,9 @@ importers: tsup: specifier: ^6.5.0 version: 6.5.0(ts-node@10.9.1)(typescript@5.1.3) + vite: + specifier: ^4.4.2 + version: 4.4.2(@types/node@20.3.1) devDependencies: '@tryabby/core': specifier: workspace:^ @@ -618,6 +624,9 @@ importers: typescript: specifier: ^5.1.3 version: 5.1.3 + vitest: + specifier: ^0.33.0 + version: 0.33.0 packages/core: dependencies: @@ -965,7 +974,7 @@ importers: version: 4.9.5 vite: specifier: ^4.2.0 - version: 4.3.2(@types/node@18.15.11) + version: 4.3.2 vite-plugin-dts: specifier: 2.3.0 version: 2.3.0(vite@4.3.2) @@ -4059,6 +4068,14 @@ packages: requiresBuild: true optional: true + /@esbuild/android-arm64@0.18.11: + resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + /@esbuild/android-arm@0.15.18: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -4084,6 +4101,14 @@ packages: requiresBuild: true optional: true + /@esbuild/android-arm@0.18.11: + resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + /@esbuild/android-x64@0.17.17: resolution: {integrity: sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA==} engines: {node: '>=12'} @@ -4101,6 +4126,14 @@ packages: requiresBuild: true optional: true + /@esbuild/android-x64@0.18.11: + resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + /@esbuild/darwin-arm64@0.17.17: resolution: {integrity: sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ==} engines: {node: '>=12'} @@ -4118,6 +4151,14 @@ packages: requiresBuild: true optional: true + /@esbuild/darwin-arm64@0.18.11: + resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + /@esbuild/darwin-x64@0.17.17: resolution: {integrity: sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg==} engines: {node: '>=12'} @@ -4135,6 +4176,14 @@ packages: requiresBuild: true optional: true + /@esbuild/darwin-x64@0.18.11: + resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + /@esbuild/freebsd-arm64@0.17.17: resolution: {integrity: sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA==} engines: {node: '>=12'} @@ -4152,6 +4201,14 @@ packages: requiresBuild: true optional: true + /@esbuild/freebsd-arm64@0.18.11: + resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + /@esbuild/freebsd-x64@0.17.17: resolution: {integrity: sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw==} engines: {node: '>=12'} @@ -4169,6 +4226,14 @@ packages: requiresBuild: true optional: true + /@esbuild/freebsd-x64@0.18.11: + resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + /@esbuild/linux-arm64@0.17.17: resolution: {integrity: sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw==} engines: {node: '>=12'} @@ -4186,6 +4251,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-arm64@0.18.11: + resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-arm@0.17.17: resolution: {integrity: sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg==} engines: {node: '>=12'} @@ -4203,6 +4276,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-arm@0.18.11: + resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-ia32@0.17.17: resolution: {integrity: sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q==} engines: {node: '>=12'} @@ -4220,6 +4301,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-ia32@0.18.11: + resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-loong64@0.15.18: resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} @@ -4245,6 +4334,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-loong64@0.18.11: + resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-mips64el@0.17.17: resolution: {integrity: sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A==} engines: {node: '>=12'} @@ -4262,6 +4359,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-mips64el@0.18.11: + resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-ppc64@0.17.17: resolution: {integrity: sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ==} engines: {node: '>=12'} @@ -4279,6 +4384,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-ppc64@0.18.11: + resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-riscv64@0.17.17: resolution: {integrity: sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA==} engines: {node: '>=12'} @@ -4296,6 +4409,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-riscv64@0.18.11: + resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-s390x@0.17.17: resolution: {integrity: sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ==} engines: {node: '>=12'} @@ -4313,6 +4434,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-s390x@0.18.11: + resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-x64@0.17.17: resolution: {integrity: sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg==} engines: {node: '>=12'} @@ -4330,6 +4459,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-x64@0.18.11: + resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/netbsd-x64@0.17.17: resolution: {integrity: sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA==} engines: {node: '>=12'} @@ -4347,6 +4484,14 @@ packages: requiresBuild: true optional: true + /@esbuild/netbsd-x64@0.18.11: + resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + /@esbuild/openbsd-x64@0.17.17: resolution: {integrity: sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA==} engines: {node: '>=12'} @@ -4364,6 +4509,14 @@ packages: requiresBuild: true optional: true + /@esbuild/openbsd-x64@0.18.11: + resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + /@esbuild/sunos-x64@0.17.17: resolution: {integrity: sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q==} engines: {node: '>=12'} @@ -4381,6 +4534,14 @@ packages: requiresBuild: true optional: true + /@esbuild/sunos-x64@0.18.11: + resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + /@esbuild/win32-arm64@0.17.17: resolution: {integrity: sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q==} engines: {node: '>=12'} @@ -4398,6 +4559,14 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-arm64@0.18.11: + resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + /@esbuild/win32-ia32@0.17.17: resolution: {integrity: sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ==} engines: {node: '>=12'} @@ -4415,6 +4584,14 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-ia32@0.18.11: + resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + /@esbuild/win32-x64@0.17.17: resolution: {integrity: sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg==} engines: {node: '>=12'} @@ -4432,6 +4609,14 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-x64@0.18.11: + resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4632,11 +4817,11 @@ packages: jest-get-type: 29.2.0 dev: true - /@jest/schemas@29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.25.24 + '@sinclair/typebox': 0.27.8 dev: true /@jest/transform@29.5.0: @@ -4677,7 +4862,7 @@ packages: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 18.15.11 @@ -4690,14 +4875,14 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.17 /@jridgewell/resolve-uri@3.1.0: @@ -4717,6 +4902,9 @@ packages: /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: @@ -4727,7 +4915,7 @@ packages: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 /@juggle/resize-observer@3.4.0: resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} @@ -4858,7 +5046,6 @@ packages: dependencies: '@types/set-cookie-parser': 2.4.2 set-cookie-parser: 2.5.1 - dev: true /@mswjs/interceptors@0.17.6: resolution: {integrity: sha512-201pBIWehTURb6q8Gheu4Zhvd3Ox1U4BJq5KiOQsYzkWyfiOG4pwcz5hPZIEryztgrf8/sdwABpvY757xMmfrQ==} @@ -4869,12 +5056,11 @@ packages: '@xmldom/xmldom': 0.8.6 debug: 4.3.4 headers-polyfill: 3.1.2 - outvariant: 1.3.0 + outvariant: 1.4.0 strict-event-emitter: 0.2.8 web-encoding: 1.1.5 transitivePeerDependencies: - supports-color - dev: true /@napi-rs/simple-git-android-arm-eabi@0.1.8: resolution: {integrity: sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==} @@ -5562,7 +5748,6 @@ packages: /@open-draft/until@1.0.3: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} - dev: true /@panva/hkdf@1.0.2: resolution: {integrity: sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==} @@ -6253,8 +6438,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true /@socket.io/component-emitter@3.1.0: @@ -6646,7 +6831,7 @@ packages: magic-string: 0.27.0 remark-external-links: 8.0.0 remark-slug: 6.1.0 - rollup: 3.21.6 + rollup: 3.26.2 typescript: 4.9.3 vite: 4.2.0 transitivePeerDependencies: @@ -7070,7 +7255,7 @@ packages: fetch-retry: 5.0.4 fs-extra: 11.1.1 isomorphic-unfetch: 3.1.0 - nanoid: 3.3.4 + nanoid: 3.3.6 read-pkg-up: 7.0.1 transitivePeerDependencies: - encoding @@ -7146,7 +7331,7 @@ packages: svelte: 3.58.0 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 4.3.2(@types/node@18.15.11) + vite: 4.3.2 transitivePeerDependencies: - supports-color dev: true @@ -7199,7 +7384,7 @@ packages: magic-string: 0.29.0 svelte: 3.58.0 svelte-hmr: 0.15.1(svelte@3.58.0) - vite: 4.3.2(@types/node@18.15.11) + vite: 4.3.2 vitefu: 0.2.4(vite@4.3.2) transitivePeerDependencies: - supports-color @@ -7215,10 +7400,10 @@ packages: debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.0 + magic-string: 0.30.1 svelte: 3.58.0 svelte-hmr: 0.15.1(svelte@3.58.0) - vite: 4.3.2(@types/node@18.15.11) + vite: 4.3.2 vitefu: 0.2.4(vite@4.3.2) transitivePeerDependencies: - supports-color @@ -7809,13 +7994,17 @@ packages: /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: - '@types/chai': 4.3.4 + '@types/chai': 4.3.5 dev: true /@types/chai@4.3.4: resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} dev: true + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + /@types/connect-history-api-fallback@1.5.0: resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} dependencies: @@ -7966,7 +8155,6 @@ packages: /@types/js-levenshtein@1.1.1: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} - dev: true /@types/js-yaml@4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} @@ -8057,7 +8245,6 @@ packages: /@types/node@20.3.1: resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} - dev: true /@types/nodemailer@6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} @@ -8170,7 +8357,6 @@ packages: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: '@types/node': 18.15.11 - dev: true /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} @@ -8498,6 +8684,44 @@ packages: vitest: 0.25.8(jsdom@20.0.3) dev: true + /@vitest/expect@0.33.0: + resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==} + dependencies: + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.33.0: + resolution: {integrity: sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==} + dependencies: + '@vitest/utils': 0.33.0 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.33.0: + resolution: {integrity: sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==} + dependencies: + magic-string: 0.30.1 + pathe: 1.1.1 + pretty-format: 29.6.1 + dev: true + + /@vitest/spy@0.33.0: + resolution: {integrity: sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.33.0: + resolution: {integrity: sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 29.6.1 + dev: true + /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: @@ -8610,7 +8834,6 @@ packages: /@xmldom/xmldom@0.8.6: resolution: {integrity: sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==} engines: {node: '>=10.0.0'} - dev: true /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -8635,7 +8858,6 @@ packages: /@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: @@ -8661,15 +8883,15 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.10.0 acorn-walk: 8.2.0 - /acorn-import-assertions@1.8.0(acorn@8.8.2): + /acorn-import-assertions@1.8.0(acorn@8.10.0): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.2 + acorn: 8.10.0 /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -8678,6 +8900,13 @@ packages: dependencies: acorn: 7.4.1 + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -8699,6 +8928,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + /acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} @@ -9081,7 +9315,6 @@ packages: /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - dev: true /axe-core@4.5.2: resolution: {integrity: sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==} @@ -9669,7 +9902,6 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -10112,7 +10344,7 @@ packages: css-select: 4.3.0 parse5: 6.0.1 parse5-htmlparser2-tree-adapter: 6.0.1 - postcss: 8.4.21 + postcss: 8.4.25 pretty-bytes: 5.6.0 /cross-spawn@5.1.0: @@ -10146,12 +10378,12 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) - postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) - postcss-modules-scope: 3.0.0(postcss@8.4.21) - postcss-modules-values: 4.0.0(postcss@8.4.21) + icss-utils: 5.1.0(postcss@8.4.25) + postcss: 8.4.25 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.25) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.25) + postcss-modules-scope: 3.0.0(postcss@8.4.25) + postcss-modules-values: 4.0.0(postcss@8.4.25) postcss-value-parser: 4.2.0 semver: 7.3.8 webpack: 5.75.0(esbuild@0.17.8) @@ -10499,8 +10731,8 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - /diff-sequences@29.3.1: - resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true @@ -11149,6 +11381,35 @@ packages: '@esbuild/win32-ia32': 0.17.8 '@esbuild/win32-x64': 0.17.8 + /esbuild@0.18.11: + resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.11 + '@esbuild/android-arm64': 0.18.11 + '@esbuild/android-x64': 0.18.11 + '@esbuild/darwin-arm64': 0.18.11 + '@esbuild/darwin-x64': 0.18.11 + '@esbuild/freebsd-arm64': 0.18.11 + '@esbuild/freebsd-x64': 0.18.11 + '@esbuild/linux-arm': 0.18.11 + '@esbuild/linux-arm64': 0.18.11 + '@esbuild/linux-ia32': 0.18.11 + '@esbuild/linux-loong64': 0.18.11 + '@esbuild/linux-mips64el': 0.18.11 + '@esbuild/linux-ppc64': 0.18.11 + '@esbuild/linux-riscv64': 0.18.11 + '@esbuild/linux-s390x': 0.18.11 + '@esbuild/linux-x64': 0.18.11 + '@esbuild/netbsd-x64': 0.18.11 + '@esbuild/openbsd-x64': 0.18.11 + '@esbuild/sunos-x64': 0.18.11 + '@esbuild/win32-arm64': 0.18.11 + '@esbuild/win32-ia32': 0.18.11 + '@esbuild/win32-x64': 0.18.11 + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -11832,8 +12093,8 @@ packages: resolution: {integrity: sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.0 dev: true @@ -12276,7 +12537,6 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - dev: true /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} @@ -12539,7 +12799,7 @@ packages: https-proxy-agent: 5.0.1 mri: 1.2.0 node-fetch-native: 1.1.0 - pathe: 1.1.0 + pathe: 1.1.1 tar: 6.1.13 transitivePeerDependencies: - supports-color @@ -12698,7 +12958,6 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.1.3 - dev: true /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -12709,7 +12968,6 @@ packages: /graphql@16.6.0: resolution: {integrity: sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: true /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -12905,7 +13163,6 @@ packages: /headers-polyfill@3.1.2: resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} - dev: true /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -13109,13 +13366,13 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.21): + /icss-utils@5.1.0(postcss@8.4.25): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.25 /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -13262,7 +13519,6 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true /internal-slot@1.0.3: resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} @@ -13338,7 +13594,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -13435,7 +13690,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -13484,6 +13738,10 @@ packages: resolution: {integrity: sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==} dev: true + /is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: false + /is-number-like@1.0.8: resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} dependencies: @@ -13612,7 +13870,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: true /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -13776,9 +14033,9 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 29.3.1 + diff-sequences: 29.4.3 jest-get-type: 29.2.0 - pretty-format: 29.3.1 + pretty-format: 29.6.1 dev: true /jest-get-type@29.2.0: @@ -13812,7 +14069,7 @@ packages: chalk: 4.1.2 jest-diff: 29.3.1 jest-get-type: 29.2.0 - pretty-format: 29.3.1 + pretty-format: 29.6.1 dev: true /jest-message-util@29.3.1: @@ -13825,7 +14082,7 @@ packages: chalk: 4.1.2 graceful-fs: 4.2.10 micromatch: 4.0.5 - pretty-format: 29.3.1 + pretty-format: 29.6.1 slash: 3.0.0 stack-utils: 2.0.6 dev: true @@ -13911,7 +14168,6 @@ packages: /js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} - dev: true /js-sdsl@4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} @@ -13972,7 +14228,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.10.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -14055,7 +14311,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.10.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -14640,13 +14896,20 @@ packages: resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 /magic-string@0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /make-dir@2.1.0: @@ -15170,8 +15433,8 @@ packages: /micromark-extension-mdxjs@1.0.0: resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) micromark-extension-mdx-expression: 1.0.3 micromark-extension-mdx-jsx: 1.0.3 micromark-extension-mdx-md: 1.0.0 @@ -15575,6 +15838,15 @@ packages: hasBin: true dev: true + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + /mousetrap@1.6.5: resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} dev: false @@ -15673,6 +15945,42 @@ packages: - supports-color dev: true + /msw@1.2.2(typescript@5.1.3): + resolution: {integrity: sha512-GsW3PE/Es/a1tYThXcM8YHOZ1S1MtivcS3He/LQbbTCx3rbWJYCtWD5XXyJ53KlNPT7O1VI9sCW3xMtgFe8XpQ==} + engines: {node: '>=14'} + hasBin: true + requiresBuild: true + peerDependencies: + typescript: '>= 4.4.x <= 5.1.x' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@mswjs/cookies': 0.2.2 + '@mswjs/interceptors': 0.17.6 + '@open-draft/until': 1.0.3 + '@types/cookie': 0.4.1 + '@types/js-levenshtein': 1.1.1 + chalk: 4.1.1 + chokidar: 3.5.3 + cookie: 0.4.2 + graphql: 16.6.0 + headers-polyfill: 3.1.2 + inquirer: 8.2.5 + is-node-process: 1.2.0 + js-levenshtein: 1.1.6 + node-fetch: 2.6.7 + outvariant: 1.4.0 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.4.6 + type-fest: 2.19.0 + typescript: 5.1.3 + yargs: 17.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} dependencies: @@ -15694,6 +16002,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -16477,6 +16790,9 @@ packages: resolution: {integrity: sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==} dev: true + /outvariant@1.4.0: + resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -16501,6 +16817,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -16709,7 +17032,6 @@ packages: /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -16722,8 +17044,8 @@ packages: util: 0.10.4 dev: false - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true /pathval@1.1.1: @@ -16801,6 +17123,14 @@ packages: find-up: 5.0.0 dev: true + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + /polished@4.2.2: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} @@ -16866,42 +17196,42 @@ packages: semver: 7.3.8 webpack: 5.75.0(esbuild@0.17.8) - /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.25): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.25 - /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): + /postcss-modules-local-by-default@4.0.0(postcss@8.4.25): resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 + icss-utils: 5.1.0(postcss@8.4.25) + postcss: 8.4.25 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 - /postcss-modules-scope@3.0.0(postcss@8.4.21): + /postcss-modules-scope@3.0.0(postcss@8.4.25): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.25 postcss-selector-parser: 6.0.11 - /postcss-modules-values@4.0.0(postcss@8.4.21): + /postcss-modules-values@4.0.0(postcss@8.4.25): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 + icss-utils: 5.1.0(postcss@8.4.25) + postcss: 8.4.25 /postcss-nested@6.0.0(postcss@8.4.21): resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} @@ -16947,7 +17277,7 @@ packages: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.4 + nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -16959,6 +17289,14 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + /preact-render-to-string@5.2.6(preact@10.11.3): resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: @@ -17020,6 +17358,12 @@ packages: hasBin: true dev: true + /prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -17037,7 +17381,16 @@ packages: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + 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 @@ -17888,7 +18241,7 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.21 + postcss: 8.4.25 source-map: 0.6.1 /resolve@1.19.0: @@ -17980,6 +18333,13 @@ packages: fsevents: 2.3.2 dev: true + /rollup@3.26.2: + resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + /rollup@3.5.1: resolution: {integrity: sha512-hdQWTvPeiAbM6SUkxV70HdGUVxsgsc+CLy5fuh4KdgUBJ0SowXiix8gANgXoG3wEuLwfoJhCT2V+WwxfWq9Ikw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -18283,7 +18643,6 @@ packages: /set-cookie-parser@2.5.1: resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} - dev: true /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -18362,6 +18721,10 @@ packages: get-intrinsic: 1.1.3 object-inspect: 1.12.2 + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /sigmund@1.0.1: resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} dev: false @@ -18660,6 +19023,10 @@ packages: escape-string-regexp: 2.0.0 dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false @@ -18737,11 +19104,9 @@ packages: 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==} - dev: true /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} @@ -18862,7 +19227,7 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.10.0 dev: true /stripe@11.18.0: @@ -19249,7 +19614,7 @@ packages: engines: {node: '>=10'} dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19258,7 +19623,7 @@ packages: engines: {node: '>=10'} dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19312,16 +19677,30 @@ packages: resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} dev: true + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + /tinypool@0.3.1: resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} engines: {node: '>=14.0.0'} dev: true + /tinypool@0.6.0: + resolution: {integrity: sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==} + engines: {node: '>=14.0.0'} + dev: true + /tinyspy@1.1.1: resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} engines: {node: '>=14.0.0'} dev: true + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + /tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} dependencies: @@ -19506,7 +19885,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 20.3.1 - acorn: 8.8.2 + acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -19784,6 +20163,10 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: false + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -20012,7 +20395,7 @@ packages: /unplugin@0.10.2: resolution: {integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==} dependencies: - acorn: 8.8.2 + acorn: 8.10.0 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.4.6 @@ -20124,7 +20507,6 @@ packages: is-generator-function: 1.0.10 is-typed-array: 1.1.10 which-typed-array: 1.1.9 - dev: true /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} @@ -20216,6 +20598,28 @@ packages: vfile-message: 3.1.3 dev: false + /vite-node@0.33.0(@types/node@18.15.11): + resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.2(@types/node@18.15.11) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-plugin-dts@2.3.0(vite@4.2.0): resolution: {integrity: sha512-WbJgGtsStgQhdm3EosYmIdTGbag5YQpZ3HXWUAPCDyoXI5qN6EY0V7NXq0lAmnv9hVQsvh0htbYcg0Or5Db9JQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -20255,7 +20659,7 @@ packages: kolorist: 1.7.0 magic-string: 0.29.0 ts-morph: 18.0.0 - vite: 4.3.2(@types/node@18.15.11) + vite: 4.3.2 transitivePeerDependencies: - '@types/node' - rollup @@ -20328,7 +20732,7 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.3.2(@types/node@18.15.11): + /vite@4.3.2: resolution: {integrity: sha512-9R53Mf+TBoXCYejcL+qFbZde+eZveQLDYd9XgULILLC1a5ZwPaqgmdVpL8/uvw2BM/1TzetWjglwm+3RO+xTyw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -20353,7 +20757,6 @@ packages: terser: optional: true dependencies: - '@types/node': 18.15.11 esbuild: 0.17.17 postcss: 8.4.21 rollup: 3.21.6 @@ -20361,6 +20764,78 @@ packages: fsevents: 2.3.2 dev: true + /vite@4.4.2(@types/node@18.15.11): + resolution: {integrity: sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.18.11 + postcss: 8.4.25 + rollup: 3.26.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vite@4.4.2(@types/node@20.3.1): + resolution: {integrity: sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.3.1 + esbuild: 0.18.11 + postcss: 8.4.25 + rollup: 3.26.2 + optionalDependencies: + fsevents: 2.3.2 + dev: false + /vitefu@0.2.4(vite@4.2.0): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: @@ -20380,7 +20855,7 @@ packages: vite: optional: true dependencies: - vite: 4.3.2(@types/node@18.15.11) + vite: 4.3.2 dev: true /vitest@0.25.8(jsdom@20.0.3): @@ -20419,9 +20894,75 @@ packages: tinybench: 2.4.0 tinypool: 0.3.1 tinyspy: 1.1.1 - vite: 4.3.2(@types/node@18.15.11) + vite: 4.4.2(@types/node@18.15.11) transitivePeerDependencies: - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vitest@0.33.0: + resolution: {integrity: sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.11 + '@vitest/expect': 0.33.0 + '@vitest/runner': 0.33.0 + '@vitest/snapshot': 0.33.0 + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.1 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.6.0 + vite: 4.4.2(@types/node@18.15.11) + vite-node: 0.33.0(@types/node@18.15.11) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss - sass - stylus - sugarss @@ -20501,7 +21042,6 @@ packages: util: 0.12.5 optionalDependencies: '@zxing/text-encoding': 0.9.0 - dev: true /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -20665,8 +21205,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) + acorn: 8.10.0 + acorn-import-assertions: 1.8.0(acorn@8.10.0) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -20704,8 +21244,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) + acorn: 8.10.0 + acorn-import-assertions: 1.8.0(acorn@8.10.0) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -20834,7 +21374,6 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - dev: true /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -20856,6 +21395,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -21105,6 +21653,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /z-schema@5.0.5: resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} engines: {node: '>=8.0.0'}