From e3a4cfa7abd284162b91c9cf9a563ee887ab3247 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Fri, 12 Apr 2024 19:57:01 -0400 Subject: [PATCH 01/18] add class names for UI testing --- frontend/src/App.tsx | 4 ++-- frontend/src/components/ImageUpload.tsx | 2 +- frontend/src/components/UrlInputSection.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2329105..95b5779 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -457,7 +457,7 @@ function App() { @@ -574,7 +574,7 @@ function App() { diff --git a/frontend/src/components/ImageUpload.tsx b/frontend/src/components/ImageUpload.tsx index 366f104..bbecd92 100644 --- a/frontend/src/components/ImageUpload.tsx +++ b/frontend/src/components/ImageUpload.tsx @@ -166,7 +166,7 @@ function ImageUpload({ setReferenceImages }: Props) { {screenRecorderState === ScreenRecorderState.INITIAL && ( /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
- +

Drag & drop a screenshot here,
or click to upload diff --git a/frontend/src/components/UrlInputSection.tsx b/frontend/src/components/UrlInputSection.tsx index 35ad622..18422d6 100644 --- a/frontend/src/components/UrlInputSection.tsx +++ b/frontend/src/components/UrlInputSection.tsx @@ -69,7 +69,7 @@ export function UrlInputSection({ doCreate, screenshotOneApiKey }: Props) { From 01022abc4a080388d2e32c4e05462cdde916897e Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Thu, 16 May 2024 14:05:18 -0400 Subject: [PATCH 02/18] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..386e7e3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,21 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Screenshots of backend AND frontend terminal logs** +If applicable, add screenshots to help explain your problem. From 1f61d02da693424731fa34013e7d8a8142592d88 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Thu, 16 May 2024 14:05:50 -0400 Subject: [PATCH 03/18] Update issue templates --- .github/ISSUE_TEMPLATE/custom.md | 10 ++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 0000000..48d5f81 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 72d412fa52fec5f60271a5882dbf3fe7db3ddd67 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Fri, 17 May 2024 16:22:45 -0400 Subject: [PATCH 04/18] set up a basic puppeteer test --- frontend/.gitignore | 3 + frontend/jest.config.js | 8 + frontend/package.json | 7 +- frontend/src/components/history/utils.test.ts | 275 +-- frontend/src/tests/qa.test.ts | 95 + frontend/yarn.lock | 2120 ++++++++++++++++- 6 files changed, 2350 insertions(+), 158 deletions(-) create mode 100644 frontend/jest.config.js create mode 100644 frontend/src/tests/qa.test.ts diff --git a/frontend/.gitignore b/frontend/.gitignore index 17ceca3..250cd48 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -25,3 +25,6 @@ dist-ssr # Env files .env* + +# QA files +qa/**/* diff --git a/frontend/jest.config.js b/frontend/jest.config.js new file mode 100644 index 0000000..a31fc6d --- /dev/null +++ b/frontend/jest.config.js @@ -0,0 +1,8 @@ +export default { + preset: "ts-jest", + testEnvironment: "node", + transform: { + "^.+\\.tsx?$": "ts-jest", + }, + testTimeout: 30000, +}; diff --git a/frontend/package.json b/frontend/package.json index 7109443..2fb02e3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,7 +10,7 @@ "build-hosted": "tsc && vite build --mode prod", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "test": "vitest" + "test": "jest" }, "dependencies": { "@codemirror/lang-html": "^6.4.6", @@ -49,7 +49,9 @@ "webm-duration-fix": "^1.0.4" }, "devDependencies": { + "@types/jest": "^29.5.12", "@types/node": "^20.9.0", + "@types/puppeteer": "^7.0.4", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@typescript-eslint/eslint-plugin": "^6.0.0", @@ -59,8 +61,11 @@ "eslint": "^8.45.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.3", + "jest": "^29.7.0", "postcss": "^8.4.31", + "puppeteer": "^22.6.4", "tailwindcss": "^3.3.5", + "ts-jest": "^29.1.2", "typescript": "^5.0.2", "vite": "^4.4.5", "vite-plugin-html": "^3.2.0", diff --git a/frontend/src/components/history/utils.test.ts b/frontend/src/components/history/utils.test.ts index 330b8e5..e321bdc 100644 --- a/frontend/src/components/history/utils.test.ts +++ b/frontend/src/components/history/utils.test.ts @@ -1,4 +1,3 @@ -import { expect, test } from "vitest"; import { extractHistoryTree, renderHistory } from "./utils"; import type { History } from "./history_types"; @@ -84,147 +83,149 @@ const basicBadHistory: History = [ }, ]; -test("should correctly extract the history tree", () => { - expect(extractHistoryTree(basicLinearHistory, 2)).toEqual([ - "1. create", - "use better icons", - "2. edit with better icons", - "make text red", - "3. edit with better icons and red text", - ]); +describe("History Utils", () => { + test("should correctly extract the history tree", () => { + expect(extractHistoryTree(basicLinearHistory, 2)).toEqual([ + "1. create", + "use better icons", + "2. edit with better icons", + "make text red", + "3. edit with better icons and red text", + ]); - expect(extractHistoryTree(basicLinearHistory, 0)).toEqual([ - "1. create", - ]); + expect(extractHistoryTree(basicLinearHistory, 0)).toEqual([ + "1. create", + ]); - // Test branching - expect(extractHistoryTree(basicBranchingHistory, 3)).toEqual([ - "1. create", - "use better icons", - "2. edit with better icons", - "make text green", - "4. edit with better icons and green text", - ]); + // Test branching + expect(extractHistoryTree(basicBranchingHistory, 3)).toEqual([ + "1. create", + "use better icons", + "2. edit with better icons", + "make text green", + "4. edit with better icons and green text", + ]); - expect(extractHistoryTree(longerBranchingHistory, 4)).toEqual([ - "1. create", - "use better icons", - "2. edit with better icons", - "make text green", - "4. edit with better icons and green text", - "make text bold", - "5. edit with better icons and green, bold text", - ]); + expect(extractHistoryTree(longerBranchingHistory, 4)).toEqual([ + "1. create", + "use better icons", + "2. edit with better icons", + "make text green", + "4. edit with better icons and green text", + "make text bold", + "5. edit with better icons and green, bold text", + ]); - expect(extractHistoryTree(longerBranchingHistory, 2)).toEqual([ - "1. create", - "use better icons", - "2. edit with better icons", - "make text red", - "3. edit with better icons and red text", - ]); + expect(extractHistoryTree(longerBranchingHistory, 2)).toEqual([ + "1. create", + "use better icons", + "2. edit with better icons", + "make text red", + "3. edit with better icons and red text", + ]); - // Errors + // Errors - // Bad index - expect(() => extractHistoryTree(basicLinearHistory, 100)).toThrow(); - expect(() => extractHistoryTree(basicLinearHistory, -2)).toThrow(); + // Bad index + expect(() => extractHistoryTree(basicLinearHistory, 100)).toThrow(); + expect(() => extractHistoryTree(basicLinearHistory, -2)).toThrow(); - // Bad tree - expect(() => extractHistoryTree(basicBadHistory, 1)).toThrow(); -}); - -test("should correctly render the history tree", () => { - expect(renderHistory(basicLinearHistory, 2)).toEqual([ - { - isActive: false, - parentVersion: null, - summary: "Create", - type: "Create", - }, - { - isActive: false, - parentVersion: null, - summary: "use better icons", - type: "Edit", - }, - { - isActive: true, - parentVersion: null, - summary: "make text red", - type: "Edit", - }, - ]); - - // Current version is the first version - expect(renderHistory(basicLinearHistory, 0)).toEqual([ - { - isActive: true, - parentVersion: null, - summary: "Create", - type: "Create", - }, - { - isActive: false, - parentVersion: null, - summary: "use better icons", - type: "Edit", - }, - { - isActive: false, - parentVersion: null, - summary: "make text red", - type: "Edit", - }, - ]); - - // Render a history with code - expect(renderHistory(basicLinearHistoryWithCode, 0)).toEqual([ - { - isActive: true, - parentVersion: null, - summary: "Imported from code", - type: "Imported from code", - }, - { - isActive: false, - parentVersion: null, - summary: "use better icons", - type: "Edit", - }, - { - isActive: false, - parentVersion: null, - summary: "make text red", - type: "Edit", - }, - ]); - - // Render a non-linear history - expect(renderHistory(basicBranchingHistory, 3)).toEqual([ - { - isActive: false, - parentVersion: null, - summary: "Create", - type: "Create", - }, - { - isActive: false, - parentVersion: null, - summary: "use better icons", - type: "Edit", - }, - { - isActive: false, - parentVersion: null, - summary: "make text red", - type: "Edit", - }, - { - isActive: true, - parentVersion: "v2", - summary: "make text green", - type: "Edit", - }, - ]); + // Bad tree + expect(() => extractHistoryTree(basicBadHistory, 1)).toThrow(); + }); + + test("should correctly render the history tree", () => { + expect(renderHistory(basicLinearHistory, 2)).toEqual([ + { + isActive: false, + parentVersion: null, + summary: "Create", + type: "Create", + }, + { + isActive: false, + parentVersion: null, + summary: "use better icons", + type: "Edit", + }, + { + isActive: true, + parentVersion: null, + summary: "make text red", + type: "Edit", + }, + ]); + + // Current version is the first version + expect(renderHistory(basicLinearHistory, 0)).toEqual([ + { + isActive: true, + parentVersion: null, + summary: "Create", + type: "Create", + }, + { + isActive: false, + parentVersion: null, + summary: "use better icons", + type: "Edit", + }, + { + isActive: false, + parentVersion: null, + summary: "make text red", + type: "Edit", + }, + ]); + + // Render a history with code + expect(renderHistory(basicLinearHistoryWithCode, 0)).toEqual([ + { + isActive: true, + parentVersion: null, + summary: "Imported from code", + type: "Imported from code", + }, + { + isActive: false, + parentVersion: null, + summary: "use better icons", + type: "Edit", + }, + { + isActive: false, + parentVersion: null, + summary: "make text red", + type: "Edit", + }, + ]); + + // Render a non-linear history + expect(renderHistory(basicBranchingHistory, 3)).toEqual([ + { + isActive: false, + parentVersion: null, + summary: "Create", + type: "Create", + }, + { + isActive: false, + parentVersion: null, + summary: "use better icons", + type: "Edit", + }, + { + isActive: false, + parentVersion: null, + summary: "make text red", + type: "Edit", + }, + { + isActive: true, + parentVersion: "v2", + summary: "make text green", + type: "Edit", + }, + ]); + }); }); diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts new file mode 100644 index 0000000..9f75cd2 --- /dev/null +++ b/frontend/src/tests/qa.test.ts @@ -0,0 +1,95 @@ +import puppeteer, { Browser, Page, ElementHandle } from "puppeteer"; +import { Stack } from "../lib/stacks"; + +const REPO_PATH = "/Users/abi/Documents/GitHub/screenshot-to-code/frontend"; +const DOWNLOAD_PATH = `${REPO_PATH}/qa`; +const SCREENSHOTS_PATH = `${REPO_PATH}/qa/results`; +const IMAGE_PATH = DOWNLOAD_PATH + "/ui_table.png"; + +describe("Simple Puppeteer Test", () => { + let browser: Browser; + let page: Page; + + beforeAll(async () => { + browser = await puppeteer.launch({ headless: true }); + page = await browser.newPage(); + await page.goto("http://localhost:5173/"); + + // Set screen size + await page.setViewport({ width: 1080, height: 1024 }); + + // TODO: Does this need to be moved? + const client = await page.createCDPSession(); + + // Set download behavior path + await client.send("Page.setDownloadBehavior", { + behavior: "allow", + downloadPath: DOWNLOAD_PATH, + }); + }); + + afterAll(async () => { + await browser.close(); + }); + + const stacks = Object.values(Stack).slice(0, 1); + + stacks.forEach((stack) => { + it(`should load the homepage and check the title for stack: ${stack}`, async () => { + const codeGenerationModel = "claude_3_sonnet"; + + // Set up local storage + const setting = { + openAiApiKey: null, + openAiBaseURL: null, + screenshotOneApiKey: null, + isImageGenerationEnabled: false, + editorTheme: "cobalt", + generatedCodeConfig: stack, + codeGenerationModel: codeGenerationModel, + isTermOfServiceAccepted: false, + accessCode: null, + }; + + await page.evaluate((setting) => { + localStorage.setItem("setting", JSON.stringify(setting)); + }, setting); + + // Reload the page to apply the local storage + await page.reload(); + + // Generate from image + + const fileInput = (await page.$( + ".file-input" + )) as ElementHandle; + // Replace with the path to your image + const imagePath = IMAGE_PATH; + if (!fileInput) { + throw new Error("File input element not found"); + } + + // Upload file + await fileInput.uploadFile(imagePath); + + // Screenshot of the uploaded image + await page.screenshot({ + path: `${SCREENSHOTS_PATH}/${codeGenerationModel}_${stack}_image_uploaded.png`, + }); + + console.log("starting image code generation for stack: ", stack); + + // Click the generate button and wait for the code to be generated + await page.waitForNetworkIdle(); + await page.waitForFunction(() => document.body.innerText.includes("v1"), { + timeout: 30000, + }); + + await page.screenshot({ + path: `${SCREENSHOTS_PATH}/${codeGenerationModel}_${stack}_image_generation_results.png`, + }); + + console.log(`done with image code generation for stack: ${stack}`); + }); + }); +}); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 1edf79e..7a08c1e 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -20,6 +20,14 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" @@ -33,6 +41,32 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz" integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== +"@babel/compat-data@^7.23.5": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.23.2": version "7.23.3" resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz" @@ -64,6 +98,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-compilation-targets@^7.22.15": version "7.22.15" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" @@ -75,6 +119,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" @@ -102,6 +157,13 @@ dependencies: "@babel/types" "^7.22.15" +"@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + "@babel/helper-module-transforms@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" @@ -113,6 +175,22 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== + "@babel/helper-plugin-utils@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" @@ -125,6 +203,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" @@ -132,21 +217,43 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + "@babel/helpers@^7.23.2": version "7.23.2" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz" @@ -156,6 +263,15 @@ "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + "@babel/highlight@^7.22.13": version "7.22.20" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" @@ -165,11 +281,124 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz" integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== +"@babel/parser@^7.14.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-transform-react-jsx-self@^7.22.5": version "7.23.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz" @@ -200,6 +429,15 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz" @@ -216,6 +454,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz" @@ -225,6 +479,20 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@codemirror/autocomplete@^6.0.0": version "6.11.0" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.11.0.tgz#406dee8bf5342dfb48920ad75454d3406ddf9963" @@ -626,6 +894,145 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -633,6 +1040,68 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" @@ -642,6 +1111,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" @@ -652,6 +1130,11 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.3": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" @@ -665,6 +1148,14 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" @@ -738,6 +1229,34 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@puppeteer/browsers@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.2.1.tgz#c40608b96b10c09a6b2d08ab5ea31dfe1b409455" + integrity sha512-QSXujx4d4ogDamQA8ckkkRieFzDgZEuZuGiey9G7CuDcbnX4iINKWxTPC5Br2AEzY9ICAvcndqgAUFMMKnS/Tw== + dependencies: + debug "4.3.4" + extract-zip "2.0.1" + progress "2.0.3" + proxy-agent "6.4.0" + semver "7.6.0" + tar-fs "3.0.5" + unbzip2-stream "1.4.3" + yargs "17.7.2" + +"@puppeteer/browsers@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.2.3.tgz#ad6b79129c50825e77ddaba082680f4dad0b674e" + integrity sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ== + dependencies: + debug "4.3.4" + extract-zip "2.0.1" + progress "2.0.3" + proxy-agent "6.4.0" + semver "7.6.0" + tar-fs "3.0.5" + unbzip2-stream "1.4.3" + yargs "17.7.2" + "@radix-ui/number@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" @@ -1262,6 +1781,36 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__core@^7.20.3": version "7.20.4" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz" @@ -1295,11 +1844,59 @@ dependencies: "@babel/types" "^7.20.7" +"@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/json-schema@^7.0.12": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/node@*": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + "@types/node@^20.9.0": version "20.9.0" resolved "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz" @@ -1312,6 +1909,13 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz" integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== +"@types/puppeteer@^7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-7.0.4.tgz#6eb4081323e9075c1f4c353f93ee2ed6eed99487" + integrity sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg== + dependencies: + puppeteer "*" + "@types/react-dom@^18.2.7": version "18.2.15" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz" @@ -1338,6 +1942,30 @@ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz" integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^6.0.0": version "6.11.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz" @@ -1497,6 +2125,13 @@ acorn@^8.10.0, acorn@^8.8.2, acorn@^8.9.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1507,7 +2142,7 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1526,7 +2161,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -1543,7 +2178,7 @@ any-promise@^1.0.0: resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1556,6 +2191,13 @@ arg@^5.0.2: resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" @@ -1578,6 +2220,13 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + async@^3.2.3: version "3.2.5" resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" @@ -1600,11 +2249,102 @@ autoprefixer@^10.4.16: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +b4a@^1.6.4: + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" + integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== + +bare-fs@^2.1.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.2.3.tgz#34f8b81b8c79de7ef043383c05e57d4a10392a68" + integrity sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw== + dependencies: + bare-events "^2.0.0" + bare-path "^2.0.0" + streamx "^2.13.0" + +bare-os@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.2.1.tgz#c94a258c7a408ca6766399e44675136c0964913d" + integrity sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w== + +bare-path@^2.0.0, bare-path@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.1.tgz#111db5bf2db0aed40081aa4ba38b8dfc2bb782eb" + integrity sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A== + dependencies: + bare-os "^2.1.0" + base64-arraybuffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" @@ -1615,6 +2355,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" @@ -1657,11 +2402,48 @@ browserslist@^4.21.10, browserslist@^4.21.9: node-releases "^2.0.13" update-browserslist-db "^1.0.13" +browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.2.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -1693,11 +2475,26 @@ camelcase-css@^2.0.1: resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: version "1.0.30001562" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz" integrity sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng== +caniuse-lite@^1.0.30001587: + version "1.0.30001620" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz#78bb6f35b8fe315b96b8590597094145d0b146b4" + integrity sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew== + chai@^4.3.10: version "4.3.10" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" @@ -1728,6 +2525,11 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + check-error@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" @@ -1750,6 +2552,34 @@ chokidar@^3.5.1, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chromium-bidi@0.5.17: + version "0.5.17" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.17.tgz#04b66fa77f9ab80234b72206e71fc2af96fd08c4" + integrity sha512-BqOuIWUgTPj8ayuBFJUYCCuwIcwjBsb3/614P7tt1bEPJ4i1M0kCdIl0Wi9xhtswBXnfO2bTpTMkHD71H8rJMg== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.22.4" + +chromium-bidi@0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.19.tgz#e4f4951b7d9b20d668d6b387839f7b7bf2d69ef4" + integrity sha512-UA6zL77b7RYCjJkZBsZ0wlvCTD+jTjllZ8f6wdO4buevXgTZYjV+XLB9CiEa2OuuTGGTLnI7eN9I60YxuALGQg== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.22.4" + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + class-variance-authority@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" @@ -1769,11 +2599,25 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@2.0.0, clsx@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + codemirror@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" @@ -1787,6 +2631,11 @@ codemirror@^6.0.1: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -1858,6 +2707,29 @@ copy-to-clipboard@^3.3.3: dependencies: toggle-selection "^1.0.6" +cosmiconfig@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + crelt@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" @@ -1905,13 +2777,23 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" @@ -1924,11 +2806,40 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== +devtools-protocol@0.0.1262051: + version "0.0.1262051" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1262051.tgz#670b1f8459b2a136e05bd9a8d54ec0212d543a38" + integrity sha512-YJe4CT5SA8on3Spa+UDtNhEqtuV6Epwz3OZ4HQVLhlRccpZ9/PAYk0/cy/oKxFKRrZPBUPyxympQci4yWNWZ9g== + +devtools-protocol@0.0.1286932: + version "0.0.1286932" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1286932.tgz#2303707034426fe0b39012713d4b7339f7dbc815" + integrity sha512-wu58HMQll9voDjR4NlPyoDEw1syfzaBNHymMMZ/QOXiHRNluOnDgu9hp1yHOKYoMlxCh4lSSiugLITe6Fvu1eA== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" @@ -2023,11 +2934,45 @@ electron-to-chromium@^1.4.535: resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz" integrity sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA== +electron-to-chromium@^1.4.668: + version "1.4.774" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz#1017d1758aaeeefe5423aa9d67b4b1e5d1d0a856" + integrity sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + esbuild@^0.18.10: version "0.18.20" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" @@ -2094,11 +3039,27 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-plugin-react-hooks@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" @@ -2175,6 +3136,11 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" @@ -2209,6 +3175,21 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + execa@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -2224,11 +3205,43 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" @@ -2240,7 +3253,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -2257,6 +3270,20 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" @@ -2285,6 +3312,14 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -2330,12 +3365,21 @@ fs-extra@^11.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2, fsevents@~2.3.3: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -2350,6 +3394,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -2360,11 +3409,38 @@ get-nonce@^1.0.0: resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-stream@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-uri@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" + integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + fs-extra "^11.2.0" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -2391,7 +3467,7 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2432,7 +3508,7 @@ goober@^2.1.10: resolved "https://registry.npmjs.org/goober/-/goober-2.1.13.tgz" integrity sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ== -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -2464,6 +3540,11 @@ he@1.2.0, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + html-minifier-terser@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" @@ -2485,12 +3566,33 @@ html2canvas@^1.4.1: css-line-break "^2.1.0" text-segmentation "^1.0.3" +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + human-signals@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -2500,7 +3602,7 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -import-fresh@^3.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2508,6 +3610,14 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" @@ -2538,6 +3648,19 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -2557,6 +3680,16 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -2574,6 +3707,11 @@ is-path-inside@^3.0.3: resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" @@ -2584,6 +3722,59 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -2594,6 +3785,364 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + jiti@^1.19.1: version "1.21.0" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" @@ -2604,6 +4153,14 @@ jiti@^1.19.1: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -2611,6 +4168,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -2621,6 +4183,11 @@ json-buffer@3.0.1: resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -2657,6 +4224,16 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" @@ -2683,6 +4260,13 @@ local-pkg@^0.5.0: mlly "^1.4.2" pkg-types "^1.0.3" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -2695,6 +4279,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -2740,6 +4329,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + magic-string@^0.30.5: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" @@ -2747,6 +4341,25 @@ magic-string@^0.30.5: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2765,6 +4378,11 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" @@ -2784,6 +4402,11 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mlly@^1.2.0, mlly@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e" @@ -2818,6 +4441,11 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -2834,11 +4462,21 @@ node-html-parser@^5.3.3: css-select "^4.2.1" he "1.2.0" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + node-releases@^2.0.13: version "2.0.13" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -2880,13 +4518,20 @@ object-hash@^3.0.0: resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + onetime@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" @@ -2906,7 +4551,14 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -p-limit@^3.0.2: +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -2920,6 +4572,13 @@ p-limit@^5.0.0: dependencies: yocto-queue "^1.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" @@ -2927,6 +4586,33 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pac-proxy-agent@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" + integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.2" + +pac-resolver@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -2942,6 +4628,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" @@ -2995,12 +4691,17 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -3010,11 +4711,18 @@ pify@^2.3.0: resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pirates@^4.0.1: +pirates@^4.0.1, pirates@^4.0.4: version "4.0.6" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-types@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" @@ -3091,7 +4799,7 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -pretty-format@^29.7.0: +pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -3100,6 +4808,19 @@ pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +progress@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" @@ -3109,16 +4830,95 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-agent@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" + integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.3" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.1" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +puppeteer-core@22.6.4: + version "22.6.4" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.6.4.tgz#b0f9b3c7e90013e892fc34f0a3685543aa7b6326" + integrity sha512-QtfJwPmqQec3EHc6LqbEz03vSiuVAr9bYp0TV87dLoreev6ZevsXdLgOfQgoA3GocrsSe/eUf7NRPQ1lQfsc3w== + dependencies: + "@puppeteer/browsers" "2.2.1" + chromium-bidi "0.5.17" + debug "4.3.4" + devtools-protocol "0.0.1262051" + ws "8.16.0" + +puppeteer-core@22.9.0: + version "22.9.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.9.0.tgz#df7ef6c285f4eed938911322184f9cd21d892b39" + integrity sha512-Q2SYVZ1SIE7jCd/Pp+1/mNLFtdJfGvAF+CqOTDG8HcCNCiBvoXfopXfOfMHQ/FueXhGfJW/I6DartWv6QzpNGg== + dependencies: + "@puppeteer/browsers" "2.2.3" + chromium-bidi "0.5.19" + debug "4.3.4" + devtools-protocol "0.0.1286932" + ws "8.17.0" + +puppeteer@*: + version "22.9.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.9.0.tgz#ef404de6c1f6a5b32e01ede20258acf4aa826bf9" + integrity sha512-yNux2cm6Sfik4lNLNjJ25Cdn9spJRbMXxl1YZtVZCEhEeej1sFlCvZ/Cr64LhgyJOuvz3iq2uk+RLFpQpGwrjw== + dependencies: + "@puppeteer/browsers" "2.2.3" + cosmiconfig "9.0.0" + devtools-protocol "0.0.1286932" + puppeteer-core "22.9.0" + +puppeteer@^22.6.4: + version "22.6.4" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.6.4.tgz#478028ff522e51b5456d9c4a2a0df6ee3a5b2a72" + integrity sha512-J9hXNwZmuqKDmNMj6kednZH8jzbdX9735NQfQJrq5LRD4nHisAMyW9pCD7glKi+iM7RV9JkesI1MYhdsN+0ZSQ== + dependencies: + "@puppeteer/browsers" "2.2.1" + cosmiconfig "9.0.0" + devtools-protocol "0.0.1262051" + puppeteer-core "22.6.4" + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" @@ -3237,12 +5037,34 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.7, resolve@^1.22.2: +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.2: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -3303,7 +5125,14 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@^6.3.1: +semver@7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -3315,6 +5144,11 @@ semver@^7.3.4, semver@^7.5.0, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.5.3: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -3332,21 +5166,61 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" + integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.7.1: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -3355,11 +5229,28 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@~0.6.0: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + stackback@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" @@ -3370,6 +5261,33 @@ std-env@^3.5.0: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.6.0.tgz#94807562bddc68fa90f2e02c5fd5b6865bb4e98e" integrity sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg== +streamx@^2.13.0, streamx@^2.15.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" + optionalDependencies: + bare-events "^2.2.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -3377,6 +5295,16 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-final-newline@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" @@ -3426,6 +5354,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -3471,6 +5406,26 @@ tailwindcss@^3.3.5: resolve "^1.22.2" sucrase "^3.32.0" +tar-fs@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.5.tgz#f954d77767e4e6edf973384e1eb95f8f81d64ed9" + integrity sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^2.1.1" + bare-path "^2.1.0" + +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + terser@^5.10.0: version "5.24.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" @@ -3481,6 +5436,15 @@ terser@^5.10.0: commander "^2.20.0" source-map-support "~0.5.20" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-segmentation@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" @@ -3512,6 +5476,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tiny-invariant@^1.1.0: version "1.3.1" resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" @@ -3532,6 +5501,11 @@ tinyspy@^2.2.0: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" @@ -3559,7 +5533,21 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: +ts-jest@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.2.tgz#7613d8c81c43c8cb312c6904027257e814c40e09" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -3571,7 +5559,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -3596,6 +5584,14 @@ ufo@^1.3.0: resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" @@ -3621,6 +5617,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + use-callback-ref@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" @@ -3648,6 +5649,15 @@ utrie@^1.0.2: dependencies: base64-arraybuffer "^1.0.2" +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + vite-node@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.0.1.tgz#c16c9df9b5d47b74156a6501c9db5b380d992768" @@ -3798,6 +5808,13 @@ w3c-keyname@^2.2.4: resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + webm-duration-fix@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/webm-duration-fix/-/webm-duration-fix-1.0.4.tgz#fef235cb3d3ed3363507f705a7577dbb9fdedae6" @@ -3823,11 +5840,43 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +ws@8.17.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" @@ -3843,6 +5892,32 @@ yaml@^2.1.1: resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@17.7.2, yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" @@ -3852,3 +5927,8 @@ yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zod@3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== From 7396160833e9c78c21df6a57d9b04aa97c3a17b7 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Fri, 17 May 2024 16:49:17 -0400 Subject: [PATCH 05/18] clean up the code --- frontend/src/tests/qa.test.ts | 66 +++++++++++++++++------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 9f75cd2..0c6de47 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -32,53 +32,34 @@ describe("Simple Puppeteer Test", () => { await browser.close(); }); - const stacks = Object.values(Stack).slice(0, 1); + const stacks = Object.values(Stack); + + // For debugging + //.slice(0, 1); stacks.forEach((stack) => { it(`should load the homepage and check the title for stack: ${stack}`, async () => { const codeGenerationModel = "claude_3_sonnet"; + const testId = `${codeGenerationModel}_${stack}`; - // Set up local storage - const setting = { - openAiApiKey: null, - openAiBaseURL: null, - screenshotOneApiKey: null, - isImageGenerationEnabled: false, - editorTheme: "cobalt", - generatedCodeConfig: stack, - codeGenerationModel: codeGenerationModel, - isTermOfServiceAccepted: false, - accessCode: null, - }; - - await page.evaluate((setting) => { - localStorage.setItem("setting", JSON.stringify(setting)); - }, setting); - - // Reload the page to apply the local storage - await page.reload(); - - // Generate from image + await setupLocalStorage(page, stack, codeGenerationModel); + // Upload file const fileInput = (await page.$( ".file-input" )) as ElementHandle; - // Replace with the path to your image - const imagePath = IMAGE_PATH; + if (!fileInput) { throw new Error("File input element not found"); } - // Upload file - await fileInput.uploadFile(imagePath); + await fileInput.uploadFile(IMAGE_PATH); - // Screenshot of the uploaded image + // Screenshot the first step await page.screenshot({ - path: `${SCREENSHOTS_PATH}/${codeGenerationModel}_${stack}_image_uploaded.png`, + path: `${SCREENSHOTS_PATH}/${testId}_image_uploaded.png`, }); - console.log("starting image code generation for stack: ", stack); - // Click the generate button and wait for the code to be generated await page.waitForNetworkIdle(); await page.waitForFunction(() => document.body.innerText.includes("v1"), { @@ -86,10 +67,29 @@ describe("Simple Puppeteer Test", () => { }); await page.screenshot({ - path: `${SCREENSHOTS_PATH}/${codeGenerationModel}_${stack}_image_generation_results.png`, + path: `${SCREENSHOTS_PATH}/${testId}_image_results.png`, }); - - console.log(`done with image code generation for stack: ${stack}`); }); }); }); + +async function setupLocalStorage(page: Page, stack: string, model: string) { + const setting = { + openAiApiKey: null, + openAiBaseURL: null, + screenshotOneApiKey: null, + isImageGenerationEnabled: false, + editorTheme: "cobalt", + generatedCodeConfig: stack, + codeGenerationModel: model, + isTermOfServiceAccepted: false, + accessCode: null, + }; + + await page.evaluate((setting) => { + localStorage.setItem("setting", JSON.stringify(setting)); + }, setting); + + // Reload the page to apply the local storage + await page.reload(); +} From 610400bc49ae42b8ad1d60d175a1dc8bec95a484 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Fri, 17 May 2024 16:52:01 -0400 Subject: [PATCH 06/18] also iterate through stacks --- frontend/src/tests/qa.test.ts | 57 +++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 0c6de47..a86a0d0 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -1,5 +1,6 @@ import puppeteer, { Browser, Page, ElementHandle } from "puppeteer"; import { Stack } from "../lib/stacks"; +import { CodeGenerationModel } from "../lib/models"; const REPO_PATH = "/Users/abi/Documents/GitHub/screenshot-to-code/frontend"; const DOWNLOAD_PATH = `${REPO_PATH}/qa`; @@ -32,42 +33,46 @@ describe("Simple Puppeteer Test", () => { await browser.close(); }); - const stacks = Object.values(Stack); - + const stacks = Object.values(Stack).slice(0, 1); + const models = Object.values(CodeGenerationModel); // For debugging //.slice(0, 1); - stacks.forEach((stack) => { - it(`should load the homepage and check the title for stack: ${stack}`, async () => { - const codeGenerationModel = "claude_3_sonnet"; - const testId = `${codeGenerationModel}_${stack}`; + models.forEach((model) => { + stacks.forEach((stack) => { + it(`should load the homepage and check the title for stack: ${stack}`, async () => { + const testId = `${model}_${stack}`; - await setupLocalStorage(page, stack, codeGenerationModel); + await setupLocalStorage(page, stack, model); - // Upload file - const fileInput = (await page.$( - ".file-input" - )) as ElementHandle; + // Upload file + const fileInput = (await page.$( + ".file-input" + )) as ElementHandle; - if (!fileInput) { - throw new Error("File input element not found"); - } + if (!fileInput) { + throw new Error("File input element not found"); + } - await fileInput.uploadFile(IMAGE_PATH); + await fileInput.uploadFile(IMAGE_PATH); - // Screenshot the first step - await page.screenshot({ - path: `${SCREENSHOTS_PATH}/${testId}_image_uploaded.png`, - }); + // Screenshot the first step + await page.screenshot({ + path: `${SCREENSHOTS_PATH}/${testId}_image_uploaded.png`, + }); - // Click the generate button and wait for the code to be generated - await page.waitForNetworkIdle(); - await page.waitForFunction(() => document.body.innerText.includes("v1"), { - timeout: 30000, - }); + // Click the generate button and wait for the code to be generated + await page.waitForNetworkIdle(); + await page.waitForFunction( + () => document.body.innerText.includes("v1"), + { + timeout: 30000, + } + ); - await page.screenshot({ - path: `${SCREENSHOTS_PATH}/${testId}_image_results.png`, + await page.screenshot({ + path: `${SCREENSHOTS_PATH}/${testId}_image_results.png`, + }); }); }); }); From 992344ac8de4414e487ad0f5166f0efa943d4bfd Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Fri, 17 May 2024 17:06:51 -0400 Subject: [PATCH 07/18] add testing for edits --- frontend/src/tests/qa.test.ts | 134 +++++++++++++++++++++++++--------- 1 file changed, 98 insertions(+), 36 deletions(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index a86a0d0..32f277d 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -11,8 +11,15 @@ describe("Simple Puppeteer Test", () => { let browser: Browser; let page: Page; + const DEBUG = true; + const stacks = Object.values(Stack).slice(0, DEBUG ? 1 : undefined); + const models = Object.values(CodeGenerationModel).slice( + 0, + DEBUG ? 1 : undefined + ); + beforeAll(async () => { - browser = await puppeteer.launch({ headless: true }); + browser = await puppeteer.launch({ headless: false }); page = await browser.newPage(); await page.goto("http://localhost:5173/"); @@ -33,47 +40,70 @@ describe("Simple Puppeteer Test", () => { await browser.close(); }); - const stacks = Object.values(Stack).slice(0, 1); - const models = Object.values(CodeGenerationModel); - // For debugging - //.slice(0, 1); - models.forEach((model) => { stacks.forEach((stack) => { - it(`should load the homepage and check the title for stack: ${stack}`, async () => { - const testId = `${model}_${stack}`; + it( + `should load the homepage and check the title for stack: ${stack}`, + async () => { + const testId = `${model}_${stack}`; + const screenshotPathPrefix = `${SCREENSHOTS_PATH}/${testId}`; + await setupLocalStorage(page, stack, model); - await setupLocalStorage(page, stack, model); + // Upload file + const fileInput = (await page.$( + ".file-input" + )) as ElementHandle; - // Upload file - const fileInput = (await page.$( - ".file-input" - )) as ElementHandle; - - if (!fileInput) { - throw new Error("File input element not found"); - } - - await fileInput.uploadFile(IMAGE_PATH); - - // Screenshot the first step - await page.screenshot({ - path: `${SCREENSHOTS_PATH}/${testId}_image_uploaded.png`, - }); - - // Click the generate button and wait for the code to be generated - await page.waitForNetworkIdle(); - await page.waitForFunction( - () => document.body.innerText.includes("v1"), - { - timeout: 30000, + if (!fileInput) { + throw new Error("File input element not found"); } - ); - await page.screenshot({ - path: `${SCREENSHOTS_PATH}/${testId}_image_results.png`, - }); - }); + await fileInput.uploadFile(IMAGE_PATH); + + // Screenshot the first step + await page.screenshot({ + path: `${screenshotPathPrefix}_image_uploaded.png`, + }); + + // Click the generate button and wait for the code to be generated + await page.waitForNetworkIdle(); + await page.waitForFunction( + () => document.body.innerText.includes("v1"), + { + timeout: 30000, + } + ); + + await page.screenshot({ + path: `${screenshotPathPrefix}_image_results.png`, + }); + + await makeEdit( + page, + "make the header blue", + "v2", + screenshotPathPrefix + ); + + await makeEdit( + page, + "make all text italic", + "v3", + screenshotPathPrefix + ); + + await page.evaluate(() => { + document.querySelectorAll("div").forEach((div) => { + if (div.innerText.includes("v2")) { + div.click(); + } + }); + }); + + await makeEdit(page, "make all text red", "v4", screenshotPathPrefix); + }, + 60 * 1000 + ); }); }); }); @@ -98,3 +128,35 @@ async function setupLocalStorage(page: Page, stack: string, model: string) { // Reload the page to apply the local storage await page.reload(); } + +async function makeEdit( + page: Page, + edit: string, + version: string, + screenshotPathPrefix: string +) { + await page.type( + 'textarea[placeholder="Tell the AI what to change..."]', + edit + ); + + await page.screenshot({ + path: `${screenshotPathPrefix}_typed_${version}.png`, + }); + + await page.click(".update-btn"); + + console.log(version); + + await page.waitForFunction( + (version: string) => document.body.innerText.includes(version), + { + timeout: 30000, + }, + version + ); + + await page.screenshot({ + path: `${screenshotPathPrefix}_done_${version}.png`, + }); +} From dbd1ea07ffed2df2e305076591a1d99406b6fd52 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 13:10:34 -0400 Subject: [PATCH 08/18] remove console.log --- frontend/src/tests/qa.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 32f277d..fe2a898 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -146,8 +146,6 @@ async function makeEdit( await page.click(".update-btn"); - console.log(version); - await page.waitForFunction( (version: string) => document.body.innerText.includes(version), { From 9a234264b629b228021423552e06c7c1d815a5e5 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 14:33:49 -0400 Subject: [PATCH 09/18] clean up test code --- frontend/src/App.tsx | 2 +- frontend/src/tests/qa.test.ts | 303 ++++++++++++++++++++++------------ 2 files changed, 203 insertions(+), 102 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 95b5779..d37e296 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -465,7 +465,7 @@ function App() {

diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index fe2a898..8321543 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -5,13 +5,16 @@ import { CodeGenerationModel } from "../lib/models"; const REPO_PATH = "/Users/abi/Documents/GitHub/screenshot-to-code/frontend"; const DOWNLOAD_PATH = `${REPO_PATH}/qa`; const SCREENSHOTS_PATH = `${REPO_PATH}/qa/results`; -const IMAGE_PATH = DOWNLOAD_PATH + "/ui_table.png"; +const IMAGE_PATH = DOWNLOAD_PATH + "/simple_button.png"; +const SCREENSHOT_WITH_IMAGES = `${DOWNLOAD_PATH}/simple_ui_with_image.png`; describe("Simple Puppeteer Test", () => { let browser: Browser; let page: Page; const DEBUG = true; + const IS_HEADLESS = false; + const stacks = Object.values(Stack).slice(0, DEBUG ? 1 : undefined); const models = Object.values(CodeGenerationModel).slice( 0, @@ -19,7 +22,7 @@ describe("Simple Puppeteer Test", () => { ); beforeAll(async () => { - browser = await puppeteer.launch({ headless: false }); + browser = await puppeteer.launch({ headless: IS_HEADLESS }); page = await browser.newPage(); await page.goto("http://localhost:5173/"); @@ -40,121 +43,219 @@ describe("Simple Puppeteer Test", () => { await browser.close(); }); + // Create tests models.forEach((model) => { stacks.forEach((stack) => { it( - `should load the homepage and check the title for stack: ${stack}`, + `Create for : ${model} & ${stack}`, async () => { - const testId = `${model}_${stack}`; - const screenshotPathPrefix = `${SCREENSHOTS_PATH}/${testId}`; - await setupLocalStorage(page, stack, model); - - // Upload file - const fileInput = (await page.$( - ".file-input" - )) as ElementHandle; - - if (!fileInput) { - throw new Error("File input element not found"); - } - - await fileInput.uploadFile(IMAGE_PATH); - - // Screenshot the first step - await page.screenshot({ - path: `${screenshotPathPrefix}_image_uploaded.png`, - }); - - // Click the generate button and wait for the code to be generated - await page.waitForNetworkIdle(); - await page.waitForFunction( - () => document.body.innerText.includes("v1"), - { - timeout: 30000, - } - ); - - await page.screenshot({ - path: `${screenshotPathPrefix}_image_results.png`, - }); - - await makeEdit( + const app = new App( page, - "make the header blue", - "v2", - screenshotPathPrefix + stack, + model, + `create_screenshot_${model}_${stack}` ); + await app.init(); + // Generate from screenshot + await app.uploadImage(SCREENSHOT_WITH_IMAGES); + }, + 60 * 1000 + ); - await makeEdit( + it( + `Create from URL for : ${model} & ${stack}`, + async () => { + const app = new App( page, - "make all text italic", - "v3", - screenshotPathPrefix + stack, + model, + `create_url_${model}_${stack}` ); - - await page.evaluate(() => { - document.querySelectorAll("div").forEach((div) => { - if (div.innerText.includes("v2")) { - div.click(); - } - }); - }); - - await makeEdit(page, "make all text red", "v4", screenshotPathPrefix); + await app.init(); + // Generate from screenshot + await app.generateFromUrl("https://a.picoapps.xyz/design-fear"); }, 60 * 1000 ); }); }); + + // Update tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) + models.forEach((model) => { + ["html_tailwind"].forEach((stack) => { + it( + `Update for : ${model}`, + async () => { + const app = new App(page, stack, model, `update_${model}_${stack}`); + await app.init(); + + // Generate from screenshot + await app.uploadImage(IMAGE_PATH); + // Regenerate works for v1 + await app.regenerate(); + // Make an update + await app.edit("make the header blue", "v2"); + // Make another update + await app.edit("make all text italic", "v3"); + // Branch off v2 and make an update + await app.clickVersion("v2"); + await app.edit("make all text red", "v4"); + }, + 90 * 1000 + ); + }); + }); }); -async function setupLocalStorage(page: Page, stack: string, model: string) { - const setting = { - openAiApiKey: null, - openAiBaseURL: null, - screenshotOneApiKey: null, - isImageGenerationEnabled: false, - editorTheme: "cobalt", - generatedCodeConfig: stack, - codeGenerationModel: model, - isTermOfServiceAccepted: false, - accessCode: null, - }; +class App { + private screenshotPathPrefix: string; + private page: Page; + private stack: string; + private model: string; - await page.evaluate((setting) => { - localStorage.setItem("setting", JSON.stringify(setting)); - }, setting); + // TODOs + // - Abstract screenshot functionality + // - Abstract waiting for version to be done - // Reload the page to apply the local storage - await page.reload(); -} - -async function makeEdit( - page: Page, - edit: string, - version: string, - screenshotPathPrefix: string -) { - await page.type( - 'textarea[placeholder="Tell the AI what to change..."]', - edit - ); - - await page.screenshot({ - path: `${screenshotPathPrefix}_typed_${version}.png`, - }); - - await page.click(".update-btn"); - - await page.waitForFunction( - (version: string) => document.body.innerText.includes(version), - { - timeout: 30000, - }, - version - ); - - await page.screenshot({ - path: `${screenshotPathPrefix}_done_${version}.png`, - }); + constructor(page: Page, stack: string, model: string, testId: string) { + this.page = page; + this.stack = stack; + this.model = model; + this.screenshotPathPrefix = `${SCREENSHOTS_PATH}/${testId}`; + } + + async init() { + await this.setupLocalStorage(); + } + + async setupLocalStorage() { + const setting = { + openAiApiKey: null, + openAiBaseURL: null, + screenshotOneApiKey: null, + isImageGenerationEnabled: true, + editorTheme: "cobalt", + generatedCodeConfig: this.stack, + codeGenerationModel: this.model, + isTermOfServiceAccepted: false, + accessCode: null, + }; + + await this.page.evaluate((setting) => { + localStorage.setItem("setting", JSON.stringify(setting)); + }, setting); + + // Reload the page to apply the local storage + await this.page.reload(); + } + + async _screenshot(step: string) { + await this.page.screenshot({ + path: `${this.screenshotPathPrefix}_${step}.png`, + }); + } + + async generateFromUrl(url: string) { + await this.page.type('input[placeholder="Enter URL"]', url); + + await this._screenshot("typed_url"); + + // Click the capture button and wait for the code to be generated + await this.page.click("button.capture-btn"); + await this.page.waitForNetworkIdle(); + await this.page.waitForFunction( + () => document.body.innerText.includes("v1"), + { + timeout: 30000, + } + ); + + await this._screenshot("url_result"); + } + + // Uploads a screenshot and generates the image + async uploadImage(screenshotPath: string) { + // Upload file + const fileInput = (await this.page.$( + ".file-input" + )) as ElementHandle; + + if (!fileInput) { + throw new Error("File input element not found"); + } + + await fileInput.uploadFile(screenshotPath); + + // Screenshot the first step + await this.page.screenshot({ + path: `${this.screenshotPathPrefix}_image_uploaded.png`, + }); + + // Click the generate button and wait for the code to be generated + await this.page.waitForNetworkIdle(); + await this.page.waitForFunction( + () => document.body.innerText.includes("v1"), + { + timeout: 30000, + } + ); + + // Wait for 1s so that the HTML and JS has time to render before screenshotting + await new Promise((resolve) => setTimeout(resolve, 3000)); + + await this.page.screenshot({ + path: `${this.screenshotPathPrefix}_image_results.png`, + }); + } + + // Makes a text edit and waits for a new version + async edit(edit: string, version: string) { + await this.page.type( + 'textarea[placeholder="Tell the AI what to change..."]', + edit + ); + + await this.page.screenshot({ + path: `${this.screenshotPathPrefix}_typed_${version}.png`, + }); + + await this.page.click(".update-btn"); + + await this.page.waitForFunction( + (version: string) => document.body.innerText.includes(version), + { + timeout: 30000, + }, + version + ); + + await this.page.screenshot({ + path: `${this.screenshotPathPrefix}_done_${version}.png`, + }); + } + + async clickVersion(version: string) { + await this.page.evaluate((version) => { + document.querySelectorAll("div").forEach((div) => { + if (div.innerText.includes(version)) { + div.click(); + } + }); + }, version); + } + + async regenerate() { + await this.page.click(".regenerate-btn"); + + await this.page.waitForFunction( + () => document.body.innerText.includes("v1"), + { + timeout: 30000, + } + ); + + await this.page.screenshot({ + path: `${this.screenshotPathPrefix}_regenerate_results.png`, + }); + } } From a3104fab1a2c96f2ff799b2a29d6c2656eeb87e8 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 15:24:16 -0400 Subject: [PATCH 10/18] make env vars work --- frontend/jest.config.js | 1 + frontend/package.json | 1 + frontend/src/setupTests.ts | 3 ++ frontend/src/tests/qa.test.ts | 93 ++++++++++++++++++----------------- frontend/yarn.lock | 5 ++ 5 files changed, 59 insertions(+), 44 deletions(-) create mode 100644 frontend/src/setupTests.ts diff --git a/frontend/jest.config.js b/frontend/jest.config.js index a31fc6d..310efb5 100644 --- a/frontend/jest.config.js +++ b/frontend/jest.config.js @@ -1,6 +1,7 @@ export default { preset: "ts-jest", testEnvironment: "node", + setupFiles: ["/src/setupTests.ts"], transform: { "^.+\\.tsx?$": "ts-jest", }, diff --git a/frontend/package.json b/frontend/package.json index 2fb02e3..92bebfc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -58,6 +58,7 @@ "@typescript-eslint/parser": "^6.0.0", "@vitejs/plugin-react": "^4.0.3", "autoprefixer": "^10.4.16", + "dotenv": "^16.4.5", "eslint": "^8.45.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.3", diff --git a/frontend/src/setupTests.ts b/frontend/src/setupTests.ts new file mode 100644 index 0000000..b1ea596 --- /dev/null +++ b/frontend/src/setupTests.ts @@ -0,0 +1,3 @@ +// So jest test runner can read env vars from .env file +import { config } from "dotenv"; +config({ path: ".env.jest" }); diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 8321543..8fa9972 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -8,7 +8,7 @@ const SCREENSHOTS_PATH = `${REPO_PATH}/qa/results`; const IMAGE_PATH = DOWNLOAD_PATH + "/simple_button.png"; const SCREENSHOT_WITH_IMAGES = `${DOWNLOAD_PATH}/simple_ui_with_image.png`; -describe("Simple Puppeteer Test", () => { +describe("e2e tests", () => { let browser: Browser; let page: Page; @@ -105,6 +105,32 @@ describe("Simple Puppeteer Test", () => { ); }); }); + + // Start from code tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) + models.forEach((model) => { + ["html_tailwind"].forEach((stack) => { + it( + `Start from code for : ${model}`, + async () => { + const app = new App(page, stack, model, `update_${model}_${stack}`); + await app.init(); + + // Generate from screenshot + await app.uploadImage(IMAGE_PATH); + // Regenerate works for v1 + await app.regenerate(); + // Make an update + await app.edit("make the header blue", "v2"); + // Make another update + await app.edit("make all text italic", "v3"); + // Branch off v2 and make an update + await app.clickVersion("v2"); + await app.edit("make all text red", "v4"); + }, + 90 * 1000 + ); + }); + }); }); class App { @@ -132,7 +158,7 @@ class App { const setting = { openAiApiKey: null, openAiBaseURL: null, - screenshotOneApiKey: null, + screenshotOneApiKey: process.env.TEST_SCREENSHOTONE_API_KEY, isImageGenerationEnabled: true, editorTheme: "cobalt", generatedCodeConfig: this.stack, @@ -155,21 +181,27 @@ class App { }); } - async generateFromUrl(url: string) { - await this.page.type('input[placeholder="Enter URL"]', url); + async _waitUntilVersionIsReady(version: string) { + await this.page.waitForNetworkIdle(); + await this.page.waitForFunction( + (version) => document.body.innerText.includes(version), + { + timeout: 30000, + }, + version + ); + // Wait for 3s so that the HTML and JS has time to render before screenshotting + await new Promise((resolve) => setTimeout(resolve, 3000)); + } + async generateFromUrl(url: string) { + // Type in the URL + await this.page.type('input[placeholder="Enter URL"]', url); await this._screenshot("typed_url"); // Click the capture button and wait for the code to be generated await this.page.click("button.capture-btn"); - await this.page.waitForNetworkIdle(); - await this.page.waitForFunction( - () => document.body.innerText.includes("v1"), - { - timeout: 30000, - } - ); - + await this._waitUntilVersionIsReady("v1"); await this._screenshot("url_result"); } @@ -179,33 +211,15 @@ class App { const fileInput = (await this.page.$( ".file-input" )) as ElementHandle; - if (!fileInput) { throw new Error("File input element not found"); } - await fileInput.uploadFile(screenshotPath); - - // Screenshot the first step - await this.page.screenshot({ - path: `${this.screenshotPathPrefix}_image_uploaded.png`, - }); + await this._screenshot("image_uploaded"); // Click the generate button and wait for the code to be generated - await this.page.waitForNetworkIdle(); - await this.page.waitForFunction( - () => document.body.innerText.includes("v1"), - { - timeout: 30000, - } - ); - - // Wait for 1s so that the HTML and JS has time to render before screenshotting - await new Promise((resolve) => setTimeout(resolve, 3000)); - - await this.page.screenshot({ - path: `${this.screenshotPathPrefix}_image_results.png`, - }); + await this._waitUntilVersionIsReady("v1"); + await this._screenshot("image_results"); } // Makes a text edit and waits for a new version @@ -246,16 +260,7 @@ class App { async regenerate() { await this.page.click(".regenerate-btn"); - - await this.page.waitForFunction( - () => document.body.innerText.includes("v1"), - { - timeout: 30000, - } - ); - - await this.page.screenshot({ - path: `${this.screenshotPathPrefix}_regenerate_results.png`, - }); + await this._waitUntilVersionIsReady("v1"); + await this._screenshot("regenerate_results"); } } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 7a08c1e..7285b73 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2917,6 +2917,11 @@ dotenv@^16.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + ebml-block@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/ebml-block/-/ebml-block-1.1.2.tgz#fd49951b0faf5a3049bdd61c851a76b5e679c290" From ce82fc87c4718deb84c14d9dd274911eb815275d Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 15:44:22 -0400 Subject: [PATCH 11/18] read fixtures path from env var --- frontend/.gitignore | 4 +-- frontend/src/tests/fixtures/simple_button.png | Bin 0 -> 22092 bytes .../tests/fixtures/simple_ui_with_image.png | Bin 0 -> 35542 bytes frontend/src/tests/qa.test.ts | 29 +++++++++--------- 4 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 frontend/src/tests/fixtures/simple_button.png create mode 100644 frontend/src/tests/fixtures/simple_ui_with_image.png diff --git a/frontend/.gitignore b/frontend/.gitignore index 250cd48..a0d3702 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -26,5 +26,5 @@ dist-ssr # Env files .env* -# QA files -qa/**/* +# Test files +src/tests/results/ diff --git a/frontend/src/tests/fixtures/simple_button.png b/frontend/src/tests/fixtures/simple_button.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f776bdb2c94ee0278bda3d0cf8cd8a06bbc6e4 GIT binary patch literal 22092 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 literal 0 HcmV?d00001 diff --git a/frontend/src/tests/fixtures/simple_ui_with_image.png b/frontend/src/tests/fixtures/simple_ui_with_image.png new file mode 100644 index 0000000000000000000000000000000000000000..7533f850ad7358af9f6a1db78b67bc85a95d69a3 GIT binary patch literal 35542 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 literal 0 HcmV?d00001 diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 8fa9972..c05423d 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -2,11 +2,11 @@ import puppeteer, { Browser, Page, ElementHandle } from "puppeteer"; import { Stack } from "../lib/stacks"; import { CodeGenerationModel } from "../lib/models"; -const REPO_PATH = "/Users/abi/Documents/GitHub/screenshot-to-code/frontend"; -const DOWNLOAD_PATH = `${REPO_PATH}/qa`; -const SCREENSHOTS_PATH = `${REPO_PATH}/qa/results`; -const IMAGE_PATH = DOWNLOAD_PATH + "/simple_button.png"; -const SCREENSHOT_WITH_IMAGES = `${DOWNLOAD_PATH}/simple_ui_with_image.png`; +const TESTS_ROOT_PATH = process.env.TEST_ROOT_PATH; +const RESULTS_DIR = `${TESTS_ROOT_PATH}/results`; +const FIXTURES_PATH = `${TESTS_ROOT_PATH}/fixtures`; +const SIMPLE_SCREENSHOT = FIXTURES_PATH + "/simple_button.png"; +const SCREENSHOT_WITH_IMAGES = `${FIXTURES_PATH}/simple_ui_with_image.png`; describe("e2e tests", () => { let browser: Browser; @@ -30,13 +30,12 @@ describe("e2e tests", () => { await page.setViewport({ width: 1080, height: 1024 }); // TODO: Does this need to be moved? - const client = await page.createCDPSession(); - + // const client = await page.createCDPSession(); // Set download behavior path - await client.send("Page.setDownloadBehavior", { - behavior: "allow", - downloadPath: DOWNLOAD_PATH, - }); + // await client.send("Page.setDownloadBehavior", { + // behavior: "allow", + // downloadPath: DOWNLOAD_PATH, + // }); }); afterAll(async () => { @@ -83,14 +82,14 @@ describe("e2e tests", () => { // Update tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) models.forEach((model) => { ["html_tailwind"].forEach((stack) => { - it( + it.only( `Update for : ${model}`, async () => { const app = new App(page, stack, model, `update_${model}_${stack}`); await app.init(); // Generate from screenshot - await app.uploadImage(IMAGE_PATH); + await app.uploadImage(SIMPLE_SCREENSHOT); // Regenerate works for v1 await app.regenerate(); // Make an update @@ -116,7 +115,7 @@ describe("e2e tests", () => { await app.init(); // Generate from screenshot - await app.uploadImage(IMAGE_PATH); + await app.uploadImage(SIMPLE_SCREENSHOT); // Regenerate works for v1 await app.regenerate(); // Make an update @@ -147,7 +146,7 @@ class App { this.page = page; this.stack = stack; this.model = model; - this.screenshotPathPrefix = `${SCREENSHOTS_PATH}/${testId}`; + this.screenshotPathPrefix = `${RESULTS_DIR}/${testId}`; } async init() { From 5c598daa3cb2c805c9555386bddefc56a60a512c Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 15:46:30 -0400 Subject: [PATCH 12/18] add example for jest env --- frontend/src/.env.jest.example | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 frontend/src/.env.jest.example diff --git a/frontend/src/.env.jest.example b/frontend/src/.env.jest.example new file mode 100644 index 0000000..59bc657 --- /dev/null +++ b/frontend/src/.env.jest.example @@ -0,0 +1,2 @@ +TEST_SCREENSHOTONE_API_KEY= +TEST_ROOT_PATH= From 726ecafd35d1d4db66282323db6b69253bdac8d8 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 15:51:19 -0400 Subject: [PATCH 13/18] fix up update tests --- frontend/src/tests/qa.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index c05423d..04593c8 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -82,8 +82,8 @@ describe("e2e tests", () => { // Update tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) models.forEach((model) => { ["html_tailwind"].forEach((stack) => { - it.only( - `Update for : ${model}`, + it( + `update: ${model}`, async () => { const app = new App(page, stack, model, `update_${model}_${stack}`); await app.init(); @@ -93,12 +93,12 @@ describe("e2e tests", () => { // Regenerate works for v1 await app.regenerate(); // Make an update - await app.edit("make the header blue", "v2"); + await app.edit("make the button background blue", "v2"); // Make another update - await app.edit("make all text italic", "v3"); + await app.edit("make the text italic", "v3"); // Branch off v2 and make an update await app.clickVersion("v2"); - await app.edit("make all text red", "v4"); + await app.edit("make the text white", "v4"); }, 90 * 1000 ); From df38041e778e8fea794eb21ef10ad80ee945b3a5 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 16:08:33 -0400 Subject: [PATCH 14/18] attempt to test import from code --- frontend/src/components/ImportCodeSection.tsx | 6 +- frontend/src/tests/qa.test.ts | 77 ++++++++++--------- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/frontend/src/components/ImportCodeSection.tsx b/frontend/src/components/ImportCodeSection.tsx index b320a97..c31e753 100644 --- a/frontend/src/components/ImportCodeSection.tsx +++ b/frontend/src/components/ImportCodeSection.tsx @@ -38,7 +38,9 @@ function ImportCodeSection({ importFromCode }: Props) { return ( - + @@ -62,7 +64,7 @@ function ImportCodeSection({ importFromCode }: Props) { /> - diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 04593c8..e4a7ac8 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -13,7 +13,7 @@ describe("e2e tests", () => { let page: Page; const DEBUG = true; - const IS_HEADLESS = false; + const IS_HEADLESS = true; const stacks = Object.values(Stack).slice(0, DEBUG ? 1 : undefined); const models = Object.values(CodeGenerationModel).slice( @@ -82,7 +82,7 @@ describe("e2e tests", () => { // Update tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) models.forEach((model) => { ["html_tailwind"].forEach((stack) => { - it( + it.only( `update: ${model}`, async () => { const app = new App(page, stack, model, `update_${model}_${stack}`); @@ -105,26 +105,31 @@ describe("e2e tests", () => { }); }); - // Start from code tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) + // Start from code tests - for every model models.forEach((model) => { ["html_tailwind"].forEach((stack) => { - it( - `Start from code for : ${model}`, + it.skip( + `Start from code: ${model}`, async () => { - const app = new App(page, stack, model, `update_${model}_${stack}`); + const app = new App( + page, + stack, + model, + `start_from_code_${model}_${stack}` + ); await app.init(); - // Generate from screenshot - await app.uploadImage(SIMPLE_SCREENSHOT); + await app.importFromCode(); + // Regenerate works for v1 - await app.regenerate(); - // Make an update - await app.edit("make the header blue", "v2"); - // Make another update - await app.edit("make all text italic", "v3"); - // Branch off v2 and make an update - await app.clickVersion("v2"); - await app.edit("make all text red", "v4"); + // await app.regenerate(); + // // Make an update + // await app.edit("make the header blue", "v2"); + // // Make another update + // await app.edit("make all text italic", "v3"); + // // Branch off v2 and make an update + // await app.clickVersion("v2"); + // await app.edit("make all text red", "v4"); }, 90 * 1000 ); @@ -138,10 +143,6 @@ class App { private stack: string; private model: string; - // TODOs - // - Abstract screenshot functionality - // - Abstract waiting for version to be done - constructor(page: Page, stack: string, model: string, testId: string) { this.page = page; this.stack = stack; @@ -223,28 +224,17 @@ class App { // Makes a text edit and waits for a new version async edit(edit: string, version: string) { + // Type in the edit await this.page.type( 'textarea[placeholder="Tell the AI what to change..."]', edit ); + await this._screenshot(`typed_${version}`); - await this.page.screenshot({ - path: `${this.screenshotPathPrefix}_typed_${version}.png`, - }); - + // Click the update button and wait for the code to be generated await this.page.click(".update-btn"); - - await this.page.waitForFunction( - (version: string) => document.body.innerText.includes(version), - { - timeout: 30000, - }, - version - ); - - await this.page.screenshot({ - path: `${this.screenshotPathPrefix}_done_${version}.png`, - }); + await this._waitUntilVersionIsReady(version); + await this._screenshot(`done_${version}`); } async clickVersion(version: string) { @@ -262,4 +252,19 @@ class App { await this._waitUntilVersionIsReady("v1"); await this._screenshot("regenerate_results"); } + + // Work in progress + async importFromCode() { + await this.page.click(".import-from-code-btn"); + + await this.page.type("textarea", "hello world"); + + await this.page.select("#output-settings-js", "HTML + Tailwind"); + + await this._screenshot("typed_code"); + + await this.page.click(".import-btn"); + + await this._waitUntilVersionIsReady("v1"); + } } From 55a0a6c44407b2aeffdf7cdef04c79c0f4fabba9 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Mon, 20 May 2024 16:22:41 -0400 Subject: [PATCH 15/18] minor fixes --- frontend/src/tests/qa.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index e4a7ac8..6d98481 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -12,7 +12,7 @@ describe("e2e tests", () => { let browser: Browser; let page: Page; - const DEBUG = true; + const DEBUG = false; const IS_HEADLESS = true; const stacks = Object.values(Stack).slice(0, DEBUG ? 1 : undefined); @@ -82,7 +82,7 @@ describe("e2e tests", () => { // Update tests - for every model (doesn’t need to be repeated for each stack - fix to HTML Tailwind only) models.forEach((model) => { ["html_tailwind"].forEach((stack) => { - it.only( + it( `update: ${model}`, async () => { const app = new App(page, stack, model, `update_${model}_${stack}`); @@ -98,7 +98,7 @@ describe("e2e tests", () => { await app.edit("make the text italic", "v3"); // Branch off v2 and make an update await app.clickVersion("v2"); - await app.edit("make the text white", "v4"); + await app.edit("make the text yellow", "v4"); }, 90 * 1000 ); From 9882447586395901d40b2cae58f3461f6851fb92 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Tue, 21 May 2024 10:38:33 -0400 Subject: [PATCH 16/18] add comments --- frontend/src/tests/qa.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/tests/qa.test.ts b/frontend/src/tests/qa.test.ts index 6d98481..b5274d1 100644 --- a/frontend/src/tests/qa.test.ts +++ b/frontend/src/tests/qa.test.ts @@ -3,11 +3,15 @@ import { Stack } from "../lib/stacks"; import { CodeGenerationModel } from "../lib/models"; const TESTS_ROOT_PATH = process.env.TEST_ROOT_PATH; -const RESULTS_DIR = `${TESTS_ROOT_PATH}/results`; + +// Fixtures const FIXTURES_PATH = `${TESTS_ROOT_PATH}/fixtures`; const SIMPLE_SCREENSHOT = FIXTURES_PATH + "/simple_button.png"; const SCREENSHOT_WITH_IMAGES = `${FIXTURES_PATH}/simple_ui_with_image.png`; +// Results +const RESULTS_DIR = `${TESTS_ROOT_PATH}/results`; + describe("e2e tests", () => { let browser: Browser; let page: Page; From bef9aa831accf800bccb773d0529814ad1cc2470 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Thu, 23 May 2024 12:00:59 -0400 Subject: [PATCH 17/18] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 4b681b1..7a7531a 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,11 @@ We also just added experimental support for taking a video/screen recording of a [Follow me on Twitter for updates](https://twitter.com/_abi_). +## Sponsors + + + + ## 🚀 Try It Out without no install [Try it live on the hosted version (paid)](https://screenshottocode.com). From 23e631765e561c6d539058933640a79197e27849 Mon Sep 17 00:00:00 2001 From: Abi Raja Date: Thu, 23 May 2024 12:19:28 -0400 Subject: [PATCH 18/18] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..f3c0ced --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [abi]