diff --git a/.eslintrc.json b/.eslintrc.json index 580ef7e..dbd584f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,6 +9,7 @@ "plugin:react/jsx-runtime", "plugin:react-hooks/recommended", "plugin:jsx-a11y/recommended", + "plugin:jest/recommended", "prettier" ], "rules": { @@ -21,17 +22,5 @@ "version": "detect" } }, - "overrides": [ - { - "files": "src/**/*.test.{ts,tsx}", - "extends": ["plugin:jest/recommended"], - "plugins": ["jest"] - }, - { - "files": "cypress/**/*.ts", - "extends": ["plugin:cypress/recommended"], - "plugins": ["cypress"] - } - ], "ignorePatterns": ["paramview/static/"] } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2f7586d..45d7cb0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: run: poetry run mypy ${{ env.PACKAGE_NAME }} tests - name: Test (Pytest) - run: poetry run pytest + run: poetry run pytest tests/unit frontend: runs-on: ubuntu-latest @@ -71,29 +71,14 @@ jobs: - name: Enable Yarn run: corepack enable - - name: Get Cypress version - id: cypress-version - run: echo VERSION=$(yarn info cypress --json | jq ".children.Version" -r) >> $GITHUB_OUTPUT - - - name: Cypress cache - uses: actions/cache@v3 - with: - path: ~/.cache/Cypress - key: cypress-${{ runner.os }}-${{ steps.cypress-version.outputs.VERSION }} - restore-keys: | - cypress-${{ runner.os }}- - - name: Install Node.js dependencies run: yarn - - name: Prune Cypress cache - run: yarn cypress cache prune - - name: Lint run: yarn lint - name: Unit tests - run: yarn test:unit + run: yarn test e2e: runs-on: ubuntu-latest @@ -122,39 +107,24 @@ jobs: - name: Enable Yarn run: corepack enable - - name: Get Cypress version - id: cypress-version - run: echo VERSION=$(yarn info cypress --json | jq ".children.Version" -r) >> $GITHUB_OUTPUT - - - name: Cypress cache - uses: actions/cache@v3 - with: - path: ~/.cache/Cypress - key: cypress-${{ runner.os }}-${{ steps.cypress-version.outputs.VERSION }} - restore-keys: | - cypress-${{ runner.os }}- - - name: Install Node.js dependencies run: yarn - - name: Prune Cypress cache - run: yarn cypress cache prune + - name: Install Playwright browsers + run: poetry run playwright install --with-deps chromium - name: Build frontend run: yarn build - - name: Start backend server - run: yarn backend start & - - - name: Start frontend server - run: yarn preview & + - name: Start E2E server + run: poetry run python tests/e2e/start_server.py & - name: E2E tests - run: yarn test:e2e + run: poetry run pytest tests/e2e - name: Upload failure screenshots uses: actions/upload-artifact@v3 if: failure() with: - name: e2e-failure-screenshots - path: cypress/screenshots + name: e2e-failed-traces + path: test-results diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 8332dcb..96fe52b 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -36,24 +36,9 @@ jobs: - name: Enable Yarn run: corepack enable - - name: Get Cypress version - id: cypress-version - run: echo VERSION=$(yarn info cypress --json | jq ".children.Version" -r) >> $GITHUB_OUTPUT - - - name: Cypress cache - uses: actions/cache@v3 - with: - path: ~/.cache/Cypress - key: cypress-${{ runner.os }}-${{ steps.cypress-version.outputs.VERSION }} - restore-keys: | - cypress-${{ runner.os }}- - - name: Install Node.js dependencies run: yarn - - name: Prune Cypress cache - run: yarn cypress cache prune - - name: Build frontend run: yarn build diff --git a/.gitignore b/.gitignore index 2922cae..a8d9fc5 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,8 @@ node_modules/ # Jest coverage/ -# Cypress -cypress/videos/ -cypress/screenshots/ +# Playwright +test-results/ # Data files *.db diff --git a/cypress.config.mjs b/cypress.config.mjs deleted file mode 100644 index f2f7c74..0000000 --- a/cypress.config.mjs +++ /dev/null @@ -1,26 +0,0 @@ -import { promisify } from "util"; -import { exec as exec_original } from "child_process"; -import { defineConfig } from "cypress"; - -const BACKEND_COMMAND = "python cypress/backend.py"; -const exec = promisify(exec_original); - -export default defineConfig({ - video: false, - e2e: { - baseUrl: "http://localhost:4173", - setupNodeEvents(on) { - on("task", { - "db:reset": ({ single = false, long = false } = { single: false, long: false }) => - exec( - `${BACKEND_COMMAND} reset` + - (single ? " --single" : "") + - (long ? " --long" : ""), - ), - "db:clear": () => exec(`${BACKEND_COMMAND} clear`), - "db:commit": () => exec(`${BACKEND_COMMAND} commit`), - "db:load_classes": () => exec(`${BACKEND_COMMAND} load_classes`), - }); - }, - }, -}); diff --git a/cypress/backend.py b/cypress/backend.py deleted file mode 100644 index 89b9e22..0000000 --- a/cypress/backend.py +++ /dev/null @@ -1,139 +0,0 @@ -"""Script to perform actions relating to the backend.""" - -# pylint: disable=missing-class-docstring - -from __future__ import annotations -from typing import Any -import os -import argparse -from datetime import datetime, timedelta, timezone -from sqlalchemy import delete -from freezegun import freeze_time -import astropy.units as u # type: ignore -from paramdb import ParamDB, Param, Struct, ParamList, ParamDict -from paramdb._database import _Snapshot - - -DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "param.db") -db = ParamDB[Any](DB_PATH) - - -class CustomStruct(Struct): - int: int - str: str - param: CustomParam - - -class CustomParam(Param): - int: int - str: str - - -def start() -> None: - """Reset the database and start the server.""" - # This takes a small amount of time to import, so this slightly optimizes the speed - # of tests, which do not call the start command and therefore do not need to import - # paramview. - from paramview import start_server # pylint: disable=import-outside-toplevel - - reset() - start_server(DB_PATH, auto_open=False) - - -def reset(single: bool = False, long: bool = False) -> None: - """Clear the database and make some initial commits.""" - if single: - num_commits = 1 - elif long: - num_commits = 100 - else: - num_commits = 3 - clear() - date = datetime(2023, 1, 1, tzinfo=timezone.utc).astimezone() - with freeze_time(date): - initial_data = ParamDict( - { - "commit_id": 1, - "int": 123, - "float": 1.2345, - "bool": True, - "str": "test", - "None": None, - "datetime": date, - "Quantity": 1.2345 * u.m, - "list": [123, "test"], - "dict": {"int": 123, "str": "test"}, - "paramList": ParamList([123, "test"]), - "paramDict": ParamDict(int=123, str="test"), - "struct": CustomStruct( - int=123, str="test", param=CustomParam(int=123, str="test") - ), - "param": CustomParam(int=123, str="test"), - } - ) - db.commit("Initial commit", initial_data) - for commit_id in range(2, num_commits + 1): - date += timedelta(days=1) - updated_data = ParamDict(commit_id=commit_id, b=2, c=3) - with freeze_time(date): - db.commit(f"Commit {commit_id}", updated_data) - - -def clear() -> None: - """Clear the database.""" - with db._Session.begin() as session: # pylint: disable=no-member,protected-access - session.execute(delete(_Snapshot)) # Clear all commits - - -def commit() -> None: - """Make a commit with the given message.""" - num_commits = db.num_commits - commit_id = num_commits + 1 - with freeze_time(datetime(2023, 1, 1) + timedelta(days=num_commits)): - db.commit(f"Commit {commit_id}", ParamDict(commit_id=commit_id, b=2, c=3)) - - -def load_classes() -> None: - """ - Load the last commit as Python classes. This helps to test that objects are - formatted properly, in particular datetime and Quantity objects. - """ - db.load() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - subparsers = parser.add_subparsers(title="commands", required=True) - parser_start = subparsers.add_parser( - "start", - help="reset the database and start the backend server", - ) - parser_start.set_defaults(func=lambda args: start()) - parser_reset = subparsers.add_parser( - "reset", - help="clear the database and make some initial commits", - ) - parser_reset.add_argument( - "--single", action="store_true", help="only make a single commit" - ) - parser_reset.add_argument( - "--long", action="store_true", help="create a long commit history" - ) - parser_reset.set_defaults(func=lambda args: reset(args.single, args.long)) - parser_clear = subparsers.add_parser( - "clear", - help="clear the database", - ) - parser_clear.set_defaults(func=lambda args: clear()) - parser_commit = subparsers.add_parser( - "commit", - help="make a commit with the given message", - ) - parser_commit.set_defaults(func=lambda args: commit()) - parser_commit = subparsers.add_parser( - "load_classes", - help="load the last commit using Python classes", - ) - parser_commit.set_defaults(func=lambda args: load_classes()) - args = parser.parse_args() - args.func(args) diff --git a/cypress/e2e/commit-dialog.cy.ts b/cypress/e2e/commit-dialog.cy.ts deleted file mode 100644 index dd21585..0000000 --- a/cypress/e2e/commit-dialog.cy.ts +++ /dev/null @@ -1,120 +0,0 @@ -describe("non-commit functionality", () => { - before(() => { - cy.task("db:reset"); - }); - - beforeEach(() => { - cy.visit("/"); - cy.getByTestId("edit-button").click(); // Enter edit mode - }); - - it("resets commit message text field when the dialog is reopened", () => { - // Open the commit dialog - cy.getByTestId("open-commit-dialog-button").as("openCommitDialogButton").click(); - - // Type a commit message - cy.getByTestId("commit-message-text-field") - .as("commitMessageTextField") - .type("New commit"); - cy.get("@commitMessageTextField").find("input").should("have.value", "New commit"); - - // Close the commit dialog and open it again - cy.getByTestId("close-commit-dialog-button").click(); - cy.get("@openCommitDialogButton").click(); - - // Commit message text field is now empty - cy.get("@commitMessageTextField").find("input").should("have.value", ""); - }); - - it("refuses to make a commit if there is no message", () => { - // Open the commit dialog - cy.getByTestId("open-commit-dialog-button").as("openCommitDialogButton").click(); - - // Click the button to make the commit - cy.getByTestId("make-commit-button").click(); - - // Commit message field still exists and is not disabled, so the commit was not made - cy.getByTestId("commit-message-text-field").find("input").should("not.be.disabled"); - }); -}); - -describe("commit making", () => { - beforeEach(() => { - cy.task("db:reset"); - cy.visit("/"); - }); - - it("can edit data and make a new commit", () => { - // Initially, item "b" contains "2" and item "c" contains "3" - cy.getByTestId("parameter-list-item-b").as("listItemB").should("contain", "2"); - cy.getByTestId("parameter-list-item-c").as("listItemC").should("contain", "3"); - - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Type 456 into the "b" input - cy.get("@listItemB").within(() => - cy.getByTestId("leaf-input").find("input").type("{selectAll}456"), - ); - - // Switch type of "c" input to str and type "test" - cy.get("@listItemC").within(() => { - cy.getByTestId("leaf-type-input").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-str").click()); - cy.getByTestId("leaf-input").find("input").type("{selectAll}test"); - }); - - // Open the commit dialog - cy.getByTestId("open-commit-dialog-button").click(); - - // Comparison list reflects what has been edited - cy.getByTestId("comparison-list-item-old-commit_id").should("not.exist"); - cy.getByTestId("comparison-list-item-new-commit_id").should("not.exist"); - cy.getByTestId("comparison-list-item-old-b").contains("2"); - cy.getByTestId("comparison-list-item-new-b").contains("456"); - cy.getByTestId("comparison-list-item-old-c").contains("3"); - cy.getByTestId("comparison-list-item-new-c").contains("test"); - - // Type a message and type enter to make the commit - cy.getByTestId("commit-message-text-field").type("New commit{enter}"); - - // List items contain new values - cy.get("@listItemB").should("contain", "456"); - cy.get("@listItemC").should("contain", "test"); - }); - - it( - "commits data in the correct format for datetime and Quantity objects (that is, the" + - " format that allows them to be read into Python classes)", - () => { - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Enter a datetime value into input "b" - cy.getByTestId("parameter-list-item-b").within(() => { - cy.getByTestId("leaf-type-input").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-datetime").click()); - cy.getByTestId("leaf-input").find("input").type("2023-01-01T00:00:01"); - }); - - // Enter a Quantity value into input "c" - cy.getByTestId("parameter-list-item-c").within(() => { - cy.getByTestId("leaf-type-input").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-Quantity").click()); - cy.getByTestId("leaf-input").find("input").type("{selectAll}1"); - cy.getByTestId("leaf-unit-input").find("input").type("{selectAll}m"); - }); - - // Make a new commit with these updated values - cy.getByTestId("open-commit-dialog-button").click(); - cy.getByTestId("commit-message-text-field").type("New commit{enter}"); - - // This will load the most recent commit into Python classes, and throw an error if - // creating the datetime and Quantity objects are not successful. (For example, - // JavaScript is fine with dates being in ISO format with "Z" as the timezone, - // whereas Python requires them to have "+00:00" for UTC time. This is the only test - // that would catch that particular error.) - cy.task("db:load_classes"); - }, - ); -}); diff --git a/cypress/e2e/commit-selection.cy.ts b/cypress/e2e/commit-selection.cy.ts deleted file mode 100644 index ebff46d..0000000 --- a/cypress/e2e/commit-selection.cy.ts +++ /dev/null @@ -1,512 +0,0 @@ -type CommitEntry = { id: number; message: string; timestamp: string }; - -function getFullMessage({ id, message }: CommitEntry) { - return `${id}: ${message}`; -} - -function visitAndInterceptCommitHistory() { - cy.intercept("/api/commit-history").as("commitHistoryIntercept"); - cy.visit("/"); - cy.wait("@commitHistoryIntercept") // Initial request - .wait("@commitHistoryIntercept") // Request when SocketIO connection is established - .then(({ response: { body } }) => { - cy.wrap(body).as("commitHistory"); - }); -} - -describe("short commit history", () => { - before(() => { - cy.task("db:reset"); - }); - - beforeEach(() => { - visitAndInterceptCommitHistory(); - }); - - it("displays the latest commit, latest is checked, and inputs are not disabled", () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const latestCommit = commitHistory[commitHistory.length - 1]; - - // Combobox contains latest commit and is not disabled - cy.getByTestId("commit-select-combobox") - .shouldContainDate(latestCommit.timestamp) - .find("input") - .should("have.value", getFullMessage(latestCommit)) - .should("not.be.disabled"); - - // Latest checkbox is checked and not disabled - cy.getByTestId("latest-checkbox") - .find("input") - .should("be.checked") - .should("not.be.disabled"); - - // Displays parameter data for the latest commit - cy.getByTestId("parameter-list-item-commit_id").should("contain", latestCommit.id); - }); - }); - - it("can search for the initial commit and switch to it", () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const firstCommit = commitHistory[0]; - const fullMessage = getFullMessage(firstCommit); - const partialMessage = fullMessage.slice(0, 8); - - // Type part of the full message - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .type(partialMessage); - - // Combobox contains that part of the message and updates the timestamp - cy.get("@commitSelectCombobox") - .shouldContainDate(firstCommit.timestamp) - .find("input") - .should("have.value", partialMessage); - - // Listbox appears and contains the correct option - cy.getByTestId("commit-select-listbox").within(() => { - cy.getByTestId(`commit-select-option-${firstCommit.id}`) - .should("contain", fullMessage) - .shouldContainDate(firstCommit.timestamp); - }); - - // Type enter - cy.get("@commitSelectCombobox").type("{enter}"); - - // Listbox closes - cy.getByTestId("commit-select-listbox").should("not.exist"); - - // Unfocus the commit select box - cy.get("@commitSelectCombobox").find("input").blur(); - - // Wait 10 ms to allow the commit select box to become fully unfocused - // eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(10); - - // Combobox contains full message and timestamp - cy.get("@commitSelectCombobox").find("input").should("have.value", fullMessage); - cy.get("@commitSelectCombobox").shouldContainDate(firstCommit.timestamp); - - // Displays parameter data for the first commit - cy.getByTestId("parameter-list-item-commit_id").should("contain", firstCommit.id); - }); - }); - - it("switches to latest commit when latest checkbox is checked", () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const firstCommit = commitHistory[0]; - const latestCommit = commitHistory[commitHistory.length - 1]; - - // Switch to first commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .type(getFullMessage(firstCommit).slice(0, 8) + "{enter}"); - - // Latest checkbox should be unchecked - cy.getByTestId("latest-checkbox") - .as("latestCheckbox") - .find("input") - .should("not.be.checked"); - - // Check the latest checkbox - cy.get("@latestCheckbox").click(); - cy.get("@latestCheckbox").find("input").should("be.checked"); - - // Combobox contains latest commit - cy.get("@commitSelectCombobox") - .find("input") - .should("have.value", getFullMessage(latestCommit)); - cy.get("@commitSelectCombobox").shouldContainDate(latestCommit.timestamp); - - // Displays parameter data for the latest commit - cy.getByTestId("parameter-list-item-commit_id").should("contain", latestCommit.id); - }); - }); -}); - -describe("long commit history", () => { - before(() => { - cy.task("db:reset", { long: true }); - }); - - beforeEach(() => { - visitAndInterceptCommitHistory(); - }); - - it("can navigate using down arrow and uses virtualization in the listbox", () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const oldCommitIndex = 12; - const commitHistory = commitHistoryAlias as CommitEntry[]; - const latestCommit = commitHistory[commitHistory.length - 1]; - const oldCommit = commitHistory[commitHistory.length - oldCommitIndex]; - const latestFullMessage = getFullMessage(latestCommit); - - // Click on the combobox to open the listbox - cy.getByTestId("commit-select-combobox").as("commitSelectCombobox").click(); - - // Combobox contains the message and timestamp of the latest commit - cy.get("@commitSelectCombobox") - .shouldContainDate(latestCommit.timestamp) - .find("input") - .should("have.value", latestFullMessage); - - // Listbox contains the latest commit, but not the old commit, which is not loaded - // because of virtualization. - cy.getByTestId("commit-select-listbox") - .as("commitSelectListbox") - .should("contain", latestFullMessage); - cy.getByTestId(`commit-select-option-${oldCommit.id}`).should("not.exist"); - - // Navigate down to the old commit using the down arrow - commitHistory - .slice(commitHistory.length - oldCommitIndex, commitHistory.length - 1) - .reverse() - .forEach(({ id }) => { - cy.get("@commitSelectCombobox").type("{downArrow}"); - cy.getByTestId(`commit-select-option-${id}`).should("exist"); - }); - - // Combobox still contains the message of the latest commit, but now contains the - // timestamp of the twentieth commit. - cy.get("@commitSelectCombobox") - .shouldContainDate(oldCommit.timestamp) - .find("input") - .should("have.value", latestFullMessage); - - // Listbox contains the twentieth commit, but not the latest commit, which is not - // loaded because of virtualization. - cy.get("@commitSelectListbox") - .should("contain", getFullMessage(oldCommit)) - .should("not.contain", latestFullMessage); - }); - }); -}); - -describe("update commit history", () => { - beforeEach(() => { - cy.task("db:reset"); - visitAndInterceptCommitHistory(); - }); - - it("updates to latest commit when latest checkbox is checked", () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const originalLatestCommit = commitHistory[commitHistory.length - 1]; - - // Combobox contains the original latest commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .find("input") - .should("have.value", getFullMessage(originalLatestCommit)); - - // Make a commit - cy.task("db:commit"); - cy.wait("@commitHistoryIntercept").then(({ response: { body } }) => { - const updatedCommitHistory: CommitEntry[] = body; - const updatedLatestCommit = updatedCommitHistory[updatedCommitHistory.length - 1]; - const updatedFullMessage = getFullMessage(updatedLatestCommit); - - // Latest commit has updated - cy.wrap(updatedLatestCommit).should("not.deep.equal", originalLatestCommit); - - // Combobox contains the updated latest commmit - cy.get("@commitSelectCombobox") - .find("input") - .should("have.value", updatedFullMessage); - cy.get("@commitSelectCombobox").shouldContainDate(updatedLatestCommit.timestamp); - - // Listbox contains the updated latest commit - cy.get("@commitSelectCombobox").click(); - cy.getByTestId("commit-select-listbox").should("contain", updatedFullMessage); - - // Displays parameter data for the updated latest commit - cy.getByTestId("parameter-list-item-commit_id").should( - "contain", - updatedLatestCommit.id, - ); - }); - }); - }); - - it("doesn't update to latest commit when latest checkbox is unchecked", () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const originalLatestCommit = commitHistory[commitHistory.length - 1]; - - // Combobox contains the original latest commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .find("input") - .should("have.value", getFullMessage(originalLatestCommit)); - - // Uncheck the latest checkbox - cy.getByTestId("latest-checkbox").as("latestCheckbox").click(); - cy.get("@latestCheckbox").find("input").should("not.be.checked"); - - cy.task("db:commit"); - cy.wait("@commitHistoryIntercept").then(({ response: { body } }) => { - const updatedCommitHistory: CommitEntry[] = body; - const updatedLatestCommit = updatedCommitHistory[updatedCommitHistory.length - 1]; - const updatedFullMessage = getFullMessage(updatedLatestCommit); - - // Latest commit has updated - cy.wrap(updatedLatestCommit).should("not.deep.equal", originalLatestCommit); - - // Combobox contains the original latest commmit - cy.get("@commitSelectCombobox") - .find("input") - .should("have.value", getFullMessage(originalLatestCommit)); - cy.get("@commitSelectCombobox").shouldContainDate(originalLatestCommit.timestamp); - - // Listbox contains the updated latest commit - cy.get("@commitSelectCombobox").click(); - cy.getByTestId("commit-select-listbox").should("contain", updatedFullMessage); - - // Displays parameter data for the original latest commit - cy.getByTestId("parameter-list-item-commit_id").should( - "contain", - originalLatestCommit.id, - ); - }); - }); - }); -}); - -describe("edit mode (no committing)", () => { - before(() => { - cy.task("db:reset"); - }); - - beforeEach(() => { - visitAndInterceptCommitHistory(); - }); - - it("commit combobox and latest checkbox are disabled", () => { - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Combobox and latest checkbox are disabled - cy.getByTestId("commit-select-combobox") - .find("input") - .as("commitSelectComboboxInput") - .should("be.disabled"); - cy.getByTestId("latest-checkbox") - .find("input") - .as("latestCheckboxInput") - .should("be.disabled"); - - // Click the cancel button to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Combobox and latest checkbox are not disabled - cy.get("@commitSelectComboboxInput").should("not.be.disabled"); - cy.get("@latestCheckboxInput").should("not.be.disabled"); - - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Combobox and latest checkbox are disabled - cy.get("@commitSelectComboboxInput").should("be.disabled"); - cy.get("@latestCheckboxInput").should("be.disabled"); - - // Click buttons to open commit dialog and make a commit - cy.getByTestId("open-commit-dialog-button").click(); - cy.getByTestId("commit-message-text-field").type("New commit"); - cy.getByTestId("make-commit-button").click(); - - // Combobox and latest checkbox are not disabled - cy.get("@commitSelectComboboxInput").should("not.be.disabled"); - cy.get("@latestCheckboxInput").should("not.be.disabled"); - }); - - it("can change commit after entering and exiting edit mode (previous bug)", () => { - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Click the cancel button to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const firstCommit = commitHistory[0]; - const fullMessage = getFullMessage(firstCommit); - - // Make sure commit select box is fully loaded - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .find("input") - .should("not.be.disabled"); - - // Select the first commit - cy.get("@commitSelectCombobox").type(`${fullMessage.slice(0, 8)}{enter}`); - - // Unfocus the commit select box - cy.get("@commitSelectCombobox").find("input").blur(); - - // Wait 10 ms to allow the commit select box to become fully unfocused - // eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(10); - - // Commit select should contain the first commit - cy.get("@commitSelectCombobox").find("input").should("have.value", fullMessage); - }); - }); -}); - -describe("edit mode (with committing)", () => { - beforeEach(() => { - cy.task("db:reset"); - visitAndInterceptCommitHistory(); - }); - - it( - "when latest is checked, it is unchecked in edit mode, making a commit in edit mode" + - " does not check latest or switch to the latest commit, and once exit mode ends" + - " latest is checked again and the new latest commit is selected", - () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const originalLatestCommit = commitHistory[commitHistory.length - 1]; - const originalFullMessage = getFullMessage(originalLatestCommit); - - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Latest checkbox is not checked - cy.getByTestId("latest-checkbox") - .find("input") - .as("latestCheckboxInput") - .should("not.be.checked"); - - // Combobox contains latest commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .shouldContainDate(originalLatestCommit.timestamp) - .find("input") - .should("have.value", originalFullMessage); - - // Make a commit - cy.task("db:commit"); - cy.wait("@commitHistoryIntercept").then(({ response: { body } }) => { - const updatedCommitHistory: CommitEntry[] = body; - const updatedLatestCommit = - updatedCommitHistory[updatedCommitHistory.length - 1]; - const updatedFullMessage = getFullMessage(updatedLatestCommit); - - // Latest commit has updated - cy.wrap(updatedLatestCommit).should("not.deep.equal", originalLatestCommit); - - // Latest checkbox is not checked - cy.get("@latestCheckboxInput").should("not.be.checked"); - - // Combobox contains the original latest commit (since latest is unchecked) - cy.get("@commitSelectCombobox") - .shouldContainDate(originalLatestCommit.timestamp) - .find("input") - .should("have.value", originalFullMessage); - - // Click the cancel button to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Latest checkbox is checked - cy.get("@latestCheckboxInput").should("be.checked"); - - // Combobox contains the updated latest commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .shouldContainDate(updatedLatestCommit.timestamp) - .find("input") - .should("have.value", updatedFullMessage); - }); - }); - }, - ); - - it( - "when latest is unchecked, entering edit mode, making a commit, and exiting edit" + - " do not change the selected commit or check latest", - () => { - cy.get("@commitHistory").then((commitHistoryAlias: unknown) => { - const commitHistory = commitHistoryAlias as CommitEntry[]; - const firstCommit = commitHistory[0]; - const fullMessage = getFullMessage(firstCommit); - - // Select the first commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .type(`${fullMessage.slice(0, 8)}{enter}`); - - // Click the edit button to enter edit mode - cy.getByTestId("edit-button").click(); - - // Latest checkbox is unchecked - cy.getByTestId("latest-checkbox") - .find("input") - .as("latestCheckboxInput") - .should("not.be.checked"); - - // Combobox contains first commit - cy.get("@commitSelectCombobox") - .shouldContainDate(firstCommit.timestamp) - .find("input") - .should("have.value", fullMessage); - - // Make a commit - cy.task("db:commit"); - cy.wait("@commitHistoryIntercept"); - - // Combobox still contains the first commit - cy.get("@commitSelectCombobox") - .shouldContainDate(firstCommit.timestamp) - .find("input") - .should("have.value", fullMessage); - - // Click the cancel button to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Latest checkbox is still not checked - cy.get("@latestCheckboxInput").should("not.be.checked"); - - // Combobox contains the original latest commit - cy.get("@commitSelectCombobox") - .shouldContainDate(firstCommit.timestamp) - .find("input") - .should("have.value", fullMessage); - }); - }, - ); - - it( - "makes a new commit via the commit dialog and switches the new commit once it has" + - " been created", - () => { - // Click buttons to enter edit mode and open the commit dialog - cy.getByTestId("edit-button").click(); - cy.getByTestId("open-commit-dialog-button").click(); - - // Type a commit message - const commitMessage = "Test commit"; - cy.getByTestId("commit-message-text-field").type(commitMessage); - - // Click the commit button to make a commit - cy.getByTestId("make-commit-button").click(); - - cy.wait("@commitHistoryIntercept").then(({ response: { body } }) => { - const updatedCommitHistory: CommitEntry[] = body; - const updatedLatestCommit = updatedCommitHistory[updatedCommitHistory.length - 1]; - - // Commit message should equal what was typed - cy.wrap(updatedLatestCommit.message).should("equal", commitMessage); - - // Combobox contains latest commit - cy.getByTestId("commit-select-combobox") - .as("commitSelectCombobox") - .shouldContainDate(updatedLatestCommit.timestamp) - .find("input") - .should("have.value", getFullMessage(updatedLatestCommit)); - }); - }, - ); -}); diff --git a/cypress/e2e/error.cy.ts b/cypress/e2e/error.cy.ts deleted file mode 100644 index 1218108..0000000 --- a/cypress/e2e/error.cy.ts +++ /dev/null @@ -1,30 +0,0 @@ -describe("error has occured", () => { - before(() => { - // Clearing results in an empty database, which causes an error in the UI. - cy.task("db:clear"); - }); - - beforeEach(() => { - cy.visit("/"); - }); - - it('sets page title to "Error"', () => { - cy.title().should("eq", "Error"); - }); - - it("displays error alert", () => { - cy.getByTestId("alert-title").should("contain", "Error"); - cy.getByTestId("error-message").should( - "contain", - "Database param.db has no commits.", - ); - cy.getByTestId("reload-button").should("contain", "Reload"); - }); - - it("reloads when reload button is clicked", () => { - cy.getByTestId("reload-button").click(); - cy.window() - .then((win) => win.performance.getEntriesByType("navigation")[0].toJSON().type) - .should("eq", "reload"); - }); -}); diff --git a/cypress/e2e/loading.cy.ts b/cypress/e2e/loading.cy.ts deleted file mode 100644 index 426ed28..0000000 --- a/cypress/e2e/loading.cy.ts +++ /dev/null @@ -1,58 +0,0 @@ -before(() => { - cy.task("db:reset"); -}); - -describe("page is loading", () => { - beforeEach(() => { - // Delay API responses by 1 second to observe the loading state - cy.intercept("/api/**", (req) => { - req.on("response", (res) => { - res.setDelay(1000); - }); - }); - cy.visit("/"); - }); - - it('sets page title to "Loading…"', () => { - cy.title().should("eq", "Loading…"); - }); - - it("displays loading states", () => { - cy.getByTestId("database-name-loading").should("match", ":empty"); - cy.getByTestId("commit-select-loading").should("match", ":empty"); - cy.getByTestId("parameter-list-loading").should("match", ":empty"); - }); -}); - -describe("page is loaded", () => { - beforeEach(() => { - cy.intercept("/api/database-name").as("databaseNameIntercept"); - cy.visit("/"); - cy.wait("@databaseNameIntercept").then(({ response: { body } }) => { - cy.wrap(body).as("databaseName"); - }); - }); - - it("sets page title to database name", () => { - cy.get("@databaseName").then((databaseNameAlias: unknown) => { - const databaseName = databaseNameAlias as string; - cy.title().should("eq", databaseName); - }); - }); - - it("displays loaded elements", () => { - cy.get("@databaseName").then((databaseNameAlias: unknown) => { - const databaseName = databaseNameAlias as string; - cy.getByTestId("database-name").should("contain", databaseName); - }); - cy.getByTestId("commit-select-combobox").find("label").should("contain", "Commit"); - cy.getByTestId("latest-checkbox").should("contain", "Latest"); - cy.getByTestId("parameter-list").find('[role="button"]').should("contain", "root"); - }); - - it("displays parameter controls", () => { - cy.getByTestId("parameter-section-heading").should("contain", "Parameters"); - cy.getByTestId("round-switch").should("contain", "Round"); - cy.getByTestId("collapse-all-button").should("contain", "Collapse all"); - }); -}); diff --git a/cypress/e2e/parameter-editing.cy.ts b/cypress/e2e/parameter-editing.cy.ts deleted file mode 100644 index 2461c03..0000000 --- a/cypress/e2e/parameter-editing.cy.ts +++ /dev/null @@ -1,410 +0,0 @@ -describe("leaf input", () => { - const dateString = "2023-01-01T00:00:00.000Z"; - - before(() => { - cy.task("db:reset", { single: true }); - }); - - beforeEach(() => { - cy.visit("/"); - cy.getByTestId("edit-button").click(); // Enter edit mode - }); - - it("can display input for each type of parameter", () => { - cy.getByTestId("parameter-list").within(() => { - //int - cy.getByTestId("parameter-list-item-int").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .should("have.value", "123") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - cy.getByTestId("leaf-type-input").should("contain", "int/float"); - }); - - // float - cy.getByTestId("parameter-list-item-float").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .should("have.value", "1.2345") // Unrounded - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - cy.getByTestId("leaf-type-input").should("contain", "int/float"); - }); - - // bool - cy.getByTestId("parameter-list-item-bool").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .should("have.value", "True") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - cy.getByTestId("leaf-type-input").should("contain", "bool"); - }); - - // str - cy.getByTestId("parameter-list-item-str").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .should("have.value", "test") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - cy.getByTestId("leaf-type-input").should("contain", "str"); - }); - - // None - cy.getByTestId("parameter-list-item-None").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .should("have.value", "None") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - cy.getByTestId("leaf-type-input").should("contain", "None"); - }); - - // datetime - cy.getByTestId("parameter-list-item-datetime").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .shouldHaveDateValue(dateString) - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - cy.getByTestId("leaf-type-input").should("contain", "datetime"); - }); - - // Quantity - cy.getByTestId("parameter-list-item-Quantity").within(() => { - cy.getByTestId("leaf-input") - .find("input") - .should("have.value", "1.2345") // Unrounded - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").find("input").should("have.value", "m"); - cy.getByTestId("leaf-type-input").should("contain", "Quantity"); - }); - }); - }); - - it("can edit and reset input for each type of parameter", () => { - cy.getByTestId("parameter-list").within(() => { - // int - cy.getByTestId("parameter-list-item-int").within(() => { - // Type an "a" into the int input - cy.getByTestId("leaf-input").find("input").as("int-input").type("a"); - - // Input contains new value and is invalid - cy.get("@int-input").should("have.value", "123a").shouldBeInvalid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value and is valid - cy.get("@int-input").should("have.value", "123").shouldBeValid(); - }); - - // float - cy.getByTestId("parameter-list-item-float").within(() => { - // Type an "a" into the float input - cy.getByTestId("leaf-input").find("input").as("float-input").type("a"); - - // Input contains new value and is invalid - cy.get("@float-input").should("have.value", "1.2345a").shouldBeInvalid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value and is valid - cy.get("@float-input").should("have.value", "1.2345").shouldBeValid(); - }); - - // bool - cy.getByTestId("parameter-list-item-bool").within(() => { - // Select "False" for bool input - cy.getByTestId("leaf-input").as("bool-input").click(); - cy.document().within(() => cy.getByTestId("boolean-input-option-False").click()); - - // Input contains new value and is valid - cy.get("@bool-input").find("input").should("have.value", "False").shouldBeValid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value and is valid - cy.get("@bool-input").find("input").should("have.value", "True").shouldBeValid(); - }); - - // str - cy.getByTestId("parameter-list-item-str").within(() => { - // Type an "a" into the float input - cy.getByTestId("leaf-input").find("input").as("str-input").type("a"); - - // Input contains new value and is valid - cy.get("@str-input").should("have.value", "testa").shouldBeValid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value and is valid - cy.get("@str-input").should("have.value", "test").shouldBeValid(); - }); - - // None - cy.getByTestId("parameter-list-item-None").within(() => { - // None input is disabled and valid - cy.getByTestId("leaf-input") - .find("input") - .as("None-input") - .should("be.disabled") - .shouldBeValid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value, is disabled, and is valid - cy.get("@None-input") - .should("have.value", "None") - .should("be.disabled") - .shouldBeValid(); - }); - - // datetime - cy.getByTestId("parameter-list-item-datetime").within(() => { - const newDateValue = "2023-02-01T00:00:01"; - - // Clear the datetime input - cy.getByTestId("leaf-input").find("input").as("datetime-input").clear(); - - // Input is blank and invalid - cy.get("@datetime-input").should("have.value", "").shouldBeInvalid(); - - // Type a new date into the datetime input - cy.get("@datetime-input").type(newDateValue); - cy.get("@datetime-input").shouldHaveDateValue(newDateValue).shouldBeValid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value and is valid - cy.get("@datetime-input").shouldHaveDateValue(dateString).shouldBeValid(); - }); - - // Quantity - cy.getByTestId("parameter-list-item-Quantity").within(() => { - // Type an "a" into the Quantity input - cy.getByTestId("leaf-input").find("input").as("Quantity-input").type("a"); - cy.getByTestId("leaf-unit-input") - .find("input") - .as("Quantity-unit-input") - .type("s"); - - // Input and unit input contain new values - cy.get("@Quantity-input").should("have.value", "1.2345a").shouldBeInvalid(); - cy.get("@Quantity-unit-input").should("have.value", "ms").shouldBeValid(); - - // Clear the unit input - cy.get("@Quantity-unit-input").clear(); - - // Unit input is empty and invalid - cy.get("@Quantity-unit-input").should("have.value", "").shouldBeInvalid(); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Input contains original value and is valid - cy.get("@Quantity-input").should("have.value", "1.2345").shouldBeValid(); - cy.get("@Quantity-unit-input").should("have.value", "m").shouldBeValid(); - }); - }); - }); - - it("can change an input to each type of parameter", () => { - cy.getByTestId("parameter-list").within(() => { - cy.getByTestId("parameter-list-item-int").within(() => { - // Select int/float leaf type - cy.getByTestId("leaf-type-input").as("leafTypeInput").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-int-float").click()); - cy.getByTestId("leaf-type-input") - .as("leafTypeInput") - .should("contain", "int/float"); - cy.getByTestId("leaf-input") - .find("input") - .as("leafInput") - .should("have.value", "123") - .should("not.be.disabled") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - - // Select bool leaf type - cy.get("@leafTypeInput").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-bool").click()); - cy.get("@leafTypeInput").should("contain", "bool"); - cy.get("@leafInput") - .should("have.value", "False") - .should("not.be.disabled") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - - // Select str leaf type - cy.get("@leafTypeInput").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-str").click()); - cy.get("@leafTypeInput").should("contain", "str"); - cy.get("@leafInput") - .should("have.value", "False") - .should("not.be.disabled") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - - // Select None leaf type - cy.get("@leafTypeInput").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-None").click()); - cy.get("@leafTypeInput").should("contain", "None"); - cy.get("@leafInput") - .should("have.value", "None") - .should("be.disabled") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - - // Select Quantity leaf type - cy.get("@leafTypeInput").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-Quantity").click()); - cy.get("@leafTypeInput").should("contain", "Quantity"); - cy.get("@leafInput") - .should("have.value", "None") - .should("not.be.disabled") - .shouldBeInvalid(); - cy.getByTestId("leaf-unit-input") - .find("input") - .should("have.value", "") - .shouldBeInvalid(); - - // Select datetime leaf type - cy.get("@leafTypeInput").click(); - cy.document().within(() => cy.getByTestId("leaf-type-option-datetime").click()); - cy.get("@leafTypeInput").should("contain", "datetime"); - cy.get("@leafInput") - .should("have.value", "") - .should("not.be.disabled") - .shouldBeInvalid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - - // Reset the input - cy.getByTestId("reset-leaf-button").click(); - - // Leaf type input contains the original type - cy.get("@leafTypeInput").should("contain", "int/float"); - cy.get("@leafInput") - .should("have.value", "123") - .should("not.be.disabled") - .shouldBeValid(); - cy.getByTestId("leaf-unit-input").should("not.exist"); - }); - }); - }); -}); - -describe("exiting edit mode by clicking the cancel button", () => { - before(() => { - cy.task("db:reset"); - }); - - beforeEach(() => { - cy.visit("/"); - }); - - it("can exit edit mode by pressing the cancel button when there are no changes", () => { - // Click edit to enter edit mode - cy.getByTestId("edit-button").click(); - - // Click cancel to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Edit button exists, meaning we exited edit mode - cy.getByTestId("edit-button").should("exist"); - }); - - it("can exit edit mode by pressing the cancel button when there are invalid changes", () => { - // Click edit to enter edit mode - cy.getByTestId("edit-button").click(); - - cy.getByTestId("parameter-list-item-b").within(() => { - // Type "a" into the (int/float) input. Since this input is not valid, it does not - // count as a change. - cy.getByTestId("leaf-input").find("input").type("a"); - }); - - // Click cancel to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Click edit to enter edit mode again - cy.getByTestId("edit-button").click(); - - // Input has the original value, meaning changes were discarded - cy.getByTestId("parameter-list-item-b").within(() => { - cy.getByTestId("leaf-input").find("input").should("have.value", "2"); - }); - }); - - it( - "prompts the user to confirm they want to discard changes and does not exit if they" + - ' respond "Cancel"', - () => { - // Respond "Cancel" to future confirm prompts - cy.on("window:confirm", cy.stub().as("onConfirm").returns(false)); - - // Click edit to enter edit mode - cy.getByTestId("edit-button").click(); - - // Type "123" into the (int/float) input. Since this input is valid, it counts as - // a change. - cy.getByTestId("parameter-list-item-b").within(() => { - cy.getByTestId("leaf-input").find("input").as("b-input").type("{selectAll}123"); - }); - - // Click cancel to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Confirm was called - cy.get("@onConfirm").should( - "be.calledOnceWith", - "You have unsaved changes. Do you want to discard them?", - ); - - // Input still has the updated value - cy.get("@b-input").should("have.value", "123"); - }, - ); - - it( - "prompts the user to confirm they want to discard changes and exits and discards" + - ' changes if they respond "OK"', - () => { - // Respond "OK" to future confirm prompts - cy.on("window:confirm", cy.stub().as("onConfirm").returns(true)); - - // Click edit to enter edit mode - cy.getByTestId("edit-button").click(); - - // Type "123" into the (int/float) input. Since this input is valid, it counts as - // a change. - cy.getByTestId("parameter-list-item-b").within(() => { - cy.getByTestId("leaf-input").find("input").type("{selectAll}123"); - }); - - // Click cancel to exit edit mode - cy.getByTestId("cancel-edit-button").click(); - - // Confirm was called - cy.get("@onConfirm").should( - "be.calledOnceWith", - "You have unsaved changes. Do you want to discard them?", - ); - - // Click edit to enter edit mode - cy.getByTestId("edit-button").click(); - - // Input has the original value, so the changes were discarded - cy.getByTestId("parameter-list-item-b").within(() => { - cy.getByTestId("leaf-input").find("input").should("have.value", "2"); - }); - }, - ); -}); diff --git a/cypress/e2e/parameter-navigation.cy.ts b/cypress/e2e/parameter-navigation.cy.ts deleted file mode 100644 index 9ee98e8..0000000 --- a/cypress/e2e/parameter-navigation.cy.ts +++ /dev/null @@ -1,203 +0,0 @@ -describe("parameter data for latest commit", () => { - const dateString = "2023-01-01T00:00:00.000Z"; - - before(() => { - cy.task("db:reset", { single: true }); - }); - - beforeEach(() => { - cy.visit("/"); - }); - - it("can display each type of parameter", () => { - cy.getByTestId("parameter-list").within(() => { - cy.getByTestId("parameter-list-item-int").should("contain", "123"); - - cy.getByTestId("parameter-list-item-float").should("contain", "1.234"); // Rounded - - cy.getByTestId("parameter-list-item-bool").should("contain", "True"); - - cy.getByTestId("parameter-list-item-str").should("contain", "test"); - - cy.getByTestId("parameter-list-item-None").should("contain", "None"); - - cy.getByTestId("parameter-list-item-datetime").shouldContainDate(dateString); - - cy.getByTestId("parameter-list-item-Quantity").should("contain", "1.234 m"); // Rounded - - cy.getByTestId("parameter-list-item-list") - .should("contain", "list") - .shouldNotContainDate(dateString); - - cy.getByTestId("parameter-list-item-dict") - .should("contain", "dict") - .shouldNotContainDate(dateString); - - cy.getByTestId("parameter-list-item-paramDict") - .should("contain", "ParamDict") - .shouldNotContainDate(dateString); - - cy.getByTestId("parameter-list-item-paramList") - .should("contain", "ParamList") - .shouldNotContainDate(dateString); - - cy.getByTestId("parameter-list-item-struct") - .should("contain", "CustomStruct (Struct)") - .shouldContainDate(dateString); - - cy.getByTestId("parameter-list-item-param") - .should("contain", "CustomParam (Param)") - .shouldContainDate(dateString); - }); - }); - - it("rounds according to whether the round switch is checked", () => { - // Rounded - cy.getByTestId("round-switch") - .find("input") - .as("roundSwitchInput") - .should("be.checked"); - cy.getByTestId("parameter-list-item-float").as("float").should("contain", "1.234"); - cy.getByTestId("parameter-list-item-Quantity") - .as("Quantity") - .should("contain", "1.234 m"); - - // Unrounded - cy.get("@roundSwitchInput").uncheck(); - cy.get("@roundSwitchInput").should("not.be.checked"); - cy.get("@float").should("contain", "1.2345"); - cy.get("@Quantity").should("contain", "1.2345 m"); - }); - - // it("expands and collapses nested items when clicked", () => { - // // Children do not exist (collapsed) - // cy.getByTestId("parameter-list-item-dict") - // .as("dict") - // .should("exist") - // .within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // cy.getByTestId("parameter-list-item-str").should("not.exist"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click dict item - // cy.get("@dict").find('[role="button"]').click(); - - // // Children are visible (expended) - // cy.get("@dict").within(() => { - // cy.getByTestId("parameter-list-item-int").should("be.visible"); - // cy.getByTestId("parameter-list-item-str").should("be.visible"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click dict item - // cy.get("@dict").find('[role="button"]').click(); - - // // Children do not exist (collapsed) - // cy.get("@dict").within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // cy.getByTestId("parameter-list-item-str").should("not.exist"); - // }); - // }); - - // it("collapses all items when the collapse all button is clicked", () => { - // // Children do not exist (collapsed) - // cy.getByTestId("parameter-list-item-dict") - // .as("dict") - // .should("exist") - // .within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // }); - // cy.getByTestId("parameter-list-item-paramDict") - // .as("paramDict") - // .should("exist") - // .within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click dict item - // cy.get("@dict").find('[role="button"]').click(); - - // // Children are visible (expended) - // cy.get("@dict").within(() => { - // cy.getByTestId("parameter-list-item-int").should("be.visible"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click paramDict item - // cy.get("@paramDict").find('[role="button"]').click(); - - // // Children are visible (expended) - // cy.get("@paramDict").within(() => { - // cy.getByTestId("parameter-list-item-int").should("be.visible"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click collapse all button - // cy.getByTestId("collapse-all-button").click(); - - // // Children do not exist (collapsed) - // cy.get("@dict").within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // }); - // cy.get("@paramDict").within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // }); - // }); - - // it("resets root item to expanded when collapse all button is clicked", () => { - // // Children are visible (expended) - // cy.getByTestId("parameter-list-item-root") - // .as("root") - // .within(() => { - // cy.getByTestId("parameter-list-item-int").should("be.visible"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click root item - // cy.get("@root").find('[role="button"]').first().click(); - - // // Children do not exist (collapsed) - // cy.get("@root").within(() => { - // cy.getByTestId("parameter-list-item-int").should("not.exist"); - // }); - - // // Wait briefly to allow for other processes to finish (this test fails - // // intermittently, so this is an attempt to fix it). - // // eslint-disable-next-line cypress/no-unnecessary-waiting - // cy.wait(10); - - // // Click collapse all button - // cy.getByTestId("collapse-all-button").click(); - - // // Children are visible (expended) - // cy.get("@root").within(() => { - // cy.getByTestId("parameter-list-item-int").should("be.visible"); - // }); - // }); -}); diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts deleted file mode 100644 index 2b0043f..0000000 --- a/cypress/support/e2e.ts +++ /dev/null @@ -1,118 +0,0 @@ -// See https://docs.cypress.io/guides/tooling/typescript-support#Types-for-Custom-Commands -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Cypress { - interface Chainable { - /** - * Get a DOM element by `data-testid`. - * - * This is a custom Cypress command. - */ - getByTestId( - dataTestAttribute: string, - options?: Parameters[1], - ): Chainable>; - - /** - * Assert that the DOM element contains the date specified by the given timestamp or - * string. - * - * This is a custom Cypress command. - */ - shouldContainDate( - timestampOrString: number | string, - ): Chainable>; - - /** - * Assert that the DOM element does not contain the date specified by the given - * timestamp or string. - * - * This is a custom Cypress command. - */ - shouldNotContainDate( - timestampOrString: number | string, - ): Chainable>; - - /** - * Assert that the DOM element's value is equal to the date specified by the given - * timestamp or string in local datetime format. - * - * This is a custom Cypress command. - */ - shouldHaveDateValue( - timestampOrString: number | string, - ): Chainable>; - - /** - * Assert that the input element is valid, based on its aria-invalid attribute. - * - * This is a custom Cypress command. - */ - shouldBeValid(): Chainable>; - - /** - * Assert that the input element is invalid, based on its aria-invalid attribute. - * - * This is a custom Cypress command. - */ - shouldBeInvalid(): Chainable>; - } - } -} - -/** See src/utils/timestamp.ts */ -function formatDate(timestampOrString: number | string) { - return new Date(timestampOrString).toLocaleString(undefined, { - year: "2-digit", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - }); -} - -/** See src/utils/timestamp.ts */ -function getLocalISOString(timestampOrString: number | string) { - const date = new Date(timestampOrString); - date.setMinutes(date.getMinutes() - date.getTimezoneOffset()); - const localISOStringWithSeconds = date.toISOString().split(".")[0]; - return date.getSeconds() === 0 - ? localISOStringWithSeconds.slice(0, -3) - : localISOStringWithSeconds; -} - -Cypress.Commands.add("getByTestId", (selector, options) => { - return cy.get(`[data-testid=${selector}]`, options); -}); - -Cypress.Commands.add( - "shouldContainDate", - { prevSubject: true }, - (subject, timestampOrString) => - cy.wrap(subject).should("contain", formatDate(timestampOrString)), -); - -Cypress.Commands.add( - "shouldNotContainDate", - { prevSubject: true }, - (subject, timestampOrString) => - cy.wrap(subject).should("not.contain", formatDate(timestampOrString)), -); - -Cypress.Commands.add( - "shouldHaveDateValue", - { prevSubject: true }, - (subject, timestampOrString) => - cy.wrap(subject).should("have.value", getLocalISOString(timestampOrString)), -); - -Cypress.Commands.add("shouldBeValid", { prevSubject: true }, (subject) => - cy.wrap(subject).should("have.attr", "aria-invalid", "false"), -); - -Cypress.Commands.add("shouldBeInvalid", { prevSubject: true }, (subject) => - cy.wrap(subject).should("have.attr", "aria-invalid", "true"), -); - -export {}; diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json deleted file mode 100644 index 8f160a5..0000000 --- a/cypress/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["es5", "dom"], - "types": ["cypress", "node"], - "noEmit": true - }, - "include": ["e2e/**/*", "support/**/*"] -} diff --git a/package.json b/package.json index b13c40b..60f77e6 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,8 @@ "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", - "lint": "tsc && tsc --project cypress && eslint . && prettier --check .", - "test:unit": "jest", - "test:e2e": "wait-on http://127.0.0.1:5050 -t 1000 && wait-on http://localhost:4173 -t 1000 && poetry run cypress run", - "cy:open": "wait-on http://127.0.0.1:5050 -t 1000 && wait-on http://localhost:4173 -t 1000 && poetry run cypress open", - "backend": "poetry run python cypress/backend.py" + "lint": "tsc && eslint . && prettier --check .", + "test": "jest" }, "packageManager": "yarn@4.0.2", "dependencies": { @@ -38,14 +35,12 @@ "@types/react": "^18.2.42", "@types/react-dom": "^18.2.17", "@types/react-window": "^1.8.8", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser": "^6.13.2", + "@typescript-eslint/eslint-plugin": "^6.17.0", + "@typescript-eslint/parser": "^6.17.0", "@vitejs/plugin-react-swc": "^3.5.0", - "cypress": "^13.6.1", "eslint": "^8.55.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-cypress": "^2.15.1", "eslint-plugin-import": "^2.29.0", "eslint-plugin-jest": "^27.6.0", "eslint-plugin-jsx-a11y": "^6.8.0", diff --git a/paramview/_cli.py b/paramview/_cli.py index 5280a96..e743086 100644 --- a/paramview/_cli.py +++ b/paramview/_cli.py @@ -9,7 +9,7 @@ _VERSION = distribution(_PACKAGE_NAME).version -def _parse_args(*args: str) -> Namespace: +def _parse_args(args: list[str] | None = None) -> Namespace: """ Parse command line arguments using argparse. If arguments are passed in, those are parsed instead of command line arguments. @@ -33,7 +33,12 @@ def _parse_args(*args: str) -> Namespace: type=int, help="port to use (default is 5050)", ) - return parser.parse_args(args or None) + parser.add_argument( + "--no-open", + action="store_true", + help="don't open a new browser window (default is to open one)", + ) + return parser.parse_args(args) def main() -> None: @@ -42,4 +47,4 @@ def main() -> None: program calls this function. """ args = _parse_args() - start_server(args.db_path, default_port=args.port) + start_server(args.db_path, default_port=args.port, open_window=not args.no_open) diff --git a/paramview/_server.py b/paramview/_server.py index 1c5f6a9..ee314b7 100644 --- a/paramview/_server.py +++ b/paramview/_server.py @@ -35,19 +35,19 @@ def start_server( db_path: str, host: str = "127.0.0.1", default_port: int = 5050, - auto_open: bool = True, + open_window: bool = True, ) -> None: """ Start the server locally on the given port using SocketIO, and open in a new browser - window if auto_open is True. If the given port is in use, find another available - port. + window if ``open_window`` is ``True``. If the given port is in use, find another + available port. """ port = _available_port(host, default_port) app, socketio = create_app(db_path) stop_watch_db = watch_db(db_path, socketio) try: print(f"Serving on http://{host}:{port}", file=sys.stderr) - if auto_open: + if open_window: webbrowser.open(f"http://{host}:{port}", new=2) socketio.run(app, host, port) finally: diff --git a/poetry.lock b/poetry.lock index 93c2294..3e7c1d5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "astroid" -version = "3.0.1" +version = "3.0.2" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" files = [ - {file = "astroid-3.0.1-py3-none-any.whl", hash = "sha256:7d5895c9825e18079c5aeac0572bc2e4c83205c95d416e0b4fee8bc361d2d9ca"}, - {file = "astroid-3.0.1.tar.gz", hash = "sha256:86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e"}, + {file = "astroid-3.0.2-py3-none-any.whl", hash = "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c"}, + {file = "astroid-3.0.2.tar.gz", hash = "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"}, ] [package.dependencies] @@ -68,13 +68,13 @@ test-all = ["astropy[test]", "coverage[toml]", "ipython (>=4.2)", "objgraph", "s [[package]] name = "astropy-iers-data" -version = "0.2023.12.4.0.30.20" +version = "0.2023.12.11.0.31.11" description = "IERS Earth Rotation and Leap Second tables for the astropy core package" optional = false python-versions = ">=3.8" files = [ - {file = "astropy-iers-data-0.2023.12.4.0.30.20.tar.gz", hash = "sha256:2d27bd0af3f09a0ce01dd0e863086a6c6132a6b213a27da561c5fae5424e85c5"}, - {file = "astropy_iers_data-0.2023.12.4.0.30.20-py3-none-any.whl", hash = "sha256:352b2acf7d8abb8de5c1e5c0cc912d6b92dfaea4a1188aad17d94dc6333dc909"}, + {file = "astropy-iers-data-0.2023.12.11.0.31.11.tar.gz", hash = "sha256:30dfae118e3df16a30013becea7231e3b4699e6127595a86bd71b1bd35a0c75b"}, + {file = "astropy_iers_data-0.2023.12.11.0.31.11-py3-none-any.whl", hash = "sha256:dc9b886713a4b8fc0683d760f42eba3fc029918d4c441b1bab60d876010614f0"}, ] [package.extras] @@ -99,29 +99,33 @@ test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "py [[package]] name = "black" -version = "23.11.0" +version = "23.12.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, - {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, - {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, - {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, - {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, - {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, - {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, - {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, - {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, - {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, - {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, - {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, - {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, - {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, - {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, - {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, - {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, - {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, + {file = "black-23.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67f19562d367468ab59bd6c36a72b2c84bc2f16b59788690e02bbcb140a77175"}, + {file = "black-23.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbd75d9f28a7283b7426160ca21c5bd640ca7cd8ef6630b4754b6df9e2da8462"}, + {file = "black-23.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:593596f699ca2dcbbbdfa59fcda7d8ad6604370c10228223cd6cf6ce1ce7ed7e"}, + {file = "black-23.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:12d5f10cce8dc27202e9a252acd1c9a426c83f95496c959406c96b785a92bb7d"}, + {file = "black-23.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e73c5e3d37e5a3513d16b33305713237a234396ae56769b839d7c40759b8a41c"}, + {file = "black-23.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba09cae1657c4f8a8c9ff6cfd4a6baaf915bb4ef7d03acffe6a2f6585fa1bd01"}, + {file = "black-23.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace64c1a349c162d6da3cef91e3b0e78c4fc596ffde9413efa0525456148873d"}, + {file = "black-23.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:72db37a2266b16d256b3ea88b9affcdd5c41a74db551ec3dd4609a59c17d25bf"}, + {file = "black-23.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fdf6f23c83078a6c8da2442f4d4eeb19c28ac2a6416da7671b72f0295c4a697b"}, + {file = "black-23.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39dda060b9b395a6b7bf9c5db28ac87b3c3f48d4fdff470fa8a94ab8271da47e"}, + {file = "black-23.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7231670266ca5191a76cb838185d9be59cfa4f5dd401b7c1c70b993c58f6b1b5"}, + {file = "black-23.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:193946e634e80bfb3aec41830f5d7431f8dd5b20d11d89be14b84a97c6b8bc75"}, + {file = "black-23.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcf91b01ddd91a2fed9a8006d7baa94ccefe7e518556470cf40213bd3d44bbbc"}, + {file = "black-23.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:996650a89fe5892714ea4ea87bc45e41a59a1e01675c42c433a35b490e5aa3f0"}, + {file = "black-23.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdbff34c487239a63d86db0c9385b27cdd68b1bfa4e706aa74bb94a435403672"}, + {file = "black-23.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:97af22278043a6a1272daca10a6f4d36c04dfa77e61cbaaf4482e08f3640e9f0"}, + {file = "black-23.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ead25c273adfad1095a8ad32afdb8304933efba56e3c1d31b0fee4143a1e424a"}, + {file = "black-23.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c71048345bdbced456cddf1622832276d98a710196b842407840ae8055ade6ee"}, + {file = "black-23.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a832b6e00eef2c13b3239d514ea3b7d5cc3eaa03d0474eedcbbda59441ba5d"}, + {file = "black-23.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:6a82a711d13e61840fb11a6dfecc7287f2424f1ca34765e70c909a35ffa7fb95"}, + {file = "black-23.12.0-py3-none-any.whl", hash = "sha256:a7c07db8200b5315dc07e331dda4d889a56f6bf4db6a9c2a526fa3166a81614f"}, + {file = "black-23.12.0.tar.gz", hash = "sha256:330a327b422aca0634ecd115985c1c7fd7bdb5b5a2ef8aa9888a82e2ebe9437a"}, ] [package.dependencies] @@ -135,7 +139,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -150,6 +154,17 @@ files = [ {file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, ] +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] + [[package]] name = "cffi" version = "1.16.0" @@ -214,6 +229,105 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + [[package]] name = "click" version = "8.1.7" @@ -375,12 +489,68 @@ python-dateutil = ">=2.7" [[package]] name = "greenlet" -version = "3.0.2" +version = "3.0.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.2.tar.gz", hash = "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc"}, + {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, ] [package.extras] @@ -398,6 +568,17 @@ files = [ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + [[package]] name = "importlib-metadata" version = "7.0.0" @@ -430,20 +611,17 @@ files = [ [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "itsdangerous" @@ -688,13 +866,13 @@ astropy = ["astropy (>=6.0.0,<7.0.0)"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] @@ -712,6 +890,26 @@ files = [ docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +[[package]] +name = "playwright" +version = "1.40.0" +description = "A high-level API to automate web browsers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "playwright-1.40.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:35b7e0b389df2aa632f3614d35be7bace35f6f634d880db44b035c83e4481312"}, + {file = "playwright-1.40.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:382a7465cc0ea3bf7fa66716bd37fd53f66af4bcc5c72283a8eff3f6e87758a8"}, + {file = "playwright-1.40.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f11e1ec32f3b3dbd7f24d1481c313cb527001955004ee88a73f9b4a610d0db28"}, + {file = "playwright-1.40.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:6a842dca4dd53feda1d7bd0e14aa65140e4e816452ebddd307e90cad184d92bd"}, + {file = "playwright-1.40.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ec3746de69e7ba912b70e0fe3a3c6b8af97f21ece793c5db27c251da4d2f3e6"}, + {file = "playwright-1.40.0-py3-none-win32.whl", hash = "sha256:3ae90ea5ad776fe5e1300a9c730244c8e57a183c6eb261044418710d51ae03c0"}, + {file = "playwright-1.40.0-py3-none-win_amd64.whl", hash = "sha256:ba5a89953aedb158025e4581eafb6fdeebb3d58acd9ce24b59f691b1e2a861bc"}, +] + +[package.dependencies] +greenlet = "3.0.1" +pyee = "11.0.1" + [[package]] name = "pluggy" version = "1.3.0" @@ -749,6 +947,23 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] +[[package]] +name = "pyee" +version = "11.0.1" +description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyee-11.0.1-py3-none-any.whl", hash = "sha256:9bcc9647822234f42c228d88de63d0f9ffa881e87a87f9d36ddf5211f6ac977d"}, + {file = "pyee-11.0.1.tar.gz", hash = "sha256:a642c51e3885a33ead087286e35212783a4e9b8d6514a10a5db4e57ac57b2b29"}, +] + +[package.dependencies] +typing-extensions = "*" + +[package.extras] +dev = ["black", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] + [[package]] name = "pyerfa" version = "2.0.1.1" @@ -789,13 +1004,13 @@ files = [ [[package]] name = "pylint" -version = "3.0.2" +version = "3.0.3" description = "python code static checker" optional = false python-versions = ">=3.8.0" files = [ - {file = "pylint-3.0.2-py3-none-any.whl", hash = "sha256:60ed5f3a9ff8b61839ff0348b3624ceeb9e6c2a92c514d81c9cc273da3b6bcda"}, - {file = "pylint-3.0.2.tar.gz", hash = "sha256:0d4c286ef6d2f66c8bfb527a7f8a629009e42c99707dec821a03e1b51a4c1496"}, + {file = "pylint-3.0.3-py3-none-any.whl", hash = "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810"}, + {file = "pylint-3.0.3.tar.gz", hash = "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b"}, ] [package.dependencies] @@ -806,7 +1021,7 @@ dill = [ {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] -isort = ">=4.2.5,<6" +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -839,6 +1054,38 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-base-url" +version = "2.0.0" +description = "pytest plugin for URL based testing" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pytest-base-url-2.0.0.tar.gz", hash = "sha256:e1e88a4fd221941572ccdcf3bf6c051392d2f8b6cef3e0bc7da95abec4b5346e"}, + {file = "pytest_base_url-2.0.0-py3-none-any.whl", hash = "sha256:ed36fd632c32af9f1c08f2c2835dcf42ca8fcd097d6ed44a09f253d365ad8297"}, +] + +[package.dependencies] +pytest = ">=3.0.0,<8.0.0" +requests = ">=2.9" + +[[package]] +name = "pytest-playwright" +version = "0.4.3" +description = "A pytest wrapper with fixtures for Playwright to automate web browsers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-playwright-0.4.3.tar.gz", hash = "sha256:699e2c47fbb1e6a57895454693eba278cf55d04d44c15017709b00e1de1d9ccd"}, + {file = "pytest_playwright-0.4.3-py3-none-any.whl", hash = "sha256:c9ff6e7ebfd967b562f5c3d67f1ae6b45a061d6ea51ad304fdd95aca9db20774"}, +] + +[package.dependencies] +playwright = ">=1.18" +pytest = ">=6.2.4,<8.0.0" +pytest-base-url = ">=1.0.0,<3.0.0" +python-slugify = ">=6.0.0,<9.0.0" + [[package]] name = "python-dateutil" version = "2.8.2" @@ -872,6 +1119,23 @@ asyncio-client = ["aiohttp (>=3.4)"] client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] docs = ["sphinx"] +[[package]] +name = "python-slugify" +version = "8.0.1" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, + {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + [[package]] name = "python-socketio" version = "5.10.0" @@ -951,6 +1215,27 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + [[package]] name = "simple-websocket" version = "1.0.0" @@ -1066,6 +1351,17 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3-binary"] +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -1090,15 +1386,31 @@ files = [ [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] +[[package]] +name = "urllib3" +version = "2.1.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "watchdog" version = "3.0.0" @@ -1248,4 +1560,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "41997fbef387ff2416a24e005a3abf9c902c62ca1449eb6d336adce92df2c113" +content-hash = "0c769f73e8811fcdbd1b2e06661d5afe780aec2093ad0bab24e47e0a222b2058" diff --git a/pyproject.toml b/pyproject.toml index 7fcdd30..f66f6b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ flake8 = "^6.1.0" pylint = "^3.0.2" black = "^23.11.0" pytest = "^7.4.3" +pytest-playwright = "^0.4.3" freezegun = "1.2.2" sqlalchemy = "^2.0.23" astropy = "^6.0.0" @@ -37,5 +38,6 @@ paramview = "paramview._cli:main" strict = true [tool.pytest.ini_options] -addopts = ["--import-mode=importlib"] +addopts = ["--import-mode=importlib", "--tracing=retain-on-failure"] +base_url = "http://127.0.0.1:5051" filterwarnings = ["ignore::DeprecationWarning:eventlet.support.greenlets"] diff --git a/src/components/Header/CommitSelect.tsx b/src/components/Header/CommitSelect.tsx index 7ab95d8..75c6722 100644 --- a/src/components/Header/CommitSelect.tsx +++ b/src/components/Header/CommitSelect.tsx @@ -201,11 +201,7 @@ function CommitSelectContents() { /** Controls that affect the entire dashboard. */ export default function CommitSelect() { return ( - - } - > + }> ); diff --git a/src/components/Header/CommitSelectList.tsx b/src/components/Header/CommitSelectList.tsx index 4e474b4..c2d18ed 100644 --- a/src/components/Header/CommitSelectList.tsx +++ b/src/components/Header/CommitSelectList.tsx @@ -53,16 +53,16 @@ const OuterElementContext = createContext({}); const CommitSelectOuterElement = forwardRef( function CommitSelectOuterElement(props, ref) { const outerProps = useContext(OuterElementContext); - return ; + return ( + + ); }, ); /** Custom innerElementType passed to React window. */ const CommitSelectInnerElement = forwardRef( function CommitSelectInnerElement(props, ref) { - return ( - - ); + return ; }, ); diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 8462016..e203d50 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -43,7 +43,7 @@ export default function Header() { - }> + }> diff --git a/src/components/ParamSection/CommitDialog/ComparisonList.tsx b/src/components/ParamSection/CommitDialog/ComparisonList.tsx index 586e082..ae98812 100644 --- a/src/components/ParamSection/CommitDialog/ComparisonList.tsx +++ b/src/components/ParamSection/CommitDialog/ComparisonList.tsx @@ -192,15 +192,15 @@ export default function ComparisonList({ shouldUpdate }: ComparisonListProps) { return ( - {dataDiff === null ? ( - {`No changes from ${latestCommitDescription}`} - ) : ( - <> - {`Changes from ${latestCommitDescription}`} - - - - + + {dataDiff === null + ? `No changes from ${latestCommitDescription}` + : `Changes from ${latestCommitDescription}`} + + {dataDiff !== null && ( + + + )} ); diff --git a/src/components/ParamSection/LeafItemContent.tsx b/src/components/ParamSection/LeafItemContent.tsx index a479fdd..ab8e264 100644 --- a/src/components/ParamSection/LeafItemContent.tsx +++ b/src/components/ParamSection/LeafItemContent.tsx @@ -172,10 +172,10 @@ function LeafItemEditModeContent({ editedLeaf, path }: LeafItemEditModeContentPr color={changedInput ? "success" : undefined} onChange={({ target: { value } }) => setInput(value)} > - + True - + False diff --git a/src/components/ParamSection/ParamList.tsx b/src/components/ParamSection/ParamList.tsx index 9a4af8a..b402f30 100644 --- a/src/components/ParamSection/ParamList.tsx +++ b/src/components/ParamSection/ParamList.tsx @@ -86,8 +86,8 @@ function ParamListItem({ path }: ParamListItemProps) { /** List of parameter data. */ export default function ParamList() { return ( - }> - + }> + diff --git a/src/components/ParamSection/ParamSection.tsx b/src/components/ParamSection/ParamSection.tsx index 52905e1..b53a047 100644 --- a/src/components/ParamSection/ParamSection.tsx +++ b/src/components/ParamSection/ParamSection.tsx @@ -30,9 +30,7 @@ export default function ParamSection() { return ( - - Parameters - + Parameters diff --git a/tests/e2e/__init__.py b/tests/e2e/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/e2e/conftest.py b/tests/e2e/conftest.py new file mode 100644 index 0000000..5dda24e --- /dev/null +++ b/tests/e2e/conftest.py @@ -0,0 +1,27 @@ +""" +Global fixtures for E2E tests. + +Called automatically by Pytest before running tests. +""" + +from __future__ import annotations +import pytest +from playwright.sync_api import Page, Dialog +from tests.e2e.helpers import CaptureDialogs + + +@pytest.fixture(name="capture_dialogs") +def fixture_capture_dialogs(page: Page) -> CaptureDialogs: + """Capture dialogs and expose a an object with settings and captured values.""" + capture_dialogs = CaptureDialogs() + + def handle_dialog(dialog: Dialog) -> None: + capture_dialogs.num_dialogs += 1 + capture_dialogs.last_dialog_message = dialog.message + if capture_dialogs.accept: + dialog.accept() + else: + dialog.dismiss() + + page.on("dialog", handle_dialog) + return capture_dialogs diff --git a/tests/e2e/helpers.py b/tests/e2e/helpers.py new file mode 100644 index 0000000..ffe1c7b --- /dev/null +++ b/tests/e2e/helpers.py @@ -0,0 +1,143 @@ +"""Helper functions for E2E tests.""" + +from __future__ import annotations +from typing import Any +import os +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone +from sqlalchemy import delete +from freezegun import freeze_time +import astropy.units as u # type: ignore +from paramdb import ParamDB, Param, Struct, ParamList, ParamDict +from paramdb._database import _Snapshot + + +_START_DATETIME = datetime(2023, 1, 1, tzinfo=timezone.utc).astimezone() +DB_NAME = "param.db" +DB_PATH = os.path.join(os.path.dirname(__file__), DB_NAME) +_DB = ParamDB[Any](DB_PATH) + + +class CustomParam(Param): + """Custom parameter.""" + + int: int + str: str + + +class CustomStruct(Struct): + """Custom parameter structure.""" + + int: int + str: str + param: CustomParam + + +def get_datetime(commit_id: int) -> datetime: + """Get the datetime corresponding to the given commit ID.""" + return _START_DATETIME + timedelta(days=commit_id - 1) + + +def get_datetime_input(commit_id: int) -> str: + """ + Get the datetime corresponding to the given commit ID in the format of HTML + datetime-local input. + """ + return get_datetime(commit_id).astimezone().strftime("%Y-%m-%dT%H:%M") + + +def get_datetime_display(commit_id: int) -> str: + """ + Get the datetime corresponding to the given commit ID in the format dates are + displayed in the app. + """ + return get_datetime(commit_id).astimezone().strftime("%m/%d/%y, %I:%M:%S %p") + + +def get_commit_message(commit_id: int, message: str | None = None) -> str: + """Get the commit message corresponding to the given commit ID.""" + if message is not None: + return message + if commit_id == 1: + return "Initial commit" + return f"Commit {commit_id}" + + +def get_commit_message_display(commit_id: int, message: str | None = None) -> str: + """Get the commit message as displayed in the app.""" + return f"{commit_id}: {get_commit_message(commit_id, message)}" + + +def clear_db() -> None: + """Clear the database.""" + with _DB._Session.begin() as session: # pylint: disable=no-member,protected-access + session.execute(delete(_Snapshot)) # Clear all commits + + +def commit_to_db(data: Any | None = None, message: str | None = None) -> None: + """Make a commit with the given message.""" + num_commits = _DB.num_commits + commit_id = num_commits + 1 + data = ParamDict(commit_id=commit_id, b=2, c=3) if data is None else data + with freeze_time(get_datetime(num_commits + 1)): + _DB.commit(get_commit_message(commit_id, message), data) + + +def reset_db(num_commits: int = 1) -> None: + """Clear the database and make some initial commits.""" + clear_db() + with freeze_time(_START_DATETIME): + param = CustomParam(int=123, str="test") + # Use real datetime for last updated (rather than freezegun.api.FakeDatetime) + setattr(param, "_Param__last_updated", _START_DATETIME) + initial_data = ParamDict( + { + "commit_id": 1, + "int": 123, + "float": 1.2345, + "bool": True, + "str": "test", + "None": None, + "datetime": get_datetime(1), + "Quantity": 1.2345 * u.m, + "list": [123, "test"], + "dict": {"int": 123, "str": "test"}, + "paramList": ParamList([123, "test"]), + "paramDict": ParamDict(int=123, str="test"), + "struct": CustomStruct(int=123, str="test", param=param), + "param": param, + } + ) + commit_to_db(initial_data) + for _ in range(2, num_commits + 1): + commit_to_db() + + +def load_classes_from_db() -> None: + """ + Load the last commit as Python classes. This helps to test that objects are + formatted properly, in particular datetime and Quantity objects. + """ + _DB.load() + + +@dataclass +class CaptureDialogs: + """Settings and captured values exposed by the ``capture_dialogs`` fixture.""" + + accept: bool = False + """Whether to accept subsequent dialogs (default is ``False``).""" + num_dialogs: int = 0 + """Number of dialogs captured in the current test.""" + last_dialog_message: str | None = None + """Message of the last dialog message captured.""" + + +# pylint: disable-next=too-few-public-methods +class CommitInfo: + """Information for a given commit.""" + + def __init__(self, commit_id: int, message: str | None = None) -> None: + self.id = commit_id + self.date = get_datetime_display(commit_id) + self.message = get_commit_message_display(commit_id, message) diff --git a/tests/e2e/start_server.py b/tests/e2e/start_server.py new file mode 100644 index 0000000..185ddbc --- /dev/null +++ b/tests/e2e/start_server.py @@ -0,0 +1,8 @@ +"""Script to reset the database and start the server for E2E testing.""" + +from paramview import start_server +from tests.e2e.helpers import DB_PATH, reset_db + +if __name__ == "__main__": + reset_db() + start_server(DB_PATH, default_port=5051, open_window=False) diff --git a/tests/e2e/test_commit_dialog.py b/tests/e2e/test_commit_dialog.py new file mode 100644 index 0000000..b0ebb97 --- /dev/null +++ b/tests/e2e/test_commit_dialog.py @@ -0,0 +1,145 @@ +"""Tests for the commit dialog.""" + +import pytest +from playwright.sync_api import Page, expect +from tests.e2e.helpers import ( + CommitInfo, + reset_db, + load_classes_from_db, + get_datetime_input, +) + +NEW_COMMIT_MESSAGE = "New commit" +FIRST_COMMIT = CommitInfo(1) +NEW_COMMIT = CommitInfo(2, NEW_COMMIT_MESSAGE) + + +@pytest.fixture(autouse=True) +def setup(page: Page) -> None: + """Automatically run before each test in this module.""" + reset_db() + page.goto("/") + page.get_by_test_id("edit-button").click() + + +def test_refuses_to_commit_with_no_message(page: Page) -> None: + """Refuses to make a commit if there is no message.""" + commit_message = page.get_by_test_id("commit-message-text-field") + commit_message_input = commit_message.get_by_role("textbox") + + # Attempt to make a commit + page.get_by_test_id("open-commit-dialog-button").click() + page.get_by_test_id("make-commit-button").click() + + # Message field exists and is enabled, meaning a commit was not made + expect(commit_message_input).to_be_enabled() + + +def test_reopen_resets_commit_message(page: Page) -> None: + """Commit message resets when the commit dialog is reopened.""" + open_commit_dialog_button = page.get_by_test_id("open-commit-dialog-button") + commit_message = page.get_by_test_id("commit-message-text-field") + commit_message_input = commit_message.get_by_role("textbox") + + # Open commit dialog and type a new commit + open_commit_dialog_button.click() + commit_message_input.fill(NEW_COMMIT_MESSAGE) + expect(commit_message_input).to_have_value(NEW_COMMIT_MESSAGE) + + # Close commit dialog + page.get_by_test_id("close-commit-dialog-button").click() + + # When commit dialog is reopened, commit message is empty + open_commit_dialog_button.click() + expect(commit_message_input).to_have_value("") + + +# pylint: disable-next=too-many-locals +def test_make_commit(page: Page) -> None: + """Can edit data and make a commit.""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + commit_message = page.get_by_test_id("commit-message-text-field") + commit_message_input = commit_message.get_by_role("textbox") + + int_item = page.get_by_test_id("parameter-list-item-int") + int_item_input = int_item.get_by_test_id("leaf-input").get_by_role("textbox") + int_old_item = page.get_by_test_id("comparison-list-item-old-int") + int_new_item = page.get_by_test_id("comparison-list-item-new-int") + + float_item = page.get_by_test_id("parameter-list-item-float") + float_item_input = float_item.get_by_test_id("leaf-input").get_by_role("textbox") + float_old_item = page.get_by_test_id("comparison-list-item-old-float") + float_new_item = page.get_by_test_id("comparison-list-item-new-float") + + str_item = page.get_by_test_id("parameter-list-item-str") + str_item_input = str_item.get_by_test_id("leaf-input").get_by_role("textbox") + str_old_item = page.get_by_test_id("comparison-list-item-old-str") + str_new_item = page.get_by_test_id("comparison-list-item-new-str") + + # Initial values + expect(int_item_input).to_have_value("123") + expect(float_item_input).to_have_value("1.2345") + expect(str_item_input).to_have_value("test") + + # Edit parameter values + int_item_input.fill("456") + float_item_input.fill("5.6789") + + # Opem commit dialog + page.get_by_test_id("open-commit-dialog-button").click() + + # Commit list reflects what was changed + expect(page.get_by_test_id("commit-changes-message")).to_have_text( + f"Changes from latest commit ({FIRST_COMMIT.message})" + ) + expect(int_old_item).to_have_text("int123") + expect(int_new_item).to_have_text("int456") + expect(float_old_item).to_have_text("float1.2345") + expect(float_new_item).to_have_text("float5.6789") + expect(str_old_item).not_to_be_attached() + expect(str_new_item).not_to_be_attached() + + # Enter message and make commit + commit_message_input.fill(NEW_COMMIT_MESSAGE) + commit_message_input.press("Enter") + expect(commit_select_combobox_input).to_have_value(NEW_COMMIT.message) + + # Values were updated + expect(int_item).to_have_text("int456") + expect(float_item).to_have_text("float5.679") + expect(str_item).to_have_text("strtest") + + +def test_commit_backend_format(page: Page) -> None: + """ + Commits to the backend in the correct format for datetime and Quantity and (i.e. the + format that allows them to be read by Python). + """ + commit_message = page.get_by_test_id("commit-message-text-field") + commit_message_input = commit_message.get_by_role("textbox") + + datetime_item = page.get_by_test_id("parameter-list-item-datetime") + datetime_item_input = datetime_item.get_by_test_id("leaf-input").locator( + "input[type=datetime-local]" + ) + quantity_item = page.get_by_test_id("parameter-list-item-Quantity") + quantity_item_input = quantity_item.get_by_test_id("leaf-input").get_by_role( + "textbox" + ) + quantity_item_unit_input = quantity_item.get_by_test_id( + "leaf-unit-input" + ).get_by_role("textbox") + + # Update datetime and quantity + datetime_item_input.fill(get_datetime_input(2)) + quantity_item_input.fill("5.6789") + quantity_item_unit_input.fill("GHz") + + # Make commit + page.get_by_test_id("open-commit-dialog-button").click() + commit_message_input.fill(NEW_COMMIT_MESSAGE) + commit_message_input.press("Enter") + + # Load classes in the backend (test fails if this fails) + load_classes_from_db() diff --git a/tests/e2e/test_commit_selection.py b/tests/e2e/test_commit_selection.py new file mode 100644 index 0000000..f2984d3 --- /dev/null +++ b/tests/e2e/test_commit_selection.py @@ -0,0 +1,228 @@ +"""Tests for commit selection.""" + +import pytest +from playwright.sync_api import Page, expect +from tests.e2e.helpers import CommitInfo, reset_db, commit_to_db + +NUM_COMMITS = 3 +FIRST_COMMIT = CommitInfo(1) +LATEST_COMMIT = CommitInfo(NUM_COMMITS) + + +@pytest.fixture(autouse=True) +def setup(page: Page) -> None: + """Automatically run before each test in this module.""" + reset_db(NUM_COMMITS) + page.goto("/") + + +def test_commit_select_inputs(page: Page) -> None: + """Displays the latest commit, latest is checked, and inputs are not disabled.""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + latest_checkbox = page.get_by_test_id("latest-checkbox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(latest_checkbox).to_be_checked() + expect(commit_id_item).to_have_text(f"commit_id{LATEST_COMMIT.id}") + + +def test_commit_search(page: Page) -> None: + """Searches for the initial commit and switches to it.""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + commit_select_listbox = page.get_by_test_id("commit-select-listbox") + commit_select_option = commit_select_listbox.get_by_test_id( + f"commit-select-option-{FIRST_COMMIT.id}" + ) + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + + # Search for first commit + commit_select_combobox_input.fill(FIRST_COMMIT.message[:8]) + expect(commit_select_listbox).to_be_attached() + expect(commit_select_option).to_contain_text( + FIRST_COMMIT.message + FIRST_COMMIT.date + ) + + # Select the first commit + commit_select_combobox_input.press("Enter") + expect(commit_select_listbox).not_to_be_attached() + expect(commit_select_combobox).to_contain_text(FIRST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(FIRST_COMMIT.message) + expect(commit_id_item).to_have_text(f"commit_id{FIRST_COMMIT.id}") + + +def test_latest_checkbox(page: Page) -> None: + """Switches to latest commit when latest checkbox is checked.""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + latest_checkbox = page.get_by_test_id("latest-checkbox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + + # Switch to first commit + commit_select_combobox_input.fill(FIRST_COMMIT.message[:8]) + commit_select_combobox_input.press("Enter") + expect(latest_checkbox).not_to_be_checked() + + # Check the latest checkbox + latest_checkbox.click() + expect(latest_checkbox).to_be_checked() + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(commit_id_item).to_have_text(f"commit_id{LATEST_COMMIT.id}") + + +def test_commit_list_virtualization(page: Page) -> None: + """Uses virtualization for long commit lists.""" + num_commits = 100 + latest_commit = CommitInfo(num_commits) + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_listbox = page.get_by_test_id("commit-select-listbox") + + # Reset to a long list of commits + reset_db(num_commits) + + # Commit list contains latest commit, but not the first (due to virtualization) + commit_select_combobox.click() + expect(commit_select_listbox).to_contain_text(latest_commit.message) + expect(commit_select_listbox).not_to_contain_text(FIRST_COMMIT.message) + + # After scrolling, the commit list contains the first commit, but not the latest + commit_select_listbox.evaluate("(elem) => elem.scrollTo(0, elem.scrollHeight)") + expect(commit_select_listbox).not_to_contain_text(latest_commit.message) + expect(commit_select_listbox).to_contain_text(FIRST_COMMIT.message) + + +def test_latest_checked_updates(page: Page) -> None: + """Updates to latest commit when the latest checkbox is checked.""" + latest_commit = CommitInfo(NUM_COMMITS + 1) + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + + # Commit select contains original latest commit + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(commit_id_item).to_have_text(f"commit_id{LATEST_COMMIT.id}") + + commit_to_db() + + # Commit select contains the new latest commit + expect(commit_select_combobox).to_contain_text(latest_commit.date) + expect(commit_select_combobox_input).to_have_value(latest_commit.message) + expect(commit_id_item).to_have_text(f"commit_id{latest_commit.id}") + + +def test_latest_unchecked_does_not_update(page: Page) -> None: + """Does not update to latest commit when the latest checkbox is unchecked.""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + + page.get_by_test_id("latest-checkbox").click() + commit_to_db() + + # Commit select contains original latest commit + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(commit_id_item).to_have_text(f"commit_id{LATEST_COMMIT.id}") + + +def test_edit_mode_commit_select_inputs_disabled(page: Page) -> None: + """Commit select inputs are disabled in edit mode.""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + latest_checkbox = page.get_by_test_id("latest-checkbox") + + # Inputs are originally enabled + expect(commit_select_combobox_input).to_be_enabled() + expect(latest_checkbox).to_be_enabled() + + # In edit mode, inputs are disabled + page.get_by_test_id("edit-button").click() + expect(commit_select_combobox_input).to_be_disabled() + expect(latest_checkbox).to_be_disabled() + + # Out of edit mode, inputs are enabled again + page.get_by_test_id("cancel-edit-button").click() + expect(commit_select_combobox_input).to_be_enabled() + expect(latest_checkbox).to_be_enabled() + + +def test_change_commit_after_exiting_edit_mode(page: Page) -> None: + """Can change commit after entering and exiting edit mode (previous bug).""" + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + + page.get_by_test_id("edit-button").click() + page.get_by_test_id("cancel-edit-button").click() + + # Switch to first commit + commit_select_combobox_input.fill(FIRST_COMMIT.message[:8]) + commit_select_combobox_input.press("Enter") + expect(commit_select_combobox).to_contain_text(FIRST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(FIRST_COMMIT.message) + expect(commit_id_item).to_have_text(f"commit_id{FIRST_COMMIT.id}") + + +def test_edit_mode_latest_checked(page: Page) -> None: + """ + When latest is checked, it is unchecked it edit mode, and rechecked when edit mode + is exited. + """ + latest_commit = CommitInfo(NUM_COMMITS + 1) + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + latest_checkbox = page.get_by_test_id("latest-checkbox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + commit_id_input = commit_id_item.get_by_test_id("leaf-input").get_by_role("textbox") + + # In edit mode, latest checkbox is unchecked + page.get_by_test_id("edit-button").click() + expect(latest_checkbox).not_to_be_checked() + + # Current commit does not update + commit_to_db() + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(commit_id_input).to_have_value(f"{LATEST_COMMIT.id}") + + # Out of edit mode, latest checkbox is checked and current commit updates + page.get_by_test_id("cancel-edit-button").click() + expect(latest_checkbox).to_be_checked() + expect(commit_select_combobox).to_contain_text(latest_commit.date) + expect(commit_select_combobox_input).to_have_value(latest_commit.message) + expect(commit_id_item).to_have_text(f"commit_id{latest_commit.id}") + + +def test_edit_mode_latest_unchecked(page: Page) -> None: + """ + When latest is unchecked, it is unchecked it edit mode, and still unchecked when + edit mode is exited. + """ + commit_select_combobox = page.get_by_test_id("commit-select-combobox") + commit_select_combobox_input = commit_select_combobox.get_by_role("combobox") + latest_checkbox = page.get_by_test_id("latest-checkbox") + commit_id_item = page.get_by_test_id("parameter-list-item-commit_id") + commit_id_input = commit_id_item.get_by_test_id("leaf-input").get_by_role("textbox") + + # In edit mode, latest checkbox is unchecked + latest_checkbox.click() + page.get_by_test_id("edit-button").click() + expect(latest_checkbox).not_to_be_checked() + + # Current commit does not update + commit_to_db() + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(commit_id_input).to_have_value(f"{LATEST_COMMIT.id}") + + # Out of edit mode, latest checkbox is checked and current commit updates + page.get_by_test_id("cancel-edit-button").click() + expect(latest_checkbox).not_to_be_checked() + expect(commit_select_combobox).to_contain_text(LATEST_COMMIT.date) + expect(commit_select_combobox_input).to_have_value(LATEST_COMMIT.message) + expect(commit_id_item).to_have_text(f"commit_id{LATEST_COMMIT.id}") diff --git a/tests/e2e/test_database_name.py b/tests/e2e/test_database_name.py new file mode 100644 index 0000000..b966abf --- /dev/null +++ b/tests/e2e/test_database_name.py @@ -0,0 +1,22 @@ +"""Tests for the page title.""" + +import pytest +from playwright.sync_api import Page, expect +from tests.e2e.helpers import DB_NAME, reset_db + + +@pytest.fixture(autouse=True) +def setup(page: Page) -> None: + """Automatically run before each test in this module.""" + reset_db() + page.goto("/") + + +def test_page_title(page: Page) -> None: + """Page title is the database file name.""" + expect(page).to_have_title(DB_NAME) + + +def test_database_name(page: Page) -> None: + """Database name header is the database file name.""" + expect(page.get_by_test_id("database-name")).to_have_text(DB_NAME) diff --git a/tests/e2e/test_error.py b/tests/e2e/test_error.py new file mode 100644 index 0000000..485d8f1 --- /dev/null +++ b/tests/e2e/test_error.py @@ -0,0 +1,38 @@ +"""Tests for parameter editing.""" + +from __future__ import annotations +import pytest +from playwright.sync_api import Page, expect +from tests.e2e.helpers import DB_NAME, clear_db + + +@pytest.fixture(autouse=True) +def setup(page: Page) -> None: + """Automatically run before each test in this module.""" + clear_db() + page.goto("/") + + +def test_error_title(page: Page) -> None: + """Page title is "Error".""" + expect(page).to_have_title("Error") + + +def test_error_alert(page: Page) -> None: + """Displays an alert with the error message.""" + alert_title = page.get_by_test_id("alert-title") + error_message = page.get_by_test_id("error-message") + reload_button = page.get_by_test_id("reload-button") + + expect(alert_title).to_have_text("Error") + expect(error_message).to_have_text(f"Database {DB_NAME} has no commits.") + expect(reload_button).to_have_text("Reload") + + +def test_reload_button(page: Page) -> None: + """Page reloads with the reload button is clicked.""" + page.get_by_test_id("reload-button").click() + last_navigation_type = page.evaluate_handle( + "window.performance.getEntriesByType('navigation')[0].type" + ) + assert last_navigation_type.json_value() == "reload" diff --git a/tests/e2e/test_parameter_editing.py b/tests/e2e/test_parameter_editing.py new file mode 100644 index 0000000..fcd0b45 --- /dev/null +++ b/tests/e2e/test_parameter_editing.py @@ -0,0 +1,365 @@ +"""Tests for parameter editing.""" + +import pytest +from playwright.sync_api import Page, expect +from tests.e2e.helpers import CaptureDialogs, reset_db, get_datetime_input + + +@pytest.fixture(autouse=True) +def setup(page: Page) -> None: + """Automatically run before each test in this module.""" + reset_db() + page.goto("/") + page.get_by_test_id("edit-button").click() + + +def test_input_int(page: Page) -> None: + """ + Input for int parameters has the correct initial values can be edited and reset, and + is properly validated. + """ + item = page.get_by_test_id("parameter-list-item-int") + leaf_input = item.get_by_test_id("leaf-input").get_by_role("textbox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_value("123") + expect(leaf_input).to_have_attribute("aria-invalid", "false") + expect(item.get_by_test_id("leaf-unit-input")).not_to_be_attached() + expect(leaf_type_input).to_have_text("int/float") + + # Fill with invalid input + leaf_input.fill("123a") + expect(leaf_input).to_have_attribute("aria-invalid", "true") + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_value("123") + expect(leaf_input).to_have_attribute("aria-invalid", "false") + + +def test_input_float(page: Page) -> None: + """ + Input for float parameters has the correct initial values can be edited and reset, + and is properly validated. + """ + item = page.get_by_test_id("parameter-list-item-float") + leaf_input = item.get_by_test_id("leaf-input").get_by_role("textbox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_value("1.2345") + expect(leaf_input).to_have_attribute("aria-invalid", "false") + expect(item.get_by_test_id("leaf-unit-input")).not_to_be_attached() + expect(leaf_type_input).to_have_text("int/float") + + # Fill with invalid input + leaf_input.fill("1.2345a") + expect(leaf_input).to_have_attribute("aria-invalid", "true") + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_value("1.2345") + expect(leaf_input).to_have_attribute("aria-invalid", "false") + + +def test_input_bool(page: Page) -> None: + """ + Input for bool parameters has the correct initial values can be edited and reset. + """ + item = page.get_by_test_id("parameter-list-item-bool") + leaf_input = item.get_by_test_id("leaf-input").get_by_role("combobox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_text("True") + expect(item.get_by_test_id("leaf-unit-input")).not_to_be_attached() + expect(leaf_type_input).to_have_text("bool") + + # Change value to False + leaf_input.click() + page.get_by_test_id("bool-input-option-False").click() + expect(leaf_input).to_have_text("False") + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_text("True") + + +def test_input_str(page: Page) -> None: + """ + Input for str parameters has the correct initial values can be edited and reset. + """ + item = page.get_by_test_id("parameter-list-item-str") + leaf_input = item.get_by_test_id("leaf-input").get_by_role("textbox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_value("test") + expect(item.get_by_test_id("leaf-unit-input")).not_to_be_attached() + expect(leaf_type_input).to_have_text("str") + + # Change value + leaf_input.fill("testa") + expect(leaf_input).to_have_value("testa") + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_value("test") + + +def test_input_none(page: Page) -> None: + """ + Input for None parameters has the correct initial values can be edited and reset. + """ + item = page.get_by_test_id("parameter-list-item-None") + leaf_input = item.get_by_test_id("leaf-input").get_by_role("textbox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_value("None") + expect(leaf_input).to_be_disabled() + expect(item.get_by_test_id("leaf-unit-input")).not_to_be_attached() + expect(leaf_type_input).to_have_text("None") + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_value("None") + expect(leaf_input).to_be_disabled() + + +def test_input_datetime(page: Page) -> None: + """ + Input for datetime parameters has the correct initial values can be edited and + reset. + """ + datetime_input_value = get_datetime_input(1) + new_datetime_input_value = get_datetime_input(2) + item = page.get_by_test_id("parameter-list-item-datetime") + leaf_input = item.get_by_test_id("leaf-input").locator("input[type=datetime-local]") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_value(datetime_input_value) + expect(item.get_by_test_id("leaf-unit-input")).not_to_be_attached() + expect(leaf_type_input).to_have_text("datetime") + + # Change value + leaf_input.fill(new_datetime_input_value) + expect(leaf_input).to_have_value(new_datetime_input_value) + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_value(datetime_input_value) + + +def test_input_quantity(page: Page) -> None: + """ + Input for Quantity parameters has the correct initial values can be edited and + reset. + """ + item = page.get_by_test_id("parameter-list-item-Quantity") + leaf_input = item.get_by_test_id("leaf-input").get_by_role("textbox") + leaf_unit_input = item.get_by_test_id("leaf-unit-input").get_by_role("textbox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Initial input + expect(leaf_input).to_have_value("1.2345") + expect(leaf_input).to_have_attribute("aria-invalid", "false") + expect(leaf_unit_input).to_have_value("m") + expect(leaf_unit_input).to_have_attribute("aria-invalid", "false") + expect(leaf_type_input).to_have_text("Quantity") + + # Fill number with invalid input + leaf_input.fill("1.2345a") + expect(leaf_input).to_have_attribute("aria-invalid", "true") + + # Fill units with valid input + leaf_unit_input.fill("ms") + expect(leaf_unit_input).to_have_attribute("aria-invalid", "false") + + # Fill units with invalid input + leaf_unit_input.fill("") + expect(leaf_unit_input).to_have_attribute("aria-invalid", "true") + + # Reset + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input).to_have_value("1.2345") + expect(leaf_input).to_have_attribute("aria-invalid", "false") + expect(leaf_unit_input).to_have_value("m") + expect(leaf_unit_input).to_have_attribute("aria-invalid", "false") + + +def test_change_input_type(page: Page) -> None: + """Can change an input to each parameter type.""" + item = page.get_by_test_id("parameter-list-item-int") + leaf_input = item.get_by_test_id("leaf-input") + leaf_input_textbox = leaf_input.get_by_role("textbox") + leaf_input_combobox = leaf_input.get_by_role("combobox") + leaf_input_datetime = leaf_input.locator("input[type=datetime-local]") + leaf_unit_input = item.get_by_test_id("leaf-unit-input").get_by_role("textbox") + leaf_type_input = item.get_by_test_id("leaf-type-input").get_by_role("combobox") + + # Select int/float type + leaf_type_input.click() + page.get_by_test_id("leaf-type-option-int-float").click() + expect(leaf_input_textbox).to_have_value("123") + expect(leaf_input_textbox).to_have_attribute("aria-invalid", "false") + expect(leaf_unit_input).not_to_be_attached() + expect(leaf_type_input).to_have_text("int/float") + + # Select bool type + leaf_type_input.click() + page.get_by_test_id("leaf-type-option-bool").click() + expect(leaf_input_combobox).to_have_text("False") + expect(leaf_unit_input).not_to_be_attached() + expect(leaf_type_input).to_have_text("bool") + + # Select str type + leaf_type_input.click() + page.get_by_test_id("leaf-type-option-str").click() + expect(leaf_input_textbox).to_have_value("False") + expect(leaf_unit_input).not_to_be_attached() + expect(leaf_type_input).to_have_text("str") + + # Select None type + leaf_type_input.click() + page.get_by_test_id("leaf-type-option-None").click() + expect(leaf_input_textbox).to_have_value("None") + expect(leaf_input_textbox).to_be_disabled() + expect(leaf_unit_input).not_to_be_attached() + expect(leaf_type_input).to_have_text("None") + + # Select datetime type + leaf_type_input.click() + page.get_by_test_id("leaf-type-option-datetime").click() + expect(leaf_input_datetime).to_have_value("") + expect(leaf_input_datetime).to_have_attribute("aria-invalid", "true") + expect(leaf_unit_input).not_to_be_attached() + expect(leaf_type_input).to_have_text("datetime") + + # Select Quantity type + leaf_type_input.click() + page.get_by_test_id("leaf-type-option-Quantity").click() + expect(leaf_input_textbox).to_have_value("None") + expect(leaf_input_textbox).to_have_attribute("aria-invalid", "true") + expect(leaf_unit_input).to_have_value("") + expect(leaf_unit_input).to_have_attribute("aria-invalid", "true") + expect(leaf_type_input).to_have_text("Quantity") + + # Reset to original type + item.get_by_test_id("reset-leaf-button").click() + expect(leaf_input_textbox).to_have_value("123") + expect(leaf_input_textbox).to_have_attribute("aria-invalid", "false") + expect(leaf_unit_input).not_to_be_attached() + expect(leaf_type_input).to_have_text("int/float") + + +def test_exit_edit_mode_no_changes(page: Page, capture_dialogs: CaptureDialogs) -> None: + """ + Can exit edit mode or close the page when there are no changes, and there are no + dialogs. + """ + edit_button = page.get_by_test_id("edit-button") + cancel_button = page.get_by_test_id("cancel-edit-button") + + # Exit edit mode + expect(edit_button).not_to_be_attached() + expect(cancel_button).to_be_attached() + cancel_button.click() + expect(edit_button).to_be_attached() + expect(cancel_button).not_to_be_attached() + + # Close the page + page.close(run_before_unload=True) + + assert capture_dialogs.num_dialogs == 0 + + +def test_exit_edit_mode_invalid_changes( + page: Page, capture_dialogs: CaptureDialogs +) -> None: + """ + Can exit edit mode or close the page when there are invalid changes only, and there + are no dialogs. + """ + edit_button = page.get_by_test_id("edit-button") + cancel_button = page.get_by_test_id("cancel-edit-button") + leaf_input = ( + page.get_by_test_id("parameter-list-item-int") + .get_by_test_id("leaf-input") + .get_by_role("textbox") + ) + + # Fill with invalid value, then exit and re-enter edit mode + leaf_input.fill("123a") + cancel_button.click() + edit_button.click() + expect(leaf_input).to_have_value("123") + + # Fill with invalid value and close the page + leaf_input.fill("123a") + page.close(run_before_unload=True) + + assert capture_dialogs.num_dialogs == 0 + + +def test_exit_edit_mode_valid_changes_dismiss( + page: Page, capture_dialogs: CaptureDialogs +) -> None: + """ + When there are valid changes and exit mode is exited or the page is closed, the user + is given a confirmation dialog. If they dismiss this dialog, exit mode is not + exited. + """ + capture_dialogs.accept = False + cancel_button = page.get_by_test_id("cancel-edit-button") + leaf_input = ( + page.get_by_test_id("parameter-list-item-int") + .get_by_test_id("leaf-input") + .get_by_role("textbox") + ) + + # Fill with valid value and attempt to exit edit mode + leaf_input.fill("1234") + cancel_button.click() + expect(leaf_input).to_have_value("1234") + assert capture_dialogs.num_dialogs == 1 + assert ( + capture_dialogs.last_dialog_message + == "You have unsaved changes. Do you want to discard them?" + ) + + # Change to invalid value and attempt to close the page + leaf_input.fill("1234") + page.close(run_before_unload=True) + expect(leaf_input).to_have_value("1234") + assert capture_dialogs.num_dialogs == 2 + + +def test_exit_edit_mode_valid_changes_accept( + page: Page, capture_dialogs: CaptureDialogs +) -> None: + """ + When there are valid changes and exit mode is exited, the user is given a + confirmation dialog. If they accept this dialog, exit mode is exited. + """ + capture_dialogs.accept = True + edit_button = page.get_by_test_id("edit-button") + cancel_button = page.get_by_test_id("cancel-edit-button") + leaf_input = ( + page.get_by_test_id("parameter-list-item-int") + .get_by_test_id("leaf-input") + .get_by_role("textbox") + ) + + # Fill with valid value and exit edit mode + leaf_input.fill("1234") + cancel_button.click() + edit_button.click() + expect(leaf_input).to_have_value("123") + assert capture_dialogs.num_dialogs == 1 + assert ( + capture_dialogs.last_dialog_message + == "You have unsaved changes. Do you want to discard them?" + ) diff --git a/tests/e2e/test_parameter_viewing.py b/tests/e2e/test_parameter_viewing.py new file mode 100644 index 0000000..ceff0ba --- /dev/null +++ b/tests/e2e/test_parameter_viewing.py @@ -0,0 +1,122 @@ +"""Tests for parameter viewing.""" + +import pytest +from playwright.sync_api import Page, expect +from tests.e2e.helpers import reset_db, get_datetime_display + +INITIAL_DATETIME_DISPLAY = get_datetime_display(1) + + +@pytest.fixture(autouse=True) +def setup(page: Page) -> None: + """Automatically run before each test in this module.""" + reset_db() + page.goto("/") + + +def test_displays_params(page: Page) -> None: + """Displays each type of parameter.""" + for test_id, expected_text in [ + ("parameter-list-item-int", "int123"), + ("parameter-list-item-float", "float1.234"), # Rounded + ("parameter-list-item-bool", "boolTrue"), + ("parameter-list-item-str", "strtest"), + ("parameter-list-item-None", "NoneNone"), + ("parameter-list-item-datetime", f"datetime{INITIAL_DATETIME_DISPLAY}"), + ("parameter-list-item-Quantity", "Quantity1.234 m"), # Rounded + ("parameter-list-item-list", "listlist"), + ("parameter-list-item-dict", "dictdict"), + ("parameter-list-item-paramList", "paramListParamList"), + ("parameter-list-item-paramDict", "paramDictParamDict"), + ( + "parameter-list-item-struct", + f"structCustomStruct (Struct){INITIAL_DATETIME_DISPLAY}", + ), + ( + "parameter-list-item-param", + f"paramCustomParam (Param){INITIAL_DATETIME_DISPLAY}", + ), + ]: + expect(page.get_by_test_id(test_id)).to_have_text(expected_text) + + +def test_round_switch(page: Page) -> None: + """Rounds numerical parameters only when round switch is checked.""" + round_switch = page.get_by_test_id("round-switch") + float_item = page.get_by_test_id("parameter-list-item-float") + quantity_item = page.get_by_test_id("parameter-list-item-Quantity") + + # Rounded (default) + expect(round_switch).to_be_checked() + expect(float_item).to_have_text("float1.234") + expect(quantity_item).to_have_text("Quantity1.234 m") + + # Unrounded + round_switch.uncheck() + expect(round_switch).not_to_be_checked() + expect(float_item).to_have_text("float1.2345") + expect(quantity_item).to_have_text("Quantity1.2345 m") + + +def test_nested_items(page: Page) -> None: + """Expands and collapses nested items when they are clicked.""" + nested_item = page.get_by_test_id("parameter-list-item-dict") + nested_item_button = nested_item.get_by_role("button") + child_item_1 = nested_item.get_by_test_id("parameter-list-item-int") + child_item_2 = nested_item.get_by_test_id("parameter-list-item-str") + + # Initially collapsed + expect(child_item_1).not_to_be_visible() + expect(child_item_2).not_to_be_visible() + + # Expands when clicked + nested_item_button.click() + expect(child_item_1).to_be_visible() + expect(child_item_2).to_be_visible() + + # Collapses when clicked again + nested_item_button.click() + expect(child_item_1).not_to_be_visible() + expect(child_item_2).not_to_be_visible() + + +def test_collapse_all(page: Page) -> None: + """Collapses all non-root items when "Collapse all" is clicked.""" + dict_item = page.get_by_test_id("parameter-list-item-dict") + list_item = page.get_by_test_id("parameter-list-item-list") + dict_item_child_1 = dict_item.get_by_test_id("parameter-list-item-int") + dict_item_child_2 = dict_item.get_by_test_id("parameter-list-item-str") + list_item_child_1 = list_item.get_by_test_id("parameter-list-item-0") + list_item_child_2 = list_item.get_by_test_id("parameter-list-item-1") + + # Click nested items to expand + dict_item.get_by_role("button").click() + list_item.get_by_role("button").click() + expect(dict_item_child_1).to_be_visible() + expect(dict_item_child_2).to_be_visible() + expect(list_item_child_1).to_be_visible() + expect(list_item_child_2).to_be_visible() + + # Collapse all + page.get_by_test_id("collapse-all-button").click() + expect(dict_item_child_1).not_to_be_visible() + expect(dict_item_child_2).not_to_be_visible() + expect(list_item_child_1).not_to_be_visible() + expect(list_item_child_2).not_to_be_visible() + + +def test_collapse_all_root(page: Page) -> None: + """Expands the root item when "Collapse all" is clicked.""" + root_item = page.get_by_test_id("parameter-list-item-root") + child_item_1 = root_item.get_by_test_id("parameter-list-item-int") + child_item_2 = root_item.get_by_test_id("parameter-list-item-str") + + # Click root to collapse + root_item.get_by_role("button", name="root").click() + expect(child_item_1).not_to_be_visible() + expect(child_item_2).not_to_be_visible() + + # Collapse all to reset root + page.get_by_test_id("collapse-all-button").click() + expect(child_item_1).to_be_visible() + expect(child_item_2).to_be_visible() diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/unit/conftest.py similarity index 93% rename from tests/conftest.py rename to tests/unit/conftest.py index 5ef062c..0377a7e 100644 --- a/tests/conftest.py +++ b/tests/unit/conftest.py @@ -1,4 +1,8 @@ -"""Defines global fixtures. Called automatically by Pytest before running tests.""" +""" +Global fixtures for unit tests. + +Called automatically by Pytest before running tests. +""" from __future__ import annotations from typing import Any @@ -18,7 +22,7 @@ def fixture_db_name() -> str: @pytest.fixture(name="db_path") -def fixture_db_path(db_name: str, tmp_path: Path) -> str: +def fixture_db_path(tmp_path: Path, db_name: str) -> str: """ Path to a ParamDB database. The initial database is created using a different path name to ensure that residual file system events do not trigger update events when diff --git a/tests/test_api.py b/tests/unit/test_api.py similarity index 100% rename from tests/test_api.py rename to tests/unit/test_api.py diff --git a/tests/test_app.py b/tests/unit/test_app.py similarity index 100% rename from tests/test_app.py rename to tests/unit/test_app.py diff --git a/tests/test_cli.py b/tests/unit/test_cli.py similarity index 86% rename from tests/test_cli.py rename to tests/unit/test_cli.py index 663af25..b899a9a 100644 --- a/tests/test_cli.py +++ b/tests/unit/test_cli.py @@ -9,7 +9,7 @@ PROGRAM_NAME = "paramview" DB_PATH = "test.db" VERSION_MSG = f"{PROGRAM_NAME} {distribution(PROGRAM_NAME).version}" -USAGE_MSG = f"usage: {PROGRAM_NAME} [-h] [-V] [-p PORT] " +USAGE_MSG = f"usage: {PROGRAM_NAME} [-h] [-V] [-p PORT] [--no-open] " POSITIONAL_ARGS_MSG = """ positional arguments: path to the ParamDB database file @@ -18,6 +18,7 @@ -h, --help show this help message and exit -V, --version show program's version number and exit -p PORT, --port PORT port to use (default is 5050) + --no-open don't open a new browser window (default is to open one) """ ERROR_MSG = f"{PROGRAM_NAME}: error:" REQUIRED_MSG = "the following arguments are required: " @@ -34,20 +35,20 @@ def _sw(*strings: str) -> str: def test_db_path() -> None: """Parses the database path.""" - args = _parse_args(DB_PATH) + args = _parse_args([DB_PATH]) assert args.db_path == DB_PATH def test_port_default() -> None: """Default port is 5050.""" - args = _parse_args(DB_PATH) + args = _parse_args([DB_PATH]) assert args.port == 5050 @pytest.mark.parametrize("port_arg", ["--port", "-p"]) def test_port(port_arg: str) -> None: """Parses the port.""" - args = _parse_args(DB_PATH, port_arg, "1234") + args = _parse_args([DB_PATH, port_arg, "1234"]) assert args.port == 1234 @@ -55,7 +56,7 @@ def test_port(port_arg: str) -> None: def test_version(version_arg: str, capsys: CaptureFixture[str]) -> None: """Prints version message to stdout and exists with code 0.""" with pytest.raises(SystemExit) as exc_info: - _parse_args(version_arg) + _parse_args([version_arg]) assert exc_info.value.code == 0 assert _sw(capsys.readouterr().out) == _sw(VERSION_MSG) @@ -64,7 +65,7 @@ def test_version(version_arg: str, capsys: CaptureFixture[str]) -> None: def test_help(help_arg: str, capsys: CaptureFixture[str]) -> None: """Prints help message to stdout and exists with code 0.""" with pytest.raises(SystemExit) as exc_info: - _parse_args(help_arg) + _parse_args([help_arg]) assert exc_info.value.code == 0 help_message = _sw(capsys.readouterr().out) assert _sw(USAGE_MSG, POSITIONAL_ARGS_MSG) in help_message @@ -74,7 +75,7 @@ def test_help(help_arg: str, capsys: CaptureFixture[str]) -> None: def test_no_args(capsys: CaptureFixture[str]) -> None: """Prints required argument message to stderr and exits with code 2.""" with pytest.raises(SystemExit) as exc_info: - _parse_args() + _parse_args([]) assert exc_info.value.code == 2 assert _sw(capsys.readouterr().err) == _sw(USAGE_MSG, ERROR_MSG, REQUIRED_MSG) @@ -85,7 +86,7 @@ def test_parse_args_unrecognized( ) -> None: """Prints message to stderr and exits with code 2.""" with pytest.raises(SystemExit) as excinfo: - _parse_args(DB_PATH, unrecognized_arg) + _parse_args([DB_PATH, unrecognized_arg]) assert excinfo.value.code == 2 assert _sw(capsys.readouterr().err) == _sw( USAGE_MSG, ERROR_MSG, UNRECOGNIZED_MSG, unrecognized_arg diff --git a/tests/test_watch_db.py b/tests/unit/test_watch_db.py similarity index 100% rename from tests/test_watch_db.py rename to tests/unit/test_watch_db.py diff --git a/vite.config.ts b/vite.config.ts index a95a57e..c1fc154 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,6 +5,7 @@ import react from "@vitejs/plugin-react-swc"; export default defineConfig({ build: { outDir: "paramview/static", + chunkSizeWarningLimit: 1000, }, resolve: { alias: { diff --git a/yarn.lock b/yarn.lock index c699dd1..03c0fa7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,7 +32,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.9": +"@babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" checksum: 081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c @@ -40,50 +40,50 @@ __metadata: linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": - version: 7.23.5 - resolution: "@babel/core@npm:7.23.5" + version: 7.23.7 + resolution: "@babel/core@npm:7.23.7" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.5" - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/generator": "npm:^7.23.6" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.5" - "@babel/parser": "npm:^7.23.5" + "@babel/helpers": "npm:^7.23.7" + "@babel/parser": "npm:^7.23.6" "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" + "@babel/traverse": "npm:^7.23.7" + "@babel/types": "npm:^7.23.6" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 311a512a870ee330a3f9a7ea89e5df790b2b5af0b1bd98b10b4edc0de2ac440f0df4d69ea2c0ee38a4b89041b9a495802741d93603be7d4fd834ec8bb6970bd2 + checksum: 38c9934973d384ed83369712978453eac91dc3f22167404dbdb272b64f602e74728a6f37012c53ee57e521b8ae2da60097f050497d9b6a212d28b59cdfb2cd1d languageName: node linkType: hard -"@babel/generator@npm:^7.23.5, @babel/generator@npm:^7.7.2": - version: 7.23.5 - resolution: "@babel/generator@npm:7.23.5" +"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": + version: 7.23.6 + resolution: "@babel/generator@npm:7.23.6" dependencies: - "@babel/types": "npm:^7.23.5" + "@babel/types": "npm:^7.23.6" "@jridgewell/gen-mapping": "npm:^0.3.2" "@jridgewell/trace-mapping": "npm:^0.3.17" jsesc: "npm:^2.5.1" - checksum: 14c6e874f796c4368e919bed6003bb0adc3ce837760b08f9e646d20aeb5ae7d309723ce6e4f06bcb4a2b5753145446c8e4425851380f695e40e71e1760f49e7b + checksum: 53540e905cd10db05d9aee0a5304e36927f455ce66f95d1253bb8a179f286b88fa7062ea0db354c566fe27f8bb96567566084ffd259f8feaae1de5eccc8afbda languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" +"@babel/helper-compilation-targets@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: - "@babel/compat-data": "npm:^7.22.9" - "@babel/helper-validator-option": "npm:^7.22.15" - browserslist: "npm:^4.21.9" + "@babel/compat-data": "npm:^7.23.5" + "@babel/helper-validator-option": "npm:^7.23.5" + browserslist: "npm:^4.22.2" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 45b9286861296e890f674a3abb199efea14a962a27d9b8adeb44970a9fd5c54e73a9e342e8414d2851cf4f98d5994537352fbce7b05ade32e9849bbd327f9ff1 + checksum: ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa languageName: node linkType: hard @@ -176,21 +176,21 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15": +"@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" checksum: af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 languageName: node linkType: hard -"@babel/helpers@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helpers@npm:7.23.5" +"@babel/helpers@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/helpers@npm:7.23.7" dependencies: "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" - checksum: a37e2728eb4378a4888e5d614e28de7dd79b55ac8acbecd0e5c761273e2a02a8f33b34b1932d9069db55417ace2937cbf8ec37c42f1030ce6d228857d7ccaa4f + "@babel/traverse": "npm:^7.23.7" + "@babel/types": "npm:^7.23.6" + checksum: f74a61ad28a1bc1fdd9133ad571c07787b66d6db017c707b87c203b0cd06879cea8b33e9c6a8585765a4949efa5df3cc9e19b710fe867f11be38ee29fd4a0488 languageName: node linkType: hard @@ -205,12 +205,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/parser@npm:7.23.5" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/parser@npm:7.23.6" bin: parser: ./bin/babel-parser.js - checksum: 3356aa90d7bafb4e2c7310e7c2c3d443c4be4db74913f088d3d577a1eb914ea4188e05fd50a47ce907a27b755c4400c4e3cbeee73dbeb37761f6ca85954f5a20 + checksum: 6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e languageName: node linkType: hard @@ -368,12 +368,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.23.5 - resolution: "@babel/runtime@npm:7.23.5" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.6, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.23.7 + resolution: "@babel/runtime@npm:7.23.7" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: ca679cc91bb7e424bc2db87bb58cc3b06ade916b9adb21fbbdc43e54cdaacb3eea201ceba2a0464b11d2eb65b9fe6a6ffcf4d7521fa52994f19be96f1af14788 + checksum: 3e304133ee55b0750e03e53cb4efb47fb2bdcdb5795f85bbffa10595196c34b9be60eb65bd6d833c87f49fc827f0365f86f95f51d85b188004d3128bb5129c93 languageName: node linkType: hard @@ -388,32 +388,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/traverse@npm:7.23.5" +"@babel/traverse@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/traverse@npm:7.23.7" dependencies: "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.5" + "@babel/generator": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" - debug: "npm:^4.1.0" + "@babel/parser": "npm:^7.23.6" + "@babel/types": "npm:^7.23.6" + debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: c5ea793080ca6719b0a1612198fd25e361cee1f3c14142d7a518d2a1eeb5c1d21f7eec1b26c20ea6e1ddd8ed12ab50b960ff95ffd25be353b6b46e1b54d6f825 + checksum: e32fceb4249beec2bde83968ddffe17444221c1ee5cd18c543a2feaf94e3ca83f2a4dfbc2dcca87cf226e0105973e0fe3717063a21e982a9de9945615ab3f3f5 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.23.5 - resolution: "@babel/types@npm:7.23.5" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.23.6 + resolution: "@babel/types@npm:7.23.6" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 7dd5e2f59828ed046ad0b06b039df2524a8b728d204affb4fc08da2502b9dd3140b1356b5166515d229dc811539a8b70dcd4bc507e06d62a89f4091a38d0b0fb + checksum: 42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 languageName: node linkType: hard @@ -424,13 +424,6 @@ __metadata: languageName: node linkType: hard -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 - languageName: node - linkType: hard - "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -440,42 +433,6 @@ __metadata: languageName: node linkType: hard -"@cypress/request@npm:^3.0.0": - version: 3.0.1 - resolution: "@cypress/request@npm:3.0.1" - dependencies: - aws-sign2: "npm:~0.7.0" - aws4: "npm:^1.8.0" - caseless: "npm:~0.12.0" - combined-stream: "npm:~1.0.6" - extend: "npm:~3.0.2" - forever-agent: "npm:~0.6.1" - form-data: "npm:~2.3.2" - http-signature: "npm:~1.3.6" - is-typedarray: "npm:~1.0.0" - isstream: "npm:~0.1.2" - json-stringify-safe: "npm:~5.0.1" - mime-types: "npm:~2.1.19" - performance-now: "npm:^2.1.0" - qs: "npm:6.10.4" - safe-buffer: "npm:^5.1.2" - tough-cookie: "npm:^4.1.3" - tunnel-agent: "npm:^0.6.0" - uuid: "npm:^8.3.2" - checksum: 8eb92a665e6549e2533f5169431addcaad0307f51a8c7f3b6b169eb79b4d673373784a527590a47b0a2905ad5f601b24ab2d1b31d184243235aba470ffc9c1f7 - languageName: node - linkType: hard - -"@cypress/xvfb@npm:^1.2.4": - version: 1.2.4 - resolution: "@cypress/xvfb@npm:1.2.4" - dependencies: - debug: "npm:^3.1.0" - lodash.once: "npm:^4.1.1" - checksum: 1bf6224b244f6093033d77f04f6bef719280542656de063cf8ac3f38957b62aa633e6918af0b9673a8bf0123b42a850db51d9729a3ae3da885ac179bc7fc1d26 - languageName: node - linkType: hard - "@emotion/babel-plugin@npm:^11.11.0": version: 11.11.0 resolution: "@emotion/babel-plugin@npm:11.11.0" @@ -532,13 +489,13 @@ __metadata: linkType: hard "@emotion/react@npm:^11.11.1": - version: 11.11.1 - resolution: "@emotion/react@npm:11.11.1" + version: 11.11.3 + resolution: "@emotion/react@npm:11.11.3" dependencies: "@babel/runtime": "npm:^7.18.3" "@emotion/babel-plugin": "npm:^11.11.0" "@emotion/cache": "npm:^11.11.0" - "@emotion/serialize": "npm:^1.1.2" + "@emotion/serialize": "npm:^1.1.3" "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.1" "@emotion/utils": "npm:^1.2.1" "@emotion/weak-memoize": "npm:^0.3.1" @@ -548,20 +505,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 1aea4d735b537fbfbeda828bbf929488a7e1b5b7d131f14aeede8737e92bb3b611e15fec353e97f85aed7a65a1c86a695a04ba6e9be905231beef6bd624cb705 + checksum: ce995395b8714343715284beb8478afdfa72b89ed83981a15a170ca0f4a2f77d7a4a198fd50c1f9c6efcd0535768d168ff88c5921dc5f90bb33134c7a75f9455 languageName: node linkType: hard -"@emotion/serialize@npm:^1.1.2": - version: 1.1.2 - resolution: "@emotion/serialize@npm:1.1.2" +"@emotion/serialize@npm:^1.1.2, @emotion/serialize@npm:^1.1.3": + version: 1.1.3 + resolution: "@emotion/serialize@npm:1.1.3" dependencies: "@emotion/hash": "npm:^0.9.1" "@emotion/memoize": "npm:^0.8.1" "@emotion/unitless": "npm:^0.8.1" "@emotion/utils": "npm:^1.2.1" csstype: "npm:^3.0.2" - checksum: d243e0e5abce8d2183d25a32ec89bf650ee741ebadb29e6405abde05d4e2ed446ba5b3f725a29833ad709d0d08f0a5c8d0532fdcd43f4b23d931d8b6d4f218c1 + checksum: 875241eafaa30e7d3b7cf9b585d8c1f224cbf627a674e87eb1d7662dafa76a8c8d67f14a79dbf7d1eaa017e9f68389962990fbcc699d5ad65035a1a047432a3f languageName: node linkType: hard @@ -622,156 +579,163 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/android-arm64@npm:0.19.8" +"@esbuild/aix-ppc64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/aix-ppc64@npm:0.19.11" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-arm64@npm:0.19.11" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/android-arm@npm:0.19.8" +"@esbuild/android-arm@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-arm@npm:0.19.11" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/android-x64@npm:0.19.8" +"@esbuild/android-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-x64@npm:0.19.11" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/darwin-arm64@npm:0.19.8" +"@esbuild/darwin-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/darwin-arm64@npm:0.19.11" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/darwin-x64@npm:0.19.8" +"@esbuild/darwin-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/darwin-x64@npm:0.19.11" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/freebsd-arm64@npm:0.19.8" +"@esbuild/freebsd-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/freebsd-arm64@npm:0.19.11" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/freebsd-x64@npm:0.19.8" +"@esbuild/freebsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/freebsd-x64@npm:0.19.11" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-arm64@npm:0.19.8" +"@esbuild/linux-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-arm64@npm:0.19.11" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-arm@npm:0.19.8" +"@esbuild/linux-arm@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-arm@npm:0.19.11" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-ia32@npm:0.19.8" +"@esbuild/linux-ia32@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-ia32@npm:0.19.11" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-loong64@npm:0.19.8" +"@esbuild/linux-loong64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-loong64@npm:0.19.11" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-mips64el@npm:0.19.8" +"@esbuild/linux-mips64el@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-mips64el@npm:0.19.11" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-ppc64@npm:0.19.8" +"@esbuild/linux-ppc64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-ppc64@npm:0.19.11" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-riscv64@npm:0.19.8" +"@esbuild/linux-riscv64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-riscv64@npm:0.19.11" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-s390x@npm:0.19.8" +"@esbuild/linux-s390x@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-s390x@npm:0.19.11" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/linux-x64@npm:0.19.8" +"@esbuild/linux-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-x64@npm:0.19.11" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/netbsd-x64@npm:0.19.8" +"@esbuild/netbsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/netbsd-x64@npm:0.19.11" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/openbsd-x64@npm:0.19.8" +"@esbuild/openbsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/openbsd-x64@npm:0.19.11" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/sunos-x64@npm:0.19.8" +"@esbuild/sunos-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/sunos-x64@npm:0.19.11" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/win32-arm64@npm:0.19.8" +"@esbuild/win32-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-arm64@npm:0.19.11" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/win32-ia32@npm:0.19.8" +"@esbuild/win32-ia32@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-ia32@npm:0.19.11" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.8": - version: 0.19.8 - resolution: "@esbuild/win32-x64@npm:0.19.8" +"@esbuild/win32-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-x64@npm:0.19.11" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -811,10 +775,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.55.0": - version: 8.55.0 - resolution: "@eslint/js@npm:8.55.0" - checksum: 88ab9fc57a651becd2b32ec40a3958db27fae133b1ae77bebd733aa5bbd00a92f325bb02f20ad680d31c731fa49b22f060a4777dd52eb3e27da013d940bd978d +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a languageName: node linkType: hard @@ -1242,14 +1206,14 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.26": - version: 5.0.0-beta.26 - resolution: "@mui/base@npm:5.0.0-beta.26" +"@mui/base@npm:5.0.0-beta.29": + version: 5.0.0-beta.29 + resolution: "@mui/base@npm:5.0.0-beta.29" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.6" "@floating-ui/react-dom": "npm:^2.0.4" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.20" + "@mui/types": "npm:^7.2.11" + "@mui/utils": "npm:^5.15.2" "@popperjs/core": "npm:^2.11.8" clsx: "npm:^2.0.0" prop-types: "npm:^15.8.1" @@ -1260,22 +1224,22 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 8d04dc6c5674e89e2d3a1ee9b95e595cba9e006304dd52850dfadcc227f4b2acbcc309cf9c4e4e736667c665c113e70a780b45970e83bcc0da4136e15da81bb7 + checksum: 683837bc355778fc6cf3ba96cbac735f83166b7b238bff727d9a47cb2e11bb059bb7a89be371bf565dfc54981843d45932d5f5a115905e77b0c0b20af9d20a2a languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.14.20": - version: 5.14.20 - resolution: "@mui/core-downloads-tracker@npm:5.14.20" - checksum: 84b5f236e455ed4e255c64c86e5897d064425dc8640275b0690cddb229a29c6ff182fac1c771d3e7ae068c8fc439718c062e98a6299ff71d234217dd62a52643 +"@mui/core-downloads-tracker@npm:^5.15.2": + version: 5.15.2 + resolution: "@mui/core-downloads-tracker@npm:5.15.2" + checksum: bee88bdc7568c6bc564be6489035e86e1d89a8bab6e607fb1145d0f450693289ea7a3f216e1e30136ae0125a80da7d4729b0533160b9e50190bdc9bb1aafed22 languageName: node linkType: hard "@mui/icons-material@npm:^5.14.19": - version: 5.14.19 - resolution: "@mui/icons-material@npm:5.14.19" + version: 5.15.2 + resolution: "@mui/icons-material@npm:5.15.2" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.6" peerDependencies: "@mui/material": ^5.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -1283,19 +1247,19 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 1af1a14622795dae1b999b49dc27d8d9f32344ccd3bc73a3b9dbce3d8d7ad43e6aa93e100a58ae423c9404fcb91dbdeb7758bd94f5f4614a4843f649645a42a1 + checksum: dc3cc687faed7905822e388168f6e73f6597f37f58aeebca981f85dacbe513f82a97c7366d09fd9da9bd53a90e11739c12a4b4f9c2d96b64b816a5e0f039971e languageName: node linkType: hard "@mui/lab@npm:^5.0.0-alpha.155": - version: 5.0.0-alpha.155 - resolution: "@mui/lab@npm:5.0.0-alpha.155" - dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/base": "npm:5.0.0-beta.26" - "@mui/system": "npm:^5.14.20" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.20" + version: 5.0.0-alpha.158 + resolution: "@mui/lab@npm:5.0.0-alpha.158" + dependencies: + "@babel/runtime": "npm:^7.23.6" + "@mui/base": "npm:5.0.0-beta.29" + "@mui/system": "npm:^5.15.2" + "@mui/types": "npm:^7.2.11" + "@mui/utils": "npm:^5.15.2" clsx: "npm:^2.0.0" prop-types: "npm:^15.8.1" peerDependencies: @@ -1312,21 +1276,21 @@ __metadata: optional: true "@types/react": optional: true - checksum: 2b691f5ea3bd6e7a84393e4f56542b8f0f5c7731cb8d8636128cc313ae4a6fd7892b9c55c3aa83f99facb8dda4f4b78a18eb660d65629bdc24b8bdfa8115e9a1 + checksum: 3458a201a12b354e01adeaa165825339fc5c0900eca4580eab8ab8d891b9b8e33ff1be4760b40fc5219dc8635c632d98b4b7956a22d53dd3bd5bd08afb223904 languageName: node linkType: hard "@mui/material@npm:^5.14.20": - version: 5.14.20 - resolution: "@mui/material@npm:5.14.20" - dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/base": "npm:5.0.0-beta.26" - "@mui/core-downloads-tracker": "npm:^5.14.20" - "@mui/system": "npm:^5.14.20" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.20" - "@types/react-transition-group": "npm:^4.4.9" + version: 5.15.2 + resolution: "@mui/material@npm:5.15.2" + dependencies: + "@babel/runtime": "npm:^7.23.6" + "@mui/base": "npm:5.0.0-beta.29" + "@mui/core-downloads-tracker": "npm:^5.15.2" + "@mui/system": "npm:^5.15.2" + "@mui/types": "npm:^7.2.11" + "@mui/utils": "npm:^5.15.2" + "@types/react-transition-group": "npm:^4.4.10" clsx: "npm:^2.0.0" csstype: "npm:^3.1.2" prop-types: "npm:^15.8.1" @@ -1345,16 +1309,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: f7ade5827b98050bb434b98d79ea77150ba99ed62fd94c91b37636698010d388a91b9f5eeae750b5e2bda2201b3a79e5bfe1820cde44f4b0d1f03d5250690853 + checksum: c6ca6e4e25999b946d9d34052a67d9d29c2efec0da98e749c6f131f8f818d1c408f7dbc1a88a523c020cb6cf9b3ee00ec1ddafc2cc4a0f0a7b7a8b93bfd7c572 languageName: node linkType: hard -"@mui/private-theming@npm:^5.14.20": - version: 5.14.20 - resolution: "@mui/private-theming@npm:5.14.20" +"@mui/private-theming@npm:^5.15.2": + version: 5.15.2 + resolution: "@mui/private-theming@npm:5.15.2" dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/utils": "npm:^5.14.20" + "@babel/runtime": "npm:^7.23.6" + "@mui/utils": "npm:^5.15.2" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -1362,15 +1326,15 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: b89ae2265b814c7283c6985a8e14dbe9987fd51e7d42d2adedff1d49c564fb9493c5a9ae465b1772b612a4526fcb42d5b9c256411f9ff61f1799f20e428023e3 + checksum: 1a507f5ba8d257af1d3e375d7eebaf1562127ea7995bc92249fdba386b835dfb70d14378c38b832e0a92fbf0a9ac3295483fd11f338916f97ec2ffabe09dacbf languageName: node linkType: hard -"@mui/styled-engine@npm:^5.14.19": - version: 5.14.20 - resolution: "@mui/styled-engine@npm:5.14.20" +"@mui/styled-engine@npm:^5.15.2": + version: 5.15.2 + resolution: "@mui/styled-engine@npm:5.15.2" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.6" "@emotion/cache": "npm:^11.11.0" csstype: "npm:^3.1.2" prop-types: "npm:^15.8.1" @@ -1383,19 +1347,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 995800350a54b139d4ebd7c8695b54da11078b044fec700dc5f6d32facd89c09038bcd60795b396b249558b0ece4f6d0600e6951d319341eb84db1b10ec078a4 + checksum: 918580193afd32f35d60099bac67c67f00aa72c1bb76132bceebb6a9e4b8f46de080a598e0ea6677c900d9409afaa9ff91572e05482d3a4609b0e7faa39004e2 languageName: node linkType: hard -"@mui/system@npm:^5.14.20": - version: 5.14.20 - resolution: "@mui/system@npm:5.14.20" +"@mui/system@npm:^5.15.2": + version: 5.15.2 + resolution: "@mui/system@npm:5.15.2" dependencies: - "@babel/runtime": "npm:^7.23.4" - "@mui/private-theming": "npm:^5.14.20" - "@mui/styled-engine": "npm:^5.14.19" - "@mui/types": "npm:^7.2.10" - "@mui/utils": "npm:^5.14.20" + "@babel/runtime": "npm:^7.23.6" + "@mui/private-theming": "npm:^5.15.2" + "@mui/styled-engine": "npm:^5.15.2" + "@mui/types": "npm:^7.2.11" + "@mui/utils": "npm:^5.15.2" clsx: "npm:^2.0.0" csstype: "npm:^3.1.2" prop-types: "npm:^15.8.1" @@ -1411,27 +1375,27 @@ __metadata: optional: true "@types/react": optional: true - checksum: cd3c49c62d9769a227d7597190ca8a2625f779518c7c7c7b7a0b01aa4ba6a06c181c07b7fd9834808f376f6a48d2852c3c0075f6d8022ecf4d4d220e4f970e78 + checksum: b57b9080b942c0149f882aa64094491696ce8d2cfd537ed5b14dad76b17978b1435a3f357342f283ae4c3d2b5f214c2beda02942fb3eff77dc0eb2c786cd64a0 languageName: node linkType: hard -"@mui/types@npm:^7.2.10": - version: 7.2.10 - resolution: "@mui/types@npm:7.2.10" +"@mui/types@npm:^7.2.11": + version: 7.2.11 + resolution: "@mui/types@npm:7.2.11" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 59c8162812581cd1021d319e8828f6220723ffceb13609a99b1ffee6943f81ab07291cc3837c28776ca919dbe74c6416b2014c10e16b19135ff94a80ad7d3270 + checksum: 5aecdd9b02ca4537d05ec1809a31e64a3330dc104509bc470ec8e38a00259d36faf2dadee828987b385dff46fbec6fe112ef3a5c0c1b78e60c56755af04d38fa languageName: node linkType: hard -"@mui/utils@npm:^5.14.20": - version: 5.14.20 - resolution: "@mui/utils@npm:5.14.20" +"@mui/utils@npm:^5.15.2": + version: 5.15.2 + resolution: "@mui/utils@npm:5.15.2" dependencies: - "@babel/runtime": "npm:^7.23.4" + "@babel/runtime": "npm:^7.23.6" "@types/prop-types": "npm:^15.7.11" prop-types: "npm:^15.8.1" react-is: "npm:^18.2.0" @@ -1441,7 +1405,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 2a40c24e0e50c398b4150bbfa800c9eb9c2e35493f508c7daf244d22e1ec8dd2621879567028c3170318daee057bc9db9b7af492be707aaf9bb5b2bfc3b6660f + checksum: 4268b2685eb602024c0c21a43bc7b0fafa417a0b936750899988076d7cc582acc38568ddf65d50e76b02a136f7c69fa782ccd1d22d732fdac61d7f359eb7d369 languageName: node linkType: hard @@ -1508,93 +1472,93 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.7.0" +"@rollup/rollup-android-arm-eabi@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-android-arm64@npm:4.7.0" +"@rollup/rollup-android-arm64@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-android-arm64@npm:4.9.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.7.0" +"@rollup/rollup-darwin-arm64@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.9.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.7.0" +"@rollup/rollup-darwin-x64@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.9.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.7.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.7.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.9.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.7.0" +"@rollup/rollup-linux-arm64-musl@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.9.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.7.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.9.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.7.0" +"@rollup/rollup-linux-x64-gnu@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.7.0" +"@rollup/rollup-linux-x64-musl@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.9.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.7.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.9.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.7.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.9.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.7.0": - version: 4.7.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.7.0" +"@rollup/rollup-win32-x64-msvc@npm:4.9.2": + version: 4.9.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.9.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1654,82 +1618,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-darwin-arm64@npm:1.3.100" +"@swc/core-darwin-arm64@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-darwin-arm64@npm:1.3.102" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-darwin-x64@npm:1.3.100" +"@swc/core-darwin-x64@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-darwin-x64@npm:1.3.102" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.100" +"@swc/core-linux-arm-gnueabihf@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.102" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.102" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.100" +"@swc/core-linux-arm64-musl@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.102" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.100" +"@swc/core-linux-x64-gnu@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.102" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-linux-x64-musl@npm:1.3.100" +"@swc/core-linux-x64-musl@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-linux-x64-musl@npm:1.3.102" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.100" +"@swc/core-win32-arm64-msvc@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.102" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.100" +"@swc/core-win32-ia32-msvc@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.102" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.100": - version: 1.3.100 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.100" +"@swc/core-win32-x64-msvc@npm:1.3.102": + version: 1.3.102 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.102" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.100, @swc/core@npm:^1.3.96": - version: 1.3.100 - resolution: "@swc/core@npm:1.3.100" - dependencies: - "@swc/core-darwin-arm64": "npm:1.3.100" - "@swc/core-darwin-x64": "npm:1.3.100" - "@swc/core-linux-arm64-gnu": "npm:1.3.100" - "@swc/core-linux-arm64-musl": "npm:1.3.100" - "@swc/core-linux-x64-gnu": "npm:1.3.100" - "@swc/core-linux-x64-musl": "npm:1.3.100" - "@swc/core-win32-arm64-msvc": "npm:1.3.100" - "@swc/core-win32-ia32-msvc": "npm:1.3.100" - "@swc/core-win32-x64-msvc": "npm:1.3.100" + version: 1.3.102 + resolution: "@swc/core@npm:1.3.102" + dependencies: + "@swc/core-darwin-arm64": "npm:1.3.102" + "@swc/core-darwin-x64": "npm:1.3.102" + "@swc/core-linux-arm-gnueabihf": "npm:1.3.102" + "@swc/core-linux-arm64-gnu": "npm:1.3.102" + "@swc/core-linux-arm64-musl": "npm:1.3.102" + "@swc/core-linux-x64-gnu": "npm:1.3.102" + "@swc/core-linux-x64-musl": "npm:1.3.102" + "@swc/core-win32-arm64-msvc": "npm:1.3.102" + "@swc/core-win32-ia32-msvc": "npm:1.3.102" + "@swc/core-win32-x64-msvc": "npm:1.3.102" "@swc/counter": "npm:^0.1.1" "@swc/types": "npm:^0.1.5" peerDependencies: @@ -1739,6 +1711,8 @@ __metadata: optional: true "@swc/core-darwin-x64": optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true "@swc/core-linux-arm64-gnu": optional: true "@swc/core-linux-arm64-musl": @@ -1756,7 +1730,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: d6e873a7c627765991b18bd8d1b0ce1f1d9cf08c451fe78dbbf28dda14d4301cec2689f6bd85e604847d4a20226fd79c272796fef4f28feaca81a20c0f62e8e9 + checksum: e87bf302b3e6e7c0a6cf6abb001e196f9461fa8fdfc20c6dcef217f50298f31e81aed4ff7402833470241dccd35d354e4e17ac56d0e551792735aefeb4604871 languageName: node linkType: hard @@ -1835,11 +1809,11 @@ __metadata: linkType: hard "@types/babel__generator@npm:*": - version: 7.6.7 - resolution: "@types/babel__generator@npm:7.6.7" + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" dependencies: "@babel/types": "npm:^7.0.0" - checksum: 2427203864ef231857e102eeb32b731a419164863983119cdd4dac9f1503c2831eb4262d05ade95d4574aa410b94c16e54e36a616758452f685a34881f4596d9 + checksum: f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 languageName: node linkType: hard @@ -1854,11 +1828,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.4 - resolution: "@types/babel__traverse@npm:7.20.4" + version: 7.20.5 + resolution: "@types/babel__traverse@npm:7.20.5" dependencies: "@babel/types": "npm:^7.20.7" - checksum: e76cb4974c7740fd61311152dc497e7b05c1c46ba554aab875544ab0a7457f343cafcad34ba8fb2ff543ab0e012ef2d3fa0c13f1a4e9a4cd9c4c703c7a2a8d62 + checksum: 033abcb2f4c084ad33e30c3efaad82161240f351e3c71b6154ed289946b33b363696c0fbd42502b68e4582a87413c418321f40eb1ea863e34fe525641345e05b languageName: node linkType: hard @@ -1932,20 +1906,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:^20.10.4": - version: 20.10.4 - resolution: "@types/node@npm:20.10.4" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 2c8b70cba731eb2ae3ae046daa74903bfcbb0e7b9196da767e5895054f6d252296ae7a04fb1dbbcb53bb004c4c658c05eaea2731bc9e2dd9e08f7e88d672f563 - languageName: node - linkType: hard - -"@types/node@npm:^18.17.5": - version: 18.19.3 - resolution: "@types/node@npm:18.19.3" + version: 20.10.6 + resolution: "@types/node@npm:20.10.6" dependencies: undici-types: "npm:~5.26.4" - checksum: 3ed943d06e9dff70a3da793f794f1192cd93b0ababdb9f07425a05680f17cfce649cbc46734265f6fbe52fd9f277496d3a4da26c013f1193a0345f2420ea6cd0 + checksum: 6692ccfa8552ef60c4069fda3c8de726c23e8d403cdf788e3c7efa769987e80fbda5f02723dd857f9de7df24a5fa40b3ed4580ec3c5cbac04eba44cf7b2ab1dc languageName: node linkType: hard @@ -1964,15 +1929,15 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.2.17": - version: 18.2.17 - resolution: "@types/react-dom@npm:18.2.17" + version: 18.2.18 + resolution: "@types/react-dom@npm:18.2.18" dependencies: "@types/react": "npm:*" - checksum: 33b53078ed7e9e0cfc4dc691e938f7db1cc06353bc345947b41b581c3efe2b980c9e4eb6460dbf5ddc521dd91959194c970221a2bd4bfad9d23ebce338e12938 + checksum: 74dba11a1b8156f3a763f3fca1fb4ec1dcd349153279b8bf79210024a69f994bf2cf0728198c047f8130c5318420ea56281b0a4ef84c8ae943cd9a0cac705220 languageName: node linkType: hard -"@types/react-transition-group@npm:^4.4.9": +"@types/react-transition-group@npm:^4.4.10": version: 4.4.10 resolution: "@types/react-transition-group@npm:4.4.10" dependencies: @@ -1991,13 +1956,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18.2.42": - version: 18.2.42 - resolution: "@types/react@npm:18.2.42" + version: 18.2.46 + resolution: "@types/react@npm:18.2.46" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 2946d78c1f9a220a4dfedd7995b8bcba47235b19756bf3dd845c604bb24fff8d0ff5be81c0c98ac7f4488791e8c7e6cbcc4898c40c0209d74a1223b8fbfb994f + checksum: 814cc67107e5e69501d65bfc371cc2c716665d2a3608d395a2f81e24c3a2875db28e2cad717dfb17017eabcffd1d68ee2c9e09ecaba3f7108d5b7fbb9888ebab languageName: node linkType: hard @@ -2015,20 +1980,6 @@ __metadata: languageName: node linkType: hard -"@types/sinonjs__fake-timers@npm:8.1.1": - version: 8.1.1 - resolution: "@types/sinonjs__fake-timers@npm:8.1.1" - checksum: e2e6c425a548177c0930c2f9b82d3951956c9701b9ebf59623d5ad2c3229c523d3c0d598e79fe7392a239657abd3dbe3676be0650ce438bcd1199ee3b617a4d7 - languageName: node - linkType: hard - -"@types/sizzle@npm:^2.3.2": - version: 2.3.8 - resolution: "@types/sizzle@npm:2.3.8" - checksum: ab5460147ae6680cc20c2223a8f17d9f7c97144b70f00a222a1c32d68b5207696d48177ab9784dda88c74d93ed5a78dd31f74d271b15382520b423c81b4aac89 - languageName: node - linkType: hard - "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -2068,24 +2019,15 @@ __metadata: languageName: node linkType: hard -"@types/yauzl@npm:^2.9.1": - version: 2.10.3 - resolution: "@types/yauzl@npm:2.10.3" - dependencies: - "@types/node": "npm:*" - checksum: f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/eslint-plugin@npm:6.13.2" +"@typescript-eslint/eslint-plugin@npm:^6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.17.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/type-utils": "npm:6.13.2" - "@typescript-eslint/utils": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" + "@typescript-eslint/scope-manager": "npm:6.17.0" + "@typescript-eslint/type-utils": "npm:6.17.0" + "@typescript-eslint/utils": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -2098,25 +2040,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 531a4406d872738d165c6a66cb26e976523c94053b022a8210dc9fd10e91b79b705bc0fcc77145e9744e4108b53bdba55e02a10dc17757b22be92aff57849384 + checksum: 44a3c914b72607b12925d07c04be97d325f8795f5d7de8501054a4405accc35b35eaa2aa93983c602d13e842503d49bdbf1f5af5c0a69d700351c005681dcd52 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/parser@npm:6.13.2" +"@typescript-eslint/parser@npm:^6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/parser@npm:6.17.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/typescript-estree": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" + "@typescript-eslint/scope-manager": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/typescript-estree": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2c62b8cd8a37eb2ea59cd00e559f51a9f57af746e2040e872af3c58ddd3f4071ad7b7009789bdeb0e0d4ee0343bfe96ee77288020f3ae22d08e1674203f5e156 + checksum: 66b53159688083eb48259de5b4daf076f3de284ac3b4d2618bda3f7ab2d8ee27b01ae851b08e8487047e33ff3668424f17d677d66413164cb231f1519dcff82f languageName: node linkType: hard @@ -2130,22 +2072,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/scope-manager@npm:6.13.2" +"@typescript-eslint/scope-manager@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/scope-manager@npm:6.17.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" - checksum: 9b159e5bb10dfb5953e71488200b4126378fc7e987ce7d90946aea9ec40cd66c7ada92399657c5d9794189b764ca6f4eb38a8dcb9e4c5aa50ab6000a39636b9c + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + checksum: b7ac7d9c39515c2a1b3844577fab967bf126ec25ccf28076240748b3f42d60ab3e64131bfffee61f66251bdf2d59e50e39f5cb0bee7987c85c49140c75d26b5f languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/type-utils@npm:6.13.2" +"@typescript-eslint/type-utils@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/type-utils@npm:6.17.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.13.2" - "@typescript-eslint/utils": "npm:6.13.2" + "@typescript-eslint/typescript-estree": "npm:6.17.0" + "@typescript-eslint/utils": "npm:6.17.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -2153,7 +2095,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1ca97c78abdf479aea0c54e869fda2ae2f69de1974cc063062ce7b5b16c7fdf497ea15c50a29dd5941ea1b6b77e8f1213a5c272a747e334ac69ede083f327468 + checksum: 15bc9ba2d7f12c3825eced4e5c2283616496e4bca57914c98e895af23d920f94e47e2081fb4fd59da13d274809e08667ae43a76a2f1494a7043c75f980f21114 languageName: node linkType: hard @@ -2164,10 +2106,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/types@npm:6.13.2" - checksum: 029918ca5b1442bb4bc435773504ce32191e2c3e2fde8d4176bb6513f03e3dfa2aa9724b2d22b1640656d666b97f7a7ebfeaf67b881d5e07250828fa83e3ebe8 +"@typescript-eslint/types@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/types@npm:6.17.0" + checksum: c458d985b9ab4f369018536bcb88f0aedafb0c8c4b22ffd376e0c0c768a44e3956475c85ebeef40ae44238841c8df268893477b85873aa2621995c37e738e37e languageName: node linkType: hard @@ -2189,38 +2131,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/typescript-estree@npm:6.13.2" +"@typescript-eslint/typescript-estree@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.17.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/visitor-keys": "npm:6.13.2" + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" semver: "npm:^7.5.4" ts-api-utils: "npm:^1.0.1" peerDependenciesMeta: typescript: optional: true - checksum: 1c4c59dce0c51fdfee34d9f418e64fe28e3ec1a97661efc8a3d2780bdff36aff38de9090d356a968f394fa6d4e9c058936ce9cd260d4c44a52761ecd74915bce + checksum: 5a858288bb05f45a2a45b04394115826ff19f85555144bfb67dc281d4e75fc3a1e1aceb3dee68022e86b91f199d1310c15bda3100a4890004b8e474d86afad51 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/utils@npm:6.13.2" +"@typescript-eslint/utils@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/utils@npm:6.17.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.13.2" - "@typescript-eslint/types": "npm:6.13.2" - "@typescript-eslint/typescript-estree": "npm:6.13.2" + "@typescript-eslint/scope-manager": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/typescript-estree": "npm:6.17.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 84969be91e7949868eaaa289288c9d71927f0e427b572501b0991d8d62b40a4234f7287c35b35d276ccbb53e9ea5457b8250fcf4941e60e6b9ba4065fbfba416 + checksum: a85907c5fbe0a54944fff25df05bf5b8bbe524bb1907fb54c7c68135cf764aa45344e679965c17e235b328ad32e74b1357057c43035203ce874915c4687daa93 languageName: node linkType: hard @@ -2252,13 +2195,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.13.2": - version: 6.13.2 - resolution: "@typescript-eslint/visitor-keys@npm:6.13.2" +"@typescript-eslint/visitor-keys@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.17.0" dependencies: - "@typescript-eslint/types": "npm:6.13.2" + "@typescript-eslint/types": "npm:6.17.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: c173bc1fcc42c3075a5ee094e7f3bf0279d98315c25ff49e20d02d79022b1d0402accfa113b070afb4d52a6f6d180594b67baa8b6a784eabdf82b54dd1ff454c + checksum: 75a48f5810c6a69bc1c082b07d2b840c40895807b1b4ecf9d3ab9eb783176eeb3e7b11eb89d652e8331da79d604f82300f315ffc21cd937819197a8601b48d1d languageName: node linkType: hard @@ -2321,11 +2264,11 @@ __metadata: linkType: hard "acorn@npm:^8.1.0, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.9.0": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" + version: 8.11.3 + resolution: "acorn@npm:8.11.3" bin: acorn: bin/acorn - checksum: a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 + checksum: 3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 languageName: node linkType: hard @@ -2369,14 +2312,7 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": +"ansi-escapes@npm:^4.2.1": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -2441,13 +2377,6 @@ __metadata: languageName: node linkType: hard -"arch@npm:^2.2.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: 4ceaf8d8207817c216ebc4469742052cb0a097bc45d9b7fcd60b7507220da545a28562ab5bdd4dfe87921bb56371a0805da4e10d704e01f93a15f83240f1284c - languageName: node - linkType: hard - "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -2575,22 +2504,6 @@ __metadata: languageName: node linkType: hard -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: "npm:~2.1.0" - checksum: 00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 - languageName: node - linkType: hard - -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 - languageName: node - linkType: hard - "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -2598,20 +2511,6 @@ __metadata: languageName: node linkType: hard -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 - languageName: node - linkType: hard - -"async@npm:^3.2.0": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 - languageName: node - linkType: hard - "asynciterator.prototype@npm:^1.0.0": version: 1.0.0 resolution: "asynciterator.prototype@npm:1.0.0" @@ -2628,13 +2527,6 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -2642,20 +2534,6 @@ __metadata: languageName: node linkType: hard -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: 021d2cc5547d4d9ef1633e0332e746a6f447997758b8b68d6fb33f290986872d2bff5f0c37d5832f41a7229361f093cd81c40898d96ed153493c0fb5cd8575d2 - languageName: node - linkType: hard - -"aws4@npm:^1.8.0": - version: 1.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 1e39c266f53b04daf88e112de93a6006375b386a1b7ab6197260886e39abd012aa90bdd87949c3bf9c30754846031f6d5d8ac4f8676628097c11065b5d39847a - languageName: node - linkType: hard - "axe-core@npm:=4.7.0": version: 4.7.0 resolution: "axe-core@npm:4.7.0" @@ -2664,13 +2542,13 @@ __metadata: linkType: hard "axios@npm:^1.6.1": - version: 1.6.2 - resolution: "axios@npm:1.6.2" + version: 1.6.3 + resolution: "axios@npm:1.6.3" dependencies: follow-redirects: "npm:^1.15.0" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 9b77e030e85e4f9cbcba7bb52fbff67d6ce906c92d213e0bd932346a50140faf83733bf786f55bd58301bd92f9973885c7b87d6348023e10f7eaf286d0791a1d + checksum: dcc6d982353db33e6893ef01cdf81d0a0548dbd8fba0cb046dc4aee1a6a16226721faa4c2a13b2673d47130509629cdb93bb991b3a2bd4ef17a5ac27a8bba0da languageName: node linkType: hard @@ -2777,36 +2655,6 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: "npm:^0.14.3" - checksum: ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 - languageName: node - linkType: hard - -"blob-util@npm:^2.0.2": - version: 2.0.2 - resolution: "blob-util@npm:2.0.2" - checksum: ed82d587827e5c86be122301a7c250f8364963e9582f72a826255bfbd32f8d69cc10169413d666667bb1c4fc8061329ae89d176ffe46fee8f32080af944ccddc - languageName: node - linkType: hard - -"bluebird@npm:^3.7.2": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -2835,7 +2683,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.9": +"browserslist@npm:^4.22.2": version: 4.22.2 resolution: "browserslist@npm:4.22.2" dependencies: @@ -2858,13 +2706,6 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 - languageName: node - linkType: hard - "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -2872,16 +2713,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.6.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e - languageName: node - linkType: hard - "cacache@npm:^18.0.0": version: 18.0.1 resolution: "cacache@npm:18.0.1" @@ -2902,13 +2733,6 @@ __metadata: languageName: node linkType: hard -"cachedir@npm:^2.3.0": - version: 2.4.0 - resolution: "cachedir@npm:2.4.0" - checksum: 76bff9009f2c446cd3777a4aede99af634a89670a67012b8041f65e951d3d36cefe8940341ea80c72219ee9913fa1f6146824cd9dfe9874a4bded728af7e6d76 - languageName: node - linkType: hard - "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": version: 1.0.5 resolution: "call-bind@npm:1.0.5" @@ -2942,16 +2766,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001566 - resolution: "caniuse-lite@npm:1.0.30001566" - checksum: cd163075b1a9feaf9c9f657c3551279fcdac471471d67ee57ab2286c7b5480168e6336e359741b469fa40e94716f0f95ec185d87bd57d58894d66d8c21d7db04 - languageName: node - linkType: hard - -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: ccf64bcb6c0232cdc5b7bd91ddd06e23a4b541f138336d4725233ac538041fb2f29c2e86c3c4a7a61ef990b665348db23a047060b9414c3a6603e9fa61ad4626 + version: 1.0.30001572 + resolution: "caniuse-lite@npm:1.0.30001572" + checksum: 7d02570fa576b158d96739f2c65ea3ad22e90a8b028a343902de1f13b7db8512144870f1d29ec5e9ae7189d96158d9643871b6e902e6680a06b27a9afe556da2 languageName: node linkType: hard @@ -2966,7 +2783,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": +"chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -2983,13 +2800,6 @@ __metadata: languageName: node linkType: hard -"check-more-types@npm:^2.24.0": - version: 2.24.0 - resolution: "check-more-types@npm:2.24.0" - checksum: 93fda2c32eb5f6cd1161a84a2f4107c0e00b40a851748516791dd9a0992b91bdf504e3bf6bf7673ce603ae620042e11ed4084d16d6d92b36818abc9c2e725520 - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -3018,38 +2828,6 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: "npm:^3.1.0" - checksum: 92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 - languageName: node - linkType: hard - -"cli-table3@npm:~0.6.1": - version: 0.6.3 - resolution: "cli-table3@npm:0.6.3" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 39e580cb346c2eaf1bd8f4ff055ae644e902b8303c164a1b8894c0dc95941f92e001db51f49649011be987e708d9fa3183ccc2289a4d376a057769664048cc0c - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: "npm:^3.0.0" - string-width: "npm:^4.2.0" - checksum: dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 - languageName: node - linkType: hard - "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -3062,9 +2840,9 @@ __metadata: linkType: hard "clsx@npm:^2.0.0": - version: 2.0.0 - resolution: "clsx@npm:2.0.0" - checksum: c09f43b3144a0b7826b6b11b6a111b2c7440831004eecc02d333533c5e58ef0aa5f2dce071d3b25fbb8c8ea97b45df96c74bcc1d51c8c2027eb981931107b0cd + version: 2.1.0 + resolution: "clsx@npm:2.1.0" + checksum: c09c00ad14f638366ca814097e6cab533dfa1972a358da5b557be487168acbb25b4c1395e89ffa842a8a61ba87a462d2b4885bc9d4f8410b598f3cb339599cdb languageName: node linkType: hard @@ -3114,14 +2892,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.16": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -3130,20 +2901,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^6.2.1": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: 85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea - languageName: node - linkType: hard - -"common-tags@npm:^1.8.0": - version: 1.8.2 - resolution: "common-tags@npm:1.8.2" - checksum: 23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -3165,13 +2922,6 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 - languageName: node - linkType: hard - "cosmiconfig@npm:^7.0.0": version: 7.1.0 resolution: "cosmiconfig@npm:7.1.0" @@ -3250,59 +3000,6 @@ __metadata: languageName: node linkType: hard -"cypress@npm:^13.6.1": - version: 13.6.1 - resolution: "cypress@npm:13.6.1" - dependencies: - "@cypress/request": "npm:^3.0.0" - "@cypress/xvfb": "npm:^1.2.4" - "@types/node": "npm:^18.17.5" - "@types/sinonjs__fake-timers": "npm:8.1.1" - "@types/sizzle": "npm:^2.3.2" - arch: "npm:^2.2.0" - blob-util: "npm:^2.0.2" - bluebird: "npm:^3.7.2" - buffer: "npm:^5.6.0" - cachedir: "npm:^2.3.0" - chalk: "npm:^4.1.0" - check-more-types: "npm:^2.24.0" - cli-cursor: "npm:^3.1.0" - cli-table3: "npm:~0.6.1" - commander: "npm:^6.2.1" - common-tags: "npm:^1.8.0" - dayjs: "npm:^1.10.4" - debug: "npm:^4.3.4" - enquirer: "npm:^2.3.6" - eventemitter2: "npm:6.4.7" - execa: "npm:4.1.0" - executable: "npm:^4.1.1" - extract-zip: "npm:2.0.1" - figures: "npm:^3.2.0" - fs-extra: "npm:^9.1.0" - getos: "npm:^3.2.1" - is-ci: "npm:^3.0.0" - is-installed-globally: "npm:~0.4.0" - lazy-ass: "npm:^1.6.0" - listr2: "npm:^3.8.3" - lodash: "npm:^4.17.21" - log-symbols: "npm:^4.0.0" - minimist: "npm:^1.2.8" - ospath: "npm:^1.2.2" - pretty-bytes: "npm:^5.6.0" - process: "npm:^0.11.10" - proxy-from-env: "npm:1.0.0" - request-progress: "npm:^3.0.0" - semver: "npm:^7.5.3" - supports-color: "npm:^8.1.1" - tmp: "npm:~0.2.1" - untildify: "npm:^4.0.0" - yauzl: "npm:^2.10.0" - bin: - cypress: bin/cypress - checksum: f89394d8d7a1978ff8d44506114273a3279bc679f3b2732caab4d2dfd317b97c4e8abb3e137109e9a986282fc4a3f925843907a3c6205f1b9b3ad30fb9380dd9 - languageName: node - linkType: hard - "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -3310,15 +3007,6 @@ __metadata: languageName: node linkType: hard -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: 64589a15c5bd01fa41ff7007e0f2c6552c5ef2028075daa16b188a3721f4ba001841bf306dfc2eee6e2e6e7f76b38f5f17fb21fa847504192290ffa9e150118a - languageName: node - linkType: hard - "data-urls@npm:^3.0.2": version: 3.0.2 resolution: "data-urls@npm:3.0.2" @@ -3330,14 +3018,7 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.10.4": - version: 1.11.10 - resolution: "dayjs@npm:1.11.10" - checksum: 4de9af50639d47df87f2e15fa36bb07e0f9ed1e9c52c6caa1482788ee9a384d668f1dbd00c54f82aaab163db07d61d2899384b8254da3a9184fc6deca080e2fe - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3349,7 +3030,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.2.7": +"debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -3508,20 +3189,10 @@ __metadata: languageName: node linkType: hard -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.1.0" - checksum: 6cf168bae1e2dad2e46561d9af9cbabfbf5ff592176ad4e9f0f41eaaf5fe5e10bb58147fe0a804de62b1ee9dad42c28810c88d652b21b6013c47ba8efa274ca1 - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.4.601": - version: 1.4.609 - resolution: "electron-to-chromium@npm:1.4.609" - checksum: 9675a79388acbaff5953a4c61589af7da93e0d1f9d6a3b284c7630f10126eb0998557b07448514214d5a3d19025310039b55f405ab701b1253130fc94907f743 + version: 1.4.616 + resolution: "electron-to-chromium@npm:1.4.616" + checksum: a02416f3293d28120d5132546a6aea614ebd2d820a684f41b1c20138331922ddc672c4a59bfc4b91bb5aee1ba608f6c10cd3f69c344cd434397e7f14a4c97348 languageName: node linkType: hard @@ -3555,15 +3226,6 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: "npm:^1.4.0" - checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 - languageName: node - linkType: hard - "engine.io-client@npm:~6.5.2": version: 6.5.3 resolution: "engine.io-client@npm:6.5.3" @@ -3594,16 +3256,6 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.6": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: "npm:^4.1.1" - strip-ansi: "npm:^6.0.1" - checksum: 43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 - languageName: node - linkType: hard - "entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -3735,32 +3387,35 @@ __metadata: linkType: hard "esbuild@npm:^0.19.3": - version: 0.19.8 - resolution: "esbuild@npm:0.19.8" - dependencies: - "@esbuild/android-arm": "npm:0.19.8" - "@esbuild/android-arm64": "npm:0.19.8" - "@esbuild/android-x64": "npm:0.19.8" - "@esbuild/darwin-arm64": "npm:0.19.8" - "@esbuild/darwin-x64": "npm:0.19.8" - "@esbuild/freebsd-arm64": "npm:0.19.8" - "@esbuild/freebsd-x64": "npm:0.19.8" - "@esbuild/linux-arm": "npm:0.19.8" - "@esbuild/linux-arm64": "npm:0.19.8" - "@esbuild/linux-ia32": "npm:0.19.8" - "@esbuild/linux-loong64": "npm:0.19.8" - "@esbuild/linux-mips64el": "npm:0.19.8" - "@esbuild/linux-ppc64": "npm:0.19.8" - "@esbuild/linux-riscv64": "npm:0.19.8" - "@esbuild/linux-s390x": "npm:0.19.8" - "@esbuild/linux-x64": "npm:0.19.8" - "@esbuild/netbsd-x64": "npm:0.19.8" - "@esbuild/openbsd-x64": "npm:0.19.8" - "@esbuild/sunos-x64": "npm:0.19.8" - "@esbuild/win32-arm64": "npm:0.19.8" - "@esbuild/win32-ia32": "npm:0.19.8" - "@esbuild/win32-x64": "npm:0.19.8" + version: 0.19.11 + resolution: "esbuild@npm:0.19.11" + dependencies: + "@esbuild/aix-ppc64": "npm:0.19.11" + "@esbuild/android-arm": "npm:0.19.11" + "@esbuild/android-arm64": "npm:0.19.11" + "@esbuild/android-x64": "npm:0.19.11" + "@esbuild/darwin-arm64": "npm:0.19.11" + "@esbuild/darwin-x64": "npm:0.19.11" + "@esbuild/freebsd-arm64": "npm:0.19.11" + "@esbuild/freebsd-x64": "npm:0.19.11" + "@esbuild/linux-arm": "npm:0.19.11" + "@esbuild/linux-arm64": "npm:0.19.11" + "@esbuild/linux-ia32": "npm:0.19.11" + "@esbuild/linux-loong64": "npm:0.19.11" + "@esbuild/linux-mips64el": "npm:0.19.11" + "@esbuild/linux-ppc64": "npm:0.19.11" + "@esbuild/linux-riscv64": "npm:0.19.11" + "@esbuild/linux-s390x": "npm:0.19.11" + "@esbuild/linux-x64": "npm:0.19.11" + "@esbuild/netbsd-x64": "npm:0.19.11" + "@esbuild/openbsd-x64": "npm:0.19.11" + "@esbuild/sunos-x64": "npm:0.19.11" + "@esbuild/win32-arm64": "npm:0.19.11" + "@esbuild/win32-ia32": "npm:0.19.11" + "@esbuild/win32-x64": "npm:0.19.11" dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true "@esbuild/android-arm": optional: true "@esbuild/android-arm64": @@ -3807,7 +3462,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 57d7d0bc40965bdd9d4c2d76d7f9b8890c59d764e2e3820d3b01af03b6187a90efc0acf05ec900d66672c15760d7377bd22d9330d302fecc492b27065c6941a6 + checksum: 0fd913124089e26d30ec30f73b94d4ef9607935251df3253f869106980a5d4c78aa517738c8746abe6e933262e91a77d31427ce468ed8fc7fe498a20f7f92fbc languageName: node linkType: hard @@ -3909,20 +3564,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-cypress@npm:^2.15.1": - version: 2.15.1 - resolution: "eslint-plugin-cypress@npm:2.15.1" - dependencies: - globals: "npm:^13.20.0" - peerDependencies: - eslint: ">= 3.2.1" - checksum: f404adf415ef6b986d3480397a26eb73976a9156bbf786f2d22b8df28bbf0e50d4b3c699caefd230f0de9d6e8850596ab1bcc471b173aede05373d2a5ae3c624 - languageName: node - linkType: hard - "eslint-plugin-import@npm:^2.29.0": - version: 2.29.0 - resolution: "eslint-plugin-import@npm:2.29.0" + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" dependencies: array-includes: "npm:^3.1.7" array.prototype.findlastindex: "npm:^1.2.3" @@ -3940,16 +3584,16 @@ __metadata: object.groupby: "npm:^1.0.1" object.values: "npm:^1.1.7" semver: "npm:^6.3.1" - tsconfig-paths: "npm:^3.14.2" + tsconfig-paths: "npm:^3.15.0" peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 761a4e1fbc2cd318e62350bed4c448f8b11ed83091d6bb7776f096556363a09debd9922b39fd2714c895edc9aaea82e08e684eb632283f880c58a91e4bae6733 + checksum: 5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 languageName: node linkType: hard "eslint-plugin-jest@npm:^27.6.0": - version: 27.6.0 - resolution: "eslint-plugin-jest@npm:27.6.0" + version: 27.6.1 + resolution: "eslint-plugin-jest@npm:27.6.1" dependencies: "@typescript-eslint/utils": "npm:^5.10.0" peerDependencies: @@ -3961,7 +3605,7 @@ __metadata: optional: true jest: optional: true - checksum: f6a61f91c382c82d653632b85749896c0c8c2ac1e17e43cbe242da0eb5ea9f818e796ac65f7e5d7904acea36392218181be4672869b566a756243e9d39737644 + checksum: 61f5f8ba5a40fcc26918a5e5d740b6ab0ffcb7aee96f4e2357dac44217394d7805ba155e6deb5a3575e6dc369505f29aa17a39507c2aaa8fed9a676277bf3dbc languageName: node linkType: hard @@ -4054,13 +3698,13 @@ __metadata: linkType: hard "eslint@npm:^8.55.0": - version: 8.55.0 - resolution: "eslint@npm:8.55.0" + version: 8.56.0 + resolution: "eslint@npm:8.56.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.55.0" + "@eslint/js": "npm:8.56.0" "@humanwhocodes/config-array": "npm:^0.11.13" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" @@ -4097,7 +3741,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: d28c0b60f19bb7d355cb8393e77b018c8f548dba3f820b799c89bb2e0c436ee26084e700c5e57e1e97e7972ec93065277849141b82e7b0c0d02c2dc1e553a2a1 + checksum: 2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb languageName: node linkType: hard @@ -4161,30 +3805,6 @@ __metadata: languageName: node linkType: hard -"eventemitter2@npm:6.4.7": - version: 6.4.7 - resolution: "eventemitter2@npm:6.4.7" - checksum: 35d8e9d51b919114eb072d33786274e1475db50efe00960c24c088ce4f76c07a826ccc927602724928efb3d8f09a7d8dd1fa79e410875118c0e9846959287f34 - languageName: node - linkType: hard - -"execa@npm:4.1.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: "npm:^7.0.0" - get-stream: "npm:^5.0.0" - human-signals: "npm:^1.1.1" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.0" - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - strip-final-newline: "npm:^2.0.0" - checksum: 02211601bb1c52710260edcc68fb84c3c030dc68bafc697c90ada3c52cc31375337de8c24826015b8382a58d63569ffd203b79c94fef217d65503e3e8d2c52ba - languageName: node - linkType: hard - "execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -4202,15 +3822,6 @@ __metadata: languageName: node linkType: hard -"executable@npm:^4.1.1": - version: 4.1.1 - resolution: "executable@npm:4.1.1" - dependencies: - pify: "npm:^2.2.0" - checksum: c3cc5d2d2e3cdb1b7d7b0639ebd5566d113d7ada21cfa07f5226d55ba2a210320116720e07570ed5659ef2ec516bc00c8f0488dac75d112fd324ef25c2100173 - languageName: node - linkType: hard - "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -4238,44 +3849,6 @@ __metadata: languageName: node linkType: hard -"extend@npm:~3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": "npm:^2.9.1" - debug: "npm:^4.1.1" - get-stream: "npm:^5.1.0" - yauzl: "npm:^2.10.0" - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee - languageName: node - linkType: hard - -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: f75114a8388f0cbce68e277b6495dc3930db4dde1611072e4a140c24e204affd77320d004b947a132e9a3b97b8253017b2b62dce661975fb0adced707abf1ab5 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -4311,11 +3884,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" + version: 1.16.0 + resolution: "fastq@npm:1.16.0" dependencies: reusify: "npm:^1.0.4" - checksum: 5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 + checksum: 38c1b49adba639af020727284a02af021acab764efd7f088bc31364e8a5b01ce9031eb6c5f7f304019b8267c3b7c236e79d6904884f50f94f83b1700b8a6619a languageName: node linkType: hard @@ -4328,24 +3901,6 @@ __metadata: languageName: node linkType: hard -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: "npm:~1.2.0" - checksum: 304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e - languageName: node - linkType: hard - -"figures@npm:^3.2.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 - languageName: node - linkType: hard - "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -4410,12 +3965,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.15.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" + version: 1.15.4 + resolution: "follow-redirects@npm:1.15.4" peerDependenciesMeta: debug: optional: true - checksum: 915a2cf22e667bdf47b1a43cc6b7dce14d95039e9bbf9a24d0e739abfbdfa00077dd43c86d4a7a19efefcc7a99af144920a175eedc3888d268af5df67c272ee5 + checksum: 5f37ed9170c9eb19448c5418fdb0f2b73f644b5364834e70791a76ecc7db215246f9773bbef4852cfae4067764ffc852e047f744b661b0211532155b73556a6a languageName: node linkType: hard @@ -4438,13 +3993,6 @@ __metadata: languageName: node linkType: hard -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 364f7f5f7d93ab661455351ce116a67877b66f59aca199559a999bd39e3cfadbfbfacc10415a915255e2210b30c23febe9aec3ca16bf2d1ff11c935a1000e24c - languageName: node - linkType: hard - "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -4456,29 +4004,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" - checksum: 706ef1e5649286b6a61e5bb87993a9842807fd8f149cd2548ee807ea4fb882247bdf7f6e64ac4720029c0cd5c80343de0e22eee1dc9e9882e12db9cc7bc016a4 - languageName: node - linkType: hard - -"fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -4582,15 +4107,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 - languageName: node - linkType: hard - "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -4617,24 +4133,6 @@ __metadata: languageName: node linkType: hard -"getos@npm:^3.2.1": - version: 3.2.1 - resolution: "getos@npm:3.2.1" - dependencies: - async: "npm:^3.2.0" - checksum: 21556fca1da4dfc8f1707261b4f9ff19b9e9bfefa76478249d2abddba3cd014bd6c5360634add1590b27e0b27d422e8f997dddaa0234aae1fa4c54f33f82e841 - languageName: node - linkType: hard - -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: "npm:^1.0.0" - checksum: c13f8530ecf16fc509f3fa5cd8dd2129ffa5d0c7ccdf5728b6022d52954c2d24be3706b4cdf15333eec52f1fbb43feb70a01dabc639d1d10071e371da8aaa52f - languageName: node - linkType: hard - "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -4682,15 +4180,6 @@ __metadata: languageName: node linkType: hard -"global-dirs@npm:^3.0.0": - version: 3.0.1 - resolution: "global-dirs@npm:3.0.1" - dependencies: - ini: "npm:2.0.0" - checksum: ef65e2241a47ff978f7006a641302bc7f4c03dfb98783d42bf7224c136e3a06df046e70ee3a010cf30214114755e46c9eb5eb1513838812fbbe0d92b14c25080 - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -4698,12 +4187,12 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0, globals@npm:^13.20.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: type-fest: "npm:^0.20.2" - checksum: fc05e184b3be59bffa2580f28551a12a758c3a18df4be91444202982c76f13f52821ad54ffaf7d3f2a4d2498fdf54aeaca8d4540fd9e860a9edb09d34ef4c507 + checksum: d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd languageName: node linkType: hard @@ -4739,7 +4228,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -4868,17 +4357,6 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.3.6": - version: 1.3.6 - resolution: "http-signature@npm:1.3.6" - dependencies: - assert-plus: "npm:^1.0.0" - jsprim: "npm:^2.0.2" - sshpk: "npm:^1.14.1" - checksum: f8d15d8c91a5a80805530e2f401a3f83ed55162058651d86ad00df294b159a54e001b5d00e04983f7542a55865aee02d2d83d68c8499137ff2bc142553d8dfc2 - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -4899,13 +4377,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: 18810ed239a7a5e23fb6c32d0fd4be75d7cd337a07ad59b8dbf0794cb0761e6e628349ee04c409e605fe55344716eab5d0a47a62ba2a2d0d367c89a2b4247b1e - languageName: node - linkType: hard - "human-signals@npm:^2.1.0": version: 2.1.0 resolution: "human-signals@npm:2.1.0" @@ -4922,13 +4393,6 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - "ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.0 resolution: "ignore@npm:5.3.0" @@ -4989,13 +4453,6 @@ __metadata: languageName: node linkType: hard -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: 2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 - languageName: node - linkType: hard - "internal-slot@npm:^1.0.5": version: 1.0.6 resolution: "internal-slot@npm:1.0.6" @@ -5067,17 +4524,6 @@ __metadata: languageName: node linkType: hard -"is-ci@npm:^3.0.0": - version: 3.0.1 - resolution: "is-ci@npm:3.0.1" - dependencies: - ci-info: "npm:^3.2.0" - bin: - is-ci: bin.js - checksum: 0e81caa62f4520d4088a5bef6d6337d773828a88610346c4b1119fb50c842587ed8bef1e5d9a656835a599e7209405b5761ddf2339668f2d0f4e889a92fe6051 - languageName: node - linkType: hard - "is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" @@ -5144,16 +4590,6 @@ __metadata: languageName: node linkType: hard -"is-installed-globally@npm:~0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: "npm:^3.0.0" - is-path-inside: "npm:^3.0.2" - checksum: f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d - languageName: node - linkType: hard - "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -5191,7 +4627,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 @@ -5265,20 +4701,6 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: 00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 - languageName: node - linkType: hard - "is-weakmap@npm:^2.0.1": version: 2.0.1 resolution: "is-weakmap@npm:2.0.1" @@ -5326,13 +4748,6 @@ __metadata: languageName: node linkType: hard -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -5898,8 +5313,8 @@ __metadata: linkType: hard "jotai@npm:^2.6.0": - version: 2.6.0 - resolution: "jotai@npm:2.6.0" + version: 2.6.1 + resolution: "jotai@npm:2.6.1" peerDependencies: "@types/react": ">=17.0.0" react: ">=17.0.0" @@ -5908,7 +5323,7 @@ __metadata: optional: true react: optional: true - checksum: 8e1687453c3713d227c8081291e286b51ca634657dc456303b3d9f9bf80d67b4a5e71481768675a8480789b432e3b0c0159521ac7794df8a0cce989713fdc7a4 + checksum: 555145ca5feb2a18c51fc4b23fa8dbcf5c3701ebb306d844ff7ac6991aa1db1a6ebffdf4e460dd59d6678656d9a477db51ef037487f8dd0a618c298deed3cb6d languageName: node linkType: hard @@ -5942,13 +5357,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: e046e05c59ff880ee4ef68902dbdcb6d2f3c5d60c357d4d68647dc23add556c31c0e5f41bdb7e69e793dd63468bd9e085da3636341048ef577b18f5b713877c0 - languageName: node - linkType: hard - "jsdom@npm:^20.0.0": version: 20.0.3 resolution: "jsdom@npm:20.0.3" @@ -6018,13 +5426,6 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 - languageName: node - linkType: hard - "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -6032,13 +5433,6 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 - languageName: node - linkType: hard - "json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -6066,31 +5460,6 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 - languageName: node - linkType: hard - -"jsprim@npm:^2.0.2": - version: 2.0.2 - resolution: "jsprim@npm:2.0.2" - dependencies: - assert-plus: "npm:1.0.0" - extsprintf: "npm:1.3.0" - json-schema: "npm:0.4.0" - verror: "npm:1.10.0" - checksum: 677be2d41df536c92c6d0114a492ef197084018cfbb1a3e10b1fa1aad889564b2e3a7baa6af7949cc2d73678f42368b0be165a26bd4e4de6883a30dd6a24e98d - languageName: node - linkType: hard - "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -6135,13 +5504,6 @@ __metadata: languageName: node linkType: hard -"lazy-ass@npm:^1.6.0": - version: 1.6.0 - resolution: "lazy-ass@npm:1.6.0" - checksum: 4af6cb9a333fbc811268c745f9173fba0f99ecb817cc9c0fae5dbf986b797b730ff525504128f6623b91aba32b02124553a34b0d14de3762b637b74d7233f3bd - languageName: node - linkType: hard - "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -6166,27 +5528,6 @@ __metadata: languageName: node linkType: hard -"listr2@npm:^3.8.3": - version: 3.14.0 - resolution: "listr2@npm:3.14.0" - dependencies: - cli-truncate: "npm:^2.1.0" - colorette: "npm:^2.0.16" - log-update: "npm:^4.0.0" - p-map: "npm:^4.0.0" - rfdc: "npm:^1.3.0" - rxjs: "npm:^7.5.1" - through: "npm:^2.3.8" - wrap-ansi: "npm:^7.0.0" - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 8301703876ad6bf50cd769e9c1169c2aa435951d69d4f54fc202a13c1b6006a9b3afbcf9842440eb22f08beec4d311d365e31d4ed2e0fcabf198d8085b06a421 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -6212,13 +5553,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: 46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 - languageName: node - linkType: hard - "lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -6226,28 +5560,6 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:^4.0.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: 67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 - languageName: node - linkType: hard - -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" - dependencies: - ansi-escapes: "npm:^4.3.0" - cli-cursor: "npm:^3.1.0" - slice-ansi: "npm:^4.0.0" - wrap-ansi: "npm:^6.2.0" - checksum: 18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86 - languageName: node - linkType: hard - "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -6366,7 +5678,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19": +"mime-types@npm:^2.1.12": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -6382,6 +5694,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.3, minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -6391,15 +5712,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac - languageName: node - linkType: hard - "minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -6589,7 +5901,7 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": +"npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" dependencies: @@ -6693,7 +6005,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -6702,7 +6014,7 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": +"onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: @@ -6725,13 +6037,6 @@ __metadata: languageName: node linkType: hard -"ospath@npm:^1.2.2": - version: 1.2.2 - resolution: "ospath@npm:1.2.2" - checksum: e485a6ca91964f786163408b093860bf26a9d9704d83ec39ccf463b9f11ea712b780b23b73d1f64536de62c5f66244dd94ed83fc9ffe3c1564dd1eed5cdae923 - languageName: node - linkType: hard - "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -6801,15 +6106,13 @@ __metadata: "@types/react": "npm:^18.2.42" "@types/react-dom": "npm:^18.2.17" "@types/react-window": "npm:^1.8.8" - "@typescript-eslint/eslint-plugin": "npm:^6.13.2" - "@typescript-eslint/parser": "npm:^6.13.2" + "@typescript-eslint/eslint-plugin": "npm:^6.17.0" + "@typescript-eslint/parser": "npm:^6.17.0" "@vitejs/plugin-react-swc": "npm:^3.5.0" - cypress: "npm:^13.6.1" deep-object-diff: "npm:^1.1.9" eslint: "npm:^8.55.0" eslint-config-prettier: "npm:^9.1.0" eslint-import-resolver-typescript: "npm:^3.6.1" - eslint-plugin-cypress: "npm:^2.15.1" eslint-plugin-import: "npm:^2.29.0" eslint-plugin-jest: "npm:^27.6.0" eslint-plugin-jsx-a11y: "npm:^6.8.0" @@ -6908,20 +6211,6 @@ __metadata: languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 - languageName: node - linkType: hard - -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 22c54de06f269e29f640e0e075207af57de5052a3d15e360c09b9a8663f393f6f45902006c1e71aa8a5a1cdfb1a47fe268826f8496d6425c362f00f5bc3e85d9 - languageName: node - linkType: hard - "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -6936,13 +6225,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.2.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc - languageName: node - linkType: hard - "pirates@npm:^4.0.4": version: 4.0.6 resolution: "pirates@npm:4.0.6" @@ -6978,18 +6260,11 @@ __metadata: linkType: hard "prettier@npm:^3.1.0": - version: 3.1.0 - resolution: "prettier@npm:3.1.0" + version: 3.1.1 + resolution: "prettier@npm:3.1.1" bin: prettier: bin/prettier.cjs - checksum: a45ea70aa97fde162ea4c4aba3dfc7859aa6a732a1db34458d9535dc3c2c16d3bc3fb5689e6cd76aa835562555303b02d9449fd2e15af3b73c8053557e25c5b6 - languageName: node - linkType: hard - -"pretty-bytes@npm:^5.6.0": - version: 5.6.0 - resolution: "pretty-bytes@npm:5.6.0" - checksum: f69f494dcc1adda98dbe0e4a36d301e8be8ff99bfde7a637b2ee2820e7cb583b0fc0f3a63b0e3752c01501185a5cf38602c7be60da41bdf84ef5b70e89c370f3 + checksum: facc944ba20e194ff4db765e830ffbcb642803381f0d2033ed397e79904fa4ccc877dc25ad68f42d36985c01d051c990ca1b905fb83d2d7d65fe69e4386fa1a3 languageName: node linkType: hard @@ -7011,13 +6286,6 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -7049,13 +6317,6 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:1.0.0": - version: 1.0.0 - resolution: "proxy-from-env@npm:1.0.0" - checksum: c64df9b21f7f820dc882cd6f7f81671840acd28b9688ee3e3e6af47a56ec7f0edcabe5bc96b32b26218b35eeff377bcc27ac27f89b6b21401003e187ff13256f - languageName: node - linkType: hard - "proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -7070,16 +6331,6 @@ __metadata: languageName: node linkType: hard -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 - languageName: node - linkType: hard - "punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -7094,15 +6345,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.10.4": - version: 6.10.4 - resolution: "qs@npm:6.10.4" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 7a8c9d77968aeccb769aedd7e047c0e0109dad0cfa57cab1ad906f4069fd58f361b80abd2de5854ba9a09b4c5d06d6a2c82108766f1f1527572fe6130deaa471 - languageName: node - linkType: hard - "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -7130,13 +6372,13 @@ __metadata: linkType: hard "react-error-boundary@npm:^4.0.11": - version: 4.0.11 - resolution: "react-error-boundary@npm:4.0.11" + version: 4.0.12 + resolution: "react-error-boundary@npm:4.0.12" dependencies: "@babel/runtime": "npm:^7.12.5" peerDependencies: react: ">=16.13.1" - checksum: 33dad3df7687971e65c7182d97f44bd618cb5d77d1c338e0a7c17c5cf7706a07b9055fffb771ff19bad750d40dd3cfd18d661a60b0518e73197e294dc185f18c + checksum: de599799efab78929447e11f4cfb3779e99ca87a8af1b3c56ab49ecb0bcc44fe924cfad4d2f3cc77c6cc8d992e3c47e356c70edebb825ae867aa621438035209 languageName: node linkType: hard @@ -7206,9 +6448,9 @@ __metadata: linkType: hard "regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: e25f062c1a183f81c99681691a342760e65c55e8d3a4d4fe347ebe72433b123754b942b70b622959894e11f8a9131dc549bd3c9a5234677db06a4af42add8d12 + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 languageName: node linkType: hard @@ -7223,15 +6465,6 @@ __metadata: languageName: node linkType: hard -"request-progress@npm:^3.0.0": - version: 3.0.0 - resolution: "request-progress@npm:3.0.0" - dependencies: - throttleit: "npm:^1.0.0" - checksum: d5dcb7155a738572c8781436f6b418e866066a30eea0f99a9ab26b6f0ed6c13637462bba736357de3899b8d30431ee9202ac956a5f8ccdd0d9d1ed0962000d14 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -7335,16 +6568,6 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -7359,14 +6582,7 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: a17fd7b81f42c7ae4cb932abd7b2f677b04cc462a03619fb46945ae1ccae17c3bc87c020ffdde1751cbfa8549860a2883486fdcabc9b9de3f3108af32b69a667 - languageName: node - linkType: hard - -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -7378,22 +6594,22 @@ __metadata: linkType: hard "rollup@npm:^4.2.0": - version: 4.7.0 - resolution: "rollup@npm:4.7.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.7.0" - "@rollup/rollup-android-arm64": "npm:4.7.0" - "@rollup/rollup-darwin-arm64": "npm:4.7.0" - "@rollup/rollup-darwin-x64": "npm:4.7.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.7.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.7.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.7.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.7.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.7.0" - "@rollup/rollup-linux-x64-musl": "npm:4.7.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.7.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.7.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.7.0" + version: 4.9.2 + resolution: "rollup@npm:4.9.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.9.2" + "@rollup/rollup-android-arm64": "npm:4.9.2" + "@rollup/rollup-darwin-arm64": "npm:4.9.2" + "@rollup/rollup-darwin-x64": "npm:4.9.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.9.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.9.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.9.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.9.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.9.2" + "@rollup/rollup-linux-x64-musl": "npm:4.9.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.9.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.9.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.9.2" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -7426,7 +6642,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 1226252168e701aa50d8e71fc42f0561f16388b83f224fdf48aea20784143a668c897c5a8f80dc15f684fab4ece689f9d99ac3e3deab02d6b9d5dd1637b38428 + checksum: c9cd2bd09c3074730c51f22088fdc27c6ff674c81724cc75dcc26d36039a61be8ef982923493b680d583002f20f0792bca7fbbb355e303deaefbd41906a8c638 languageName: node linkType: hard @@ -7439,7 +6655,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.1, rxjs@npm:^7.8.1": +"rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -7460,13 +6676,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -7478,7 +6687,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -7573,7 +6782,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -7601,28 +6810,6 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - astral-regex: "npm:^2.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - checksum: 88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - astral-regex: "npm:^2.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - checksum: 6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -7711,27 +6898,6 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.14.1": - version: 1.18.0 - resolution: "sshpk@npm:1.18.0" - dependencies: - asn1: "npm:~0.2.3" - assert-plus: "npm:^1.0.0" - bcrypt-pbkdf: "npm:^1.0.0" - dashdash: "npm:^1.12.0" - ecc-jsbn: "npm:~0.1.1" - getpass: "npm:^0.1.1" - jsbn: "npm:~0.1.0" - safer-buffer: "npm:^2.0.2" - tweetnacl: "npm:~0.14.0" - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: e516e34fa981cfceef45fd2e947772cc70dbd57523e5c608e2cd73752ba7f8a99a04df7c3ed751588e8d91956b6f16531590b35d3489980d1c54c38bebcd41b1 - languageName: node - linkType: hard - "ssri@npm:^10.0.0": version: 10.0.5 resolution: "ssri@npm:10.0.5" @@ -7903,7 +7069,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -7965,29 +7131,6 @@ __metadata: languageName: node linkType: hard -"throttleit@npm:^1.0.0": - version: 1.0.1 - resolution: "throttleit@npm:1.0.1" - checksum: 4d41a1bf467646b1aa7bec0123b78452a0e302d7344f6a67e43e68434f0a02ea3ba44df050a40c69adeb9cae3cbf6b36b38cfe94bcc3c4a8243c9b63e38e059b - languageName: node - linkType: hard - -"through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - -"tmp@npm:~0.2.1": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" - dependencies: - rimraf: "npm:^3.0.0" - checksum: 67607aa012059c9ce697bee820ee51bc0f39b29a8766def4f92d3f764d67c7cf9205d537d24e0cb1ce9685c40d4c628ead010910118ea18348666b5c46ed9123 - languageName: node - linkType: hard - "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -8011,7 +7154,7 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.3": +"tough-cookie@npm:^4.1.2": version: 4.1.3 resolution: "tough-cookie@npm:4.1.3" dependencies: @@ -8079,15 +7222,15 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.2": - version: 3.14.2 - resolution: "tsconfig-paths@npm:3.14.2" +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: "@types/json5": "npm:^0.0.29" json5: "npm:^1.0.2" minimist: "npm:^1.2.6" strip-bom: "npm:^3.0.0" - checksum: fdc92bb7b18b31c0e76f8ec4f98d07236b09590fd6578e587ad024792c8b2235d65125a8fd007fa47a84400f84ceccbf33f24e5198d953249e7204f4cef3517c + checksum: 5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 languageName: node linkType: hard @@ -8116,22 +7259,6 @@ __metadata: languageName: node linkType: hard -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a - languageName: node - linkType: hard - -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -8273,20 +7400,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: 73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a - languageName: node - linkType: hard - -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.0.13": version: 1.0.13 resolution: "update-browserslist-db@npm:1.0.13" @@ -8320,15 +7433,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -8347,20 +7451,9 @@ __metadata: languageName: node linkType: hard -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: "npm:^1.0.0" - core-util-is: "npm:1.0.2" - extsprintf: "npm:^1.2.0" - checksum: 37ccdf8542b5863c525128908ac80f2b476eed36a32cb944de930ca1e2e78584cc435c4b9b4c68d0fc13a47b45ff364b4be43aa74f8804f9050140f660fb660d - languageName: node - linkType: hard - "vite@npm:^5.0.7": - version: 5.0.7 - resolution: "vite@npm:5.0.7" + version: 5.0.10 + resolution: "vite@npm:5.0.10" dependencies: esbuild: "npm:^0.19.3" fsevents: "npm:~2.3.3" @@ -8394,7 +7487,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: ae3a54bcb7933bc1420c54f7d72dfa88b80e53557e7de19dee018d5e8e2545d967bcbd6af48fa96dd132229f25334ff61df42621c034fe8275d9076dadb3ad7f + checksum: d666b2760d2a7ea1d0d35f67c042053e562144f80554be4e4dc58e607fd5f62193cd203d73ab2e315df66830d8b9d9a2e3509d0208bdef1b2e92e0a5c364df84 languageName: node linkType: hard @@ -8448,9 +7541,9 @@ __metadata: linkType: hard "whatwg-fetch@npm:^3.6.19": - version: 3.6.19 - resolution: "whatwg-fetch@npm:3.6.19" - checksum: 01dd755492d594c8d71d47811bb3886cdb7d566684daff5ec658cf148fa2418de6b562a94ff8cceaf1cf277bfb99fa6b61258cc20de5053f5817a4d419b5d293 + version: 3.6.20 + resolution: "whatwg-fetch@npm:3.6.20" + checksum: fa972dd14091321d38f36a4d062298df58c2248393ef9e8b154493c347c62e2756e25be29c16277396046d6eaa4b11bd174f34e6403fff6aaca9fb30fa1ff46d languageName: node linkType: hard @@ -8562,17 +7655,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c - languageName: node - linkType: hard - "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -8602,8 +7684,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0": - version: 8.14.2 - resolution: "ws@npm:8.14.2" + version: 8.16.0 + resolution: "ws@npm:8.16.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -8612,7 +7694,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 35b4c2da048b8015c797fd14bcb5a5766216ce65c8a5965616a5440ca7b6c3681ee3cbd0ea0c184a59975556e9d58f2002abf8485a14d11d3371770811050a16 + checksum: a7783bb421c648b1e622b423409cb2a58ac5839521d2f689e84bc9dc41d59379c692dd405b15a997ea1d4c0c2e5314ad707332d0c558f15232d2bc07c0b4618a languageName: node linkType: hard @@ -8702,16 +7784,6 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - fd-slicer: "npm:~1.1.0" - checksum: f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 - languageName: node - linkType: hard - "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1"