diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 4f51e577..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-env node */ -module.exports = { - root: true, - extends: [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - '@vue/eslint-config-typescript/recommended', - ], - env: { - 'vue/setup-compiler-macros': true, - node: true, - }, - rules: { - '@typescript-eslint/no-unused-vars': [ - 'error', - {argsIgnorePattern: '^_'}, - ], - '@typescript-eslint/no-empty-function': [ - 'error', - {allow: ['methods']}, - ], - 'max-len': ['error', {code: 80, comments: 80}], - 'operator-linebreak': [ - 'error', - 'before', - {overrides: {'=': 'after'}}, - ], - 'vue/multi-word-component-names': 'off', - // For the Paramable interface, v-model directives need type annotation - 'vue/valid-v-model': 'off', - }, - overrides: [ - { - files: [ - 'src/components/MageExchangeA.vue', - 'src/components/MageSearchSquare.vue', - ], - rules: {'max-len': 'off'}, - }, - ], -} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7dcf091e..07be448f 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,10 @@ -By submitting this PR, I am indicating to the Numberscope maintainers that I have read and understood the [contributing guidelines](https://numberscope.colorado.edu/doc/CONTRIBUTING/) and that this PR follows those guidelines to the best of my knowledge. I have also read the [pull request checklist](https://numberscope.colorado.edu/doc/doc/pull-request-checklist/) and followed the instructions therein. +By submitting this PR, I am indicating to the Numberscope maintainers that I +have read and understood the +[contributing guidelines](https://numberscope.colorado.edu/doc/CONTRIBUTING/) +and that this PR follows those guidelines to the best of my knowledge. I have +also read the +[pull request checklist](https://numberscope.colorado.edu/doc/doc/pull-request-checklist/) +and followed the instructions therein.
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4e717ab9..f500ec4c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,5 +1,10 @@ name: 'CI' -on: pull_request +on: + push: + branches: + - main + pull_request: + jobs: lint: runs-on: ubuntu-22.04 @@ -12,13 +17,15 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v3 with: - node-version: '18.x' + node-version: '20.x' - name: Install dependencies run: npm install - name: Lint run: npm run lint:check + - name: Type check + run: npm run typecheck test: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python @@ -28,8 +35,20 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v3 with: - node-version: '18.x' + node-version: '20.x' - name: Install dependencies run: npm install - - name: Test + - name: Unit test run: npm run test:unit + - name: Build production site + run: npm run build + - name: Install Playwright browsers + run: npx playwright install --with-deps + - name: End-to-end test + run: npx playwright test -c e2e/playci.config.ts +### Uncomment when you need to re-extract snapshots +# - name: Extract snapshots +# uses: actions/upload-artifact@v4 +# with: +# name: updated_snapshots +# path: e2e/tests/ci_snaps diff --git a/.gitignore b/.gitignore index 9e9b3eab..5da1aa2e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,12 +6,22 @@ npm-debug.log* # Subdirectories generated by various tools .venv coverage -dist node_modules -site # File for storing your local configuration *.local # Emacs backup files *~ + +# Build files +dist +etc/npm_install_ran_at +etc/typechecked_at +site + +# End-to-end testing +e2e/.last_cl_args +e2e/certificate +e2e/docker_image_built +e2e/results diff --git a/.husky/pre-commit b/.husky/pre-commit index 91864d2b..07cf0b26 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,8 +1,8 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -npm run lint:list || echo 'Files listed above will be reformatted and staged.' -npm run lint:staged +node tools/cleancommit.js npm run lint:check -npm run typecheck npm run test:unit +npm run test:e2e + diff --git a/.prettierignore b/.prettierignore index fde52cf8..da926c4d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,15 +8,18 @@ *.generator *.local *~ +.env +.env.* +.github/workflows .gitignore .husky .prettierignore .vscode coverage dist +index.html node_modules package-lock.json -index.html +e2e/*-snapshots +e2e/results site -.env -.env.* diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 7d6cf731..00000000 --- a/.prettierrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "arrowParens": "avoid", - "bracketSameLine": true, - "bracketSpacing": false, - "embeddedLanguageFormatting": "auto", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "jsxSingleQuote": false, - "printWidth": 78, - "proseWrap": "always", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": false, - "singleQuote": true, - "tabWidth": 4, - "trailingComma": "es5", - "useTabs": false, - "vueIndentScriptAndStyle": true -} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 95472f8f..df73b305 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,12 +24,13 @@ applies to other repos as well.) [read about basic Git operations](./doc/working-with-git-and-github.md#basic-operations). 5. [Push your branch to GitHub](./doc/working-with-git-and-github.md#push-a-branch). 6. [Read Numberscope's coding principles guide](./doc/code-principles.md). -7. [Read Numberscope's style guide](./doc/code-style.md). You should also - familiarize yourself with frontscope's internal code structure and APIs. - Documentation on these topics is generally incorporated into the relevant - source files (see [this example](src/shared/math.ts)). However, it is all - gathered in the "Internal code and APIs" section of the navigation bar in - the [online docs](https://numberscope.colorado.edu/doc). +7. Familiarize yourself with frontscope's + [code organization](./doc/code-organization.md) and internal APIs. Some + information on the latter topic may only be found in comments in the + relevant sources files, as the documentation project is ongoing. However, + all such formal documentation currently being generated is gathered in the + "Internal code and APIs" section of the navigation bar in the + [online docs](https://numberscope.colorado.edu/doc). 8. If you are working on a visualizer, read [the doc on making a visualizer](./doc/making-a-visualizer.md). 9. [Work through Numberscope's pull request checklist](./doc/pull-request-checklist.md). @@ -64,9 +65,9 @@ their factorizations, see `backscope` applies to other repos as well.) If you've read the -[Numberscope code principles guide](./doc/code-principles.md) and the -[Numberscope code style guide](./doc/code-style.md), and you think your code -is ready to be reviewed by someone at Numberscope, follow these steps: +[Numberscope code principles guide](./doc/code-principles.md) and have adhered +to the [code organization](./doc/code-organization.md), and you think your +code is ready to be reviewed by someone at Numberscope, follow these steps: 1. Work through [Numberscope's pull request checklist](./doc/pull-request-checklist.md). diff --git a/doc/behind-the-scenes.md b/doc/behind-the-scenes.md index d6e1926a..7a5cd81f 100644 --- a/doc/behind-the-scenes.md +++ b/doc/behind-the-scenes.md @@ -29,6 +29,9 @@ implement these interfaces yourself. That means including all the required properties and methods, and making sure they behave in the way the engine expects. +And just as a reminder, only generate random numbers (if needed) using mathjs; +see the [math documentation](../src/shared/math.md). + ## Visualizers Source: `VisualizerInterface.ts`. diff --git a/doc/code-organization.md b/doc/code-organization.md new file mode 100644 index 00000000..5bb4d109 --- /dev/null +++ b/doc/code-organization.md @@ -0,0 +1,84 @@ +# Code organization + +Here's a brief overview of the directory layout of this project, to help you +find what you're looking for, and to guide you when you need to create new +files. + +## Top level of project + +Here you will find the obligatory README.md and licensing/contributing +information, project manifests like package.json and requirements.txt, and the +top-level index.html for vite. There are also a few hidden (dotfile) +configuration files, like git's own .git and .gitignore files, similar ones +for github and Husky, and the .env files that control environment variables. +Otherwise, we try to keep the top level uncluttered, and you should rarely +need to create a file here. + +- ### etc/ -- Configuration files + + In particular, since frontscope uses so many tools, we have moved all of + their configuration files into etc/, as they were accumulating in the top + level. You should be able to find almost all configuration information + here, and any new tool that needs to be introduced should be invoked so as + to find its configuration file in the etc/ directory. As one example, the + Vite and Vitest configuration files are located here. As an exception, the + several tsconfig files for the TypeScript compiler are located in the + top-level directory itself -- we have not been able to get them to work in + any other location. + +- ### src/ -- Source code + + All of the actual TypeScript and Vue source code for the frontscope web + application is located here, along with assets that are used in-browser. + Only the top-level App.vue and main.ts are directly at the top level. The + rest are arranged in subdirectories: + + - #### src/assets/ and src/public/ + + Non-code assets needed when the site is deployed. + + - #### src/components/ -- Vue components + + - #### src/router/ -- Vue router + + - #### src/sequences/ -- Sequence implementations + + These classes provide the integer sequences that can be analyzed with + Numberscope. + + - #### src/shared/ + + Code needed by multiple other directories is located here. + + - #### src/views/ -- Vue views selected by the router + + - #### visualizers/ and visualizers-workbench/ + + These directories contain the implementations of the various means of + turning a sequence of numbers into a graphical presentation. In some + sense, these are the heart of Numberscope. The workbench directory is + for Visualizers under development (together with a template + permanently kept there), and those in visualizers/ will automatically + appear in the user interface + +- ### doc/ -- Documentation + + This directory contains the bulk of the content for the integrated + documentation site. Some content is also extracted from the source code + and incorporated when the documentation site is built. The styling + information for the site is in etc/doc_theme/. + +- ### e2e/ -- End-to-end in-browser testing + + All files relating to end-to-end testing are located here. Configuration + files are directly in this folder (another minor exception to the rule + mentioned above that all configuration is in etc/). + + - #### e2e/tests/ -- End-to-end test specifications + - #### e2e/results/ -- Files generated via testing. + +- ### tools/ -- Internal utilities + + Contains code for any custom utilities used for example in the building + and maintenance of frontscope. Nothing here should actually be needed by + the eventual web application. diff --git a/doc/code-principles.md b/doc/code-principles.md index 84ca59c7..d4539a33 100644 --- a/doc/code-principles.md +++ b/doc/code-principles.md @@ -28,3 +28,20 @@ Practically speaking this means: comments that merely repeat what the code already says - only have code that actually does something -- don't include any commented out code or code that can't be reached or run +- minimize the number of return statements in a function + - if there are conditions under which you can bail out easily, it's OK + to check for them near the top of the function and return from there + - otherwise, strive to have all returns at or near the end of the + function + +## Code style/formatting + +We rely on automated tools (ESLint and Prettier as of this writing) to keep +the layout/style of our code uniform for readability. Any new code will be +required to conform in the commit/PR process. In fact, often the tools will be +able to adjust the layout of the code for you: if a commit is rejected because +of formatting non-compliance, try `npm run lint` -- just be aware that it will +modify your source files. If you just want to see the issues without touching +any of your files, use `npm run lint:check`. See +[working with the package manager](working-with-pm.md) for details on these +and other scripts you can run. diff --git a/doc/code-style.md b/doc/code-style.md deleted file mode 100644 index 3ba96a3c..00000000 --- a/doc/code-style.md +++ /dev/null @@ -1,13 +0,0 @@ -# Code style - -Outside of the code formatting that is covered by our automated tools (ESLint -and Prettier as of this writing), we also like to: - -# Minimize the number of return statements in a function - -- If you can easily figure out that you need to bail out of a function, go - ahead and put a return at the top of the function and then proceed with - the rest of the function. -- Otherwise, try to minimize the number of return statements in a function. - Having them strewn throughout a function (especially a long function) is - generally hard to read. diff --git a/doc/code-tests.md b/doc/code-tests.md new file mode 100644 index 00000000..2909e0eb --- /dev/null +++ b/doc/code-tests.md @@ -0,0 +1,207 @@ +# Code tests + +For its front end, Numberscope uses [`vitest`](https://vitest.dev/) for unit +tests and low-level integration tests that run without a browser, and +[`Playwright`](https://playwright.dev/) for higher-level integration and +end-to-end integration tests that run in a browser. + +### Running tests + +The package manager is set up with scripts that make basic running of all +tests very convenient. To run all unit (vitest) tests, execute +`npm run test:unit`. To run all end-to-end (Playwright) tests, use +`npm run test:e2e`. + +Here is some more detailed information about running the end-to-end tests: + +- They result in accessing a considerable amount of (sequence) data over the + internet. Therefore, if you run them when your internet connection is poor + or inactive, some of the tests will fail. + +- Because they are rather expensive (in terms of computation time), the + end-to-end tests are designed to run only when something has changed since + they last passed. So if you run the tests, and they all pass, and you + immediately re-execute `npm run test:e2e`, it will simply tell you that + the tests are "up to date." + +- When all of the end-to-end tests have passed, the last three lines of the + output should typically look as follows: (There are two copies of the + "status": "passed" line because there are two batches of tests.) + +``` + "status": "passed", + "status": "passed", +echo 'All tests passed' > e2e/certificate +``` + +- By default, the end-to-end tests mostly run in a + [Docker](https://www.docker.com/) container, which we have found maximizes + the reproducibility of the tests. So as explained in some more detail in + the [onboarding](./onboarding.md) page, you will need to install Docker on + your system and make sure the Docker daemon is running in order to run the + tests. + + You can also run them directly in your ambient system with + `npm run build && npm run test:e2e:cmd` or just `npm run test:e2e:ui` for + the graphical front end to Playwright, but note that some tests, + especially image comparison tests, may fail when in fact they would + succeed when run in the standard way. + +#### Customizing vitest runs + +If some situation in the code has led to one of the unit tests failing, you +may find yourself in a situation in which you need to run that test +repeatedly, and would rather not run all of the other tests. Fortunately, the +tests are organized by source directory. Hence, if the failure is occurring in +a test associated with the `src/shared` directory (say), then you can run just +the tests associated with that directory via `npm run test:unit src/shared`. +For a brief overview of other options you might use with running unit tests, +try `npm run test:unit -- --help`. (Note the extra `--` stuck in there, which +is needed because the test option you want to use here itself begins with +`--`.) + +#### Customizing Playwright runs + +You may find yourself in a similar situation with end-to-end testing. In this +case, all of the tests are specified in the top-level `e2e` directory. +However, they are organized into thematic files, which you can see via +`ls e2e`, for example. You can run just one of these collections of tests, say +the ones for the Gallery view in `e2e/gallery.spec.ts`, by executing +`npm run test:e2e gallery`. And similarly to unit tests, you can obtain an +overview of other possibilities via `npm run test:e2e -- --help`. + +## Creating tests + +If you are considering contributing code to Numberscope, you will very likely +need to create tests. The [pull request checklist](pull-request-checklist.md) +notes that any new feature (including a new visualizer) requires some test +that exercises it; and any bug fix should include a test that would have +failed with the buggy code but which now succeeds on the improved code. There +are somewhat different processes for adding each of the two kinds of tests. + +### Adding a unit test + +As mentioned above, these tests are organized per source directory, in +subdirectories named `__tests__/`. More than likely such a directory will +already exist alongside the source file you want to test, but if not, simply +create one -- vitest will find it automatically. Within the `__tests__/` +directory, the tests are organized by source file, and named accordingly, with +file extension `.spec.ts`. Again, if you are adding tests related to a file +that already has associated tests, you can just insert new tests in an +existing file. If there are no tests yet for the file you are concerned with, +you can just create the `.spec.ts` file and the framework will automatically +execute it. + +Let's go through the latter case. At the time of this writing, there was no +test specification for the `src/shared/defineFeatured.ts` file that provides +the specimens for the Featured Gallery. So, we simply created +`src/shared/__tests__/defineFeatured.spec.ts`. At the top of the file you need +to import the test facilities from `vitest`, and typically all of the exported +entities from the module being tested, like so: + +``` +{! ../src/shared/__tests__/defineFeatured.spec.ts extract: { stop: ibe..g } !} +``` + +In this case, there is only one export, `getFeatured`, so the test +specification is pretty brief. Here it is in full: + +``` +{! ../src/shared/__tests__/defineFeatured.spec.ts extract: { start: tured } !} +``` + +As you can see, tests are arranged in groups, each consisting of a call to +`describe`. The first argument is a string saying what is being tested in that +group, typically one of the exports. The second argument is a function that +executes the test. + +Within that function, each test is specified by a call to `it`. The first +argument is again descriptive, giving the property that is being tested. And +the second argument is again a function that runs the test. The body of this +function performs some trial computation using the item being tested, +typically followed by one or more assertions about the outcome of that +computation. The vitest framework provides a +[mini-language](https://vitest.dev/api/expect.html) for specifying assertions, +each triggered by a call to the `expect` function. You can see a few examples +in the code above (admittedly some a bit contrived for the sake of this +exposition). + +And that's all there is to it. With this spec file newly in place, +`npm run test:unit` reports three more passed tests than before. It's ready to +be committed and made part of a pull request. + +### Adding an end-to-end test + +The Playwright framework for end-to-end testing is broadly similar. In this +case, the spec files are all in the `e2e` directory, and again, they will +automatically be discovered and run when placed there. The file extension is +the same, and the main names are essentially arbitrary but should give an idea +of what's being tested. + +Let's take a look at one test in `e2e/gallery.spec.ts` that tests proper +operation of the page reached by clicking on the "Gallery" item in +Numberscope's navigation bar. As with vitest, there's a preamble importing the +test framework: + +``` +{! ../e2e/tests/gallery.spec.ts extract: { stop: before } !} +``` + +but this time there's not necessarily a need to explicitly import any of the +Numberscope code. That's because Playwright builds the entire system and opens +up its root URL in a browser running in "headless" mode -- that is to say, it +simulates rendering the resulting pages, and needs no attached display. The +Playwright tests manipulate that browser and verify it operates as expected. + +Next, we see a new test framework feature: the ability to run code before +every one of the tests in this file: + +``` +{! ../e2e/tests/gallery.spec.ts extract: { start: play, stop: describe} !} +``` + +You'll notice that this code takes a `page` argument. That's common to all +Playwright actions: page represents the browser tab that you are (virtually) +working with in your tests. In this case, we direct the tab to visit the +gallery URL, and we clear out its (simulated) browser-local storage to provide +a clean environment for testing. + +Note that vitest has a [similar ability](https://vitest.dev/api/#beforeeach) +to call a block of code before each test, if needed. + +Finally, let's look at the second test in this suite: + +``` +{! ../e2e/tests/gallery.spec.ts extract: + start: '(.*describe.*)' + stop: title +!} +... +{! ../e2e/tests/gallery.spec.ts extract: + start: '(.*minim.*)' + stop: clicking +!} +... +``` + +As with vitest, tests are arranged in groups, and here `test.describe` is the +direct analogue of `describe` in vitest, with `test` the analogue of `it`. The +second call to `test` in the "Gallery" group is shown above. Also like vitest, +it consists of a sequence of assertions, with reminiscent syntax. In this +case, most of the assertions have to be `await`ed, because they necessitate +various actions being performed in the browser, which may take some time to go +into effect. + +For example, the third item in the test is the direction to click on the first +element in the page with id `featured-arrow`. Whatever that does (it's +supposed to collapse the first group of images in the Gallery), it may take a +little while to occur and have its effects (who knows, it might load some +external webpage, which could take time). Hence the await. The test goes on to +check that the resulting page has the expected organization (correct elements +in the DOM tree), and then clicks again to see that the display goes back to +the way it was. + +Hopefully this example demystifies the process of creating a test for +Numberscope. You can also find +[more details](https://playwright.dev/docs/test-assertions) on the actions and +assertions you can put in a Playwright test. diff --git a/doc/husky-pre-commit.md b/doc/husky-pre-commit.md index 059a2e07..91556195 100644 --- a/doc/husky-pre-commit.md +++ b/doc/husky-pre-commit.md @@ -6,9 +6,16 @@ Assuming that the Git hooks specified by this repository have been actions prior to every call to `git commit`: ```sh -{! ../.husky/pre-commit extract: { start: list } !} +{! ../.husky/pre-commit extract: { start: husky } !} ``` +See the page on [package manager scripts](working-with-pm.md) for the meanings +of most of these actions; the `cleancommit` action uses custom code in the +tools/ directory to verify that there are no unstaged changes or untracked +files, which would confuse the later steps (they would be analyzing the +working tree rather than the staged file, so we just enforce those are the +same). + ([Direct link](../.husky/pre-commit) to the Husky pre-commit script.) diff --git a/doc/making-a-visualizer.md b/doc/making-a-visualizer.md index 86af4185..da8e82c6 100644 --- a/doc/making-a-visualizer.md +++ b/doc/making-a-visualizer.md @@ -123,9 +123,12 @@ top of the parameters panel, and may be less immediately visible to the user, for which reason these should be avoided if type-checking or the `validate` property will suffice. -Your validation can't depend on the sequence. You can do sequence-dependent -validation in [`setup()`](#set-up-the-visualizer-often-used), as described -below, but you won't be able to prompt the user for corrections at that point. +By the time checkParameters() is called, the visualizer's sequence should be +sufficiently initialized that you can depend on its `first` and `last` (index) +values, in case you need those for validation. On the other hand, the sketch +will not necessarily yet be available. You can do sketch-dependent validation +in [`setup()`](#set-up-the-visualizer-often-used), as described below, but you +won't be able to prompt the user for corrections at that point. - **p5 Template:** Make sure that the step size is positive. @@ -234,11 +237,20 @@ visualizer can't be loaded into Numberscope without it. #### 💡️ Stop and start animation _(often used)_ -If your visualization is a static picture, call the sketch's `noLoop()` -function when you're done drawing. This stops the animation loop, so you don't -waste time re-drawing the same picture dozens of times per second. If the -visualization is only static temporarily, you can call `loop()` to re-start -the animation loop whenever you need to. +If your visualization is a static picture, call the visualizer `stop()` method +when you're done drawing. This stops the p5 animation loop, so you don't waste +time re-drawing the same picture dozens of times per second. If the +visualization is only static temporarily, you can call `continue()` to +re-start the animation loop whenever you need to. + +If you have previous experience with p5.js, you might be used to calling +`noLoop()` and `loop()` to stop and start your sketch. In a visualizer, +however, you need to use its `stop()` and `continue()` methods to ensure that +all of Numberscope's controls remain properly updated. + +As an advanced option, `stop()` can also take a maximum number of additional +frames to draw. So if you you only want your visualization to run for 100 +frames, you could just call `this.stop(100)` right in your `setup()` function. - **p5 Template:** Stop the animation loop at the end of each frame. Only start it again when the user steps to a different sequence entry, @@ -265,6 +277,29 @@ something unexpected has happened. The first is with the throw an error. If it's not caught anywhere else, the visualizer framework will show it in an error dialog. +#### 🔩️ Getting random numbers _(advanced)_ + +Do not use the built-in `Math.random()` random number generator, because there +is no practical mechanism for making its output reproducible for testing +purposes. Instead, obtain random numbers using the provided `math` module, +along the following lines: + +``` +import {math} from '@/shared/math' +import {P5Visualizer} from '@/visualizers/P5Visualizer' + +class DiceVisualizer extends P5Visualizer({}) { + ... + draw() { + ... + // Roll a die (generate a number 1, 2, 3, 4, 5, or 6, + // all equally likely, at random): + const myRoll = math.randomInt(1, 7) // upper limit is exclusive. + ... +``` + +For more details, see the [math documentation](../src/shared/math.md). + ### How to document your visualizer Documentation should be included in the source file between markdown tags diff --git a/doc/onboarding.md b/doc/onboarding.md index 1e0a586c..30ced6a8 100644 --- a/doc/onboarding.md +++ b/doc/onboarding.md @@ -38,9 +38,14 @@ Boulder Experimental Mathematics Lab.) 3. If you don't have [NodeJS](https://nodejs.org/en/) installed, install it. NodeJS allows you to run JavaScript outside of a web browser. We use it in our front end code base. -4. If you don't have [Python 3](https://www.python.org/) installed, install +4. Make sure you have [Make](https://linuxhandbook.com/using-make/) installed. + There's a guide for Linux on that page; or you can try these other links + for + [Windows](https://stackoverflow.com/questions/32127524/how-to-install-and-use-make-in-windows) + or [MacOS](https://stackoverflow.com/questions/1469994/using-make-on-os-x). +5. If you don't have [Python 3](https://www.python.org/) installed, install it. We use Python in frontscope for our documentation site. -5. Make sure you have a `venv` module by running the following command: +6. Make sure you have a `venv` module by running the following command: ```sh python3 -m venv -h ``` @@ -55,10 +60,10 @@ Boulder Experimental Mathematics Lab.) commands you run are run using the dependencies in the virutal environment, and not the dependencies you installed elsewhere on your computer. -6. Somewhere on your computer, make a directory where you can keep Numberscope +7. Somewhere on your computer, make a directory where you can keep Numberscope code. I like to put a directory called `Code` in my home directory. You can call this whatever you want. -7. If you plan to submit new code to become part of Numberscope at some time +8. If you plan to submit new code to become part of Numberscope at some time in the future, _you must_ "fork" (make your own copy of) the repository: - Go to https://github.com/numberscope/frontscope. - Click the "Fork" button (in the upper right as of this writing) and then @@ -78,23 +83,33 @@ Boulder Experimental Mathematics Lab.) If you have trouble, read [this doc](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) or ping someone for help. -8. Go to the newly cloned `frontscope` directory and install the dependencies: +9. If you are going to submit new code, you will also need to run the standard + tests of the system with your changes in place, and likely add new tests + for your changes. Running tests requires that you have + [Docker](https://www.docker.com/) installed on your system. There are many + tutorials for installing docker; here are example ones for + [Windows](https://docs.docker.com/desktop/install/windows-install/), + [Ubuntu Linux](https://linuxconfig.org/quick-docker-installation-on-ubuntu-24-04), + and + [Mac OS](https://thesecmaster.com/blog/installing-docker-desktop-on-macos). +10. Go to the newly cloned `frontscope` directory and install the + dependencies: ```sh cd frontscope npm install ``` You need NodeJS installed to do this. -9. Run the development server (this runs a local copy of Numberscope on your - computer so you can interact with the webpage): +11. Run the development server (this runs a local copy of Numberscope on your + computer so you can interact with the webpage): ```sh npm run dev ``` This should print a link that you can open in the browser. Open it and see if Numberscope seems to be working. -10. If you plan on contributing code to Numberscope, _you must_ work in your +12. If you plan on contributing code to Numberscope, _you must_ work in your fork on a dedicated feature branch. To learn how to create a branch, see [this doc](./working-with-git-and-github.md#create-a-branch). -11. Finally, before you start changing code, please read +13. Finally, before you start changing code, please read [our docs on submitting a pull request](../CONTRIBUTING.md#submit-a-pull-request). See [the doc on running from source](./running-from-source.md) for more diff --git a/doc/pull-request-checklist.md b/doc/pull-request-checklist.md index 845f6f04..48d4d163 100644 --- a/doc/pull-request-checklist.md +++ b/doc/pull-request-checklist.md @@ -5,13 +5,18 @@ The PR submitter should: - Please use a `snake_case` name for the branch in the PR. -- Please limit your PR's focus to one thing. +- Please limit the PR's focus to one thing. - Ideally, submit a small PR with limited functionality that can be built upon instead of submitting one huge, monolithic PR. Typically, the smaller - the PR, the better, with the obvious caveat that the code in your PR needs + the PR, the better, with the obvious caveat that the code in the PR needs to work and actually do something. A small PR for a visualizer might be in the ballpark of 200 lines of code. -- Write or supplement test(s) for the file(s) you touch in your PR. +- Write or supplement test(s) for the file(s) affected by the PR. In + particular, if it is a bug fix PR, there **must** be a new test that would + fail with the prior code, but passes in the PR. The new tests may be + either unit (vitest) or end-to-end (Playwright) tests or both, as + appropriate. +- Update all documentation to reflect the changes in the PR. - Make sure Numberscope runs properly, including former supposedly unmodified behaviors and newly implemented ones. In particular, run it via 'npm run dev' and with the browser console open and make sure there are no @@ -22,19 +27,28 @@ The PR submitter should: ## For PR reviewers - All new or changed features are appropriately documented. -- Tests are appropriately modified for all new or changed features. +- Tests are appropriately modified for all new or changed features. If it is + a bugfix PR there must be at least one new test. Most other PRs should + have new or changed tests as well. So if you do not see any changed files + in the `e2e/tests` directory or in any `__tests__` directory, that is at + least an "orange" flag. - The PR is passing lint by running `npm run lint`. There should be no changed files and no warnings/errors. +- The PR passes all tests. Note that you must run the end-to-end tests + yourself with `npm run test:e2e`. You can't rely solely on the GitHub CI + test results; for example, as of this writing, they are unable to run any + WebGL tests. In other words, consider passing the GitHub CI tests as a + necessary but not sufficient condition for considering a PR to be "passing + all tests". - The PR builds by running `npm run build`. (This also checks type correctness.) There should be no errors, and for now the only allowed warning is the one about some assets being too big. -- The PR passes all tests. Right now (Oct. 2022), just by running - `npm run test:unit`. -- Numberscope runs properly -- basically the same check as on the submitter - list, but be sure to exercise as many randomly selected behaviors as you - have time for, definitely including but not limited to the ones nominally - affected by the PR. This should be done in `npm run preview` mode after a - successful build. +- The built system runs with `npm run preview`. +- When run that way, Numberscope operates properly. The end-to-end tests + take the pressure to try a variety of random behaviors off of the + reviewer, but a number of possible actions that seem related to the + changes in the PR must definitely be tried in this fashion before + approving for merge. - At the end of the review process, before merging, add a commit to update the ["Contributors" section of the "About" document](about.md#contributors) to diff --git a/doc/running-from-source.md b/doc/running-from-source.md index 187aed28..df974d31 100644 --- a/doc/running-from-source.md +++ b/doc/running-from-source.md @@ -1,8 +1,10 @@ # Setting up to run from source 1. Prerequisites: To install and run properly, `frontscope` needs - [Git](https://git-scm.com/), [Node.js](https://nodejs.org/en/), and - [Python](https://www.python.org/) (version 3.5 or later) with a working + [Git](https://git-scm.com/), + [make](https://linuxhandbook.com/using-make/), + [Node.js](https://nodejs.org/en/), and [Python](https://www.python.org/) + (version 3.5 or later) with a working "[venv](https://docs.python.org/3/library/venv.html)" module. If any of these are not present on your system, install them. It's very likely you already have Python, but on Debian/Ubuntu systems, you may well have to diff --git a/doc/user_guide.md b/doc/user_guide.md index 0eecdc9a..2d0b1f30 100644 --- a/doc/user_guide.md +++ b/doc/user_guide.md @@ -5,7 +5,7 @@ itself with either of the buttons mentioning "the 'Scope." (There's one in the top navigation bar and one right in the center of the page for convenience.) That will bring you to: -{! ../src/views/Scope.vue extract: { start: ''} !} +{! ../src/views/Scope.vue extract: { start: ''} !} ## Errors diff --git a/doc/working-with-bigints.md b/doc/working-with-bigints.md index 3f68e355..2cdcc880 100644 --- a/doc/working-with-bigints.md +++ b/doc/working-with-bigints.md @@ -17,15 +17,15 @@ code: `BigInt(v)`. - Literal values of type `bigint` consist digits followed by a lower-case n, like 73n for the bigint with value 73, or 0n or -10n, etc. -- Right now unfortunately mathjs does not work on bigints but we are working - on that. +- Right now unfortunately mathjs does not work on bigints but soon we will + update to a version that does. - In the meantime to compensate for the lack of bigints in mathjs, we have a - module (`src/shared/math`) in numberscope to supply some math utilities. - You should familiarize yourself with the - [functions it offers](../src/shared/math.md). + module (`@/shared/math`) in numberscope that adds some utilities to the + `math` module for working with bigints. You should familiarize yourself + with the [functions it offers](../src/shared/math.md). - In particular, if you are forced to convert a bigint to the JavaScript - number type, you should do it with the `safeNumber` function provided by - the math utility module, unless for some structural reason you are + number type, you should do it with the `math.safeNumber` function provided + by the math utility module, unless for some structural reason you are **certain** the bigint won't overflow the number. That will provide overflow checking and throw an error if accuracy would be lost. Note that any value you get from the OEIS may be too large to fit in the JavaScript diff --git a/doc/working-with-pm.md b/doc/working-with-pm.md index f4216095..44bb1f93 100644 --- a/doc/working-with-pm.md +++ b/doc/working-with-pm.md @@ -8,8 +8,8 @@ an alternate package manager. {! ../package.json extract: {start: 'scripts', stop: '},', replace: [ - ['help:(\D*)".*".*echo (.*)"', '### npm run \1\n\2'], # one-liner like test - '"help:\D*:\d*".*echo (.*)"', # a numbered continuation line of help - ['"help:(\D*)":.*"', '### npm run \1\n'], # header of a block of help lines + ['help:(.*\D)".*".*echo (.*)"', '### npm run \1\n\2'], # 1-liner help + '"help:.*[-:]\d*".*echo \\?"?(.*?)\\?"?"', # a continuation line of help + ['"help:(.*\D)":.*"', '### npm run \1\n'], # header of block of help lines '.' # ignore the actual scripts that don't start with help ]} !} diff --git a/doc_theme/css/.coordinate.css.generator b/doc_theme/css/.coordinate.css.generator deleted file mode 100644 index ce4bf2b2..00000000 --- a/doc_theme/css/.coordinate.css.generator +++ /dev/null @@ -1,6 +0,0 @@ -{! ../../src/views/minor/NavBar.vue extract: {start: 'style', stop: 'style'} !} -{! ../../src/App.vue extract: [ - {start: 'style', stop: 'main'}, - {start: '(.*nav.*)', stop: style} -] -!} diff --git a/e2e/Dockerfile b/e2e/Dockerfile new file mode 100644 index 00000000..f3d55619 --- /dev/null +++ b/e2e/Dockerfile @@ -0,0 +1,18 @@ +FROM mcr.microsoft.com/playwright:v1.47.0-noble + +# Copy frontscope (including tests) +COPY . /test + +WORKDIR /test + +# Clean out any sources/tests/build that happened to be there +RUN rm -rf src dist e2e/results/* e2e/tests + +# Install system dependencies +RUN apt update && apt install python3.12-venv -y + +# Install node dependencies +RUN npm install + +# Install browsers +RUN npx playwright install diff --git a/e2e/playci.config.ts b/e2e/playci.config.ts new file mode 100644 index 00000000..11cb7090 --- /dev/null +++ b/e2e/playci.config.ts @@ -0,0 +1,13 @@ +import {defineConfig} from '@playwright/test' + +import {baseConfiguration} from './playwright.config.ts' + +const dockerConfig = { + ...baseConfiguration, + snapshotDir: baseConfiguration.testDir + '/ci_snaps', + grepInvert: /@webGL/, + timeout: 30000, + reporter: [['list', {printSteps: true}]], +} + +export default defineConfig(dockerConfig) diff --git a/e2e/playdocker.config.ts b/e2e/playdocker.config.ts new file mode 100644 index 00000000..f9cefc31 --- /dev/null +++ b/e2e/playdocker.config.ts @@ -0,0 +1,33 @@ +import {defineConfig} from '@playwright/test' +import * as process from 'process' + +import {baseConfiguration} from './playwright.config.ts' + +const chromiumProject = baseConfiguration.projects.find( + proj => proj.name === 'chromium' +) +const firefoxProject = baseConfiguration.projects.find( + proj => proj.name === 'firefox' +) + +if ( + !chromiumProject + || !firefoxProject + || baseConfiguration.projects.length !== 2 +) { + console.error( + 'Base playwright configuration has changed, please update' + + 'e2e/playdocker.config.ts' + ) + process.exit(1) +} + +const dockerConfig = { + ...baseConfiguration, + outputDir: './results/docker/output', + timeout: 45000, + projects: [chromiumProject, {...firefoxProject, grepInvert: /@webGL/}], + reporter: [['blob', {outputFile: './results/docker/report.zip'}]], +} + +export default defineConfig(dockerConfig) diff --git a/e2e/playmerge.config.ts b/e2e/playmerge.config.ts new file mode 100644 index 00000000..784ebfa3 --- /dev/null +++ b/e2e/playmerge.config.ts @@ -0,0 +1,16 @@ +import {defineConfig} from '@playwright/test' + +import {baseConfiguration} from './playwright.config.ts' + +export default defineConfig({ + testDir: baseConfiguration.testDir, + reporter: [ + [ + 'html', + { + open: 'never', + outputFolder: './results/combined/playwright-report', + }, + ], + ], +}) diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts new file mode 100644 index 00000000..6e22ad77 --- /dev/null +++ b/e2e/playwright.config.ts @@ -0,0 +1,71 @@ +import {defineConfig, devices} from '@playwright/test' +import * as process from 'process' + +/** + * See https://playwright.dev/docs/test-configuration. + */ + +// Export the configuration object so we can derive from it in other tests +export const baseConfiguration = { + testDir: './tests', + outputDir: './results/manual/output', + /* Run tests in files in parallel */ + fullyParallel: false, + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: [ + ['html', {open: 'never', outputFolder: './results/manual/report'}], + ], + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:5050', + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: {...devices['Desktop Chrome']}, + }, + + { + name: 'firefox', + use: {...devices['Desktop Firefox']}, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run preview:cmd', + url: 'http://localhost:5050', + reuseExistingServer: !process.env.CI, + }, +} + +/* Export the configuration for Playwright to use: */ +export default defineConfig(baseConfiguration) diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ChaosGame-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ChaosGame-chromium-linux.png new file mode 100644 index 00000000..0d6616cd Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ChaosGame-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ChaosGame-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ChaosGame-firefox-linux.png new file mode 100644 index 00000000..29aeb833 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ChaosGame-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/DivisorSquare-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/DivisorSquare-chromium-linux.png new file mode 100644 index 00000000..0d921f49 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/DivisorSquare-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/DivisorSquare-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/DivisorSquare-firefox-linux.png new file mode 100644 index 00000000..f3e92f52 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/DivisorSquare-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Latticework-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Latticework-chromium-linux.png new file mode 100644 index 00000000..7e932897 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Latticework-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Latticework-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Latticework-firefox-linux.png new file mode 100644 index 00000000..ef942f9c Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Latticework-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ResidueRise-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ResidueRise-chromium-linux.png new file mode 100644 index 00000000..4939626c Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ResidueRise-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ResidueRise-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ResidueRise-firefox-linux.png new file mode 100644 index 00000000..0073a969 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ResidueRise-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png new file mode 100644 index 00000000..4bfbbcc9 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png new file mode 100644 index 00000000..880db390 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ThueTrellis-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ThueTrellis-chromium-linux.png new file mode 100644 index 00000000..a4390103 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ThueTrellis-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ThueTrellis-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ThueTrellis-firefox-linux.png new file mode 100644 index 00000000..76b10eb9 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/ThueTrellis-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Twelve-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Twelve-chromium-linux.png new file mode 100644 index 00000000..9d41218e Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Twelve-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Twelve-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Twelve-firefox-linux.png new file mode 100644 index 00000000..a68cee18 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/Twelve-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png new file mode 100644 index 00000000..e349a151 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/WaitForIt-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/WaitForIt-firefox-linux.png new file mode 100644 index 00000000..acc62a36 Binary files /dev/null and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/WaitForIt-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png new file mode 100644 index 00000000..50c0bb2d Binary files /dev/null and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png new file mode 100644 index 00000000..986deb15 Binary files /dev/null and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png new file mode 100644 index 00000000..146ce5ec Binary files /dev/null and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png new file mode 100644 index 00000000..e2af9f7a Binary files /dev/null and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA007235-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA007235-chromium-linux.png new file mode 100644 index 00000000..e93f6bd7 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA007235-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA007235-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA007235-firefox-linux.png new file mode 100644 index 00000000..49ca5347 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA007235-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA114592-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA114592-chromium-linux.png new file mode 100644 index 00000000..15c011dd Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA114592-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA114592-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA114592-firefox-linux.png new file mode 100644 index 00000000..2cee9a99 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA114592-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA228060-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA228060-chromium-linux.png new file mode 100644 index 00000000..c18747c0 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA228060-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA228060-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA228060-firefox-linux.png new file mode 100644 index 00000000..41ff7ada Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ChaosA228060-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png new file mode 100644 index 00000000..f2ed5bed Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png new file mode 100644 index 00000000..9fe583fa Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png new file mode 100644 index 00000000..7e1c4271 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png new file mode 100644 index 00000000..4f208230 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png new file mode 100644 index 00000000..c2da32f3 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png new file mode 100644 index 00000000..c837476b Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png new file mode 100644 index 00000000..d3c1f928 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png new file mode 100644 index 00000000..927ddb93 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png new file mode 100644 index 00000000..5bc17d87 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png new file mode 100644 index 00000000..329aab7c Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png new file mode 100644 index 00000000..4089a413 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png new file mode 100644 index 00000000..8c03364a Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png new file mode 100644 index 00000000..3e0b3c25 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png new file mode 100644 index 00000000..f0dc5d7e Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA002819-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA002819-chromium-linux.png new file mode 100644 index 00000000..837f9b8b Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA002819-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA002819-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA002819-firefox-linux.png new file mode 100644 index 00000000..ab07186d Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA002819-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA134028-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA134028-chromium-linux.png new file mode 100644 index 00000000..c30d455c Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA134028-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA134028-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA134028-firefox-linux.png new file mode 100644 index 00000000..6c3b4c3b Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ModFillA134028-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA007235-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA007235-chromium-linux.png new file mode 100644 index 00000000..434fdbb7 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA007235-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA007235-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA007235-firefox-linux.png new file mode 100644 index 00000000..2250e636 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA007235-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA114592-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA114592-chromium-linux.png new file mode 100644 index 00000000..cc613eb4 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA114592-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA114592-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA114592-firefox-linux.png new file mode 100644 index 00000000..21e1596c Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA114592-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA228060-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA228060-chromium-linux.png new file mode 100644 index 00000000..71001c69 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA228060-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA228060-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA228060-firefox-linux.png new file mode 100644 index 00000000..38839114 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA228060-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA241298-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA241298-chromium-linux.png new file mode 100644 index 00000000..a4093875 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA241298-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA241298-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA241298-firefox-linux.png new file mode 100644 index 00000000..953bd3f2 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/NumberGlyphA241298-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png new file mode 100644 index 00000000..bb77f858 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png new file mode 100644 index 00000000..d642ed82 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png new file mode 100644 index 00000000..7430cd18 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png new file mode 100644 index 00000000..0cfe4224 Binary files /dev/null and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png differ diff --git a/e2e/tests/doc.spec.ts b/e2e/tests/doc.spec.ts new file mode 100644 index 00000000..86d03912 --- /dev/null +++ b/e2e/tests/doc.spec.ts @@ -0,0 +1,10 @@ +import {test, expect} from '@playwright/test' + +test.describe('Documentation site', () => { + test('Includes husky actions', async ({page}) => { + await page.goto('/doc/doc/husky-pre-commit/') + await expect( + await page.locator('.hljs-built_in').nth(0).innerText() + ).toEqual('test') + }) +}) diff --git a/e2e/tests/featured.spec.ts b/e2e/tests/featured.spec.ts new file mode 100644 index 00000000..135ef647 --- /dev/null +++ b/e2e/tests/featured.spec.ts @@ -0,0 +1,29 @@ +import {test, expect} from '@playwright/test' +import {parseSpecimenQuery} from '../../src/shared/browserCaching' +import {getFeatured} from '../../src/shared/defineFeatured' + +const featured = getFeatured() +test.describe('Featured gallery images', () => { + for (const feature of featured) { + const featProps = parseSpecimenQuery(feature.query) + const details = {} + if (featProps.visualizerKind === 'Histogram') { + details.tag = '@webGL' + } + test(featProps.name, details, async ({page, browserName}) => { + const short = featProps.name.replaceAll(' ', '') + const testURL = `/?frames=64&randomSeed=${short}&${feature.query}` + await page.goto(testURL) + await expect( + page.locator('#specimen-bar-desktop').getByText('play_arrow') + ).toHaveId('pause-button', {timeout: 30000}) + const matchParams = + browserName === 'firefox' && details.tag === '@webGL' + ? {maxDiffPixelRatio: 0.02} + : {} + expect( + await page.locator('#canvas-container').screenshot() + ).toMatchSnapshot(`${short}.png`, matchParams) + }) + } +}) diff --git a/e2e/tests/featured.spec.ts-snapshots/ChaosGame-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/ChaosGame-chromium-linux.png new file mode 100644 index 00000000..0d6616cd Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ChaosGame-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ChaosGame-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/ChaosGame-firefox-linux.png new file mode 100644 index 00000000..29aeb833 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ChaosGame-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/DivisorSquare-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/DivisorSquare-chromium-linux.png new file mode 100644 index 00000000..0d921f49 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/DivisorSquare-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/DivisorSquare-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/DivisorSquare-firefox-linux.png new file mode 100644 index 00000000..f3e92f52 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/DivisorSquare-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/Latticework-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/Latticework-chromium-linux.png new file mode 100644 index 00000000..7e932897 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/Latticework-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/Latticework-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/Latticework-firefox-linux.png new file mode 100644 index 00000000..ef942f9c Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/Latticework-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/Polyfactors-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/Polyfactors-chromium-linux.png new file mode 100644 index 00000000..594022b4 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/Polyfactors-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/Polyfactors-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/Polyfactors-firefox-linux.png new file mode 100644 index 00000000..62713649 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/Polyfactors-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ResidueRise-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/ResidueRise-chromium-linux.png new file mode 100644 index 00000000..4939626c Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ResidueRise-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ResidueRise-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/ResidueRise-firefox-linux.png new file mode 100644 index 00000000..0073a969 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ResidueRise-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png new file mode 100644 index 00000000..efd72382 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png new file mode 100644 index 00000000..7a2a95f0 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ThueTrellis-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/ThueTrellis-chromium-linux.png new file mode 100644 index 00000000..a4390103 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ThueTrellis-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ThueTrellis-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/ThueTrellis-firefox-linux.png new file mode 100644 index 00000000..76b10eb9 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ThueTrellis-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/Twelve-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/Twelve-chromium-linux.png new file mode 100644 index 00000000..9d41218e Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/Twelve-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/Twelve-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/Twelve-firefox-linux.png new file mode 100644 index 00000000..a68cee18 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/Twelve-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png new file mode 100644 index 00000000..e349a151 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/WaitForIt-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/WaitForIt-firefox-linux.png new file mode 100644 index 00000000..acc62a36 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/WaitForIt-firefox-linux.png differ diff --git a/e2e/tests/gallery.spec.ts b/e2e/tests/gallery.spec.ts new file mode 100644 index 00000000..d745607d --- /dev/null +++ b/e2e/tests/gallery.spec.ts @@ -0,0 +1,61 @@ +import {test, expect} from '@playwright/test' + +test.beforeEach(async ({page}) => { + await page.goto('/gallery', {waitUntil: 'domcontentloaded'}) + await page.evaluate(() => localStorage.clear()) +}) + +test.describe('Gallery', () => { + test('Has a title', async ({page}) => { + await expect(page).toHaveTitle(/Numberscope/) + }) + test('minimizing', async ({page}) => { + await expect(page.locator('#featured-arrow')).toHaveClass(/arrow-up/) + await expect(page.locator('#featured-arrow')).not.toHaveClass( + /arrow-down/ + ) + + await page.locator('#featured-arrow').first().click() + await expect(page.locator('#featured-arrow')).not.toHaveClass( + /arrow-up/ + ) + await expect(page.locator('#featured-arrow')).toHaveClass( + /arrow-down/ + ) + + await page.locator('#featured-arrow').first().click() + await expect(page.locator('#featured-arrow')).toHaveClass(/arrow-up/) + await expect(page.locator('#featured-arrow')).not.toHaveClass( + /arrow-down/ + ) + }) + test('clicking on a featured item', async ({page}) => { + await page.locator('.card-body >> nth=2').click() + await expect(page.url()).not.toContain('gallery') + await expect( + await page.locator('#sequenceTab .item-name').innerText() + ).toMatch('Formula: 12') + await expect( + await page.locator('#visualiserTab .item-name').innerText() + ).toMatch('Mod Fill') + }) + test('saving a specimen and then deleting it', async ({page}) => { + await page.goto('/', {waitUntil: 'domcontentloaded'}) + await page.locator('#specimen-bar-desktop #save-button').click() + await page.goto('/gallery', {waitUntil: 'domcontentloaded'}) + + const savedCard = await page + .locator('#saved-gallery .card-body') + .first() + + await expect( + await savedCard.locator('.card-title').innerText() + ).toMatch('Specimen') + await expect( + await savedCard.locator('.card-text').innerText() + ).toMatch('Random integers 0 to 9') + + await savedCard.locator('.delete-button').click() + await expect(page.locator('#saved-specimens >> *')).toHaveCount(0) + }) +}) diff --git a/e2e/tests/idiot.spec.ts b/e2e/tests/idiot.spec.ts new file mode 100644 index 00000000..0e61e418 --- /dev/null +++ b/e2e/tests/idiot.spec.ts @@ -0,0 +1,38 @@ +import {test, expect} from '@playwright/test' + +import {specimenQuery} from '../../src/shared/browserCaching' + +// These are tests in the spirit of +// https://github.com/numberscope/frontscope/issues/113, i.e. +// "idiot-proofing" Numberscope + +// Each item is the argument list to specimenQuery +const testlist = { + 'Way too big a number': [ + 'A', + 'ModFill', + 'Formula', + 'modDimension=1111111111111111111111111111111111111111111', + 'formula=12', + ], + 'Start deep in a sequence': [ + 'B', + 'FactorFence', + 'Formula', + '', + 'first=1020000', + ], +} +test.describe('Stress-test Numberscope usage', () => { + for (const k in testlist) { + test(k, async ({page}) => { + const query = specimenQuery(...testlist[k]) + const testURL = '/?frames=5&' + query + await page.goto(testURL) + await expect( + page.locator('#specimen-bar-desktop').getByText('play_arrow') + ).toHaveId('pause-button', {timeout: 15000}) + await expect(page).toHaveScreenshot() // capture error alert, if one + }) + } +}) diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png new file mode 100644 index 00000000..944b0a76 Binary files /dev/null and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png differ diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png new file mode 100644 index 00000000..2fdcfe81 Binary files /dev/null and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png differ diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png new file mode 100644 index 00000000..6600871e Binary files /dev/null and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png differ diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png new file mode 100644 index 00000000..e2af9f7a Binary files /dev/null and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png differ diff --git a/e2e/tests/scope.spec.ts b/e2e/tests/scope.spec.ts new file mode 100644 index 00000000..559b4ed7 --- /dev/null +++ b/e2e/tests/scope.spec.ts @@ -0,0 +1,164 @@ +import {test, expect} from '@playwright/test' +import {parseSpecimenQuery} from '../../src/shared/browserCaching' + +test.beforeEach(async ({page}) => { + await page.goto('/', {waitUntil: 'domcontentloaded'}) + await page.evaluate(() => localStorage.clear()) +}) + +test.describe('Scope', () => { + test('Has a title', async ({page}) => { + await expect(page).toHaveTitle(/Numberscope/) + }) + + test('Tabs are draggable', async ({page}) => { + await page + .locator('#visualiserTab .buttons') + .dragTo(page.locator('#canvas-container'), { + force: true, + sourcePosition: { + x: 10, + y: 10, + }, + targetPosition: { + x: 100, + y: 100, + }, + }) + await expect(page.locator('#bottom-right-dropzone')).toHaveClass( + /empty/ + ) + }) + + test('Sidebars disappear when tabs are dragged', async ({page}) => { + await page + .locator('#visualiserTab .buttons') + .dragTo(page.locator('#canvas-container'), { + force: true, + sourcePosition: { + x: 10, + y: 10, + }, + }) + + await page + .locator('#sequenceTab .buttons') + .dragTo(page.locator('#canvas-container'), { + force: true, + sourcePosition: { + x: 10, + y: 10, + }, + + targetPosition: { + x: 500, + y: 100, + }, + }) + + await expect(page.locator('#right-dropzone-container')).toHaveClass( + /empty/ + ) + await expect( + page.locator('#right-dropzone-container .dropzone-resize') + ).toHaveCSS('display', 'none') + + await expect(page.locator('#left-dropzone-container')).toHaveClass( + /empty/ + ) + await expect( + page.locator('#left-dropzone-container .dropzone-resize') + ).toHaveCSS('display', 'none') + }) + + test('Changing a sequence', async ({page}) => { + await page.locator('#sequenceTab .visualizer-info').click() + await page.locator('.results .card-body').first().click() + await expect( + await page.locator('#sequenceTab .item-name').innerText() + ).toMatch('Formula: n') + }) + + test('minimizing a tab', async ({page}) => { + await page.locator('#visualiserTab .minimize').click() + await expect(page.locator('#visualiserTab')).toHaveClass(/minimized/) + await expect( + await page.locator('#visualiserTab').evaluate(element => { + return element.clientHeight + }) + ).toBeLessThan(125) + + await page.locator('#visualiserTab .minimize').click() + await expect(page.locator('#visualiserTab')).not.toHaveClass( + /minimized/ + ) + await expect( + await page.locator('#visualiserTab').evaluate(element => { + return element.clientHeight + }) + ).toBeGreaterThan(375) + }) + test('Changing a parameter', async ({page}) => { + const oldURL = page.url() + + await page.locator('#modDimension').fill('100') + await expect(page.locator('#modDimension')).toHaveValue('100') + + await expect(page.url()).not.toEqual(oldURL) + }) + test('changing the specimen name', async ({page}) => { + const oldURL = page.url() + + await page.locator('#specimen-bar-desktop input').fill('test') + const currentSpecimenIM = await page.evaluate(() => { + return localStorage.getItem('currentSpecimen') + }) + if (currentSpecimenIM === null) { + throw new Error('currentSpecimen is null') + } + const currentSpecimen = JSON.parse(currentSpecimenIM) + const currentProperties = parseSpecimenQuery(currentSpecimen.query) + + await expect(currentProperties.name).toEqual('test') + await expect(page.url()).not.toEqual(oldURL) + }) + test('refreshing the specimen', async ({page}) => { + const oldCanvas = await page.locator('#canvas-container canvas') + + await oldCanvas.evaluate(canvas => { + canvas.classList.add('old-canvas') + }) + await page.locator('#specimen-bar-desktop #refresh-button').click() + + const newCanvas = await page.locator('#canvas-container canvas') + await expect(newCanvas).not.toBe(oldCanvas) + await expect(newCanvas).not.toHaveClass('old-canvas') + }) + + test('copying to clipboard', async ({page, context, browserName}) => { + // grant clipboard permissions for chromium, other browsers don't + // allow this due to privacy concerns + if (browserName === 'chromium') { + await context.grantPermissions([ + 'clipboard-read', + 'clipboard-write', + ]) + } + + await page.locator('#specimen-bar-desktop #share-button').click() + + let clipboardContent + if (browserName === 'chromium') { + const handle = await page.evaluateHandle(() => + navigator.clipboard.readText() + ) + clipboardContent = await handle.jsonValue() + } else { + // we can't read the clipboard content in other browsers + clipboardContent = page.url() + } + + const url = page.url() + await expect(clipboardContent).toMatch(url) + }) +}) diff --git a/e2e/tests/stress.spec.ts b/e2e/tests/stress.spec.ts new file mode 100644 index 00000000..449c4d33 --- /dev/null +++ b/e2e/tests/stress.spec.ts @@ -0,0 +1,34 @@ +import {test, expect} from '@playwright/test' + +import {specimenQuery} from '../../src/shared/browserCaching' + +// These are non-snapshot tests that we know to be somewhat or very +// challenging to Numberscope. Once sequences that are here pass, they +// might be candidates for adding to the transversal test. + +// Each item is the argument list to specimenQuery +const testlist = { + 'Sequence with lots of data': ['T1', 'Histogram', 'OEIS A000521'], + 'Sequence with extremely large offset': [ + 'T2', + 'Differences', + 'OEIS A241292', + ], +} +test.describe('Stress-test Numberscope visualization', () => { + for (const k in testlist) { + // Right now these all fail. This skipping will have to be selective + // as code improves and some switch to passing. + test.skip(k, async ({page}) => { + const query = specimenQuery(...testlist[k]) + const testURL = '/?frames=5&' + query + await page.goto(testURL) + await expect( + page.locator('#specimen-bar-desktop').getByText('play_arrow') + ).toHaveId('pause-button', {timeout: 15000}) + await expect( + await page.locator('#sequenceTab .description').innerText() + ).not.toMatch(/^Unknown OEIS sequence/) + }) + } +}) diff --git a/e2e/tests/transversal.spec.ts b/e2e/tests/transversal.spec.ts new file mode 100644 index 00000000..2c8813b5 --- /dev/null +++ b/e2e/tests/transversal.spec.ts @@ -0,0 +1,93 @@ +import {test, expect} from '@playwright/test' +import {specimenQuery} from '../../src/shared/browserCaching' +import {math} from '../../src/shared/math' +import fs from 'fs' + +// The idea here is to take a collection of challenging sequences, and +// make sure that we try each sequence with at least two visualizers, and +// run each visualizer with at least two sequences. We do this by choosing +// two visualizers at random for each sequence, and then if any visualizer +// has not been chosen twice, we choose (an)other sequence(s) for it. We +// seed the random number generator so that the assignments will be +// reproducible. + +const seed = 'KILROY' // only change this in standalone PR +const challenges = [ + 'A114592', // Only -1,0,1, for 359 terms, then some bigger values + 'A007235', // short sequence but grows fast + 'A001220', // very few terms + // 'A000521', // long seq with -1 offset, grows fast; temp too much data + 'A228060', // offset -85, many small terms + 'A086677', // offset 2 + 'A241298', // very large positive offset + // 'A241292', // too large a positive offset (for now) + 'A134028', // mix of negative and positive terms + 'A002819', // nonpositive sequence + 'A001489', // all non-positive integers + 'A202319', // semiprimes +] // feel free to add more + +const vizFiles = fs + .readdirSync('./src/visualizers', {withFileTypes: true}) + .filter(item => !item.isDirectory()) + .map(item => item.name) +const vizKeys: string[] = [] +for (const vf of vizFiles) { + if (vf.includes('isualizer')) continue // infrastructure + if (vf.endsWith('.d.ts')) continue // infrastructure + if (vf.includes('ShiftCompare')) continue // freezes way too long + if (vf.includes('Turtle')) continue // Does nothing on most sequences + if (!vf.endsWith('.ts')) continue + vizKeys.push(vf.slice(0, -3)) +} +const vizSeqs = Object.fromEntries(vizKeys.map(k => [k, [] as string[]])) + +math.config({randomSeed: seed}) + +for (const seq of challenges) { + let count = 2 + while (count--) { + let viz = math.pickRandom(vizKeys) + while (vizSeqs[viz].includes(seq)) viz = math.pickRandom(vizKeys) + vizSeqs[viz].push(seq) + } +} +// Now make sure every visualizer got at least two sequences +for (const viz of vizKeys) { + let left = 2 - vizSeqs[viz].length + while (left-- > 0) { + // Find a sequence not used with this visualizers + let seq = math.pickRandom(challenges) + while (vizSeqs[viz].includes(seq)) seq = math.pickRandom(challenges) + vizSeqs[viz].push(seq) + } +} + +// now run all the combos +test.describe('Visualizer-sequence challenges', () => { + for (const viz of vizKeys) { + const vizPar = viz === 'Chaos' ? 'circSize=5' : '' // ow tough to see + const details = {} + if (viz === 'Histogram') { + details.tag = '@webGL' + } + for (const seq of vizSeqs[viz]) { + const query = specimenQuery(viz + seq, viz, 'OEIS ' + seq, vizPar) + test(`${seq} ${viz}`, details, async ({page, browserName}) => { + await page.goto(`/?frames=32&${query}`) + await expect( + page + .locator('#specimen-bar-desktop') + .getByText('play_arrow') + ).toHaveId('pause-button', {timeout: 20000}) + const matchParams = + browserName === 'firefox' && details.tag === '@webGL' + ? {maxDiffPixelRatio: 0.02} + : {} + expect( + await page.locator('#canvas-container').screenshot() + ).toMatchSnapshot(`${viz + seq}.png`, matchParams) + }) + } + } +}) diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA000521-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA000521-chromium-linux.png new file mode 100644 index 00000000..bfe487fb Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA000521-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA000521-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA000521-firefox-linux.png new file mode 100644 index 00000000..d15323f4 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA000521-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA007235-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA007235-chromium-linux.png new file mode 100644 index 00000000..e93f6bd7 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA007235-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA007235-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA007235-firefox-linux.png new file mode 100644 index 00000000..49ca5347 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA007235-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA114592-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA114592-chromium-linux.png new file mode 100644 index 00000000..15c011dd Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA114592-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA114592-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA114592-firefox-linux.png new file mode 100644 index 00000000..2cee9a99 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA114592-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA202319-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA202319-chromium-linux.png new file mode 100644 index 00000000..572c6dc6 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA202319-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA202319-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA202319-firefox-linux.png new file mode 100644 index 00000000..cd983cbb Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA202319-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA228060-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA228060-chromium-linux.png new file mode 100644 index 00000000..c18747c0 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA228060-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ChaosA228060-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ChaosA228060-firefox-linux.png new file mode 100644 index 00000000..41ff7ada Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ChaosA228060-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png new file mode 100644 index 00000000..dd6a9ade Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png new file mode 100644 index 00000000..bd4aa0bc Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA002819-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA002819-chromium-linux.png new file mode 100644 index 00000000..cc2f1481 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA002819-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA002819-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA002819-firefox-linux.png new file mode 100644 index 00000000..6a7e1477 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA002819-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png new file mode 100644 index 00000000..d5437a6f Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png new file mode 100644 index 00000000..cb9e715e Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png new file mode 100644 index 00000000..366fb6cb Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png new file mode 100644 index 00000000..5c66975d Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA228060-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA228060-chromium-linux.png new file mode 100644 index 00000000..8998f579 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA228060-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/DifferencesA228060-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA228060-firefox-linux.png new file mode 100644 index 00000000..96a60f7d Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/DifferencesA228060-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png new file mode 100644 index 00000000..88680a93 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png new file mode 100644 index 00000000..a9b198ee Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA002819-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA002819-chromium-linux.png new file mode 100644 index 00000000..6901b807 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA002819-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA002819-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA002819-firefox-linux.png new file mode 100644 index 00000000..68898358 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA002819-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA086677-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA086677-chromium-linux.png new file mode 100644 index 00000000..55bcd489 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA086677-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA086677-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA086677-firefox-linux.png new file mode 100644 index 00000000..68635001 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA086677-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png new file mode 100644 index 00000000..0bf4378e Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png new file mode 100644 index 00000000..9749d714 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png new file mode 100644 index 00000000..16e3346f Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png new file mode 100644 index 00000000..7cc5e088 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA228060-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA228060-chromium-linux.png new file mode 100644 index 00000000..23dca35d Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA228060-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA228060-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA228060-firefox-linux.png new file mode 100644 index 00000000..4028f1fb Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA228060-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png new file mode 100644 index 00000000..44e50082 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png new file mode 100644 index 00000000..e409692b Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/HistogramA001220-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/HistogramA001220-chromium-linux.png new file mode 100644 index 00000000..7ca9dbce Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/HistogramA001220-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/HistogramA001220-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/HistogramA001220-firefox-linux.png new file mode 100644 index 00000000..2dde5abf Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/HistogramA001220-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/HistogramA002819-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/HistogramA002819-chromium-linux.png new file mode 100644 index 00000000..8ea3d0c3 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/HistogramA002819-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/HistogramA002819-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/HistogramA002819-firefox-linux.png new file mode 100644 index 00000000..37df4602 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/HistogramA002819-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/HistogramA134028-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/HistogramA134028-chromium-linux.png new file mode 100644 index 00000000..4315298b Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/HistogramA134028-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/HistogramA134028-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/HistogramA134028-firefox-linux.png new file mode 100644 index 00000000..de61e0b2 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/HistogramA134028-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA001220-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA001220-chromium-linux.png new file mode 100644 index 00000000..0fdb3267 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA001220-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA001220-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA001220-firefox-linux.png new file mode 100644 index 00000000..ec340065 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA001220-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA002819-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA002819-chromium-linux.png new file mode 100644 index 00000000..837f9b8b Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA002819-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA002819-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA002819-firefox-linux.png new file mode 100644 index 00000000..ab07186d Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA002819-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA134028-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA134028-chromium-linux.png new file mode 100644 index 00000000..c30d455c Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA134028-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA134028-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA134028-firefox-linux.png new file mode 100644 index 00000000..6c3b4c3b Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA134028-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA202319-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA202319-chromium-linux.png new file mode 100644 index 00000000..0700f245 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA202319-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA202319-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA202319-firefox-linux.png new file mode 100644 index 00000000..e1ab1673 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA202319-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA241298-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA241298-chromium-linux.png new file mode 100644 index 00000000..f53d86a4 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA241298-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ModFillA241298-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ModFillA241298-firefox-linux.png new file mode 100644 index 00000000..998c0609 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ModFillA241298-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA000521-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA000521-chromium-linux.png new file mode 100644 index 00000000..d32b0f69 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA000521-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA000521-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA000521-firefox-linux.png new file mode 100644 index 00000000..7ac64aaf Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA000521-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA007235-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA007235-chromium-linux.png new file mode 100644 index 00000000..434fdbb7 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA007235-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA007235-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA007235-firefox-linux.png new file mode 100644 index 00000000..2250e636 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA007235-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA086677-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA086677-chromium-linux.png new file mode 100644 index 00000000..1e60d06d Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA086677-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA086677-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA086677-firefox-linux.png new file mode 100644 index 00000000..8fb14843 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA086677-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA114592-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA114592-chromium-linux.png new file mode 100644 index 00000000..ae2b8651 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA114592-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA114592-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA114592-firefox-linux.png new file mode 100644 index 00000000..364ba132 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA114592-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA202319-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA202319-chromium-linux.png new file mode 100644 index 00000000..58475e1f Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA202319-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA202319-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA202319-firefox-linux.png new file mode 100644 index 00000000..a00be347 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA202319-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA228060-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA228060-chromium-linux.png new file mode 100644 index 00000000..71001c69 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA228060-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA228060-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA228060-firefox-linux.png new file mode 100644 index 00000000..38839114 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA228060-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA241298-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA241298-chromium-linux.png new file mode 100644 index 00000000..a4093875 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA241298-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA241298-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA241298-firefox-linux.png new file mode 100644 index 00000000..953bd3f2 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/NumberGlyphA241298-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA000521-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA000521-chromium-linux.png new file mode 100644 index 00000000..6f5e4ab2 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA000521-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA000521-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA000521-firefox-linux.png new file mode 100644 index 00000000..204d2903 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA000521-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png new file mode 100644 index 00000000..cff1a996 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png new file mode 100644 index 00000000..047da2b4 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA007235-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA007235-chromium-linux.png new file mode 100644 index 00000000..5278910f Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA007235-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA007235-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA007235-firefox-linux.png new file mode 100644 index 00000000..01b0ca5e Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA007235-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png new file mode 100644 index 00000000..906fb935 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png new file mode 100644 index 00000000..e4214f9d Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA114592-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA114592-chromium-linux.png new file mode 100644 index 00000000..2d8fc313 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA114592-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA114592-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA114592-firefox-linux.png new file mode 100644 index 00000000..5cf97b05 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA114592-firefox-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA228060-chromium-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA228060-chromium-linux.png new file mode 100644 index 00000000..28f7dec8 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA228060-chromium-linux.png differ diff --git a/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA228060-firefox-linux.png b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA228060-firefox-linux.png new file mode 100644 index 00000000..74e8ce04 Binary files /dev/null and b/e2e/tests/transversal.spec.ts-snapshots/ShowFactorsA228060-firefox-linux.png differ diff --git a/env.d.ts b/env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/etc/Makefile b/etc/Makefile new file mode 100644 index 00000000..c934d068 --- /dev/null +++ b/etc/Makefile @@ -0,0 +1,141 @@ +.RECIPEPREFIX = | +.PHONY: FORCE playreport phony typecheck vueserve docserve preview prettiest + +SHELL = /bin/bash + +sources != shopt -s globstar && echo src/** index.html +docs != shopt -s globstar &&\ + echo doc/** etc/doc_theme/** README.md CONTRIBUTING.md etc/mkdocs.yml +tests != shopt -s globstar && echo e2e/tests/** +manifest := package.json package-lock.json requirements.txt tools/pyrun.mjs $(wildcard .husky/p*) +typescript_config := $(wildcard tsconfig*json) +e2e_local_config := e2e/playwright.config.ts +e2e_docker_config := $(e2e_local_config) e2e/playdocker.config.ts e2e/Dockerfile + +# Dummy files +installed := etc/npm_install_ran_at +typechecked := etc/typechecked_at +docked := e2e/docker_image_built + +E2E_IMAGE := frontscope-e2e-image +E2E_CONTAINER := frontscope-e2e-container + +# Default target: build the distribution in the dist/ directory +dist: $(sources) $(docs) $(install) $(typechecked) etc/vite.config.ts etc/Makefile +| npx vite --config etc/vite.config.ts build +| node tools/pyrun.mjs mkdocs build --strict --config-file etc/mkdocs.yml +| touch $@ + +# Make sometimes thinks it needs to make the following target because of some +# weirdness of how `sh -c 'COMMAND' NAME` works, or at least so I guess: +phony: +| @echo + +$(installed): $(manifest) +| npm install +| touch $@ + +$(typechecked): $(installed) $(typescript_config) $(sources) +| npx vue-tsc --noEmit -p tsconfig.vitest.json --composite false +| @touch $@ + +prettiest: $(installed) +| @node tools/prettiest.js $(flags) . + +typecheck: $(typechecked) +| @echo TypeScript types check. + +vueserve: $(typechecked) +| npx vite --config etc/vite.config.ts $(if $(mode),--mode=$(mode)) + +docserve: $(installed) +| node tools/pyrun.mjs mkdocs serve --strict -f $(or $(config),etc/mkdocs.yml) + +preview: $(dist) +| npm run preview:cmd + +testunit: $(typechecked) +| npx vitest --config etc/vitest.config.ts run $(cl_args) + +# Makes a Dockerfile that can be reused for multiple test runs +$(docked): $(manifest) $(e2e_docker_config) +| docker build -t $(E2E_IMAGE) -f e2e/Dockerfile . +| touch $@ + +last_cl_args != touch -a e2e/.last_cl_args && cat e2e/.last_cl_args + +# If no arguments are given to playreport, assume just want the last +# playwright test that has been run +ifeq ($(MAKECMDGOALS),playreport) +ifeq ($(cl_args),) +override cl_args := $(last_cl_args) +endif +endif +cl_arg_dep = +ifeq ($(last_cl_args),$(cl_args)) +else +e2e/.last_cl_args: FORCE +| @echo Detected new testing command-line arguments: +| @echo " '"$(cl_args)\' vs \'$(last_cl_args)\' +| echo $(cl_args) > $@ + +cl_arg_dep = e2e/.last_cl_args +endif + +# OK, to certify that all end-to-end tests are in good shape, we have +# to run the non-WebGL non-firefox tests in docker, the firefox WebGL tests +# locally, merge the two reports, and then check if everything passed (whew!) +e2e/certificate: e2e/results/combined/playwright-report e2e/results/docker e2e/results/local +| @grep 'status.*passed' e2e/results/docker/output/.last-run.json +| @grep 'status.*passed' e2e/results/local/output/.last-run.json +| echo 'All tests passed' > $@ + +e2e/results/combined/playwright-report: e2e/results/docker e2e/results/local e2e/playmerge.config.ts +| mkdir -p e2e/results/combined +| cp e2e/results/docker/report.zip e2e/results/combined/report-docker.zip +| cp e2e/results/local/report.zip e2e/results/combined/report-local.zip +| npx playwright merge-reports --config=e2e/playmerge.config.ts e2e/results/combined +| touch $@ + +# Here we run webgl tests in firefox on the local machine +# Since there are not many of them, we could easily miss all of them +# with a command-line argument, so pass even if we don't find any +# matching tests. +e2e/results/local: dist $(e2e_local_config) $(tests) $(cl_arg_dep) +| PLAYWRIGHT_BLOB_OUTPUT_FILE=$@/report.zip npm run test:e2e:cmd -- --grep @webGL --project firefox --pass-with-no-tests --output $@/output --reporter blob $(cl_args) || echo [Firefox webGL tests failed] +| touch $@ + +# And here we run all the other tests under Docker +# Here it is likely an error if there are no tests +e2e/results/docker: $(docked) dist $(e2e_docker_config) $(tests) $(sources) $(cl_arg_dep) +# Start the container with a dummy command to keep it alive +| docker run --name $(E2E_CONTAINER) --rm -d -i -t $(E2E_IMAGE) /bin/sh +# Copy the current source, build, and tests to the container +| docker cp dist $(E2E_CONTAINER):/test +| docker cp src $(E2E_CONTAINER):/test +| docker cp e2e/tests $(E2E_CONTAINER):/test/e2e +# Run the tests! Since we have to use a different config, sadly no way +# to reuse the npm command, so we just roll our own: +| docker exec $(E2E_CONTAINER) npx playwright test -c e2e/playdocker.config.ts $(cl_args) || echo '[Docker tests failed]' +# Recreate the results directory +| rm -rf $@ +# Extract the results from the container +| mkdir -p e2e/results +| docker cp $(E2E_CONTAINER):/test/$@ $@ +ifeq (,$(findstring --update-snapshots,$(cl_args))) +else +| docker cp $(E2E_CONTAINER):/test/e2e/tests $@ +| cp -r $@/tests/*-snapshots e2e/tests +endif +# Clean up +| docker stop $(E2E_CONTAINER) +# Backdate results if we didn't pass +| @grep 'status.*passed' e2e/results/docker/output/.last-run.json || (touch -d 20010101 $@ && exit 1) +# Whereas if we did pass, make sure results are up to date. +| touch $@ + +# finally, report on the full combined tests: + +playreport: e2e/results/combined/playwright-report +| playwright show-report $^ + diff --git a/doc_theme/.base.html.generator b/etc/doc_theme/.base.html.generator similarity index 100% rename from doc_theme/.base.html.generator rename to etc/doc_theme/.base.html.generator diff --git a/doc_theme/.main.html.generator b/etc/doc_theme/.main.html.generator similarity index 79% rename from doc_theme/.main.html.generator rename to etc/doc_theme/.main.html.generator index c34ab0b6..8ae0124b 100644 --- a/doc_theme/.main.html.generator +++ b/etc/doc_theme/.main.html.generator @@ -1,12 +1,12 @@ {% extends "base.html" %} {% block styles %} - {! ../index.html extract: {start: Bootstrap, stop: head} !} + {! ../../index.html extract: {start: Bootstrap, stop: head} !} {{ super() }} {% endblock %} {% block topmatter %} -{! ../src/views/minor/NavBar.vue extract: +{! ../../src/views/minor/NavBar.vue extract: start: template stop: template replace: [ diff --git a/etc/doc_theme/css/.coordinate.css.generator b/etc/doc_theme/css/.coordinate.css.generator new file mode 100644 index 00000000..87f56fea --- /dev/null +++ b/etc/doc_theme/css/.coordinate.css.generator @@ -0,0 +1,9 @@ +{! ../../../src/views/minor/NavBar.vue extract: + start: 'style' + stop: 'style' +!} +{! ../../../src/App.vue extract: [ + {start: 'style', stop: 'main'}, + {start: '(.*nav.*)', stop: style} +] +!} diff --git a/doc_theme/css/override.css b/etc/doc_theme/css/override.css similarity index 100% rename from doc_theme/css/override.css rename to etc/doc_theme/css/override.css diff --git a/doc_theme/js/scroll_navigation.js b/etc/doc_theme/js/scroll_navigation.js similarity index 100% rename from doc_theme/js/scroll_navigation.js rename to etc/doc_theme/js/scroll_navigation.js diff --git a/etc/eslint.config.js b/etc/eslint.config.js new file mode 100644 index 00000000..3029bfb9 --- /dev/null +++ b/etc/eslint.config.js @@ -0,0 +1,92 @@ +import globals from 'globals' +import jslint from '@eslint/js' +import tslint from 'typescript-eslint' +import pluginVue from 'eslint-plugin-vue' +import vueParser from 'vue-eslint-parser' + +export default tslint.config( + jslint.configs.recommended, + ...tslint.configs.recommended, + ...pluginVue.configs['flat/recommended'], + { + files: ['**/*.vue', '**/*.js', '**/*.mjs', '**/*.ts'], + languageOptions: { + ecmaVersion: 'latest', + }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + {argsIgnorePattern: '^_'}, + ], + '@typescript-eslint/no-empty-function': [ + 'error', + {allow: ['methods']}, + ], + 'max-len': ['error', {code: 80, comments: 80}], + 'no-trailing-spaces': 'error', + 'no-undef': 'error', + 'operator-linebreak': [ + 'error', + 'before', + {overrides: {'=': 'after'}}, + ], + }, + }, + { + files: ['**/*.vue'], + languageOptions: { + parser: vueParser, + parserOptions: { + parser: tslint.parser, // parse TS inside VUE + }, + }, + rules: { + 'vue/html-closing-bracket-newline': [ + 'error', + { + singleline: 'never', + multiline: 'never', + selfClosingTag: { + singleline: 'never', + multiline: 'never', + }, + }, + ], + 'vue/html-indent': ['error', 4], + 'vue/max-attributes-per-line': [ + 'error', + { + singleline: {max: 25}, + multiline: {max: 2}, + }, + ], + 'vue/multi-word-component-names': 'off', + 'vue/singleline-html-element-content-newline': 'off', + // For the Paramable interface, v-model directives + // need type annotation + 'vue/valid-v-model': 'off', + }, + }, + { + files: [ + 'src/components/MageExchangeA.vue', + 'src/components/MageSearchSquare.vue', + ], + rules: {'max-len': 'off'}, + }, + { + files: ['etc/vitest.config.ts'], + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, + { + files: ['src/visualizers/p5.brush.d.ts'], + rules: {'no-undef': 'off'}, + }, + { + ignores: ['.venv/*', 'dist/*', 'e2e/results/*'], + } +) diff --git a/mkdocs-workbench.yml b/etc/mkdocs-workbench.yml similarity index 100% rename from mkdocs-workbench.yml rename to etc/mkdocs-workbench.yml diff --git a/mkdocs.yml b/etc/mkdocs.yml similarity index 77% rename from mkdocs.yml rename to etc/mkdocs.yml index 198d04a2..3f6eb99a 100644 --- a/mkdocs.yml +++ b/etc/mkdocs.yml @@ -17,7 +17,8 @@ nav: - doc/working-with-git-and-github.md - doc/gitting-it-right.md - doc/code-principles.md - - doc/code-style.md + - doc/code-organization.md + - doc/code-tests.md - doc/pull-request-checklist.md - doc/visual-studio-code-setup.md - Internal code and APIs: @@ -26,8 +27,18 @@ nav: - ... | flat | src/shared/* - Other Information: - ... | flat | doc/*.md -docs_dir: doc -site_dir: dist/doc +docs_dir: ../doc +site_dir: ../dist/doc +validation: + nav: + omitted_files: info + not_found: info + absolute_links: relative_to_docs + links: + not_found: warn + anchors: warn + absolute_links: relative_to_docs + unrecognized_links: warn theme: name: readthedocs custom_dir: doc_theme/ @@ -36,22 +47,21 @@ theme: extra_css: [css/coordinate.css, css/override.css] extra_javascript: - js/scroll_navigation.js - - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML + - https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-chtml.min.js plugins: awesome-pages: collapse_single_pages: true filename: mkdocs-index.yml search: {} semiliterate: - exclude_extensions: + exclude: - '.jpg' - '.ttf' - '.ico' - '.spec.ts' - 'LICENSE.md' - ignore_folders: [node_modules, dist, coverage, '.venv', '.git'] - ignore_hidden: false - include_extensions: ['.png', 'math.ts', '.yml'] + ignore: [node_modules, dist, coverage, '.venv', '.git', tests] + include: ['.png', 'math.ts', '.yml'] extract_on_copy: true extract_standard_markdown: terminate: '' diff --git a/etc/prettier.config.js b/etc/prettier.config.js new file mode 100644 index 00000000..61b9c23a --- /dev/null +++ b/etc/prettier.config.js @@ -0,0 +1,19 @@ +export default { + arrowParens: 'avoid', + bracketSameLine: true, + bracketSpacing: false, + embeddedLanguageFormatting: 'auto', + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + jsxSingleQuote: false, + printWidth: 78, + proseWrap: 'always', + quoteProps: 'as-needed', + requirePragma: false, + semi: false, + singleQuote: true, + tabWidth: 4, + trailingComma: 'es5', + useTabs: false, + vueIndentScriptAndStyle: true, +} diff --git a/vite.config.ts b/etc/vite.config.ts similarity index 91% rename from vite.config.ts rename to etc/vite.config.ts index 82e1d815..da5f7ec5 100644 --- a/vite.config.ts +++ b/etc/vite.config.ts @@ -8,7 +8,7 @@ export default defineConfig({ plugins: [vue()], resolve: { alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), + '@': fileURLToPath(new URL('../src', import.meta.url)), }, }, css: { diff --git a/etc/vitest.config.ts b/etc/vitest.config.ts new file mode 100644 index 00000000..721a6405 --- /dev/null +++ b/etc/vitest.config.ts @@ -0,0 +1,27 @@ +/// + +import {defineConfig} from 'vite' +import Vue from '@vitejs/plugin-vue' +import path from 'path' + +export default defineConfig({ + plugins: [Vue()], + test: { + globals: true, + environment: 'happy-dom', + exclude: [ + '**/node_modules/**', + '**/e2e/**', + '**/dist/**', + '**/cypress/**', + '**/.{idea,git,cache,output,temp}/**', + '**/{karma,rollup,webpack,vite,vitest,jest}.config.*', + '**/{ava,babel,nyc,cypress,tsup,build}.config.*', + ], + }, + resolve: { + alias: { + '@': path.resolve(__dirname, '../src'), + }, + }, +}) diff --git a/package-lock.json b/package-lock.json index 9a6b3766..c3c7854e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,42 +9,43 @@ "version": "0.3.0", "hasInstallScript": true, "dependencies": { + "axios": "^1.6.8", "bigint-isqrt": "^0.3.2", "bigint-mod-arith": "^3.3.1", "interactjs": "^1.10.27", - "p5": "^1.9.2", + "p5": "^1.10.0", + "p5.brush": "^1.1.2", "vue": "^3.4.31", "vue-router": "^4.4.0" }, "devDependencies": { - "@rushstack/eslint-patch": "^1.10.3", + "@eslint/js": "^9.10.0", + "@playwright/browser-chromium": "^1.46.1", + "@playwright/browser-firefox": "^1.46.1", + "@playwright/test": "^1.46.1", "@tsconfig/node20": "^20.1.4", "@types/jsdom": "^21.1.7", "@types/node": "^20.14.10", "@types/p5": "^1.7.6", "@vitejs/plugin-vue": "^5.0.5", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^13.0.0", "@vue/test-utils": "^2.4.6", "@vue/tsconfig": "^0.5.1", - "axios": "^1.6.8", - "eslint": "^8.57.0", - "eslint-plugin-vue": "^9.27.0", + "diff": "^7.0.0", + "eslint": "^9.10.0", + "eslint-plugin-vue": "^9.28.0", "happy-dom": "^14.12.3", "husky": "^9.0.11", "jsdom": "^24.1.0", - "lint-staged": "^15.2.7", "mathjs": "^12.4.1", "npm-run-all": "^4.1.5", "prettier": "^3.3.3", - "prettier-eslint": "^16.3.0", - "prettier-eslint-cli": "^8.0.1", "sass": "^1.77.2", - "typescript": "^5.5.3", + "typescript": "^5.5.4", + "typescript-eslint": "^8.5.0", "vite": "^5.3.3", "vitest": "^1.6.0", - "vue-tsc": "^2.0.26", - "vue-unique-id": "^3.2.1" + "vue-eslint-parser": "^9.4.3", + "vue-tsc": "^2.1.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -56,11 +57,32 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -80,6 +102,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -487,24 +523,41 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -512,33 +565,87 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -554,11 +661,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@interactjs/types": { "version": "1.10.27", @@ -678,50 +793,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "node_modules/@messageformat/core": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.3.0.tgz", - "integrity": "sha512-YcXd3remTDdeMxAlbvW6oV9d/01/DZ8DHUFwSttO3LMzIZj3iO0NRw+u1xlsNNORFI+u0EQzD52ZX3+Udi0T3g==", - "dev": true, - "dependencies": { - "@messageformat/date-skeleton": "^1.0.0", - "@messageformat/number-skeleton": "^1.0.0", - "@messageformat/parser": "^5.1.0", - "@messageformat/runtime": "^3.0.1", - "make-plural": "^7.0.0", - "safe-identifier": "^0.4.1" - } - }, - "node_modules/@messageformat/date-skeleton": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.1.tgz", - "integrity": "sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==", - "dev": true - }, - "node_modules/@messageformat/number-skeleton": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz", - "integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==", - "dev": true - }, - "node_modules/@messageformat/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", - "dev": true, - "dependencies": { - "moo": "^0.5.1" - } - }, - "node_modules/@messageformat/runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz", - "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==", - "dev": true, - "dependencies": { - "make-plural": "^7.0.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -773,80 +844,48 @@ "node": ">=14" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@playwright/browser-chromium": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.46.1.tgz", + "integrity": "sha512-KF+I9NRC00OU07n7iUruEfcCBIEtXGZPkhiWpnmxE/MbyXjveQlcOQBViv/a1DUXDa3ccK2Jcbqa6YMSV/pYVQ==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.46.1" }, - "funding": { - "url": "https://opencollective.com/unts" + "engines": { + "node": ">=18" } }, - "node_modules/@prettier/eslint": { - "name": "prettier-eslint", - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", - "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "node_modules/@playwright/browser-firefox": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-firefox/-/browser-firefox-1.46.1.tgz", + "integrity": "sha512-K3h+K+QhuGuPZHh+DUvT3wy7vV+cs6joGZmVub7LV3Fc/hC7eljBE1/QK6c0txA7D84w6wmTmfU8fEoprloBTw==", "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" + "playwright-core": "1.46.1" }, "engines": { - "node": ">=16.10.0" - }, - "peerDependencies": { - "prettier-plugin-svelte": "^3.0.0", - "svelte-eslint-parser": "*" - }, - "peerDependenciesMeta": { - "prettier-plugin-svelte": { - "optional": true - }, - "svelte-eslint-parser": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@prettier/eslint/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "node_modules/@playwright/test": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz", + "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "playwright": "1.46.1" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "bin": { + "playwright": "cli.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=18" } }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -1057,13 +1096,6 @@ "win32" ] }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", - "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", - "dev": true, - "license": "MIT" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1076,18 +1108,6 @@ "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1106,12 +1126,6 @@ "parse5": "^7.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "node_modules/@types/node": { "version": "20.14.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", @@ -1128,12 +1142,6 @@ "integrity": "sha512-6pLTOo0V3N5jZb5nTwjiv3lPHLK3Z/TjbhQUj8CTWXocUk1Z/f6OHTp3Pcwi1BhWnf5gqKUcyEb1gP0KIJuQgw==", "dev": true }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@types/tough-cookie": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", @@ -1141,33 +1149,32 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", - "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", + "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/type-utils": "7.7.0", - "@typescript-eslint/utils": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/type-utils": "8.5.0", + "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1176,16 +1183,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1193,12 +1201,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1206,16 +1215,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1223,26 +1233,27 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", - "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", + "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1251,16 +1262,17 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1268,12 +1280,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1281,22 +1294,23 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1309,16 +1323,17 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1330,15 +1345,17 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1349,44 +1366,25 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", - "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", + "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/utils": "8.5.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -1394,12 +1392,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1407,22 +1406,23 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1435,16 +1435,17 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1456,80 +1457,17 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1541,41 +1479,40 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", - "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1583,12 +1520,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1596,22 +1534,23 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1624,16 +1563,17 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1645,15 +1585,17 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1664,33 +1606,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", - "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", "dev": true, "license": "MIT", "engines": { @@ -1815,30 +1734,30 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.0-alpha.16", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.16.tgz", - "integrity": "sha512-oOTnIZlx0P/idFwVw+W0NbzKDtZAQMzXSdIFfTePCKcXlb4Ys12GaGkx8NF9dsvPYV3nbv3ZsSxnkZWBmNKd7A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.1.tgz", + "integrity": "sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.0-alpha.16" + "@volar/source-map": "2.4.1" } }, "node_modules/@volar/source-map": { - "version": "2.4.0-alpha.16", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.16.tgz", - "integrity": "sha512-sL9vNG7iR2hiKZor7UkD5Sufu3QCia4cbp2gX/nGRNSdaPbhOpdAoavwlBm0PrVkpiA19NZuavZoobD8krviFg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.1.tgz", + "integrity": "sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.0-alpha.16", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.16.tgz", - "integrity": "sha512-WCx7z5O81McCQp2cC0c8081y+MgTiAR2WAiJjVL4tr4Qh4GgqK0lgn3CqAjcKizaK1R5y3wfrUqgIYr+QeFYcw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.1.tgz", + "integrity": "sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.0-alpha.16", + "@volar/language-core": "2.4.1", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -1893,64 +1812,37 @@ "@vue/shared": "3.4.31" } }, - "node_modules/@vue/devtools-api": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" - }, - "node_modules/@vue/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0" - }, - "peerDependencies": { - "eslint": ">= 8.0.0", - "prettier": ">= 3.0.0" + "de-indent": "^1.0.2", + "he": "^1.2.0" } }, - "node_modules/@vue/eslint-config-typescript": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", - "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "vue-eslint-parser": "^9.3.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "peerDependencies": { - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.0.0", - "typescript": ">=4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/@vue/devtools-api": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/language-core": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.26.tgz", - "integrity": "sha512-/lt6SfQ3O1yDAhPsnLv9iSUgXd1dMHqUm/t3RctfqjuwQf1LnftZ414X3UBn6aXT4MiwXWtbNJ4Z0NZWwDWgJQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.2.tgz", + "integrity": "sha512-tt2J7C+l0J/T5PaLhJ0jvCCi0JNwu3e8azWTYxW3jmAW5B/dac0g5UxmI7l59CQgCGFotqUqI3tXjfZgoWNtog==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "~2.4.0-alpha.15", + "@volar/language-core": "~2.4.1", "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" + "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" @@ -2064,10 +1956,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2121,19 +2014,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2177,24 +2057,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2208,14 +2070,12 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2259,12 +2119,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "node_modules/boolify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/boolify/-/boolify-1.0.1.tgz", - "integrity": "sha512-ma2q0Tc760dW54CdOyJjhrg/a54317o1zYADQJFgperNGKIKgAUGIcKnuMiff8z57+yGlrGNEt4lPgZfCgTJgA==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2320,48 +2174,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-9.1.3.tgz", - "integrity": "sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg==", - "dev": true, - "dependencies": { - "camelcase": "^8.0.0", - "map-obj": "5.0.0", - "quick-lru": "^6.1.1", - "type-fest": "^4.3.2" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz", - "integrity": "sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -2446,107 +2258,6 @@ "node": ">= 6" } }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2565,18 +2276,10 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2584,25 +2287,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/complex.js": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", @@ -2645,17 +2329,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2782,11 +2455,20 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -2797,36 +2479,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3003,15 +2655,6 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/escape-latex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", @@ -3031,43 +2674,40 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", @@ -3079,58 +2719,24 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" + "jiti": "*" }, "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { + "jiti": { "optional": true } } }, "node_modules/eslint-plugin-vue": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz", - "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz", + "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==", "dev": true, "license": "MIT", "dependencies": { @@ -3139,7 +2745,7 @@ "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.0", + "semver": "^7.6.3", "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, @@ -3187,10 +2793,64 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-seedrandom/-/esm-seedrandom-3.0.5.tgz", + "integrity": "sha512-pMAq0mFIr5JQ3Ihbng7EBLMJ+llMbaDKkiG44pqbSXS0NIZWtEANpOpxb5s6Q8Q2R562P26qMHPv8YtP/NHh9g==", + "license": "MIT" + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", @@ -3248,17 +2908,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -3288,17 +2942,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3344,15 +2993,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -3385,30 +3035,30 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, "funding": [ { "type": "individual", @@ -3444,7 +3094,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3467,12 +3116,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -3488,10 +3131,14 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -3520,28 +3167,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -3566,18 +3191,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -3606,26 +3219,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3653,26 +3246,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -3721,27 +3294,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3799,6 +3351,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -3929,31 +3494,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", @@ -4041,12 +3581,16 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4407,7 +3951,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", @@ -4432,6 +3977,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -4449,529 +3995,112 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "engines": { + "node": ">=4" } }, - "node_modules/lint-staged": { - "version": "15.2.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz", - "integrity": "sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==", + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.3.4", - "execa": "~8.0.1", - "lilconfig": "~3.1.1", - "listr2": "~8.2.1", - "micromatch": "~4.0.7", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.4.2" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" }, "engines": { - "node": ">=18.12.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/lint-staged" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", - "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" + "get-func-name": "^2.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mathjs": { + "version": "12.4.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.1.tgz", + "integrity": "sha512-welnW3khgwYjPYvECFHO+xkCxAx9IKIIPDDWPi8B5rKAvmgoEHnQX9slEmHKZTNaJiE+OS4qrJJcB4sfDn/4sw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.24.0", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "4.3.4", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.1" + }, + "bin": { + "mathjs": "bin/cli.js" }, "engines": { - "node": ">=18.0.0" + "node": ">= 18" } }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevel-colored-level-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", - "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/make-plural": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", - "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==", - "dev": true - }, - "node_modules/map-obj": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.0.tgz", - "integrity": "sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mathjs": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.1.tgz", - "integrity": "sha512-welnW3khgwYjPYvECFHO+xkCxAx9IKIIPDDWPi8B5rKAvmgoEHnQX9slEmHKZTNaJiE+OS4qrJJcB4sfDn/4sw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.24.0", - "complex.js": "^2.1.1", - "decimal.js": "^10.4.3", - "escape-latex": "^1.2.0", - "fraction.js": "4.3.4", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^4.1.1" - }, - "bin": { - "mathjs": "bin/cli.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" + "node": ">= 0.10.0" } }, "node_modules/merge-stream": { @@ -5007,7 +4136,6 @@ "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -5016,7 +4144,6 @@ "version": "2.1.34", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, "dependencies": { "mime-db": "1.51.0" }, @@ -5069,12 +4196,6 @@ "ufo": "^1.3.2" } }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5419,15 +4540,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -5491,9 +4603,22 @@ } }, "node_modules/p5": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/p5/-/p5-1.9.2.tgz", - "integrity": "sha512-fV8Td9Q1qlYXRXPLNrclRsgzXxPp/EuDlJUteV1XEtsy0JwjjCVteCrv7TTCU71BSoEtmuQ/51BIVRUJi/0gEw==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/p5/-/p5-1.10.0.tgz", + "integrity": "sha512-6cWYBFhnZz7jNC6p1VWvlt3QReMqrRSmO90bgECQIKB9oko2w/sKrOAVMyei5tjIzSYcSY0JHy+BRtSAWq24jQ==", + "license": "LGPL-2.1" + }, + "node_modules/p5.brush": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/p5.brush/-/p5.brush-1.1.2.tgz", + "integrity": "sha512-odDgTY8+KkvtVEV95YT16VY976kJguAgsbpHsXdwkaLUUEXsiWwe51mRcvRvDYriaQ9BCSIxIHey321qKtm93Q==", + "license": "MIT", + "dependencies": { + "esm-seedrandom": "^3.0.5" + }, + "peerDependencies": { + "p5": "^1.9.0" + } }, "node_modules/parent-module": { "version": "1.0.1", @@ -5548,15 +4673,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5597,15 +4713,6 @@ "node": "14 || >=16.14" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -5640,18 +4747,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -5672,231 +4767,117 @@ "pathe": "^1.1.2" } }, - "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "node_modules/playwright": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", + "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "playwright-core": "1.46.1" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", "bin": { - "prettier": "bin/prettier.cjs" + "playwright": "cli.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/prettier-eslint": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", - "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "node_modules/playwright-core": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", + "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", "dev": true, - "dependencies": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" - }, - "engines": { - "node": ">=16.10.0" - }, - "peerDependencies": { - "prettier-plugin-svelte": "^3.0.0", - "svelte-eslint-parser": "*" - }, - "peerDependenciesMeta": { - "prettier-plugin-svelte": { - "optional": true - }, - "svelte-eslint-parser": { - "optional": true - } - } - }, - "node_modules/prettier-eslint-cli": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/prettier-eslint-cli/-/prettier-eslint-cli-8.0.1.tgz", - "integrity": "sha512-jru4JUDHzWEtM/SOxqagU7hQTVP8BVrxO2J0qNauWZuPRld6Ea2eyNaEzIGx6I+yjmOLCsjNM+vU1AJgaW1ZSQ==", - "dev": true, - "dependencies": { - "@messageformat/core": "^3.2.0", - "@prettier/eslint": "npm:prettier-eslint@^16.1.0", - "arrify": "^2.0.1", - "boolify": "^1.0.1", - "camelcase-keys": "^9.1.0", - "chalk": "^4.1.2", - "common-tags": "^1.8.2", - "core-js": "^3.33.0", - "eslint": "^8.51.0", - "find-up": "^5.0.0", - "get-stdin": "^8.0.0", - "glob": "^10.3.10", - "ignore": "^5.2.4", - "indent-string": "^4.0.0", - "lodash.memoize": "^4.1.2", - "loglevel-colored-level-prefix": "^1.0.0", - "rxjs": "^7.8.1", - "yargs": "^17.7.2" - }, + "license": "Apache-2.0", "bin": { - "prettier-eslint": "dist/index.js" + "playwright-core": "cli.js" }, "engines": { - "node": ">=16.10.0" - }, - "peerDependencies": { - "prettier-eslint": "*" - }, - "peerDependenciesMeta": { - "prettier-eslint": { - "optional": true - } + "node": ">=18" } }, - "node_modules/prettier-eslint-cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/prettier-eslint-cli/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dev": true, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^10 || ^12 || >=14" } }, - "node_modules/prettier-eslint-cli/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=6.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { @@ -5934,8 +4915,7 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/psl": { "version": "1.9.0", @@ -5980,18 +4960,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", - "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -6059,21 +5027,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6082,12 +5035,13 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -6107,56 +5061,6 @@ "node": ">=4" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6167,28 +5071,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.16.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.1.tgz", @@ -6253,21 +5135,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6310,13 +5177,11 @@ "dev": true }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6383,58 +5248,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -6487,15 +5300,6 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6670,22 +5474,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6723,6 +5511,15 @@ "node": ">=14.0.0" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6776,12 +5573,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6826,9 +5617,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -6839,6 +5630,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", + "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.5.0", + "@typescript-eslint/parser": "8.5.0", + "@typescript-eslint/utils": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", @@ -7131,26 +5946,15 @@ "vue": "^3.2.0" } }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/vue-tsc": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.26.tgz", - "integrity": "sha512-tOhuwy2bIXbMhz82ef37qeiaQHMXKQkD6mOF6CCPl3/uYtST3l6fdNyfMxipudrQTxTfXVPlgJdMENBFfC1CfQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.2.tgz", + "integrity": "sha512-PH1BDxWT3eaPhl73elyZj6DV0nR3K4IFoUM1sGzMXXQneovVUwHQytdSyAHiED5MtEINGSHpL/Hs9ch+c/tDTw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/typescript": "~2.4.0-alpha.15", - "@vue/language-core": "2.0.26", + "@volar/typescript": "~2.4.1", + "@vue/language-core": "2.1.2", "semver": "^7.5.4" }, "bin": { @@ -7160,15 +5964,6 @@ "typescript": ">=5.0.0" } }, - "node_modules/vue-unique-id": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/vue-unique-id/-/vue-unique-id-3.2.1.tgz", - "integrity": "sha512-Ih4vw3nx5O0M0q16Omx23T6VQW5U+RD16SEEbGa+aJWLJxFco8slQN6z6GUuzwgREgofH3ns9n7a97qr6DI73g==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -7267,25 +6062,8 @@ "bin": { "why-is-node-running": "cli.js" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { @@ -7306,12 +6084,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -7349,61 +6121,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -7424,10 +6141,23 @@ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true }, - "@babel/parser": { + "@babel/helper-string-parser": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==" + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" + }, + "@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "requires": { + "@babel/types": "^7.25.6" + } }, "@babel/runtime": { "version": "7.24.4", @@ -7438,6 +6168,16 @@ "regenerator-runtime": "^0.14.0" } }, + "@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "requires": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + } + }, "@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -7609,43 +6349,83 @@ } }, "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true }, + "@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "requires": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + } + }, "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true + }, + "espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "requires": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + } + }, + "globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true + } } }, "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", + "dev": true + }, + "@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "levn": "^0.4.1" } }, "@humanwhocodes/module-importer": { @@ -7654,10 +6434,10 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true }, "@interactjs/types": { @@ -7744,50 +6524,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "@messageformat/core": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.3.0.tgz", - "integrity": "sha512-YcXd3remTDdeMxAlbvW6oV9d/01/DZ8DHUFwSttO3LMzIZj3iO0NRw+u1xlsNNORFI+u0EQzD52ZX3+Udi0T3g==", - "dev": true, - "requires": { - "@messageformat/date-skeleton": "^1.0.0", - "@messageformat/number-skeleton": "^1.0.0", - "@messageformat/parser": "^5.1.0", - "@messageformat/runtime": "^3.0.1", - "make-plural": "^7.0.0", - "safe-identifier": "^0.4.1" - } - }, - "@messageformat/date-skeleton": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.1.tgz", - "integrity": "sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==", - "dev": true - }, - "@messageformat/number-skeleton": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz", - "integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==", - "dev": true - }, - "@messageformat/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", - "dev": true, - "requires": { - "moo": "^0.5.1" - } - }, - "@messageformat/runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz", - "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==", - "dev": true, - "requires": { - "make-plural": "^7.0.0" - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7827,45 +6563,31 @@ "dev": true, "optional": true }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true - }, - "@prettier/eslint": { - "version": "npm:prettier-eslint@16.3.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", - "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", - "dev": true, - "requires": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" - }, - "dependencies": { - "@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - } - } + "@playwright/browser-chromium": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.46.1.tgz", + "integrity": "sha512-KF+I9NRC00OU07n7iUruEfcCBIEtXGZPkhiWpnmxE/MbyXjveQlcOQBViv/a1DUXDa3ccK2Jcbqa6YMSV/pYVQ==", + "dev": true, + "requires": { + "playwright-core": "1.46.1" + } + }, + "@playwright/browser-firefox": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-firefox/-/browser-firefox-1.46.1.tgz", + "integrity": "sha512-K3h+K+QhuGuPZHh+DUvT3wy7vV+cs6joGZmVub7LV3Fc/hC7eljBE1/QK6c0txA7D84w6wmTmfU8fEoprloBTw==", + "dev": true, + "requires": { + "playwright-core": "1.46.1" + } + }, + "@playwright/test": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz", + "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==", + "dev": true, + "requires": { + "playwright": "1.46.1" } }, "@rollup/rollup-android-arm-eabi": { @@ -7980,12 +6702,6 @@ "dev": true, "optional": true }, - "@rushstack/eslint-patch": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", - "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", - "dev": true - }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -7998,18 +6714,6 @@ "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", "dev": true }, - "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, "@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -8027,12 +6731,6 @@ "parse5": "^7.0.0" } }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "@types/node": { "version": "20.14.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", @@ -8048,12 +6746,6 @@ "integrity": "sha512-6pLTOo0V3N5jZb5nTwjiv3lPHLK3Z/TjbhQUj8CTWXocUk1Z/f6OHTp3Pcwi1BhWnf5gqKUcyEb1gP0KIJuQgw==", "dev": true }, - "@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "@types/tough-cookie": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", @@ -8061,91 +6753,89 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", - "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", + "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/type-utils": "7.7.0", - "@typescript-eslint/utils": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/type-utils": "8.5.0", + "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" } }, "@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true }, "@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" } } } }, "@typescript-eslint/parser": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", - "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", + "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" } }, "@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -8153,12 +6843,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" } }, @@ -8172,9 +6862,9 @@ } }, "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -8182,44 +6872,34 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - } - }, "@typescript-eslint/type-utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", - "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", + "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/utils": "8.5.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -8227,12 +6907,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" } }, @@ -8246,51 +6926,9 @@ } }, "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -8299,46 +6937,43 @@ } }, "@typescript-eslint/utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", - "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" } }, "@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -8346,12 +6981,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" } }, @@ -8365,9 +7000,9 @@ } }, "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -8375,22 +7010,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "@vitejs/plugin-vue": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", @@ -8481,27 +7100,27 @@ } }, "@volar/language-core": { - "version": "2.4.0-alpha.16", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.16.tgz", - "integrity": "sha512-oOTnIZlx0P/idFwVw+W0NbzKDtZAQMzXSdIFfTePCKcXlb4Ys12GaGkx8NF9dsvPYV3nbv3ZsSxnkZWBmNKd7A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.1.tgz", + "integrity": "sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==", "dev": true, "requires": { - "@volar/source-map": "2.4.0-alpha.16" + "@volar/source-map": "2.4.1" } }, "@volar/source-map": { - "version": "2.4.0-alpha.16", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.16.tgz", - "integrity": "sha512-sL9vNG7iR2hiKZor7UkD5Sufu3QCia4cbp2gX/nGRNSdaPbhOpdAoavwlBm0PrVkpiA19NZuavZoobD8krviFg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.1.tgz", + "integrity": "sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ==", "dev": true }, "@volar/typescript": { - "version": "2.4.0-alpha.16", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.16.tgz", - "integrity": "sha512-WCx7z5O81McCQp2cC0c8081y+MgTiAR2WAiJjVL4tr4Qh4GgqK0lgn3CqAjcKizaK1R5y3wfrUqgIYr+QeFYcw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.1.tgz", + "integrity": "sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q==", "dev": true, "requires": { - "@volar/language-core": "2.4.0-alpha.16", + "@volar/language-core": "2.4.1", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -8552,46 +7171,35 @@ "@vue/shared": "3.4.31" } }, - "@vue/devtools-api": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" - }, - "@vue/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", "dev": true, "requires": { - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0" + "de-indent": "^1.0.2", + "he": "^1.2.0" } }, - "@vue/eslint-config-typescript": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", - "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "vue-eslint-parser": "^9.3.1" - } + "@vue/devtools-api": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "@vue/language-core": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.26.tgz", - "integrity": "sha512-/lt6SfQ3O1yDAhPsnLv9iSUgXd1dMHqUm/t3RctfqjuwQf1LnftZ414X3UBn6aXT4MiwXWtbNJ4Z0NZWwDWgJQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.2.tgz", + "integrity": "sha512-tt2J7C+l0J/T5PaLhJ0jvCCi0JNwu3e8azWTYxW3jmAW5B/dac0g5UxmI7l59CQgCGFotqUqI3tXjfZgoWNtog==", "dev": true, "requires": { - "@volar/language-core": "~2.4.0-alpha.15", + "@volar/language-core": "~2.4.1", "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" + "path-browserify": "^1.0.1" }, "dependencies": { "brace-expansion": { @@ -8679,9 +7287,9 @@ "dev": true }, "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, "acorn-jsx": { @@ -8718,12 +7326,6 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "dev": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -8755,18 +7357,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -8776,14 +7366,12 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -8818,12 +7406,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "boolify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/boolify/-/boolify-1.0.1.tgz", - "integrity": "sha512-ma2q0Tc760dW54CdOyJjhrg/a54317o1zYADQJFgperNGKIKgAUGIcKnuMiff8z57+yGlrGNEt4lPgZfCgTJgA==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8865,32 +7447,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "dev": true - }, - "camelcase-keys": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-9.1.3.tgz", - "integrity": "sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg==", - "dev": true, - "requires": { - "camelcase": "^8.0.0", - "map-obj": "5.0.0", - "quick-lru": "^6.1.1", - "type-fest": "^4.3.2" - }, - "dependencies": { - "type-fest": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz", - "integrity": "sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==", - "dev": true - } - } - }, "chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -8939,83 +7495,19 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "ansi-regex": "^6.0.1" + "is-glob": "^4.0.1" } } } }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9031,33 +7523,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, "complex.js": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", @@ -9092,12 +7565,6 @@ "proto-list": "~1.2.1" } }, - "core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -9188,7 +7655,12 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true }, "diff-sequences": { @@ -9197,30 +7669,6 @@ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -9358,12 +7806,6 @@ "@esbuild/win32-x64": "0.21.5" } }, - "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true - }, "escape-latex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", @@ -9377,72 +7819,80 @@ "dev": true }, "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" - } - }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + }, + "dependencies": { + "eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true + }, + "espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "requires": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + } + } } }, "eslint-plugin-vue": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz", - "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz", + "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", @@ -9450,7 +7900,7 @@ "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.0", + "semver": "^7.6.3", "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, @@ -9479,6 +7929,11 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, + "esm-seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-seedrandom/-/esm-seedrandom-3.0.5.tgz", + "integrity": "sha512-pMAq0mFIr5JQ3Ihbng7EBLMJ+llMbaDKkiG44pqbSXS0NIZWtEANpOpxb5s6Q8Q2R562P26qMHPv8YtP/NHh9g==" + }, "espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -9525,12 +7980,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, "execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -9554,16 +8003,10 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -9606,12 +8049,12 @@ } }, "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "requires": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" } }, "fill-range": { @@ -9634,14 +8077,13 @@ } }, "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "requires": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" } }, "flatted": { @@ -9653,8 +8095,7 @@ "follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "foreground-child": { "version": "3.1.1", @@ -9670,7 +8111,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9683,12 +8123,6 @@ "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -9697,9 +8131,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { @@ -9720,18 +8154,6 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true - }, "get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -9749,12 +8171,6 @@ "has-symbols": "^1.0.1" } }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, "get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -9771,20 +8187,6 @@ "get-intrinsic": "^1.1.1" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -9803,20 +8205,6 @@ "type-fest": "^0.20.2" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -9857,23 +8245,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - } - } - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -9910,6 +8281,15 @@ "has-symbols": "^1.0.2" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -10000,28 +8380,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", @@ -10088,12 +8446,12 @@ "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-date-object": { @@ -10380,103 +8738,6 @@ "type-check": "~0.4.0" } }, - "lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true - }, - "lint-staged": { - "version": "15.2.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz", - "integrity": "sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==", - "dev": true, - "requires": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.3.4", - "execa": "~8.0.1", - "lilconfig": "~3.1.1", - "listr2": "~8.2.1", - "micromatch": "~4.0.7", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.4.2" - }, - "dependencies": { - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true - } - } - }, - "listr2": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", - "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", - "dev": true, - "requires": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -10499,180 +8760,27 @@ "pkg-types": "^1.0.3" } }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", - "dev": true, - "requires": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "requires": { - "get-east-asian-width": "^1.0.0" - } - }, - "slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - } - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true - }, - "loglevel-colored-level-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", - "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } + "p-locate": "^5.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", @@ -10682,15 +8790,6 @@ "get-func-name": "^2.0.1" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -10699,18 +8798,6 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "make-plural": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", - "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==", - "dev": true - }, - "map-obj": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.0.tgz", - "integrity": "sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==", - "dev": true - }, "mathjs": { "version": "12.4.1", "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.1.tgz", @@ -10759,14 +8846,12 @@ "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { "version": "2.1.34", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, "requires": { "mime-db": "1.51.0" } @@ -10804,12 +8889,6 @@ "ufo": "^1.3.2" } }, - "moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -11060,15 +9139,6 @@ "object-keys": "^1.1.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, "onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -11111,9 +9181,17 @@ } }, "p5": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/p5/-/p5-1.9.2.tgz", - "integrity": "sha512-fV8Td9Q1qlYXRXPLNrclRsgzXxPp/EuDlJUteV1XEtsy0JwjjCVteCrv7TTCU71BSoEtmuQ/51BIVRUJi/0gEw==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/p5/-/p5-1.10.0.tgz", + "integrity": "sha512-6cWYBFhnZz7jNC6p1VWvlt3QReMqrRSmO90bgECQIKB9oko2w/sKrOAVMyei5tjIzSYcSY0JHy+BRtSAWq24jQ==" + }, + "p5.brush": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/p5.brush/-/p5.brush-1.1.2.tgz", + "integrity": "sha512-odDgTY8+KkvtVEV95YT16VY976kJguAgsbpHsXdwkaLUUEXsiWwe51mRcvRvDYriaQ9BCSIxIHey321qKtm93Q==", + "requires": { + "esm-seedrandom": "^3.0.5" + } }, "parent-module": { "version": "1.0.1", @@ -11155,12 +9233,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -11191,12 +9263,6 @@ } } }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, "pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -11220,12 +9286,6 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -11243,6 +9303,31 @@ "pathe": "^1.1.2" } }, + "playwright": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", + "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.46.1" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "playwright-core": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", + "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", + "dev": true + }, "postcss": { "version": "8.4.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", @@ -11275,109 +9360,6 @@ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true }, - "prettier-eslint": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", - "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", - "dev": true, - "requires": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" - }, - "dependencies": { - "@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - } - } - } - }, - "prettier-eslint-cli": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/prettier-eslint-cli/-/prettier-eslint-cli-8.0.1.tgz", - "integrity": "sha512-jru4JUDHzWEtM/SOxqagU7hQTVP8BVrxO2J0qNauWZuPRld6Ea2eyNaEzIGx6I+yjmOLCsjNM+vU1AJgaW1ZSQ==", - "dev": true, - "requires": { - "@messageformat/core": "^3.2.0", - "@prettier/eslint": "npm:prettier-eslint@^16.1.0", - "arrify": "^2.0.1", - "boolify": "^1.0.1", - "camelcase-keys": "^9.1.0", - "chalk": "^4.1.2", - "common-tags": "^1.8.2", - "core-js": "^3.33.0", - "eslint": "^8.51.0", - "find-up": "^5.0.0", - "get-stdin": "^8.0.0", - "glob": "^10.3.10", - "ignore": "^5.2.4", - "indent-string": "^4.0.0", - "lodash.memoize": "^4.1.2", - "loglevel-colored-level-prefix": "^1.0.0", - "rxjs": "^7.8.1", - "yargs": "^17.7.2" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - } - }, - "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -11406,8 +9388,7 @@ "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "psl": { "version": "1.9.0", @@ -11433,12 +9414,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "quick-lru": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", - "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", - "dev": true - }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -11493,18 +9468,6 @@ "functions-have-names": "^1.2.2" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -11512,12 +9475,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -11528,60 +9491,12 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - } - } - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "rollup": { "version": "4.16.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.1.tgz", @@ -11623,21 +9538,6 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11671,13 +9571,10 @@ "dev": true }, "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "shebang-command": { "version": "2.0.0", @@ -11723,36 +9620,6 @@ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - } - } - }, "source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -11802,12 +9669,6 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11929,16 +9790,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -11969,6 +9820,11 @@ "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12006,12 +9862,6 @@ "dev": true, "requires": {} }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12040,11 +9890,22 @@ "dev": true }, "typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "devOptional": true }, + "typescript-eslint": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", + "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "8.5.0", + "@typescript-eslint/parser": "8.5.0", + "@typescript-eslint/utils": "8.5.0" + } + }, "ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", @@ -12210,33 +10071,17 @@ "@vue/devtools-api": "^6.5.1" } }, - "vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "vue-tsc": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.26.tgz", - "integrity": "sha512-tOhuwy2bIXbMhz82ef37qeiaQHMXKQkD6mOF6CCPl3/uYtST3l6fdNyfMxipudrQTxTfXVPlgJdMENBFfC1CfQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.2.tgz", + "integrity": "sha512-PH1BDxWT3eaPhl73elyZj6DV0nR3K4IFoUM1sGzMXXQneovVUwHQytdSyAHiED5MtEINGSHpL/Hs9ch+c/tDTw==", "dev": true, "requires": { - "@volar/typescript": "~2.4.0-alpha.15", - "@vue/language-core": "2.0.26", + "@volar/typescript": "~2.4.1", + "@vue/language-core": "2.1.2", "semver": "^7.5.4" } }, - "vue-unique-id": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/vue-unique-id/-/vue-unique-id-3.2.1.tgz", - "integrity": "sha512-Ih4vw3nx5O0M0q16Omx23T6VQW5U+RD16SEEbGa+aJWLJxFco8slQN6z6GUuzwgREgofH3ns9n7a97qr6DI73g==", - "dev": true - }, "w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -12309,17 +10154,6 @@ "stackback": "0.0.2" } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, "wrap-ansi-cjs": { "version": "npm:wrap-ansi@7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -12331,12 +10165,6 @@ "strip-ansi": "^6.0.0" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -12356,45 +10184,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 5ed7ecda..49d39e39 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "frontscope", "version": "0.3.0", + "type": "module", "scripts": { "help:help": "echo Prints a list of available scripts and a reminder about how to get more help.", "help": "echo Available scripts -- execute \\`npm run help:SCRIPTNAME\\` for help on SCRIPTNAME: && (npm run | grep '^\\s\\s\\S' | grep -v 'help\\|only\\|postinstall\\|prepare')", @@ -8,121 +9,119 @@ "help:dev-1": "echo Compiles frontscope and starts a server running it.", "help:dev-2": "echo Note the server will hot-reload the code from any", "help:dev-3": "echo source files as they change, to ease development.", + "dev": "make -f etc/Makefile vueserve", "help:dev:workbench": "run-s -s help:dev:workbench-*", "help:dev:workbench-1": "echo Compiles frontscope and starts a server running it in workbench mode,", "help:dev:workbench-2": "echo \"with the visualizers in the 'visualizers-workbench' directory loaded.\"", "help:dev:workbench-3": "echo \"Hot-reloads code changes, just like the 'dev' script.\"", - "dev": "npm run typecheck && vite", - "dev:workbench": "npm run typecheck && vite --mode workbench", + "dev:workbench": "npm run dev mode=workbench", "help:doc:serve": "run-s -s help:doc:serve-*", "help:doc:serve-1": "echo \"This is like the 'dev' script, but for the\"", "help:doc:serve-2": "echo embedded documentation rather than the", "help:doc:serve-3": "echo Numberscope interface itself.", + "doc:serve": "make -f etc/Makefile docserve", "help:doc:serve:workbench": "run-s -s help:doc:serve:workbench-*", "help:doc:serve:workbench-1": "echo \"This is like the 'dev:workbench' script, but\"", "help:doc:serve:workbench-2": "echo for the embedded documentation rather than the", "help:doc:serve:workbench-3": "echo Numberscope interface itself.", - "doc:serve": "cd tools && node pyrun.mjs mkdocs serve", - "doc:serve:workbench": "cd tools && node pyrun.mjs mkdocs serve --config-file=mkdocs-workbench.yml", + "doc:serve:workbench": "npm run doc:serve config=etc/mkdocs-workbench.yml", "help:build": "run-s -s help:build:*", "help:build:1": "echo Compiles frontscope and minifies the result,", "help:build:2": "echo producing a bundle ready for installation", "help:build:3": "echo on a server.", - "build": "npm run typecheck && vite build && cd tools && node pyrun.mjs mkdocs build", + "build": "make -f etc/Makefile", "help:preview": "run-s -s help:preview:*", - "help:preview:1": "echo Serves the most recently built files -- the", - "help:preview:2": "echo \"contents of the 'dist/' directory -- for you\"", - "help:preview:3": "echo \"to preview. This script differs from 'dev' in\"", - "help:preview:4": "echo \"that there isn't any hot module reload. It is\"", - "help:preview:5": "echo closer to what you will run in production.", - "preview": "vite preview", - "help:test:unit": "echo Runs unit tests.", - "test:unit": "vitest run", + "help:preview:1": "echo Runs build and then serves the resulting site", + "help:preview:2": "echo \"(the contents of the 'dist/' directory) \"", + "help:preview:3": "echo for you to browse. This script differs from", + "help:preview:4": "echo \"'dev' in that there isn't any hot module\"", + "help:preview:5": "echo reload. It is what runs in production.", + "preview": "make -f etc/Makefile preview", + "help:preview:cmd": "echo Previews w/o rebuild; needed for e2e tests.", + "preview:cmd": "vite --config etc/vite.config.ts preview", + "help:test:unit": "echo Typechecks and runs unit tests.", + "test:unit": "sh -c 'make -f etc/Makefile testunit \"cl_args=$@\"' phony", + "help:test:e2e": "echo Runs end-to-end in-browser tests via Docker.", + "test:e2e": "sh -c 'make -f etc/Makefile e2e/certificate \"cl_args=$@\"' phony", + "help:test:e2e:cmd": "run-s -s help:test:e2e:cmd-*", + "help:test:e2e:cmd-1": "echo Runs end-to-end tests directly.", + "help:test:e2e:cmd-2": "echo However, note that it does not rebuild", + "help:test:e2e:cmd-3": "echo before it runs, and some tests are not", + "help:test:e2e:cmd-4": "echo reproducible outside of Docker, so be", + "help:test:e2e:cmd-5": "echo careful -- this script exists mostly for", + "help:test:e2e:cmd-6": "echo use by other scripts.", + "test:e2e:cmd": "playwright test -c e2e/playwright.config.ts", + "help:test:e2e:report": "echo Runs e2e and opens report in browser", + "test:e2e:report": "sh -c 'make -f etc/Makefile playreport \"cl_args=$@\"' phony", + "help:test:e2e:ui": "echo Runs interactive end-to-end tests directly.", + "test:e2e:ui": "npm run build && npm run test:e2e:cmd -- --ui", "help:typecheck": "run-s -s help:typecheck:*", "help:typecheck:1": "echo Checks for TypeScript errors in both .vue", "help:typecheck:2": "echo and .ts files.", - "typecheck": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", + "typecheck": "make -f etc/Makefile typecheck", "help:lint": "run-s -s help:lintx:*", - "help:lintx:01": "echo If you would like to format your code before you", - "help:lintx:02": "echo make a commit with git -- which has hooks to do", - "help:lintx:03": "echo automatic formatting -- you can call this script", - "help:lintx:04": "echo \"at any time. It runs 'prettier' and\"", - "help:lintx:05": "echo \"'eslint --fix' on the project files. Note that\"", - "help:lintx:06": "echo this operation does not simply _check_ the", - "help:lintx:07": "echo formatting of your files, it _formats_ them!", - "help:lintx:08": "echo At least, if possible -- there are some", - "help:lintx:09": "echo formatting/code errors that it does not know how", - "help:lintx:10": "echo to fix. These will simply be reported as errors.", + "help:lintx:01": "echo If you would like to format your code before", + "help:lintx:02": "echo you make a commit with git -- which has hooks", + "help:lintx:03": "echo to check the formatting -- call this script at", + "help:lintx:04": "echo \"any time. It runs 'prettier' and 'eslint --fix'\"", + "help:lintx:05": "echo on the project files. Note that this operation", + "help:lintx:06": "echo does not simply _check_ the formatting of your", + "help:lintx:07": "echo files, it _formats_ them! At least, if possible;", + "help:lintx:08": "echo there are some formatting/code errors that it", + "help:lintx:09": "echo does not know how to fix. These will simply be", + "help:lintx:10": "echo reported as errors.", "help:lintx:11": "echo If any such issues are present at the time of a", - "help:lintx:12": "echo of a commit, presuming the standard git hooks", + "help:lintx:12": "echo commit, presuming the standard git hooks that", "help:lintx:13": "echo this project sets up are in place, the commit", "help:lintx:14": "echo will be rejected.", - "lint": "prettier-eslint --write \"**/*.*\" && npm run lint:check", - "help:lint:check": "run-s -s help:lint:check:*", - "help:lint:check:01": "echo \"This is like the 'lint' script but only\"", - "help:lint:check:02": "echo \"reports problems; does not modify any of\"", - "help:lint:check:03": "echo your source files. Note that this script", - "help:lint:check:04": "echo might not report any errors but then a run", - "help:lint:check:05": "echo \"of the 'lint' script might modify files.\"", - "help:lint:check:06": "echo \"That can happen because 'prettier' does not\"", - "help:lint:check:07": "echo \"have a 'diagnostic' mode in which it\"", - "help:lint:check:08": "echo reports discrepancies with its preferred", - "help:lint:check:09": "echo formatting, while some formatting not", - "help:lint:check:10": "echo \"preferred by 'prettier' is nevertheless\"", - "help:lint:check:11": "echo \"acceptable to 'eslint'.\"", - "lint:check": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", - "help:lint:list": "run-s -s help:lint:list:*", - "help:lint:list:1": "echo \"This is like the 'lint' script but only\"", - "help:lint:list:2": "echo _lists_ the files that would be changed.", - "help:lint:list:3": "echo It does not modify any source files or report", - "help:lint:list:4": "echo what the problems were or report any problems", - "help:lint:list:5": "echo that the tools do not know how to fix.", - "lint:list": "prettier-eslint --list-different \"**/*.*\"", - "help:lint:staged": "echo Only for internal use in the pre-commit hook.", - "lint:staged": "lint-staged", + "lint": "make -f etc/Makefile prettiest 'flags=-l --write'", + "help:lint:check": "run-s -s help:lint:check-*", + "help:lint:check-1": "echo \"This is like the 'lint' script, but it\"", + "help:lint:check-2": "echo only shows what changes would be made and", + "help:lint:check-3": "echo reports any unresolved problems; it does", + "help:lint:check-4": "echo not modify any of your source files.", + "lint:check": "make -f etc/Makefile prettiest flags=-s", "//only lifecycle scripts below here": "echo", "prepare": "husky", "postinstall": "python3 -m venv .venv && cd tools && node pyrun.mjs python -m pip install -U pip && node pyrun.mjs pip install -r requirements.txt" }, "dependencies": { + "axios": "^1.6.8", "bigint-isqrt": "^0.3.2", "bigint-mod-arith": "^3.3.1", "interactjs": "^1.10.27", - "p5": "^1.9.2", + "p5": "^1.10.0", + "p5.brush": "^1.1.2", "vue": "^3.4.31", "vue-router": "^4.4.0" }, "devDependencies": { - "@rushstack/eslint-patch": "^1.10.3", + "@eslint/js": "^9.10.0", + "@playwright/browser-chromium": "^1.46.1", + "@playwright/browser-firefox": "^1.46.1", + "@playwright/test": "^1.46.1", "@tsconfig/node20": "^20.1.4", "@types/jsdom": "^21.1.7", "@types/node": "^20.14.10", "@types/p5": "^1.7.6", "@vitejs/plugin-vue": "^5.0.5", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^13.0.0", "@vue/test-utils": "^2.4.6", "@vue/tsconfig": "^0.5.1", - "axios": "^1.6.8", - "eslint": "^8.57.0", - "eslint-plugin-vue": "^9.27.0", + "diff": "^7.0.0", + "eslint": "^9.10.0", + "eslint-plugin-vue": "^9.28.0", "happy-dom": "^14.12.3", "husky": "^9.0.11", "jsdom": "^24.1.0", - "lint-staged": "^15.2.7", "mathjs": "^12.4.1", "npm-run-all": "^4.1.5", "prettier": "^3.3.3", - "prettier-eslint": "^16.3.0", - "prettier-eslint-cli": "^8.0.1", "sass": "^1.77.2", - "typescript": "^5.5.3", + "typescript": "^5.5.4", + "typescript-eslint": "^8.5.0", "vite": "^5.3.3", "vitest": "^1.6.0", - "vue-tsc": "^2.0.26", - "vue-unique-id": "^3.2.1" - }, - "lint-staged": { - "*": "prettier-eslint --write" + "vue-eslint-parser": "^9.4.3", + "vue-tsc": "^2.1.2" } } diff --git a/requirements.txt b/requirements.txt index 994ed0f5..c95b742c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ mkdocs ~= 1.6 -mkdocs-semiliterate ~= 0.7 -mkdocs-awesome-pages-plugin ~= 2.8 +mkdocs-semiliterate ~= 0.8.1 +mkdocs-awesome-pages-plugin ~= 2.9.3 pymdown-extensions ~= 10.8 python-markdown-math ~= 0.8 diff --git a/src/App.vue b/src/App.vue index 56e552a0..3759516a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,6 +8,10 @@ @@ -68,7 +72,7 @@ --ns-desktop-tab-width: 300px; --ns-specimen-card-width: 216px; - /* Breakpoint widths + /* Breakpoint widths Default styles should be for vertical mobile devices (devices narrower than --ns-breakpoint-mobile) @@ -94,12 +98,13 @@ /* Display font */ @font-face { font-family: 'Infinity'; - src: url('/src/assets/fonts/infinity/Infinity.ttf'); + src: url('@/assets/fonts/infinity/Infinity.ttf'); } /* Body font */ @font-face { font-family: 'Inter'; - src: url('/src/assets/fonts/inter/Inter-VariableFont_slnt\,wght.ttf'); + src: url('@/assets/fonts/inter/Inter-VariableFont_slnt,wght.ttf') + format('truetype'); } diff --git a/src/components/OEISbar.vue b/src/components/OEISbar.vue index a182e4a2..7cf0768b 100644 --- a/src/components/OEISbar.vue +++ b/src/components/OEISbar.vue @@ -6,13 +6,13 @@ Search the encyclopedia (OEIS.org): -
+
+ type="text" + placeholder="id, keyword, etc..." + @input="doSearch($event)">