diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..46cbfe7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,20 @@ +# Normalise line endings to LF in the repository, and check out LF on every +# platform - including Windows, where core.autocrlf would otherwise produce +# CRLF working copies. +# +# This is not cosmetic. The compiled bundles in batchcode_plugin/static/ are +# committed, and a sourcemap embeds its sources verbatim in "sourcesContent", +# line endings included. A CRLF checkout of frontend/src therefore builds +# different .js.map files than a LF one, which would make the CI check for +# up-to-date artifacts fail on Windows even when nothing had changed. +* text=auto eol=lf + +# Generated artifacts: never transform them, so they stay byte-identical to +# whatever the build produced. +batchcode_plugin/static/** -text +frontend/src/locales/**/messages.ts -text +frontend/src/locales/**/messages.d.ts -text + +# Lockfiles are generated; keep them out of diff review noise +frontend/package-lock.json -diff linguist-generated +uv.lock -diff linguist-generated diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..b10d92b --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,79 @@ +# Ensure that the plugin meets the required style guidelines +# Ensure that the tests pass, that the plugin builds, and that the committed +# frontend artifacts match their sources + +name: CI Checks + +on: ["push", "pull_request"] + +jobs: + backend: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + # Honours .python-version + - name: Install Deps + run: uv sync --locked + - name: Style Checks + run: | + uv run ruff format --check . + uv run ruff check . + - name: Tests + run: uv run pytest + - name: Build Plugin + run: uv run python -m build + + frontend: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + cache: npm + cache-dependency-path: frontend/package-lock.json + # `npm ci`, not `npm install`: several dependencies are declared as + # "latest", so only the lockfile makes the build reproducible - and the + # artifact checks below depend on that. + - name: Install Deps + run: npm ci + working-directory: frontend + - name: Lint + run: npm run lint + working-directory: frontend + - name: Build + run: | + npm run translate + npm run build + working-directory: frontend + + # Both the message catalogs and the compiled bundles are committed, so a + # change to a source file must come with its rebuilt artifacts. Staging + # first, because `git diff` alone would not notice new files - and the + # bundle filenames carry a content hash, so they change with the content. + - name: Check Committed Artifacts Are Up To Date + run: | + git add -A frontend/src/locales batchcode_plugin/static + + if ! git diff --cached --exit-code --stat -- frontend/src/locales; then + echo "" + echo "ERROR: Translation catalogs are out of date." + echo "Run 'cd frontend && npm run translate' and commit the result." + exit 1 + fi + + if ! git diff --cached --exit-code --stat -- batchcode_plugin/static; then + echo "" + echo "ERROR: Compiled frontend bundles are out of date." + echo "Run 'cd frontend && npm run build' and commit the result." + echo "The bundles are committed so that installing this plugin" + echo "from a git URL includes the user interface." + exit 1 + fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b1617f --- /dev/null +++ b/.gitignore @@ -0,0 +1,165 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff +.ruff_cache/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index b0976a8..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,26 +0,0 @@ -# You can override the included template(s) by including variable overrides -# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings -# Secret Detection customization: https://docs.gitlab.com/user/application_security/secret_detection/pipeline/configure -# Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings -# Container Scanning customization: https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings -# Note that environment variables can be set in several places -# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence -stages: -- build -- test -- deploy -- review -- dast -- staging -- canary -- production -- incremental rollout 10% -- incremental rollout 25% -- incremental rollout 50% -- incremental rollout 100% -- performance -- cleanup -sast: - stage: test -include: -- template: Auto-DevOps.gitlab-ci.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..029fdca --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +repos: +- repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.12.0 + hooks: + - id: ruff-format + args: [ --preview ] + - id: ruff + args: [ + --fix, + # --unsafe-fixes, + --preview + ] +- repo: https://github.com/biomejs/pre-commit + rev: v2.0.0-beta.5 + hooks: + - id: biome-check + additional_dependencies: ["@biomejs/biome@2.0.0"] + files: ^frontend/src.*\.(js|ts|tsx)$ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..08c45f0 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,256 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this is + +`inventree-batchcode-plugin` — a server-side InvenTree plugin that generates progressive batch +codes for `StockItem` records. It is a Python package installed *into* an InvenTree instance, +plus a React bundle rendered inside InvenTree's own UI. Targets InvenTree 1.0.0+ (developed +against 1.5.2). + +Version 2.0.0 was restructured onto the [InvenTree plugin creator](https://github.com/inventree/plugin-creator) +template (creator 1.20.0). Keep the generated layout: `batchcode_plugin/core.py` is the plugin +entry point, `frontend/` builds into `batchcode_plugin/static/`. + +## Commands + +Python tooling is managed with **uv**; the frontend with **npm**. + +```bash +uv sync # create .venv from pyproject's [dependency-groups] dev +uv run ruff format . # format (single quotes, see [tool.ruff.format]) +uv run ruff check . # lint — CI runs format --check plus this +uv run pytest # tests +uv run pytest tests/test_hook_contract.py::test_date_defaults_to_current_time +uv run python -m build # sdist + wheel into dist/ + +cd frontend +npm install +npm run translate # lingui extract + compile — must be re-run when UI strings change +npm run build # tsc -b && vite build -> ../batchcode_plugin/static/ +npm run lint # biome check +npm run lint:fix # biome check --fix (also formats) +npm run dev # vite dev server on :5174, pairs with INVENTREE_PLUGIN_DEV_HOST +``` + +### Committed build artifacts + +Unlike the creator's scaffold, `batchcode_plugin/static/` is **committed** (its `.gitignore` +explains why): the plugin installer only accepts VCS URLs, which build from source, so an +uncommitted bundle means no UI for anyone installing from git. `frontend/src/locales/` is +committed for the same class of reason. + +So a change under `frontend/src/` is only half-done until the artifacts are rebuilt and staged: + +```bash +cd frontend && npm run translate && npm run build && cd .. +git add frontend/src/locales batchcode_plugin/static +``` + +The CI `frontend` job rebuilds both and fails on any difference. It stages before diffing +(`git add -A` then `git diff --cached`) because bundle filenames carry a content hash, so a +change *renames* files and a plain `git diff` would miss the new ones. Use `npm ci`, never +`npm install`: several dependencies are pinned to `"latest"`, and only the lockfile keeps the +output reproducible enough for that check. + +Two traps that make that check misfire, both already handled — don't undo either: + +- **`.gitattributes` pins everything to `eol=lf`.** A sourcemap embeds its sources verbatim in + `sourcesContent`, line endings included, so a CRLF checkout of `frontend/src/` builds different + `.js.map` files. On Windows with `core.autocrlf=true` that alone fails the check. If bundles + ever "change" with no source edit, compare `sourcesContent`, not `mappings`. +- **`npm run translate` does not delete removed strings**, it marks them obsolete (`#~`). Use + `npx lingui extract --clean && npm run compile` after removing or renaming a UI string, + otherwise the catalogs accumulate dead entries. + +Because the bundles are committed, `python -m build` on a clean checkout already yields a +complete wheel. There is no publishing workflow — the plugin is not on PyPI, and `pypi.yaml` was +removed from the scaffold. `translations.yaml` was removed too: its check is now one step of the +`frontend` job, which was already doing the same build. + +## Verifying changes + +Nothing in `batchcode_plugin/` can be imported outside a configured InvenTree/Django process — +`core.py` imports `from plugin import InvenTreePlugin`, and the views and `seed_value` import +`stock.models` / `part.models`. `tests/conftest.py` works around this: it configures Django +minimally, stubs `plugin`, `plugin.mixins`, `InvenTree.helpers`, `stock.models` and `part.models` +in `sys.modules`, loads the plugin modules by path with `importlib`, and subclasses +`BatchCodePlugin` with a dict-backed `get_setting`. So `uv run pytest` needs no InvenTree +checkout. + +Two conventions in that harness are load-bearing: + +- The stub mixins carry working `get_settings_dict` and `plugin_static_file`, so tests exercise + the panel wiring instead of monkeypatching around it. Add a method to the stub when the plugin + starts relying on a new one from the real mixins. +- `InMemoryCounter` fakes only persistence. `build_key` is bound to the **real** + `BatchCounter.build_key`, so the scope key under test is the production one — do not + reimplement it in the fake. + +What the suite does and does not reach: + +- **Covered**: format rendering and padding, counter scoping, hook kwargs resolution, trigger + modes, prefix resolution, role gating, panel context, URL names, serializer construction. +- **Frontend** is genuinely verified by `npm run build` (`tsc -b` typechecks) and `npm run lint`, + not by pytest. +- **Packaging** is verified by `python -m build` plus inspecting the wheel for + `batchcode_plugin/static/Panel.js` and the `inventree_plugins` entry point. +- **Anything touching the ORM or the registry** needs a real InvenTree instance: + `BatchCounter.advance`'s `select_for_update` behaviour, `seed_value`'s queries, the views' + request handling, and migrations. + +When changing generation logic, sanity-check that the suite is not vacuous by reintroducing the +bug you are guarding against (e.g. `kwargs.get('item')` → `kwargs.get('stock_item')`) and +confirming tests fail. + +## Architecture + +### The hook contract — get this right + +InvenTree calls `generate_batch_code(**kwargs)` from `stock/generators.py`, which passes: + +- always: `date`, `year`, `month`, `day`, `hour`, `minute`, `week` +- from the caller (see `GenerateBatchCodeSerializer` in InvenTree's `stock/serializers.py`): + `item`, `part`, `location`, `quantity`, `build_order`, `purchase_order` + +The stock item arrives as **`item`**, not `stock_item`. Version 1.x read `kwargs['stock_item']`, +so `part` and `location` were always `None` and `PER_PART` / `PER_LOCATION` / +`USE_LOCATION_PREFIX` never did anything. `extract_targets()` now resolves `part`/`location` +from the explicit kwargs first and falls back to `item.part` / `item.location`. + +Two other things about that call site: exceptions raised by the hook are caught and logged by +InvenTree (a failure means "no code", not an error to the user), and returning `None` hands the +request to the next plugin and finally to InvenTree's own `STOCK_BATCH_CODE_TEMPLATE`. That is +why `render_code` falls back to a simple code instead of letting a bad `CODE_FORMAT` propagate. + +### Counters are persisted, not derived + +`models.BatchCounter` holds one row per scope. `key` — built by `build_key()` as +`part=|loc=|period=`, with empty segments for unscoped dimensions — is the +authoritative unique constraint. The `part` / `location` FKs alongside it are denormalized +copies for admin readability only: a `unique_together` over nullable FKs would not be enforced, +since `NULL != NULL` in SQL. + +`advance()` is the only writer: `get_or_create`, then re-read `select_for_update()` under +`transaction.atomic()` so concurrent stock creation serializes. `peek()` is the read-only twin +used for previews. + +`seed`, passed on every `advance()`/`peek()`, is a floor derived from batch codes already in the +database (`seed_value()`, gated by the `SEED_FROM_EXISTING` setting). It exists so upgrading from +1.x — where the counter was recomputed from the stock table each time — does not reissue codes +already in use. + +Counter values are consumed at generation time, not when the stock item is saved, so abandoned +forms leave gaps. Codes are unique and increasing, **not** gapless. Don't "fix" this without +changing the model to reserve-and-confirm. + +### Settings + +`get_setting(key)` takes only the key. Its second positional parameter is `cache`, **not** a +default — `get_setting('ENABLED', True)` silently passes `True` as `cache`. Defaults come from +the `SETTINGS` dict. (1.x had this wrong throughout.) + +`SLUG = 'batchcode'` keys every stored setting value and the plugin's API URLs. Changing it +orphans every existing installation's configuration. + +`CODE_FORMAT` is rendered with `string.Formatter().vformat` against a mapping of plain +strings/ints (plus the datetime). Model instances are deliberately not exposed — a format string +can traverse attributes. A bare `{num}` is rewritten to `{num:0d}` before +formatting, so an explicit spec like `{num:06d}` wins over `MIN_DIGITS`. + +### Serializers: queryset resolution + +The InvenTree models cannot be imported while `serializers.py` loads — the plugin registry is +still being built. But DRF validates `queryset` inside `RelatedField.__init__`, which runs when +the **class body is evaluated**, i.e. at import. So the tempting pattern — declare +`PrimaryKeyRelatedField(queryset=None)` and fill it in from `Serializer.__init__` — raises +`AssertionError` at import and takes the plugin's whole URL set down with it. + +The working pattern is the `LazyModelField` subclasses: drop the `queryset` kwarg and override +`get_queryset()`, which both defers the model import and suppresses DRF's constructor check. +`tests/test_api_surface.py` guards this. + +### Frontend + +`frontend/src/Panel.tsx` renders the stock item panel (`get_ui_panels`, gated on +`target_model == 'stockitem'`); `Settings.tsx` renders the live format preview on the plugin +settings page (`ADMIN_SOURCE`). Both are wired by name — `'Panel.js:RenderBatchCodePluginPanel'` +and `'Settings.js:RenderPluginSettings'` — so renaming an exported function requires updating +`core.py` too. + +The dict returned in a panel's `context` key arrives as **`context.context`** in the component +(`context.instance` is the stock item, `context.reloadInstance()` refetches it). React, Mantine, +lingui and `@lingui/react` are externalized in `vite.config.ts` and provided by the InvenTree +host — do not bundle them, and prefer `context.api` over adding an HTTP client. + +`@tanstack/react-query` and `@tabler/icons-react` are used by the creator's example code but are +**not** declared in `package.json`; they resolve only transitively. The panel deliberately uses +plain `useState`/`useEffect` and no icon imports instead. + +Panel strings go through the lingui `t` macro. `frontend/src/locales/it/messages.po` is fully +translated and `.github/workflows/translations.yaml` fails the build if the catalogs are stale, +so run `npm run translate` after touching any `t` string. Use `npx lingui extract --clean` to +drop entries whose source strings are gone. + +### AppMixin consequences + +The plugin is a Django app, which means: a server **restart** is required to load it (not just +enabling it in the UI), schema changes need a migration in `batchcode_plugin/migrations/`, and +`BatchCounter.check_user_permission` must exist — InvenTree denies every permission on a plugin +model that does not implement it. Migrations here are hand-written (`0001_initial.py`); +generating them with `makemigrations` requires a full InvenTree checkout. `DEFAULT_AUTO_FIELD` in +InvenTree is plain `AutoField`, so use that, not `BigAutoField`. + +### Three integrations must be switched on + +Beyond the server-side `plugins_enabled` / `INVENTREE_PLUGINS_ENABLED`, each mixin this plugin +uses is gated by a **global database setting, all of which default to `False`** (defined in +InvenTree's `common/setting/system.py`, surfaced under Settings → Plugins): + +| Setting | Gates | Symptom when off | +| --- | --- | --- | +| `ENABLE_PLUGINS_APP` | `AppMixin` | The app is never loaded; the counter table is unreachable | +| `ENABLE_PLUGINS_URL` | `UrlsMixin` | `preview/` and `generate/` return 404 | +| `ENABLE_PLUGINS_INTERFACE` | `UserInterfaceMixin` | No panel, no settings preview | + +These are *not* in `config.yaml` or `settings.py` — searching there finds nothing, which is +misleading. When a report says "the plugin does nothing", check these before the code. + +### Installation cannot be completed from the web UI + +`plugin/installer.py` runs pip and reloads the registry; it does **not** run migrations, and +neither does the container entrypoint (`contrib/container/init.sh` only prepares directories and +`exec`s the command). Applying `0001_initial` needs `invoke update` (which includes `migrate`) or +`invoke migrate` from a shell. This is an accepted consequence of the `AppMixin` design — see the +README's install steps. If it ever needs to become UI-installable, the counter has to stop being +a model. + +The installer also only accepts **VCS URLs** (`git+https://…`, composed as `{packagename}@{url}`). +A plain `https://` URL is passed to pip as a package *index* (`-i`), so a link to a release wheel +does not work from that form. + +## Conventions + +- Code, setting keys and user-facing strings are English; Django strings use `gettext_lazy as _`, + frontend strings the lingui `t` macro. Italian is the fully-translated frontend locale. +- Ruff formats with **single quotes** and enforces google-style docstrings (`D` rules) on every + module, class and public method. `batchcode_plugin/migrations/` is exempt from `D`; `tests/` + is linted but exempt from `D103` and the `N80x` naming rules. +- Logging goes through `logging.getLogger('inventree')`, messages prefixed `BatchCodePlugin:`. +- Bump the version in **one** place: `batchcode_plugin/__init__.py:PLUGIN_VERSION`. + `pyproject.toml` reads it dynamically and `core.py` uses it for `VERSION`. (1.x had three + disagreeing version strings.) +- The README's *Upgrading from 1.x* and *Changelog* sections are maintained per release; add an + entry for behavioural changes. + +## Running the plugin creator again + +`create-inventree-plugin` cannot run in this environment: it prints via +`questionary`/`prompt_toolkit`, which needs a real Windows console screen buffer and raises +`NoConsoleScreenBufferError` from both bash and PowerShell here. To re-scaffold, drive the +cookiecutter template directly — monkeypatch `plugin_creator.helpers.pretty_print` to `print`, +build the context yourself, call `cookiecutter(..., no_input=True, extra_context=...)`, then run +the same cleanup steps `plugin_creator.cli.cleanup` does (`devops.cleanup_devops_files`, +`frontend.update_frontend`, `mixins.cleanup_mixins`). Skip `devops.git_init` — it `pip install`s +pre-commit globally, which conflicts with the uv-managed environment. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9053089 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2026 Simone Amadori + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..1eee02d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include batchcode_plugin/static * \ No newline at end of file diff --git a/README.md b/README.md index a38a4e6..4e4ef65 100644 --- a/README.md +++ b/README.md @@ -1,117 +1,359 @@ # BatchCodePlugin -**Autore:** Simone Amadori -**Sito:** [https://github.com/Kamaar](https://github.com/Kamaar) -**Compatibilità:** InvenTree 1.1.3 → 1.7 -**Versione plugin:** 1.7 +Generate progressive batch codes for InvenTree `StockItem` records, with a +configurable format and persistent per-part / per-location counters. + +- **Author:** Simone Amadori +- **Plugin version:** 2.0.0 +- **Requires:** InvenTree 1.0.0 or newer (developed against 1.5.2) --- -## Descrizione +## What it does + +The plugin implements the `generate_batch_code` hook of InvenTree's +`ValidationMixin`. InvenTree calls it whenever a batch code is required: + +- when a new `StockItem` is created, +- from the *generate* action in the stock creation and receive forms, +- from `POST /api/stock/generate/batch-code/`, +- from this plugin's own panel on the stock item detail page. + +Each code is built from a format string and a counter. The counter lives in the +database (one row per scope), is advanced atomically, and does not depend on +how the code is formatted. + +## Installation + +> **Not published to PyPI** — install from this repository. Everything needed, +> including the compiled user interface, is committed here, so there is nothing +> to build first. +> +> **One step needs server access.** This plugin adds a database table, and +> InvenTree's plugin installer does not run migrations. Installation cannot be +> completed from the web interface alone — see step 4. + +### Before you start + +Plugins must be enabled server-side: set `plugins_enabled: True` in +`config.yaml`, or the environment variable `INVENTREE_PLUGINS_ENABLED=true`. +The server also needs `git` available for an installation from a git URL (the +official Docker images have it). + +### 1. Install the package + +In **Settings → Plugins → Install Plugin**, fill in: + +| Field | Value | +| --- | --- | +| Package name | `inventree-batchcode-plugin` | +| Source URL | `git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0` | + +Drop the `@v2.0.0` to follow the default branch instead of a fixed release. + +Equivalently, from a shell in the InvenTree environment: + +```bash +pip install -U git+https://github.com/Kamaar/inventree-batchcode-plugin.git@v2.0.0 +``` + +Note that a plain `https://` URL is not an alternative here: InvenTree passes +such URLs to pip as a *package index* (`-i`), not as a package to install, so a +link to a release file will not work. + +### 2. Enable the plugin + +Activate **BatchCodePlugin** in Settings → Plugins. + +### 3. Enable the three integrations it needs + +Still under Settings → Plugins, in the *Plugin Settings* section. **All three +default to off**, and the plugin is inert without them: + +| Setting | Without it | +| --- | --- | +| Enable app integration | The counter table is never loaded — nothing works | +| Enable URL integration | The preview and generate endpoints return 404 | +| Enable interface integration | The stock item panel and format preview never appear | + +### 4. Restart, and apply the migration + +From a shell on the server — this is the step that cannot be done from the web +interface: + +```bash +invoke update # includes the database migration +``` + +Or, to migrate without a full update: + +```bash +invoke migrate +``` + +In a manual installation: `python manage.py migrate batchcode_plugin`. + +A restart is required in any case: the plugin is loaded as a Django +application, which only happens at startup. + +### Checking it worked + +Open any stock item — there should be a **Batch Code** panel showing the +current code and a preview of the next one. If the panel is missing, revisit +step 3; if it loads but reports an error, the migration in step 4 has not run. + +## Configuration + +All settings live under Settings → Plugins → Batch Code Generator. + +| Setting | Default | Description | +| --- | --- | --- | +| `ENABLED` | `true` | Generate batch codes for new stock items | +| `CODE_FORMAT` | `{prefix}{date:%Y%m%d}{sep}{num:04d}` | Format string (see placeholders below) | +| `PREFIX` | `B` | Static prefix, used unless the location prefix is enabled | +| `SEPARATOR` | `-` | Value substituted for `{sep}` | +| `MIN_DIGITS` | `4` | Zero-padding applied to a bare `{num}` | +| `DAILY_RESET` | `false` | Restart the counter at 1 each day | +| `PER_PART` | `false` | Separate counter per part | +| `PER_LOCATION` | `false` | Separate counter per stock location | +| `USE_LOCATION_PREFIX` | `false` | Use a stock location field as the prefix | +| `LOCATION_FIELD` | `name` | Which location field: `name`, `pathstring` or `description` | +| `TRIGGER_MODE` | `always` | `always`, `on_receive` (purchase order receipts only) or `manual` | +| `SEED_FROM_EXISTING` | `true` | Raise the counter past numbers already present in existing batch codes | +| `MANUAL_BUTTON` | `true` | Show the generate button in the stock item panel | +| `MANUAL_BUTTON_ROLE` | `staff` | Who may generate manually: `all`, `staff` or `superuser` | + +### Format placeholders + +`CODE_FORMAT` is a Python format string. Standard format specs work, so +`{num:06d}` and `{date:%y%W}` are both valid. + +| Placeholder | Value | +| --- | --- | +| `{prefix}` | `PREFIX`, or the location field if `USE_LOCATION_PREFIX` is set | +| `{num}` | The counter value, zero-padded to `MIN_DIGITS` | +| `{sep}` | `SEPARATOR` | +| `{date}` | Generation timestamp — supply a spec, e.g. `{date:%Y%m%d}` | +| `{part}` | Part name | +| `{ipn}` | Part IPN | +| `{loc}` | Stock location name | +| `{year}` `{month}` `{day}` `{week}` `{hour}` `{minute}` | Components of the generation time | + +A bare `{num}` inherits the `MIN_DIGITS` padding. If the format supplies its +own padding — `{num:06d}` — that wins and `MIN_DIGITS` is ignored. + +If the format string is invalid the plugin logs a warning and falls back to +`{prefix}{sep}{num}`, rather than failing the stock operation. Codes are +truncated to 100 characters, the maximum length of `StockItem.batch`. + +### Counter scope + +`PER_PART`, `PER_LOCATION` and `DAILY_RESET` decide how many counters exist. +With all three off there is one global sequence; with `PER_PART` on, each part +gets its own. The scopes are visible in the Django admin interface under +*Batch Counters*, where a sequence can also be inspected or reset by hand. -BatchCodePlugin genera automaticamente **codici batch numerici progressivi** per ogni nuovo `StockItem`. -Supporta: +Counter values are consumed when a code is **generated**, not when the stock +item is saved. Abandoning a part-filled stock form therefore leaves a gap in +the sequence. Codes are guaranteed unique and increasing, not gapless. -- Contatori separati per **parte** e/o **magazzino** -- Prefisso statico o derivato dalla **location** -- Formati personalizzabili con placeholders `{prefix}`, `{num}`, `{date}`, `{part}`, `{loc}` -- **Reset giornaliero** del contatore -- Pulsante manuale nella scheda StockItem (su InvenTree 1.2+) -- Logging dei batch generati +## API + +Two endpoints are mounted under the plugin's URL namespace. Both require an +authenticated session. + +| Endpoint | Body | Effect | +| --- | --- | --- | +| `POST /plugin/batchcode/preview/` | `item`, `part`, `location` (all optional) | Returns the code which *would* be issued next. Does not advance the counter. | +| `POST /plugin/batchcode/generate/` | `item` (required), `overwrite` (default `false`) | Issues a code and saves it to the stock item. Requires `MANUAL_BUTTON_ROLE`. | + +## User interface + +- **Stock item panel** — shows the current batch code, previews the next one, + summarises the active configuration, and offers a *Generate and save* button + to users allowed by `MANUAL_BUTTON_ROLE`. +- **Plugin settings page** — renders a live preview of the configured format, + so a format can be checked before it is used. + +Panel strings are translated; the Italian catalog is complete, other locales +fall back to English. + +## Development + +The Python environment is managed with [uv](https://docs.astral.sh/uv/), and +targets the version in `.python-version`. + +```bash +uv sync # create .venv with the dev tooling +uv run ruff format . # format +uv run ruff check . # lint +uv run pytest # tests +uv run python -m build # build sdist + wheel +``` + +Frontend (see `frontend/README.md` for details): + +```bash +cd frontend +npm ci # not `npm install` — several deps are "latest" +npm run translate # extract + compile message catalogs +npm run build # bundle into ../batchcode_plugin/static/ +npm run lint # biome +``` + +### Committed build artifacts + +Both the message catalogs (`frontend/src/locales/`) and the compiled bundles +(`batchcode_plugin/static/`) are **committed**. InvenTree's plugin installer +only accepts VCS URLs, which build from source, so a plugin installed from this +repository would have no user interface otherwise. + +That means **any change under `frontend/src/` must be followed by**: + +```bash +cd frontend && npm run translate && npm run build && cd .. +git add frontend/src/locales batchcode_plugin/static +``` + +CI rebuilds both and fails if the result differs from what is committed, so a +forgotten rebuild is caught rather than silently shipped. `npm ci` matters here: +several dependencies are declared as `"latest"`, and only the lockfile makes +the output reproducible. + +When a UI string is **removed or renamed**, `npm run translate` leaves the old +entry behind as an obsolete `#~` comment rather than deleting it. Clear those +out with: + +```bash +cd frontend && npx lingui extract --clean && npm run compile && npm run build +``` + +Line endings are pinned to LF by `.gitattributes`, and this matters more than +it looks: a sourcemap embeds its sources verbatim, so a CRLF checkout of +`frontend/src/` produces different `.js.map` files and the CI check above would +fail on Windows for no real reason. + +Nothing under `batchcode_plugin/static/` should ever be edited by hand. + +### Tests + +`tests/` covers the parts of the plugin that decide what a code looks like: +format rendering and padding, counter scoping, the `generate_batch_code` hook +context, trigger modes, role gating, and that the REST serializers import and +construct. Everything that touches the ORM or the plugin registry needs a real +InvenTree instance and is out of scope. + +The InvenTree modules are stubbed in `tests/conftest.py`, so the suite runs +without an InvenTree checkout — `uv run pytest`, nothing else. Persistence is +the only faked part: `BatchCounter.peek` / `.advance` are replaced with an +in-memory store, while `build_key` is delegated to the real model so the tests +cannot drift from the production scope key. + +### Building a release + +Because the bundles are committed, `uv run python -m build` on a clean checkout +already produces a complete wheel — no frontend build needed first. Tag the +release so installations can pin it: + +```bash +git tag -a vX.Y.Z -m "BatchCodePlugin X.Y.Z" +git push origin vX.Y.Z +``` + +Then bump `PLUGIN_VERSION` in `batchcode_plugin/__init__.py` (the single source +of the version) and the install URL in this README. + +There is no PyPI publishing workflow. To add one, restore the plugin creator's +`pypi.yaml` — it triggers on `release: published` and needs a `PYPI_API_TOKEN` +repository secret. + +This project was restructured with the +[InvenTree plugin creator](https://github.com/inventree/plugin-creator). --- +## Upgrading from 1.x + +Version 2.0.0 is a restructure onto the official plugin template. Existing +settings are preserved: the plugin slug is unchanged (`batchcode`), so stored +setting values are picked up as before. + +Breaking and behavioural changes: + +- **The plugin entry point moved** from `batchcode_plugin.plugin:BatchCodePlugin` + to `batchcode_plugin.core:BatchCodePlugin`. Installing the new distribution + handles this; a plugin installed by copying files must be replaced. +- **A database migration is now required** (see *After installing*). +- **`TARGET_FIELD` was removed.** The `generate_batch_code` hook returns a + string and InvenTree decides where it goes, which is always `StockItem.batch`. + Writing to an arbitrary field was never part of that contract. +- **`PER_PART`, `PER_LOCATION` and `USE_LOCATION_PREFIX` now work.** In 1.x the + hook read a `stock_item` keyword which InvenTree does not pass, so the part + and location were always empty and these three settings had no effect. +- **`DAILY_RESET` now resets the counter itself**, rather than filtering + existing codes for today's date. It no longer requires the date to appear in + `CODE_FORMAT`. +- **`MIN_DIGITS` now applies to normal output**, not only to the error fallback. +- **`TRIGGER_MODE=on_receive`** now means "only when a purchase order is part of + the request", which is what the hook context actually exposes. +- **The counter is persisted** instead of being derived from existing batch + codes on every call. `SEED_FROM_EXISTING` (on by default) keeps the first + code issued after the upgrade above whatever numbers are already in use; + it can be turned off once the sequence has caught up. +- **`INCLUDE_DATE`** was documented in 1.x but never implemented. Put `{date}` + in `CODE_FORMAT` instead. + ## Changelog -### Versione 1.0 -- Generazione batch base -- Progressivo globale -- Prefisso fisso `B` -- Formato predefinito: `B{num:06d}` - -### Versione 1.1 -- Contatore separato per **parte** -- Formato numerico configurabile (`MIN_DIGITS`) -- Logging dei batch generati - -### Versione 1.2 -- Supporto `EventMixin` (1.2+) -- Parametri SETTINGS opzionali -- Pulsante manuale aggiunto nella UI - -### Versione 1.3 -- Reset giornaliero del contatore -- Compatibilità con batch per singola **location** -- Migliorata compatibilità con codici esistenti - -### Versione 1.4 -- Formato codice personalizzabile con data e placeholders -- Contatore progressivo aggiornato con regex per estrazione numerica - -### Versione 1.5 -- Campo target configurabile (`TARGET_FIELD`) -- Prefisso dinamico basato sulla location (`USE_LOCATION_PREFIX`, `LOCATION_FIELD`) -- Trigger mode configurabile (`always`, `on_receive`, `manual`) - -### Versione 1.6 -- Ruoli per pulsante manuale (`MANUAL_BUTTON_ROLE`) -- Logging tramite `logger.info` -- Bugfix compatibilità 1.1.3 - -### Versione 1.7 -- Compatibile con InvenTree 1.1.3 e 1.2+ -- Tutti i parametri SETTINGS presenti -- Pulsante manuale pienamente funzionante su 1.2+ -- Logging automatico e gestione eccezioni -- Versione stabile e completa - -### Versione 1.7.3 - -## Overview -The BatchCode plugin automatically generates sequential, formatted batch codes for StockItems in InvenTree. Compatible with versions 1.1.3 → 1.2+. - -### Features -- Automatic batch code generation on StockItem creation. -- Optional manual generation via Actions menu. -- Supports per-Part and per-Location sequential counters. -- Configurable prefix, date, and number formatting (`CODE_FORMAT`). -- Daily reset of counters. -- Multi-language ready (English plugin, Italian default locale). -- Logging of batch code generation. +### 2.0.0 +- Restructured onto the official InvenTree plugin creator template +- Persistent, atomically incremented counters (`AppMixin` + `BatchCounter` model) +- Correct handling of the `generate_batch_code` hook context +- React panel for the stock item page and a live preview on the settings page +- Preview and generate REST endpoints (`UrlsMixin`) +- uv-managed Python environment, ruff formatting and linting, pytest suite, + GitHub Actions CI +- Removed `TARGET_FIELD`; see *Upgrading from 1.x* ---- +### 1.7 +- Compatible with InvenTree 1.1.3 and 1.2+ +- All SETTINGS parameters present +- Manual button functional on 1.2+ +- Automatic logging and exception handling + +### 1.6 +- Roles for the manual button (`MANUAL_BUTTON_ROLE`) +- Logging via `logger.info` +- Compatibility fixes for 1.1.3 + +### 1.5 +- Configurable target field (`TARGET_FIELD`) +- Location-derived prefix (`USE_LOCATION_PREFIX`, `LOCATION_FIELD`) +- Configurable trigger mode (`always`, `on_receive`, `manual`) + +### 1.4 +- Customisable code format with date and placeholders +- Progressive counter extracted from existing codes by regex + +### 1.3 +- Daily counter reset +- Per-location batch codes +- Improved compatibility with existing codes + +### 1.2 +- `EventMixin` support (1.2+) +- Optional SETTINGS parameters +- Manual button added to the UI + +### 1.1 +- Per-part counter +- Configurable number format (`MIN_DIGITS`) +- Logging of generated batches -### Configuration -Available plugin settings: -- **TARGET_FIELD**: Field in StockItem where batch code is saved (`batch` by default). -- **CODE_FORMAT**: Batch code format using placeholders `{prefix}`, `{num}`, `{date}`, `{part}`, `{loc}`, `{sep}`. -- **PREFIX**: Static prefix if location prefix not used. -- **MIN_DIGITS**: Minimum digits for numeric part. -- **DAILY_RESET**: Reset counter daily. -- **PER_PART**: Separate counter per Part. -- **PER_LOCATION**: Separate counter per StockLocation. -- **TRIGGER_MODE**: `always`, `on_receive`, or `manual`. -- **USE_LOCATION_PREFIX**: Use StockLocation field as prefix. -- **LOCATION_FIELD**: Field from StockLocation to use as prefix. -- **INCLUDE_DATE**: Include date in code. -- **SEPARATOR**: Separator character. -- **ENABLED**: Enable/disable automatic batch code generation. -- **MANUAL_BUTTON**: Show manual generate button. -- **MANUAL_BUTTON_ROLE**: Who can use manual button (`all`, `staff`, `superuser`). - -### Usage -- Automatic generation occurs based on `TRIGGER_MODE`. -- Manual generation via Actions menu button if enabled. -- Preview codes can be logged for testing purposes. - -### Localization -- Plugin in English. -- Default locale in Italian. -- To add more translations, create `.po` files in `locale//LC_MESSAGES/` and compile to `.mo`. - -### Logging -Batch code generation logs are recorded via `inventree` logger: -```text -[BatchCodePlugin] Generated preview batch: B20251216-0001 +### 1.0 +- Basic batch generation, global counter, fixed prefix `B` +- Default format `B{num:06d}` +## License +MIT — see [LICENSE](LICENSE). diff --git a/batchcode_plugin/.gitignore b/batchcode_plugin/.gitignore new file mode 100644 index 0000000..83c5165 --- /dev/null +++ b/batchcode_plugin/.gitignore @@ -0,0 +1,9 @@ +# The compiled frontend bundles ARE committed, deliberately. +# +# InvenTree's plugin installer only supports VCS URLs (git+https://...), which +# build from source - so a plugin installed through Settings -> Plugins from +# this repository would ship without any UI unless the bundles are in git. +# +# They are generated by `cd frontend && npm run build`. The CI 'bundles' job +# rebuilds them and fails if the result differs from what is committed, so +# never hand-edit anything in static/. diff --git a/batchcode_plugin/__init__.py b/batchcode_plugin/__init__.py index 55ddd19..90fc5bc 100644 --- a/batchcode_plugin/__init__.py +++ b/batchcode_plugin/__init__.py @@ -1,2 +1,3 @@ -# file: batchcode_plugin/__init__.py -# Può rimanere vuoto, serve solo per definire il pacchetto +"""BatchCodePlugin - progressive batch code generation for InvenTree.""" + +PLUGIN_VERSION = '2.0.0' diff --git a/batchcode_plugin/admin.py b/batchcode_plugin/admin.py new file mode 100644 index 0000000..e0d0780 --- /dev/null +++ b/batchcode_plugin/admin.py @@ -0,0 +1,20 @@ +"""Admin site configuration for the BatchCodePlugin plugin.""" + +from django.contrib import admin + +from .models import BatchCounter + + +@admin.register(BatchCounter) +class BatchCounterAdmin(admin.ModelAdmin): + """Admin interface for BatchCounter. + + Counters are created and advanced by the plugin. The main reason to reach + for this interface is to inspect a sequence, or to reset one by hand. + """ + + list_display = ('key', 'value', 'part', 'location', 'period', 'updated') + list_filter = ('period',) + search_fields = ('key',) + readonly_fields = ('key', 'part', 'location', 'period', 'updated') + autocomplete_fields = () diff --git a/batchcode_plugin/apps.py b/batchcode_plugin/apps.py new file mode 100644 index 0000000..8c24070 --- /dev/null +++ b/batchcode_plugin/apps.py @@ -0,0 +1,10 @@ +"""Django config for the BatchCodePlugin plugin.""" + +from django.apps import AppConfig + + +class BatchCodePluginConfig(AppConfig): + """Config class for the BatchCodePlugin plugin.""" + + name = 'batchcode_plugin' + verbose_name = 'Batch Code Generator' diff --git a/batchcode_plugin/core.py b/batchcode_plugin/core.py new file mode 100644 index 0000000..c4893d0 --- /dev/null +++ b/batchcode_plugin/core.py @@ -0,0 +1,456 @@ +"""Generate progressive batch codes for StockItems. + +The plugin implements the ``generate_batch_code`` hook of InvenTree's +ValidationMixin. InvenTree calls it whenever a batch code is required - on +StockItem creation, from the "generate" action in stock forms, and from the +``/api/stock/generate/batch-code/`` endpoint. +""" + +import logging +import re +import string + +from django.core.validators import MaxValueValidator, MinValueValidator +from django.utils.translation import gettext_lazy as _ +from plugin import InvenTreePlugin +from plugin.mixins import ( + AppMixin, + SettingsMixin, + UrlsMixin, + UserInterfaceMixin, + ValidationMixin, +) + +from . import PLUGIN_VERSION +from .models import BATCH_CODE_MAX_LENGTH, BatchCounter + +logger = logging.getLogger('inventree') + +# Trailing digit group of an existing batch code, used to seed counters +TRAILING_NUMBER = re.compile(r'(\d+)$') + +# A bare '{num}' placeholder, to which MIN_DIGITS padding is applied +BARE_NUM = re.compile(r'\{num\}') + + +class BatchCodePlugin( + AppMixin, + SettingsMixin, + UrlsMixin, + UserInterfaceMixin, + ValidationMixin, + InvenTreePlugin, +): + """BatchCodePlugin - progressive batch code generation for InvenTree.""" + + # Plugin metadata + TITLE = 'Batch Code Generator' + NAME = 'BatchCodePlugin' + # The slug keys every stored setting and the plugin API URLs: do not change it + SLUG = 'batchcode' + DESCRIPTION = ( + 'Generate progressive batch codes for StockItems, with a configurable ' + 'format and persistent per-part / per-location counters.' + ) + VERSION = PLUGIN_VERSION + + # Additional project information + AUTHOR = 'Simone Amadori' + WEBSITE = 'https://github.com/Kamaar/inventree-batchcode-plugin' + LICENSE = 'MIT' + + MIN_VERSION = '1.0.0' + + # Render custom UI elements to the plugin settings page + ADMIN_SOURCE = 'Settings.js:RenderPluginSettings' + + # Plugin settings (from SettingsMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/settings/ + SETTINGS = { + 'ENABLED': { + 'name': _('Enabled'), + 'description': _('Generate batch codes for new stock items'), + 'validator': bool, + 'default': True, + }, + 'CODE_FORMAT': { + 'name': _('Code Format'), + 'description': _( + 'Batch code format. Placeholders: {prefix}, {num}, {sep}, {date}, ' + '{part}, {ipn}, {loc}, {year}, {month}, {day}, {week}' + ), + 'default': '{prefix}{date:%Y%m%d}{sep}{num:04d}', + }, + 'PREFIX': { + 'name': _('Prefix'), + 'description': _( + 'Static prefix, used unless the location prefix is enabled' + ), + 'default': 'B', + }, + 'SEPARATOR': { + 'name': _('Separator'), + 'description': _('Value substituted for the {sep} placeholder'), + 'default': '-', + }, + 'MIN_DIGITS': { + 'name': _('Minimum digits'), + 'description': _( + 'Zero-padding applied to a bare {num} placeholder. Ignored if the ' + 'format specifies its own padding, e.g. {num:06d}' + ), + 'validator': [int, MinValueValidator(1), MaxValueValidator(12)], + 'default': 4, + }, + 'DAILY_RESET': { + 'name': _('Daily reset'), + 'description': _('Restart the counter at 1 each day'), + 'validator': bool, + 'default': False, + }, + 'PER_PART': { + 'name': _('Per part counter'), + 'description': _('Maintain a separate counter for each part'), + 'validator': bool, + 'default': False, + }, + 'PER_LOCATION': { + 'name': _('Per location counter'), + 'description': _('Maintain a separate counter for each stock location'), + 'validator': bool, + 'default': False, + }, + 'USE_LOCATION_PREFIX': { + 'name': _('Use location prefix'), + 'description': _( + 'Use a stock location field as the prefix, instead of PREFIX' + ), + 'validator': bool, + 'default': False, + }, + 'LOCATION_FIELD': { + 'name': _('Location field'), + 'description': _('Stock location field used as the prefix'), + 'default': 'name', + 'choices': [ + ('name', _('Name')), + ('pathstring', _('Full path')), + ('description', _('Description')), + ], + }, + 'TRIGGER_MODE': { + 'name': _('Trigger mode'), + 'description': _('Which requests this plugin responds to'), + 'default': 'always', + 'choices': [ + ('always', _('Always')), + ('on_receive', _('Purchase order receipt only')), + ('manual', _('Manual only')), + ], + }, + 'SEED_FROM_EXISTING': { + 'name': _('Seed from existing codes'), + 'description': _( + 'Before issuing a code, raise the counter past any higher number ' + 'already present in existing batch codes. Keep enabled when ' + 'upgrading from plugin version 1.x' + ), + 'validator': bool, + 'default': True, + }, + 'MANUAL_BUTTON': { + 'name': _('Manual button'), + 'description': _('Show the generate button in the stock item panel'), + 'validator': bool, + 'default': True, + }, + 'MANUAL_BUTTON_ROLE': { + 'name': _('Manual button role'), + 'description': _('Who may generate a batch code manually'), + 'default': 'staff', + 'choices': [ + ('all', _('All users')), + ('staff', _('Staff only')), + ('superuser', _('Superuser only')), + ], + }, + } + + # ------------------------------------------------------------------ + # Code construction + # ------------------------------------------------------------------ + def resolve_prefix(self, location=None) -> str: + """Return the prefix to use, honouring USE_LOCATION_PREFIX.""" + prefix = self.get_setting('PREFIX') or '' + + if not self.get_setting('USE_LOCATION_PREFIX') or location is None: + return prefix + + field = self.get_setting('LOCATION_FIELD') or 'name' + value = getattr(location, field, None) + + return str(value) if value else prefix + + def counter_scope(self, part=None, location=None, date=None) -> dict: + """Return the counter scope implied by the current settings.""" + scope = {'part': None, 'location': None, 'period': ''} + + if self.get_setting('PER_PART'): + scope['part'] = part + + if self.get_setting('PER_LOCATION'): + scope['location'] = location + + if self.get_setting('DAILY_RESET') and date is not None: + scope['period'] = date.strftime('%Y%m%d') + + return scope + + def seed_value(self, scope: dict) -> int: + """Highest number already used by existing batch codes in this scope. + + Guards against reissuing codes which predate the persistent counter - + for instance after upgrading from plugin version 1.x, where the counter + was derived from the stock table on every call. + """ + if not self.get_setting('SEED_FROM_EXISTING'): + return 0 + + from stock.models import StockItem + + items = StockItem.objects.exclude(batch__isnull=True).exclude(batch='') + + if scope.get('part'): + items = items.filter(part=scope['part']) + + if scope.get('location'): + items = items.filter(location=scope['location']) + + if scope.get('period'): + items = items.filter(batch__contains=scope['period']) + + # Only recent codes can plausibly hold the highest counter, and the + # number is not necessarily sortable as a string - so scan a window of + # recent codes and take the true maximum of their trailing digits. + codes = items.order_by('-pk').values_list('batch', flat=True)[:250] + + best = 0 + + for code in codes: + match = TRAILING_NUMBER.search(str(code)) + if match: + best = max(best, int(match.group(1))) + + return best + + def format_context(self, prefix: str, number: int, **kwargs) -> dict: + """Build the mapping made available to CODE_FORMAT. + + Only plain strings, integers and the date are exposed. Passing model + instances would let a format string reach into their attributes. + """ + part = kwargs.get('part') + location = kwargs.get('location') + date = kwargs.get('date') + + return { + 'prefix': prefix, + 'num': number, + 'sep': self.get_setting('SEPARATOR') or '', + 'date': date, + 'part': getattr(part, 'name', '') or '', + 'ipn': getattr(part, 'IPN', '') or '', + 'loc': getattr(location, 'name', '') or '', + 'year': kwargs.get('year') or (date.year if date else ''), + 'month': kwargs.get('month') or (date.month if date else ''), + 'day': kwargs.get('day') or (date.day if date else ''), + 'hour': kwargs.get('hour', ''), + 'minute': kwargs.get('minute', ''), + 'week': kwargs.get('week', ''), + } + + def render_code(self, prefix: str, number: int, **kwargs) -> str: + """Render CODE_FORMAT for the given prefix and counter value.""" + fmt = self.get_setting('CODE_FORMAT') or '{prefix}{sep}{num}' + min_digits = int(self.get_setting('MIN_DIGITS') or 4) + + # A bare {num} inherits the MIN_DIGITS padding; an explicit spec wins + fmt = BARE_NUM.sub(f'{{num:0{min_digits}d}}', fmt) + + context = self.format_context(prefix, number, **kwargs) + + try: + code = string.Formatter().vformat(fmt, (), context) + except Exception as exc: + logger.warning( + 'BatchCodePlugin: invalid CODE_FORMAT %r (%s) - using fallback', + fmt, + exc, + ) + code = f'{prefix}{context["sep"]}{str(number).zfill(min_digits)}' + + return code.strip()[:BATCH_CODE_MAX_LENGTH] + + # ------------------------------------------------------------------ + # Generation + # ------------------------------------------------------------------ + def wants_to_generate(self, **kwargs) -> bool: + """Whether TRIGGER_MODE allows responding to this request.""" + if not self.get_setting('ENABLED'): + return False + + # An explicit request through this plugin's own endpoint always applies + if kwargs.get('force'): + return True + + mode = self.get_setting('TRIGGER_MODE') + + if mode == 'manual': + return False + + if mode == 'on_receive': + return kwargs.get('purchase_order') is not None + + return True + + def extract_targets(self, **kwargs) -> tuple: + """Resolve (part, location, date) from the hook context. + + InvenTree passes 'item', 'part' and 'location' independently (see + stock/serializers.py: GenerateBatchCodeSerializer), so fall back to the + stock item's own part and location where they were not given. + """ + item = kwargs.get('item') + + part = kwargs.get('part') or getattr(item, 'part', None) + location = kwargs.get('location') or getattr(item, 'location', None) + + date = kwargs.get('date') + + if date is None: + from InvenTree.helpers import current_time + + date = current_time() + + return part, location, date + + def build_code(self, commit: bool = True, **kwargs) -> str: + """Produce a batch code. + + Args: + commit: When True the counter is advanced, so the code is reserved. + When False the next value is only previewed, leaving the + counter untouched. + **kwargs: Generation context, as described in + :meth:`generate_batch_code`. + + Returns: + The rendered batch code. + """ + part, location, date = self.extract_targets(**kwargs) + + scope = self.counter_scope(part=part, location=location, date=date) + key = BatchCounter.build_key(**scope) + seed = self.seed_value(scope) + + if commit: + number = BatchCounter.advance(key, seed=seed, **scope) + else: + number = BatchCounter.peek(key, seed=seed) + + kwargs['part'] = part + kwargs['location'] = location + kwargs['date'] = date + + return self.render_code(self.resolve_prefix(location), number, **kwargs) + + def preview_code(self, **kwargs) -> str: + """Render the code which would be issued next, without consuming it.""" + return self.build_code(commit=False, **kwargs) + + # ------------------------------------------------------------------ + # Custom data validation (from ValidationMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/validation/ + # ------------------------------------------------------------------ + def generate_batch_code(self, **kwargs): + """Generate a new StockItem batch code. + + Called by stock.generators.generate_batch_code with the context + defined there: date, year, month, day, hour, minute, week, plus the + caller's own kwargs (item, part, location, quantity, build_order, + purchase_order). Returning None hands the request to the next plugin, + and finally to InvenTree's own STOCK_BATCH_CODE_TEMPLATE. + """ + if not self.wants_to_generate(**kwargs): + return None + + code = self.build_code(commit=True, **kwargs) + + if not code: + return None + + logger.info('BatchCodePlugin: generated batch code %s', code) + + return code + + # ------------------------------------------------------------------ + # Custom URL endpoints (from UrlsMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/urls/ + # ------------------------------------------------------------------ + def setup_urls(self): + """Configure custom URL endpoints for this plugin.""" + from django.urls import path + + from .views import GenerateBatchCodeView, PreviewBatchCodeView + + return [ + path('preview/', PreviewBatchCodeView.as_view(), name='batchcode-preview'), + path( + 'generate/', + GenerateBatchCodeView.as_view(), + name='batchcode-generate', + ), + ] + + # ------------------------------------------------------------------ + # User interface elements (from UserInterfaceMixin) + # Ref: https://docs.inventree.org/en/latest/plugins/mixins/ui/ + # ------------------------------------------------------------------ + def user_can_generate(self, user) -> bool: + """Whether the given user satisfies MANUAL_BUTTON_ROLE.""" + if not user or not user.is_authenticated: + return False + + if not self.get_setting('MANUAL_BUTTON'): + return False + + role = self.get_setting('MANUAL_BUTTON_ROLE') + + if role == 'superuser': + return bool(user.is_superuser) + + if role == 'staff': + return bool(user.is_staff) + + return True + + def get_ui_panels(self, request, context: dict, **kwargs): + """Return the batch code panel, for stock item detail pages.""" + if context.get('target_model') != 'stockitem': + return [] + + return [ + { + 'key': 'batchcode-panel', + 'title': 'Batch Code', + 'description': 'Preview and generate a batch code for this stock item', + 'icon': 'ti:hash:outline', + 'source': self.plugin_static_file( + 'Panel.js:RenderBatchCodePluginPanel' + ), + 'context': { + 'settings': self.get_settings_dict(), + 'can_generate': self.user_can_generate(request.user), + }, + } + ] diff --git a/batchcode_plugin/migrations/0001_initial.py b/batchcode_plugin/migrations/0001_initial.py new file mode 100644 index 0000000..17ed407 --- /dev/null +++ b/batchcode_plugin/migrations/0001_initial.py @@ -0,0 +1,87 @@ +"""Initial migration for the BatchCodePlugin plugin.""" + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + """Create the BatchCounter model.""" + + initial = True + + dependencies = [('part', '__first__'), ('stock', '__first__')] + + operations = [ + migrations.CreateModel( + name='BatchCounter', + fields=[ + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'key', + models.CharField( + editable=False, + help_text='Encoded scope this counter applies to', + max_length=250, + unique=True, + verbose_name='Scope Key', + ), + ), + ( + 'value', + models.PositiveIntegerField( + default=0, + help_text='Last value issued for this scope', + verbose_name='Value', + ), + ), + ( + 'period', + models.CharField( + blank=True, + help_text='Reset period this counter belongs to (empty if never reset)', + max_length=16, + verbose_name='Period', + ), + ), + ( + 'updated', + models.DateTimeField(auto_now=True, verbose_name='Updated'), + ), + ( + 'location', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='stock.stocklocation', + verbose_name='Location', + ), + ), + ( + 'part', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', + to='part.part', + verbose_name='Part', + ), + ), + ], + options={ + 'verbose_name': 'Batch Counter', + 'verbose_name_plural': 'Batch Counters', + 'ordering': ['key'], + }, + ) + ] diff --git a/batchcode_plugin/migrations/__init__.py b/batchcode_plugin/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/batchcode_plugin/models.py b/batchcode_plugin/models.py new file mode 100644 index 0000000..334984a --- /dev/null +++ b/batchcode_plugin/models.py @@ -0,0 +1,148 @@ +"""Database models for the BatchCodePlugin plugin. + +A single model is defined: :class:`BatchCounter`, which persists one monotonic +counter per *scope*. A scope is the combination of the settings-driven +discriminators (part, location, reset period), encoded into ``key``. + +Persisting the counter - rather than deriving it from existing batch codes - +means the sequence is independent of the code format, and can be incremented +atomically under concurrent stock creation. +""" + +from django.contrib.auth.models import User +from django.db import IntegrityError, models, transaction +from django.utils.translation import gettext_lazy as _ + +# Maximum length of StockItem.batch in InvenTree core +BATCH_CODE_MAX_LENGTH = 100 + + +class BatchCounter(models.Model): + """A persistent, monotonically increasing counter for one batch code scope.""" + + class Meta: + """Meta options for the model.""" + + app_label = 'batchcode_plugin' + verbose_name = _('Batch Counter') + verbose_name_plural = _('Batch Counters') + ordering = ['key'] + + key = models.CharField( + max_length=250, + unique=True, + editable=False, + verbose_name=_('Scope Key'), + help_text=_('Encoded scope this counter applies to'), + ) + + value = models.PositiveIntegerField( + default=0, + verbose_name=_('Value'), + help_text=_('Last value issued for this scope'), + ) + + # The following fields are denormalized copies of the scope, kept for + # readability in the admin interface. 'key' is the authoritative constraint: + # a unique_together over nullable FKs would not be enforced, as NULL != NULL. + part = models.ForeignKey( + 'part.Part', + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name='+', + verbose_name=_('Part'), + ) + + location = models.ForeignKey( + 'stock.StockLocation', + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name='+', + verbose_name=_('Location'), + ) + + period = models.CharField( + max_length=16, + blank=True, + verbose_name=_('Period'), + help_text=_('Reset period this counter belongs to (empty if never reset)'), + ) + + updated = models.DateTimeField(auto_now=True, verbose_name=_('Updated')) + + def __str__(self): + """Human readable representation.""" + return f'{self.key} = {self.value}' + + @classmethod + def check_user_permission(cls, user: User, permission: str) -> bool: + """Determine whether a user may act on this model. + + InvenTree denies every permission for plugin models which do not + implement this method, so it must be provided explicitly. + + Counters are internal bookkeeping: readable by any authenticated user, + writable only by staff (via the admin interface). + """ + if not user or not user.is_authenticated: + return False + + if permission == 'view': + return True + + return bool(user.is_staff) + + @classmethod + def build_key(cls, part=None, location=None, period: str = '') -> str: + """Encode a scope into a stable, unique key.""" + return '|'.join( + [ + f'part={part.pk if part else ""}', + f'loc={location.pk if location else ""}', + f'period={period or ""}', + ] + ) + + @classmethod + def peek(cls, key: str, seed: int = 0) -> int: + """Return the value the next call to :meth:`advance` would issue. + + Does not modify any state - used for previewing a code. + """ + current = cls.objects.filter(key=key).values_list('value', flat=True).first() + return max(current or 0, seed) + 1 + + @classmethod + def advance(cls, key: str, seed: int = 0, **scope) -> int: + """Atomically issue the next value for the given scope. + + Args: + key: Scope key, as built by :meth:`build_key`. + seed: Floor for the counter, applied on every call. Used to carry + over sequences from batch codes which already exist in the + database, so that an upgrade from a derived counter does not + reissue codes which are already in use. + scope: Denormalized scope fields (part, location, period) stored on + creation for readability. + + Returns: + The newly issued counter value. + """ + with transaction.atomic(): + try: + counter, _created = cls.objects.get_or_create( + key=key, defaults={'value': 0, **scope} + ) + except IntegrityError: + # Concurrent create won the race; the row now exists + counter = cls.objects.get(key=key) + + # Re-read under a row lock, so concurrent writers serialize here + counter = cls.objects.select_for_update().get(pk=counter.pk) + + counter.value = max(counter.value, seed) + 1 + counter.save(update_fields=['value', 'updated']) + + return counter.value diff --git a/batchcode_plugin/plugin.json b/batchcode_plugin/plugin.json deleted file mode 100644 index b361e55..0000000 --- a/batchcode_plugin/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "batchcode", - "version": "1.7.0", - "author": "Simone Amadori", - "description": "Batch Code Generator plugin", - "url": "https://github.com/simoneamadori/inventree_batchcode_plugin", - "public": true -} diff --git a/batchcode_plugin/plugin.py b/batchcode_plugin/plugin.py deleted file mode 100644 index dde898f..0000000 --- a/batchcode_plugin/plugin.py +++ /dev/null @@ -1,209 +0,0 @@ -# batchcode_plugin/plugin.py - -from typing import Optional -import logging -import re - -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone -from django.core.validators import MinValueValidator, MaxValueValidator - -from plugin import InvenTreePlugin -from plugin.mixins import SettingsMixin, ValidationMixin -from stock.models import StockItem - -logger = logging.getLogger("inventree") - - -class BatchCodePlugin(SettingsMixin, ValidationMixin, InvenTreePlugin): - """ - Batch Code Plugin - Version 1.7.3 – Stable - Compatible with InvenTree 1.1.3 → 1.2+ - """ - - NAME = "BatchCodePlugin" - SLUG = "batchcode" - TITLE = "Batch Code Generator" - DESCRIPTION = _("Generate progressive batch codes with preview and manual action support.") - VERSION = "1.7.3" - AUTHOR = "Simone Amadori" - - SETTINGS = { - "TARGET_FIELD": { - "name": _("Target Field"), - "description": _("StockItem field where the generated code will be stored"), - "default": "batch", - }, - "CODE_FORMAT": { - "name": _("Code Format"), - "description": _( - "Batch code format. Placeholders: " - "{prefix}, {num}, {date}, {part}, {loc}, {sep}. " - "Example: {prefix}{date:%Y%m%d}{sep}{num:04d}" - ), - "default": "{prefix}{date:%Y%m%d}{sep}{num:04d}", - }, - "PREFIX": { - "name": _("Prefix"), - "description": _("Static prefix used if location prefix is disabled"), - "default": "B", - }, - "SEPARATOR": { - "name": _("Separator"), - "description": _("Separator between components"), - "default": "-", - }, - "MIN_DIGITS": { - "name": _("Minimum digits"), - "description": _("Minimum digits for numeric counter"), - "default": 4, - "validator": [int, MinValueValidator(1), MaxValueValidator(12)], - }, - "DAILY_RESET": { - "name": _("Daily reset"), - "description": _("Reset counter every day (based on date embedded in code)"), - "validator": bool, - "default": False, - }, - "PER_PART": { - "name": _("Per part counter"), - "description": _("Maintain a separate counter for each Part"), - "validator": bool, - "default": False, - }, - "PER_LOCATION": { - "name": _("Per location counter"), - "description": _("Maintain a separate counter for each StockLocation"), - "validator": bool, - "default": False, - }, - "USE_LOCATION_PREFIX": { - "name": _("Use location prefix"), - "description": _("Use a StockLocation field as prefix"), - "validator": bool, - "default": False, - }, - "LOCATION_FIELD": { - "name": _("Location field"), - "description": _("StockLocation field used as prefix (name, code, etc.)"), - "default": "name", - }, - "TRIGGER_MODE": { - "name": _("Trigger mode"), - "description": _("When the batch code should be generated"), - "default": "always", - "choices": [ - ("always", _("Always")), - ("on_receive", _("On purchase receive")), - ("manual", _("Manual only")), - ], - }, - "ENABLED": { - "name": _("Enabled"), - "description": _("Enable automatic batch generation"), - "validator": bool, - "default": True, - }, - "MANUAL_BUTTON": { - "name": _("Manual button"), - "description": _("Show manual generate button in StockItem actions"), - "validator": bool, - "default": True, - }, - "MANUAL_BUTTON_ROLE": { - "name": _("Manual button role"), - "description": _("Who can use the manual button"), - "default": "staff", - "choices": [ - ("all", _("All users")), - ("staff", _("Staff only")), - ("superuser", _("Superuser only")), - ], - }, - } - - # --------------------------------------------------------------------- - # Official InvenTree hook - # --------------------------------------------------------------------- - def generate_batch_code(self, **kwargs) -> Optional[str]: - """ - Called by InvenTree when a batch code is required. - Supports preview, auto-generation and manual generation. - """ - - if not self.get_setting("ENABLED", True): - return None - - trigger = self.get_setting("TRIGGER_MODE", "always") - if trigger == "manual" and not kwargs.get("force", False): - return None - - stock_item = kwargs.get("stock_item") - part = getattr(stock_item, "part", None) if stock_item else None - location = getattr(stock_item, "location", None) if stock_item else None - - prefix = self.get_setting("PREFIX", "B") - if self.get_setting("USE_LOCATION_PREFIX", False) and location: - prefix = getattr(location, self.get_setting("LOCATION_FIELD", "name"), prefix) or prefix - - sep = self.get_setting("SEPARATOR", "-") - fmt = self.get_setting("CODE_FORMAT") - min_digits = int(self.get_setting("MIN_DIGITS", 4)) - target = self.get_setting("TARGET_FIELD", "batch") - - qs = StockItem.objects.exclude(**{f"{target}__isnull": True}).exclude(**{target: ""}) - - if self.get_setting("PER_PART", False) and part: - qs = qs.filter(part=part) - - if self.get_setting("PER_LOCATION", False) and location: - qs = qs.filter(location=location) - - today = timezone.now().strftime("%Y%m%d") - - if self.get_setting("DAILY_RESET", False): - qs = qs.filter(**{f"{target}__contains": today}) - - last_code = qs.order_by(f"-{target}").values_list(target, flat=True).first() - - counter = 1 - if last_code: - m = re.search(r"(\d+)$", str(last_code)) - if m: - counter = int(m.group(1)) + 1 - - now = timezone.now() - - try: - code = fmt.format( - prefix=prefix, - num=counter, - date=now, - part=getattr(part, "name", ""), - loc=getattr(location, "name", ""), - sep=sep, - ) - except Exception as exc: - logger.error("BatchCodePlugin format error: %s", exc) - code = f"{prefix}{sep}{str(counter).zfill(min_digits)}" - - return code - - # --------------------------------------------------------------------- - # Manual action (InvenTree 1.2+) - # --------------------------------------------------------------------- - def plugin_actions(self): - if not self.get_setting("MANUAL_BUTTON", True): - return [] - - return [ - { - "name": "generate_batch_code", - "title": _("Generate batch code"), - "description": _("Generate a batch code for this StockItem"), - "endpoint": "manual_batch_code", - "method": "POST", - "role": self.get_setting("MANUAL_BUTTON_ROLE", "staff"), - } - ] diff --git a/batchcode_plugin/serializers.py b/batchcode_plugin/serializers.py new file mode 100644 index 0000000..38b3bf0 --- /dev/null +++ b/batchcode_plugin/serializers.py @@ -0,0 +1,133 @@ +"""API serializers for the BatchCodePlugin plugin. + +Two things here are deliberate: + +- Request and response are separate serializers. A single serializer with a + read_only 'batch_code' field cannot carry the code back out: read_only fields + are excluded from validated_data, so re-serializing the request would + silently drop it from the response. +- The related fields resolve their queryset in `get_queryset`, not in + `__init__`. The InvenTree models cannot be imported while this module is + loaded (the plugin registry is still being built), and DRF validates + `queryset` inside the *field* constructor - which runs when the class body is + evaluated, i.e. at import time - so passing `queryset=None` and filling it in + later raises an AssertionError before it ever gets the chance. +""" + +from rest_framework import serializers + + +class LazyModelField(serializers.PrimaryKeyRelatedField): + """Related field whose queryset is resolved on use. + + Overriding `get_queryset` also suppresses DRF's constructor-time check for + a `queryset` argument. + """ + + def __init__(self, **kwargs): + """Drop any queryset argument; `get_queryset` supplies it instead.""" + kwargs.pop('queryset', None) + super().__init__(**kwargs) + + def get_queryset(self): + """Return the queryset for this field. Overridden by subclasses.""" + raise NotImplementedError + + +class StockItemField(LazyModelField): + """Primary key reference to a StockItem.""" + + def get_queryset(self): + """All stock items.""" + from stock.models import StockItem + + return StockItem.objects.all() + + +class PartField(LazyModelField): + """Primary key reference to a Part.""" + + def get_queryset(self): + """All parts.""" + from part.models import Part + + return Part.objects.all() + + +class StockLocationField(LazyModelField): + """Primary key reference to a StockLocation.""" + + def get_queryset(self): + """All stock locations.""" + from stock.models import StockLocation + + return StockLocation.objects.all() + + +class BatchCodeResponseSerializer(serializers.Serializer): + """A generated or previewed batch code.""" + + class Meta: + """Meta options for this serializer.""" + + fields = ['batch_code'] + + batch_code = serializers.CharField( + label='Batch Code', help_text='The generated batch code' + ) + + +class PreviewBatchCodeSerializer(serializers.Serializer): + """Context for previewing the next batch code. + + A preview never consumes a counter value, so the same input renders the + same code until a code is actually generated for that scope. + """ + + class Meta: + """Meta options for this serializer.""" + + fields = ['item', 'part', 'location'] + + item = StockItemField( + required=False, + allow_null=True, + label='Stock Item', + help_text='Stock item to preview a batch code for', + ) + + part = PartField( + required=False, + allow_null=True, + label='Part', + help_text='Part to preview a batch code for', + ) + + location = StockLocationField( + required=False, + allow_null=True, + label='Location', + help_text='Stock location to preview a batch code for', + ) + + +class GenerateBatchCodeSerializer(serializers.Serializer): + """Request to generate a batch code and save it onto a stock item.""" + + class Meta: + """Meta options for this serializer.""" + + fields = ['item', 'overwrite'] + + item = StockItemField( + required=True, + label='Stock Item', + help_text='Stock item to assign a batch code to', + ) + + overwrite = serializers.BooleanField( + required=False, + default=False, + label='Overwrite', + help_text='Replace an existing batch code on this stock item', + ) diff --git a/batchcode_plugin/static/.vite/manifest.json b/batchcode_plugin/static/.vite/manifest.json new file mode 100644 index 0000000..fe61fb8 --- /dev/null +++ b/batchcode_plugin/static/.vite/manifest.json @@ -0,0 +1,86 @@ +{ + "src/Panel.tsx": { + "file": "Panel-DT4MHQzh.js", + "name": "Panel", + "src": "src/Panel.tsx", + "isEntry": true, + "dynamicImports": [ + "src/locales/de/messages.ts", + "src/locales/en/messages.ts", + "src/locales/es/messages.ts", + "src/locales/fr/messages.ts", + "src/locales/it/messages.ts", + "src/locales/ja/messages.ts", + "src/locales/pseudo-LOCALE/messages.ts", + "src/locales/ru/messages.ts", + "src/locales/zh_Hans/messages.ts", + "src/locales/zh_Hant/messages.ts" + ] + }, + "src/Settings.tsx": { + "file": "Settings-D5NnX1mC.js", + "name": "Settings", + "src": "src/Settings.tsx", + "isEntry": true + }, + "src/locales/de/messages.ts": { + "file": "assets/messages-SySx3VqF.js", + "name": "messages", + "src": "src/locales/de/messages.ts", + "isDynamicEntry": true + }, + "src/locales/en/messages.ts": { + "file": "assets/messages-BVqXLN8V.js", + "name": "messages", + "src": "src/locales/en/messages.ts", + "isDynamicEntry": true + }, + "src/locales/es/messages.ts": { + "file": "assets/messages-B19F09LY.js", + "name": "messages", + "src": "src/locales/es/messages.ts", + "isDynamicEntry": true + }, + "src/locales/fr/messages.ts": { + "file": "assets/messages-DtuQFlMQ.js", + "name": "messages", + "src": "src/locales/fr/messages.ts", + "isDynamicEntry": true + }, + "src/locales/it/messages.ts": { + "file": "assets/messages-m7AYrdMP.js", + "name": "messages", + "src": "src/locales/it/messages.ts", + "isDynamicEntry": true + }, + "src/locales/ja/messages.ts": { + "file": "assets/messages-BwzuZfs7.js", + "name": "messages", + "src": "src/locales/ja/messages.ts", + "isDynamicEntry": true + }, + "src/locales/pseudo-LOCALE/messages.ts": { + "file": "assets/messages-6MO-OwBA.js", + "name": "messages", + "src": "src/locales/pseudo-LOCALE/messages.ts", + "isDynamicEntry": true + }, + "src/locales/ru/messages.ts": { + "file": "assets/messages-BaNfSHmL.js", + "name": "messages", + "src": "src/locales/ru/messages.ts", + "isDynamicEntry": true + }, + "src/locales/zh_Hans/messages.ts": { + "file": "assets/messages-uDIARWjl.js", + "name": "messages", + "src": "src/locales/zh_Hans/messages.ts", + "isDynamicEntry": true + }, + "src/locales/zh_Hant/messages.ts": { + "file": "assets/messages-Bs4XYOTm.js", + "name": "messages", + "src": "src/locales/zh_Hant/messages.ts", + "isDynamicEntry": true + } +} \ No newline at end of file diff --git a/batchcode_plugin/static/Panel-DT4MHQzh.js b/batchcode_plugin/static/Panel-DT4MHQzh.js new file mode 100644 index 0000000..896b2fd --- /dev/null +++ b/batchcode_plugin/static/Panel-DT4MHQzh.js @@ -0,0 +1,2 @@ +const ue="1.5.0";var u=(e=>(e.api_server_info="",e.user_list="user/",e.user_set_password="user/:id/set-password/",e.user_tokens="user/tokens/",e.user_simple_login="email/generate/",e.user_me_profile="user/me/profile/",e.user_me_roles="user/me/roles/",e.user_me_token="user/me/token/",e.user_me="user/me/",e.auth_base="/auth/",e.user_reset="auth/v1/auth/password/request",e.user_reset_set="auth/v1/auth/password/reset",e.auth_pwd_change="auth/v1/account/password/change",e.auth_login="auth/v1/auth/login",e.auth_login_2fa="auth/v1/auth/2fa/authenticate",e.auth_session="auth/v1/auth/session",e.auth_signup="auth/v1/auth/signup",e.auth_authenticators="auth/v1/account/authenticators",e.auth_recovery="auth/v1/account/authenticators/recovery-codes",e.auth_mfa_reauthenticate="auth/v1/auth/2fa/reauthenticate",e.auth_totp="auth/v1/account/authenticators/totp",e.auth_trust="auth/v1/auth/2fa/trust",e.auth_webauthn="auth/v1/account/authenticators/webauthn",e.auth_webauthn_login="auth/v1/auth/webauthn/authenticate",e.auth_reauthenticate="auth/v1/auth/reauthenticate",e.auth_email="auth/v1/account/email",e.auth_email_verify="auth/v1/auth/email/verify",e.auth_providers="auth/v1/account/providers",e.auth_provider_redirect="auth/v1/auth/provider/redirect",e.auth_config="auth/v1/config",e.currency_list="currency/exchange/",e.currency_refresh="currency/refresh/",e.all_units="units/all/",e.task_overview="background-task/",e.task_pending_list="background-task/pending/",e.task_scheduled_list="background-task/scheduled/",e.task_failed_list="background-task/failed/",e.api_search="search/",e.settings_global_list="settings/global/",e.settings_user_list="settings/user/",e.news="news/",e.global_status="generic/status/",e.custom_state_list="generic/status/custom/",e.version="version/",e.license="license/",e.group_list="user/group/",e.owner_list="user/owner/",e.ruleset_list="user/ruleset/",e.content_type_list="contenttype/",e.icons="icons/",e.selectionlist_list="selection/",e.selectionentry_list="selection/:id/entry/",e.barcode="barcode/",e.barcode_history="barcode/history/",e.barcode_link="barcode/link/",e.barcode_unlink="barcode/unlink/",e.barcode_generate="barcode/generate/",e.data_output="data-output/",e.import_session_list="importer/session/",e.import_session_accept_fields="importer/session/:id/accept_fields/",e.import_session_accept_rows="importer/session/:id/accept_rows/",e.import_session_column_mapping_list="importer/column-mapping/",e.import_session_row_list="importer/row/",e.notifications_list="notifications/",e.notifications_readall="notifications/readall/",e.build_order_list="build/",e.build_order_issue="build/:id/issue/",e.build_order_cancel="build/:id/cancel/",e.build_order_hold="build/:id/hold/",e.build_order_complete="build/:id/finish/",e.build_output_complete="build/:id/complete/",e.build_output_create="build/:id/create-output/",e.build_output_scrap="build/:id/scrap-outputs/",e.build_output_delete="build/:id/delete-outputs/",e.build_order_auto_allocate="build/:id/auto-allocate/",e.build_order_allocate="build/:id/allocate/",e.build_order_consume="build/:id/consume/",e.build_order_deallocate="build/:id/unallocate/",e.build_line_list="build/line/",e.build_item_list="build/item/",e.bom_list="bom/",e.bom_item_validate="bom/:id/validate/",e.bom_validate="part/:id/bom-validate/",e.bom_substitute_list="bom/substitute/",e.part_list="part/",e.part_thumbs_list="part/thumbs/",e.part_pricing="part/:id/pricing/",e.part_requirements="part/:id/requirements/",e.part_serial_numbers="part/:id/serial-numbers/",e.part_scheduling="part/:id/scheduling/",e.part_pricing_internal="part/internal-price/",e.part_pricing_sale="part/sale-price/",e.part_stocktake_list="part/stocktake/",e.part_stocktake_generate="part/stocktake/generate/",e.category_list="part/category/",e.category_tree="part/category/tree/",e.category_parameter_list="part/category/parameters/",e.related_part_list="part/related/",e.part_test_template_list="part/test-template/",e.company_list="company/",e.contact_list="company/contact/",e.address_list="company/address/",e.supplier_part_list="company/part/",e.supplier_part_pricing_list="company/price-break/",e.manufacturer_part_list="company/part/manufacturer/",e.stock_location_list="stock/location/",e.stock_location_type_list="stock/location-type/",e.stock_location_tree="stock/location/tree/",e.stock_item_list="stock/",e.stock_tracking_list="stock/track/",e.stock_test_result_list="stock/test/",e.stock_transfer="stock/transfer/",e.stock_remove="stock/remove/",e.stock_return="stock/return/",e.stock_add="stock/add/",e.stock_count="stock/count/",e.stock_change_status="stock/change_status/",e.stock_merge="stock/merge/",e.stock_assign="stock/assign/",e.stock_status="stock/status/",e.stock_convert="stock/:id/convert/",e.stock_disassemble="stock/:id/disassemble/",e.stock_install="stock/:id/install/",e.stock_uninstall="stock/:id/uninstall/",e.stock_serialize="stock/:id/serialize/",e.stock_serial_info="stock/:id/serial-numbers/",e.generate_batch_code="generate/batch-code/",e.generate_serial_number="generate/serial-number/",e.purchase_order_list="order/po/",e.purchase_order_issue="order/po/:id/issue/",e.purchase_order_hold="order/po/:id/hold/",e.purchase_order_cancel="order/po/:id/cancel/",e.purchase_order_complete="order/po/:id/complete/",e.purchase_order_line_list="order/po-line/",e.purchase_order_extra_line_list="order/po-extra-line/",e.purchase_order_receive="order/po/:id/receive/",e.sales_order_list="order/so/",e.sales_order_issue="order/so/:id/issue/",e.sales_order_hold="order/so/:id/hold/",e.sales_order_cancel="order/so/:id/cancel/",e.sales_order_ship="order/so/:id/ship/",e.sales_order_complete="order/so/:id/complete/",e.sales_order_allocate="order/so/:id/allocate/",e.sales_order_allocate_serials="order/so/:id/allocate-serials/",e.sales_order_auto_allocate="order/so/:id/auto-allocate/",e.sales_order_line_list="order/so-line/",e.sales_order_extra_line_list="order/so-extra-line/",e.sales_order_allocation_list="order/so-allocation/",e.sales_order_shipment_list="order/so/shipment/",e.sales_order_shipment_complete="order/so/shipment/:id/ship/",e.return_order_list="order/ro/",e.return_order_issue="order/ro/:id/issue/",e.return_order_hold="order/ro/:id/hold/",e.return_order_cancel="order/ro/:id/cancel/",e.return_order_complete="order/ro/:id/complete/",e.return_order_receive="order/ro/:id/receive/",e.return_order_line_list="order/ro-line/",e.return_order_extra_line_list="order/ro-extra-line/",e.transfer_order_list="order/transfer-order/",e.transfer_order_issue="order/transfer-order/:id/issue/",e.transfer_order_hold="order/transfer-order/:id/hold/",e.transfer_order_cancel="order/transfer-order/:id/cancel/",e.transfer_order_complete="order/transfer-order/:id/complete/",e.transfer_order_allocate="order/transfer-order/:id/allocate/",e.transfer_order_allocate_serials="order/transfer-order/:id/allocate-serials/",e.transfer_order_line_list="order/transfer-order-line/",e.transfer_order_allocation_list="order/transfer-order-allocation/",e.label_list="label/template/",e.label_print="label/print/",e.report_list="report/template/",e.report_print="report/print/",e.report_snippet="report/snippet/",e.report_asset="report/asset/",e.plugin_list="plugins/",e.plugin_setting_list="plugins/:plugin/settings/",e.plugin_user_setting_list="plugins/:plugin/user-settings/",e.plugin_registry_status="plugins/status/",e.plugin_install="plugins/install/",e.plugin_reload="plugins/reload/",e.plugin_activate="plugins/:key/activate/",e.plugin_uninstall="plugins/:key/uninstall/",e.plugin_admin="plugins/:key/admin/",e.plugin_ui_features_list="plugins/ui/features/:feature_type/",e.plugin_locate_item="locate/",e.plugin_supplier_list="supplier/list/",e.plugin_supplier_search="supplier/search/",e.plugin_supplier_import="supplier/import/",e.machine_types_list="machine/types/",e.machine_driver_list="machine/drivers/",e.machine_registry_status="machine/status/",e.machine_list="machine/",e.machine_restart="machine/:machine/restart/",e.machine_setting_list="machine/:machine/settings/",e.machine_setting_detail="machine/:machine/settings/:config_type/",e.attachment_list="attachment/",e.error_report_list="error-report/",e.project_code_list="project-code/",e.custom_unit_list="units/",e.notes_image_upload="notes-image-upload/",e.email_list="admin/email/",e.email_test="admin/email/test/",e.config_list="admin/config/",e.parameter_list="parameter/",e.parameter_template_list="parameter/template/",e.tag_list="tag/",e.system_internal_trace_end="system-internal/observability/end",e))(u||{});window.LinguiCore.i18n;window.LinguiCore.i18n;u.part_list,u.parameter_list,u.parameter_template_list,u.part_test_template_list,u.supplier_part_list,u.manufacturer_part_list,u.category_list,u.stock_item_list,u.stock_location_list,u.stock_location_type_list,u.stock_tracking_list,u.build_order_list,u.build_line_list,u.build_item_list,u.company_list,u.project_code_list,u.purchase_order_list,u.purchase_order_line_list,u.sales_order_list,u.sales_order_shipment_list,u.return_order_list,u.return_order_line_list,u.transfer_order_list,u.transfer_order_line_list,u.address_list,u.contact_list,u.owner_list,u.user_list,u.group_list,u.import_session_list,u.label_list,u.report_list,u.plugin_list,u.content_type_list,u.selectionlist_list,u.selectionentry_list,u.error_report_list,u.tag_list;window.React.useEffect;window.React.useEffectEvent;window.LinguiCore.i18n;window.MantineNotifications.notifications;var J={exports:{}},$={},de;function Xe(){if(de)return $;de=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function r(n,o,s){var i=null;if(s!==void 0&&(i=""+s),o.key!==void 0&&(i=""+o.key),"key"in o){s={};for(var a in o)a!=="key"&&(s[a]=o[a])}else s=o;return o=s.ref,{$$typeof:e,type:n,key:i,ref:o!==void 0?o:null,props:s}}return $.Fragment=t,$.jsx=r,$.jsxs=r,$}var _e;function Ke(){return _e||(_e=1,J.exports=Xe()),J.exports}var he=Ke();window.MantineCore.ActionIcon;window.MantineCore.Group;window.MantineCore.Tooltip;const Qe=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,$e=Object.prototype.toString;function Ze(e){switch($e.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return rt(e,Error)}}function Ae(e,t){return $e.call(e)===`[object ${t}]`}function et(e){return Ae(e,"Object")}function tt(e){return!!(e?.then&&typeof e.then=="function")}function rt(e,t){try{return e instanceof t}catch{return!1}}const E="10.70.0",k=globalThis;function Y(){return oe(k),k}function oe(e){const t=e.__SENTRY__=e.__SENTRY__||{};return t.version=t.version||E,t[E]=t[E]||{}}function se(e,t,r=k){const n=r.__SENTRY__=r.__SENTRY__||{},o=n[E]=n[E]||{};return o[e]||(o[e]=t())}const T=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__;let N;function W(e){if(N!==void 0)return N?N(e):e();const t=Symbol.for("__SENTRY_SAFE_RANDOM_ID_WRAPPER__"),r=k;return t in r&&typeof r[t]=="function"?(N=r[t],N(e)):(N=null,e())}function te(){return W(()=>Math.random())}function nt(){return W(()=>Date.now())}function ot(){const e=k;return e.crypto||e.msCrypto}let X;function st(){return te()*16}function F(e=ot()){try{if(e?.randomUUID)return W(()=>e.randomUUID()).replace(/-/g,"")}catch{}return X||(X="10000000100040008000"+1e11),X.replace(/[018]/g,t=>(t^(st()&15)>>t/4).toString(16))}const Oe=1e3;function Ue(){return nt()/Oe}function it(){const{performance:e}=k;if(!e?.now||!e.timeOrigin)return Ue;const t=e.timeOrigin;return()=>(t+W(()=>e.now()))/Oe}let fe;function at(){return(fe??(fe=it()))()}function ct(e,t={}){if(t.user&&(!e.ipAddress&&t.user.ip_address&&(e.ipAddress=t.user.ip_address),!e.did&&!t.did&&(e.did=t.user.id||t.user.email||t.user.username)),e.timestamp=t.timestamp||at(),t.abnormal_mechanism&&(e.abnormal_mechanism=t.abnormal_mechanism),t.ignoreDuration&&(e.ignoreDuration=t.ignoreDuration),t.sid&&(e.sid=t.sid.length===32?t.sid:F()),t.init!==void 0&&(e.init=t.init),!e.did&&t.did&&(e.did=`${t.did}`),typeof t.started=="number"&&(e.started=t.started),e.ignoreDuration)e.duration=void 0;else if(typeof t.duration=="number")e.duration=t.duration;else{const r=e.timestamp-e.started;e.duration=r>=0?r:0}t.release&&(e.release=t.release),t.environment&&(e.environment=t.environment),!e.ipAddress&&t.ipAddress&&(e.ipAddress=t.ipAddress),!e.userAgent&&t.userAgent&&(e.userAgent=t.userAgent),typeof t.errors=="number"&&(e.errors=t.errors),t.status&&(e.status=t.status)}const lt="Sentry Logger ",me={};function je(e){if(!("console"in k))return e();const t=k.console,r={},n=Object.keys(me);n.forEach(o=>{const s=me[o];r[o]=t[o],t[o]=s});try{return e()}finally{n.forEach(o=>{t[o]=r[o]})}}function ut(){ae().enabled=!0}function dt(){ae().enabled=!1}function Ee(){return ae().enabled}function _t(...e){ie("log",...e)}function ht(...e){ie("warn",...e)}function ft(...e){ie("error",...e)}function ie(e,...t){T&&Ee()&&je(()=>{k.console[e](`${lt}[${e}]:`,...t)})}function ae(){return T?se("loggerSettings",()=>({enabled:!1})):{enabled:!1}}const S={enable:ut,disable:dt,isEnabled:Ee,log:_t,warn:ht,error:ft};function Fe(e,t,r=2){if(!t||typeof t!="object"||r<=0)return t;if(e&&Object.keys(t).length===0)return e;const n={...e};for(const o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=Fe(n[o],t[o],r-1));return n}function ge(){return F()}function mt(e,t,r){try{Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0})}catch{T&&S.log(`Failed to add non-enumerable property "${String(t)}" to object`,e)}}function gt(e){try{const t=k.WeakRef;if(typeof t=="function")return new t(e)}catch{}return e}function pt(e){if(e){if(typeof e=="object"&&"deref"in e&&typeof e.deref=="function")try{return e.deref()}catch{return}return e}}const re="_sentrySpan";function pe(e,t){t?mt(e,re,gt(t)):delete e[re]}function we(e){return pt(e[re])}function wt(e,t=0){return typeof e!="string"||t===0||e.length<=t?e:`${e.slice(0,t)}...`}const vt=100;class L{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._attributes={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext={traceId:ge(),sampleRand:te()}}clone(){const t=new L;return t._breadcrumbs=[...this._breadcrumbs],t._tags={...this._tags},t._attributes={...this._attributes},t._extra={...this._extra},t._contexts={...this._contexts},this._contexts.flags&&(t._contexts.flags={values:[...this._contexts.flags.values]}),t._user=this._user,t._level=this._level,t._session=this._session,t._transactionName=this._transactionName,t._fingerprint=this._fingerprint,t._eventProcessors=[...this._eventProcessors],t._attachments=[...this._attachments],t._sdkProcessingMetadata={...this._sdkProcessingMetadata},t._propagationContext={...this._propagationContext},t._client=this._client,t._lastEventId=this._lastEventId,t._conversationId=this._conversationId,pe(t,we(this)),t}setClient(t){this._client=t}setLastEventId(t){this._lastEventId=t}getClient(){return this._client}lastEventId(){return this._lastEventId}addScopeListener(t){this._scopeListeners.push(t)}addEventProcessor(t){return this._eventProcessors.push(t),this}setUser(t){return this._user=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this._session&&ct(this._session,{user:t}),this._notifyScopeListeners(),this}getUser(){return this._user}setConversationId(t){return this._conversationId=t||void 0,this._notifyScopeListeners(),this}setTags(t){return this._tags={...this._tags,...t},this._notifyScopeListeners(),this}setTag(t,r){return this.setTags({[t]:r})}setAttributes(t){return this._attributes={...this._attributes,...t},this._notifyScopeListeners(),this}setAttribute(t,r){return this.setAttributes({[t]:r})}removeAttribute(t){return t in this._attributes&&(delete this._attributes[t],this._notifyScopeListeners()),this}setExtras(t){return this._extra={...this._extra,...t},this._notifyScopeListeners(),this}setExtra(t,r){return this._extra={...this._extra,[t]:r},this._notifyScopeListeners(),this}setFingerprint(t){return this._fingerprint=t,this._notifyScopeListeners(),this}setLevel(t){return this._level=t,this._notifyScopeListeners(),this}setTransactionName(t){return this._transactionName=t,this._notifyScopeListeners(),this}setContext(t,r){return r===null?delete this._contexts[t]:this._contexts[t]=r,this._notifyScopeListeners(),this}setSession(t){return t?this._session=t:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(t){if(!t)return this;const r=typeof t=="function"?t(this):t,n=r instanceof L?r.getScopeData():et(r)?t:void 0,{tags:o,attributes:s,extra:i,user:a,contexts:d,level:c,fingerprint:l=[],propagationContext:_,conversationId:m}=n||{};return this._tags={...this._tags,...o},this._attributes={...this._attributes,...s},this._extra={...this._extra,...i},this._contexts={...this._contexts,...d},a&&Object.keys(a).length&&(this._user=a),c&&(this._level=c),l.length&&(this._fingerprint=l),_&&(this._propagationContext=_),m&&(this._conversationId=m),this}clear(){return this._breadcrumbs=[],this._tags={},this._attributes={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._session=void 0,this._conversationId=void 0,pe(this,void 0),this._attachments=[],this.setPropagationContext({traceId:ge(),sampleRand:te()}),this._notifyScopeListeners(),this}addBreadcrumb(t,r){const n=typeof r=="number"?r:vt;if(n<=0)return this;const o={timestamp:Ue(),...t,message:t.message?wt(t.message,2048):t.message};return this._breadcrumbs.push(o),this._breadcrumbs.length>n&&(this._breadcrumbs=this._breadcrumbs.slice(-n),this._client?.recordDroppedEvent("buffer_overflow","log_item")),this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(t){return this._attachments.push(t),this}clearAttachments(){return this._attachments=[],this}getScopeData(){return{breadcrumbs:this._breadcrumbs,attachments:this._attachments,contexts:this._contexts,tags:this._tags,attributes:this._attributes,extra:this._extra,user:this._user,level:this._level,fingerprint:this._fingerprint||[],eventProcessors:this._eventProcessors,propagationContext:this._propagationContext,sdkProcessingMetadata:this._sdkProcessingMetadata,transactionName:this._transactionName,span:we(this),conversationId:this._conversationId}}setSDKProcessingMetadata(t){return this._sdkProcessingMetadata=Fe(this._sdkProcessingMetadata,t,2),this}setPropagationContext(t){return this._propagationContext=t,this}getPropagationContext(){return this._propagationContext}captureException(t,r){const n=r?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture exception!"),n;const o=new Error("Sentry syntheticException");return this._client.captureException(t,{originalException:t,syntheticException:o,...r,event_id:n},this),n}captureMessage(t,r,n){const o=n?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture message!"),o;const s=n?.syntheticException??new Error(t);return this._client.captureMessage(t,r,{originalException:t,syntheticException:s,...n,event_id:o},this),o}captureEvent(t,r){const n=t.event_id||r?.event_id||F();return this._client?(this._client.captureEvent(t,{...r,event_id:n},this),n):(T&&S.warn("No client configured on scope - will not capture event!"),n)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach(t=>{t(this)}),this._notifyingListeners=!1)}}function bt(){return se("defaultCurrentScope",()=>new L)}function yt(){return se("defaultIsolationScope",()=>new L)}const ve=e=>e instanceof Promise&&!e[Be],Be=Symbol("chained PromiseLike"),St=(e,t,r)=>{const n=e.then(o=>(t(o),o),o=>{throw r(o),o});return ve(n)&&ve(e)?n:kt(e,n)},kt=(e,t)=>{if(!t)return e;let r=!1;for(const n in e){if(n in t)continue;r=!0;const o=e[n];typeof o=="function"?Object.defineProperty(t,n,{value:(...s)=>o.apply(e,s),enumerable:!0,configurable:!0,writable:!0}):t[n]=o}return r&&Object.assign(t,{[Be]:!0}),t};class Rt{constructor(t,r){let n;t?n=t:n=new L;let o;r?o=r:o=new L,this._stack=[{scope:n}],this._isolationScope=o}withScope(t){const r=this._pushScope();let n;try{n=t(r)}catch(o){throw this._popScope(),o}return tt(n)?St(n,()=>this._popScope(),()=>this._popScope()):(this._popScope(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStackTop(){return this._stack[this._stack.length-1]}_pushScope(){const t=this.getScope().clone();return this._stack.push({client:this.getClient(),scope:t}),t}_popScope(){return this._stack.length<=1?!1:!!this._stack.pop()}}function x(){const e=Y(),t=oe(e);return t.stack=t.stack||new Rt(bt(),yt())}function Ct(e){return x().withScope(e)}function Mt(e,t){const r=x();return r.withScope(()=>(r.getStackTop().scope=e,t(e)))}function be(e){return x().withScope(()=>e(x().getIsolationScope()))}function It(){return{withIsolationScope:be,withScope:Ct,withSetScope:Mt,withSetIsolationScope:(e,t)=>be(t),getCurrentScope:()=>x().getScope(),getIsolationScope:()=>x().getIsolationScope()}}function ce(e){const t=oe(e);return t.acs?t.acs:It()}function le(){const e=Y();return ce(e).getCurrentScope()}function Lt(){const e=Y();return ce(e).getIsolationScope()}function Pt(...e){const t=Y(),r=ce(t);if(e.length===2){const[n,o]=e;return n?r.withSetScope(n,o):r.withScope(o)}return r.withScope(e[0])}function Ge(){return le().getClient()}function Tt(e){if(e)return Nt(e)?{captureContext:e}:xt(e)?{captureContext:e}:e}function Nt(e){return e instanceof L||typeof e=="function"}const Dt=["user","level","extra","contexts","tags","fingerprint","propagationContext"];function xt(e){return Object.keys(e).some(t=>Dt.includes(t))}function $t(e,t){return le().captureException(e,Tt(t))}function Ot(){return Lt().lastEventId()}const Ut=window.React.version;function jt(e){const t=e.match(/^([^.]+)/);return t!==null&&parseInt(t[0])>=17}function Et(e,t){const r=new WeakSet;function n(o,s){if(!r.has(o)){if(o.cause)return r.add(o),n(o.cause,s);o.cause=s}}n(e,t)}function Ft(e,{componentStack:t},r){if(jt(Ut)&&Ze(e)&&t){const n=new Error(e.message);n.name=`React ErrorBoundary ${e.name}`,n.stack=t,Et(e,n)}return $t(e,r)}const ye=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,G=k,Bt=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)((?:\[[:.%\w]+\]|[\w.-]+))(?::(\d+))?\/(.+)/;function Gt(e){return e==="http"||e==="https"}function Ht(e,t=!1){const{host:r,path:n,pass:o,port:s,projectId:i,protocol:a,publicKey:d}=e;return`${a}://${d}${t&&o?`:${o}`:""}@${r}${s?`:${s}`:""}/${n&&`${n}/`}${i}`}function Vt(e){const t=Bt.exec(e);if(!t){je(()=>{console.error(`Invalid Sentry Dsn: ${e}`)});return}const[r,n,o="",s="",i="",a=""]=t.slice(1);let d="",c=a;const l=c.split("/");if(l.length>1&&(d=l.slice(0,-1).join("/"),c=l.pop()),c){const _=c.match(/^\d+/);_&&(c=_[0])}return He({host:s,pass:o,path:d,projectId:c,port:i,protocol:r,publicKey:n})}function He(e){return{protocol:e.protocol,publicKey:e.publicKey||"",pass:e.pass||"",host:e.host,port:e.port||"",path:e.path||"",projectId:e.projectId}}function qt(e){if(!T)return!0;const{port:t,projectId:r,protocol:n}=e;return["protocol","publicKey","host","projectId"].find(i=>e[i]?!1:(S.error(`Invalid Sentry Dsn: ${i} missing`),!0))?!1:r.match(/^\d+$/)?Gt(n)?t&&isNaN(parseInt(t,10))?(S.error(`Invalid Sentry Dsn: Invalid port ${t}`),!1):!0:(S.error(`Invalid Sentry Dsn: Invalid protocol ${n}`),!1):(S.error(`Invalid Sentry Dsn: Invalid projectId ${r}`),!1)}function Yt(e){const t=typeof e=="string"?Vt(e):He(e);if(!(!t||!qt(t)))return t}function Wt(e){const t=e.protocol?`${e.protocol}:`:"",r=e.port?`:${e.port}`:"";return`${t}//${e.host}${r}${e.path?`/${e.path}`:""}/api/`}function zt(e,t){const r=Yt(e);if(!r)return"";const n=`${Wt(r)}embed/error-page/`;let o=`dsn=${Ht(r)}`;for(const s in t)if(s!=="dsn"&&s!=="onClose")if(s==="user"){const i=t.user;if(!i)continue;i.name&&(o+=`&name=${encodeURIComponent(i.name)}`),i.email&&(o+=`&email=${encodeURIComponent(i.email)}`)}else o+=`&${encodeURIComponent(s)}=${encodeURIComponent(t[s])}`;return`${n}?${o}`}function Se(e={}){const t=G.document,r=t?.head||t?.body;if(!r){ye&&S.error("[showReportDialog] Global document not defined");return}const n=le(),s=Ge()?.getDsn();if(!s){ye&&S.error("[showReportDialog] DSN not configured");return}const i={...e,user:{...n.getUser(),...e.user},eventId:e.eventId||Ot()},a=G.document.createElement("script");a.async=!0,a.crossOrigin="anonymous",a.src=zt(s,i);const{onLoad:d,onClose:c}=i;if(d&&(a.onload=d),c){const l=_=>{if(_.data==="__sentry_reportdialog_closed__")try{c()}finally{G.removeEventListener("message",l)}};G.addEventListener("message",l)}r.appendChild(a)}const K=window.React,Q={componentStack:null,error:null,eventId:null};class nn extends K.Component{constructor(t){super(t),this.state=Q,this._openFallbackReportDialog=!0;const r=Ge();r&&t.showDialog&&(this._openFallbackReportDialog=!1,this._cleanupHook=r.on("afterSendEvent",n=>{!n.type&&this._lastEventId&&n.event_id===this._lastEventId&&Se({...t.dialogOptions,eventId:this._lastEventId})}))}componentDidCatch(t,r){const{componentStack:n}=r,{beforeCapture:o,onError:s,showDialog:i,dialogOptions:a}=this.props;Pt(d=>{o&&o(d,t,n);const c=this.props.handled!=null?this.props.handled:!!this.props.fallback,l=Ft(t,r,{mechanism:{handled:c,type:"auto.function.react.error_boundary"}});s&&s(t,n,l),i&&(this._lastEventId=l,this._openFallbackReportDialog&&Se({...a,eventId:l})),this.setState({error:t,componentStack:n,eventId:l})})}componentDidMount(){const{onMount:t}=this.props;t&&t()}componentWillUnmount(){const{error:t,componentStack:r,eventId:n}=this.state,{onUnmount:o}=this.props;o&&(this.state===Q?o(null,null,null):o(t,r,n)),this._cleanupHook&&(this._cleanupHook(),this._cleanupHook=void 0)}resetErrorBoundary(){const{onReset:t}=this.props,{error:r,componentStack:n,eventId:o}=this.state;t&&t(r,n,o),this.setState(Q)}render(){const{fallback:t,children:r}=this.props,n=this.state;if(n.componentStack===null)return typeof r=="function"?r():r;const o=typeof t=="function"?K.createElement(t,{error:n.error,componentStack:n.componentStack,resetError:()=>this.resetErrorBoundary(),eventId:n.eventId}):t;return K.isValidElement(o)?o:(t&&Qe&&S.warn("fallback did not produce a valid ReactElement"),null)}}var Jt={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};const Xt=window.React.forwardRef,Z=window.React.createElement,w=(e,t,r,n)=>{const o=Xt(({color:s="currentColor",size:i=24,stroke:a=2,title:d,className:c,children:l,..._},m)=>Z("svg",{ref:m,...Jt[e],width:i,height:i,className:["tabler-icon",`tabler-icon-${t}`,c].join(" "),strokeWidth:a,stroke:s,..._},[d&&Z("title",{key:"svg-title"},d),...n.map(([g,y])=>Z(g,y)),...Array.isArray(l)?l:[l]]));return o.displayName=`${r}`,o},Kt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M12 9v4",key:"svg-1"}],["path",{d:"M12 16v.01",key:"svg-2"}]];w("outline","exclamation-circle","ExclamationCircle",Kt);const Qt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 9h.01",key:"svg-1"}],["path",{d:"M11 12h1v4h1",key:"svg-2"}]];w("outline","info-circle","InfoCircle",Qt);window.LinguiCore.i18n;window.MantineCore.Alert;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useState;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;const Zt=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]];w("outline","check","Check",Zt);const At=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]];w("outline","copy","Copy",At);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Button;window.MantineCore.CopyButton;window.MantineCore.Text;window.MantineCore.Tooltip;window.MantineCore.Group;window.React.useState;window.MantineCore.Group;window.MantineCore.Progress;window.MantineCore.Stack;window.MantineCore.Text;window.React.useMemo;window.LinguiCore.i18n;window.MantineCore.Badge;window.MantineCore.Skeleton;window.React.useCallback;window.React.useEffect;window.React.useRef;window.React.useState;const er=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]];w("outline","search","Search",er);window.LinguiCore.i18n;window.MantineCore.CloseButton;window.MantineCore.TextInput;window.React.useEffect;window.React.useState;const tr=[["path",{d:"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M6 4v4",key:"svg-1"}],["path",{d:"M6 12v8",key:"svg-2"}],["path",{d:"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-3"}],["path",{d:"M12 4v10",key:"svg-4"}],["path",{d:"M12 18v2",key:"svg-5"}],["path",{d:"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-6"}],["path",{d:"M18 4v1",key:"svg-7"}],["path",{d:"M18 9v11",key:"svg-8"}]];w("outline","adjustments","Adjustments",tr);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Checkbox;window.MantineCore.Divider;window.MantineCore.Menu;window.MantineCore.Tooltip;const rr=[["path",{d:"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3",key:"svg-1"}]];w("outline","tag","Tag",rr);window.MantineCore.ActionIcon;window.MantineCore.Badge;window.MantineCore.Group;window.MantineCore.Paper;window.MantineCore.Alert;const nr=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]];w("outline","dots","Dots",nr);const or=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M10 10l4 4m0 -4l-4 4",key:"svg-1"}]];w("outline","circle-x","CircleX",or);const sr=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]];w("outline","trash","Trash",sr);const ir=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]];w("outline","edit","Edit",ir);const ar=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]];w("outline","arrow-right","ArrowRight",ar);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;window.React.useMemo;window.React.useState;window.React.useEffect;window.React.useState;var Ve=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},cr=class extends Ve{#t;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e();return window.addEventListener("visibilitychange",t,!1),()=>{window.removeEventListener("visibilitychange",t)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(t=>{typeof t=="boolean"?this.setFocused(t):this.onFocus()})}setFocused(e){this.#t!==e&&(this.#t=e,this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#t=="boolean"?this.#t:globalThis.document?.visibilityState!=="hidden"}};new cr;var lr=class extends Ve{#t=!0;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e(!0),r=()=>e(!1);return window.addEventListener("online",t,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",t),window.removeEventListener("offline",r)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(this.setOnline.bind(this))}setOnline(e){this.#t!==e&&(this.#t=e,this.listeners.forEach(r=>{r(e)}))}isOnline(){return this.#t}};new lr;const ur=window.React;ur.createContext(void 0);const dr=window.React;function _r(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}dr.createContext(_r());const hr=window.React;var fr=hr.createContext(!1);fr.Provider;const mr=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l2 2l4 -4",key:"svg-1"}]];w("outline","circle-check","CircleCheck",mr);window.LinguiCore.i18n;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.React.useEffect;window.React.useEffectEvent;window.React.useCallback;window.React.useEffect;window.React.useState;window.React.useCallback;window.React.useEffect;window.React.useMemo;window.React.useCallback;window.React.useMemo;window.React.useState;var ke;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(ke||(ke={}));var Re;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Re||(Re={}));class gr extends Error{}const qe=["post","put","patch","delete"];new Set(qe);const pr=["get",...qe];new Set(pr);const C=window.React,Ce=C.createContext(null),wr=C.createContext({outlet:null,matches:[],isDataRoute:!1}),vr=C.createContext(null);class on extends C.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?C.createElement(wr.Provider,{value:this.props.routeContext},C.createElement(vr.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}const br="startTransition";C[br];var b=(function(e){return e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error",e})(b||{});const yr=new Promise(()=>{});class sn extends C.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error(" caught the following error during render",t,r)}render(){let{children:t,errorElement:r,resolve:n}=this.props,o=null,s=b.pending;if(!(n instanceof Promise))s=b.success,o=Promise.resolve(),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_data",{get:()=>n});else if(this.state.error){s=b.error;let i=this.state.error;o=Promise.reject().catch(()=>{}),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_error",{get:()=>i})}else n._tracked?(o=n,s="_error"in o?b.error:"_data"in o?b.success:b.pending):(s=b.pending,Object.defineProperty(n,"_tracked",{get:()=>!0}),o=n.then(i=>Object.defineProperty(n,"_data",{get:()=>i}),i=>Object.defineProperty(n,"_error",{get:()=>i})));if(s===b.error&&o._error instanceof gr)throw yr;if(s===b.error&&!r)throw o._error;if(s===b.error)return C.createElement(Ce.Provider,{value:o,children:r});if(s===b.success)return C.createElement(Ce.Provider,{value:o,children:t});throw o}}const Ye=window.React,Sr=window.ReactDOM,kr="6";try{window.__reactRouterVersion=kr}catch{}const Rr="startTransition";Ye[Rr];const Cr="flushSync";Sr[Cr];const Mr="useId";Ye[Mr];var Me;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Me||(Me={}));var Ie;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ie||(Ie={}));function Ir(e,t){let r;try{r=e()}catch{return}return{getItem:o=>{var s;const i=d=>d===null?null:JSON.parse(d,void 0),a=(s=r.getItem(o))!=null?s:null;return a instanceof Promise?a.then(i):i(a)},setItem:(o,s)=>r.setItem(o,JSON.stringify(s,void 0)),removeItem:o=>r.removeItem(o)}}const ne=e=>t=>{try{const r=e(t);return r instanceof Promise?r:{then(n){return ne(n)(r)},catch(n){return this}}}catch(r){return{then(n){return this},catch(n){return ne(n)(r)}}}},Lr=(e,t)=>(r,n,o)=>{let s={storage:Ir(()=>window.localStorage),partialize:h=>h,version:0,merge:(h,p)=>({...p,...h}),...t},i=!1,a=0;const d=new Set,c=new Set;let l=s.storage;if(!l)return e((...h)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),r(...h)},n,o);const _=()=>{const h=s.partialize({...n()});return l.setItem(s.name,{state:h,version:s.version})},m=o.setState;o.setState=(h,p)=>(m(h,p),_());const g=e((...h)=>(r(...h),_()),n,o);o.getInitialState=()=>g;let y;const I=()=>{var h,p;if(!l)return;const P=++a;i=!1,d.forEach(v=>{var M;return v((M=n())!=null?M:g)});const B=((p=s.onRehydrateStorage)==null?void 0:p.call(s,(h=n())!=null?h:g))||void 0;return ne(l.getItem.bind(l))(s.name).then(v=>{if(v)if(typeof v.version=="number"&&v.version!==s.version){if(s.migrate){const M=s.migrate(v.state,v.version);return M instanceof Promise?M.then(z=>[!0,z]):[!0,M]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,v.state];return[!1,void 0]}).then(v=>{var M;if(P!==a)return;const[z,Je]=v;if(y=s.merge(Je,(M=n())!=null?M:g),r(y,!0),z)return _()}).then(()=>{P===a&&(B?.(n(),void 0),y=n(),i=!0,c.forEach(v=>v(y)))}).catch(v=>{P===a&&B?.(void 0,v)})};return o.persist={setOptions:h=>{s={...s,...h},h.storage&&(l=h.storage)},clearStorage:()=>{l?.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>I(),hasHydrated:()=>i,onHydrate:h=>(d.add(h),()=>{d.delete(h)}),onFinishHydration:h=>(c.add(h),()=>{c.delete(h)})},s.skipHydration||I(),y||g},We=Lr,Le=e=>{let t;const r=new Set,n=(c,l)=>{const _=typeof c=="function"?c(t):c;if(!Object.is(_,t)){const m=t;t=l??(typeof _!="object"||_===null)?_:Object.assign({},t,_),r.forEach(g=>g(t,m))}},o=()=>t,a={setState:n,getState:o,getInitialState:()=>d,subscribe:c=>(r.add(c),()=>r.delete(c))},d=t=e(n,o,a);return a},Pr=(e=>e?Le(e):Le),H=window.React,Tr=e=>e;function Nr(e,t=Tr){const r=H.useSyncExternalStore(e.subscribe,H.useCallback(()=>t(e.getState()),[e,t]),H.useCallback(()=>t(e.getInitialState()),[e,t]));return H.useDebugValue(r),r}const Dr=e=>{const t=Pr(e),r=n=>Nr(t,n);return Object.assign(r,t),r},ze=(e=>Dr);ze()(We((e,t)=>({detailDrawerStack:0,addDetailDrawer:r=>{e({detailDrawerStack:r===!1?0:t().detailDrawerStack+r})},hotkeys:{},addHotkeys:r=>{const n={...t().hotkeys};for(const[o,s]of r)n[o]=s;e({hotkeys:n})},removeHotkeys:r=>{const n={...t().hotkeys};for(const o of r)delete n[o];e({hotkeys:n})}}),{name:"session-settings-inventreedb_lib"}));window.MantineCore.Text;window.MantineCore.darken;window.MantineCore.getThemeColor;window.MantineCore.useMantineTheme;window.React.useMemo;const xr=[["path",{d:"M15 6l-6 6l6 6",key:"svg-0"}]];w("outline","chevron-left","ChevronLeft",xr);window.MantineCore.ActionIcon;window.MantineCore.Divider;window.MantineCore.Drawer;window.MantineCore.Group;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useMemo;const $r=25;ze()(We((e,t)=>({pageSize:$r,setPageSize:r=>{e(n=>({pageSize:r}))},tableSorting:{},getTableSorting:r=>t().tableSorting[r]||{},setTableSorting:r=>n=>{e({tableSorting:{...t().tableSorting,[r]:n}})},tableColumnNames:{},getTableColumnNames:r=>t().tableColumnNames[r]||null,setTableColumnNames:r=>n=>{e({tableColumnNames:{...t().tableColumnNames,[r]:n}})},clearTableColumnNames:()=>{e({tableColumnNames:{}})},hiddenColumns:{},getHiddenColumns:r=>t().hiddenColumns?.[r]??null,setHiddenColumns:r=>n=>{e({hiddenColumns:{...t().hiddenColumns,[r]:n}})}}),{name:"inventree-table-state"}));const Or=window.LinguiReact.I18nProvider,Ur=window.MantineCore.Skeleton,jr=window.React.useEffect,Er=window.React.useState;async function V(e,t){try{return await t(e)}catch{return console.warn(`Failed to load locale ${e}`),null}}async function Fr(e,t,r){let n=null;if(n=await V(t,r),!n&&t.includes("-")){const o=t.split("-")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}if(!n&&t.includes("_")){const o=t.split("_")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}!n&&t!=="en"&&(console.debug(`Locale ${t} not found, trying fallback locale en`),n=await V("en",r)),n?.messages?(e.load(t,n.messages),e.activate(t)):console.error(`Failed to load any locale for ${t}`)}const Br=async e=>null;function Gr({i18n:e,locale:t,loadLocale:r,children:n}){const[o,s]=Er(!1);return jr(()=>{s(!1),Fr(e,t,r??Br).then(()=>{s(!0)})},[e,t,r]),o?he.jsx(Or,{i18n:e,children:n}):he.jsx(Ur,{w:"100%",animate:!0})}window.React.useEffect;function Hr(e){const t=e?.version?.inventree||"";ue!=t&&console.info(`Plugin version mismatch! Expected version ${ue}, got ${t}`)}const Vr=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]];w("outline","plus","Plus",Vr);const qr="modulepreload",Yr=function(e){return"/"+e},Pe={},R=function(t,r,n){let o=Promise.resolve();if(r&&r.length>0){let i=function(c){return Promise.all(c.map(l=>Promise.resolve(l).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),d=a?.nonce||a?.getAttribute("nonce");o=i(r.map(c=>{if(c=Yr(c),c in Pe)return;Pe[c]=!0;const l=c.endsWith(".css"),_=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${_}`))return;const m=document.createElement("link");if(m.rel=l?"stylesheet":qr,l||(m.as="script"),m.crossOrigin="",m.href=c,d&&m.setAttribute("nonce",d),document.head.appendChild(m),l)return new Promise((g,y)=>{m.addEventListener("load",g),m.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(i){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i}return o.then(i=>{for(const a of i||[])a.status==="rejected"&&s(a.reason);return t().catch(s)})},Wr=(e,t,r)=>{const n=e[t];return n?typeof n=="function"?n():Promise.resolve(n):new Promise((o,s)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(s.bind(null,new Error("Unknown variable dynamic import: "+t+(t.split("/").length!==r?". Note that variables only represent file names one level deep.":""))))})},zr=async e=>Wr(Object.assign({"./locales/de/messages.ts":()=>R(()=>import("./assets/messages-SySx3VqF.js"),[]),"./locales/en/messages.ts":()=>R(()=>import("./assets/messages-BVqXLN8V.js"),[]),"./locales/es/messages.ts":()=>R(()=>import("./assets/messages-B19F09LY.js"),[]),"./locales/fr/messages.ts":()=>R(()=>import("./assets/messages-DtuQFlMQ.js"),[]),"./locales/it/messages.ts":()=>R(()=>import("./assets/messages-m7AYrdMP.js"),[]),"./locales/ja/messages.ts":()=>R(()=>import("./assets/messages-BwzuZfs7.js"),[]),"./locales/pseudo-LOCALE/messages.ts":()=>R(()=>import("./assets/messages-6MO-OwBA.js"),[]),"./locales/ru/messages.ts":()=>R(()=>import("./assets/messages-BaNfSHmL.js"),[]),"./locales/zh_Hans/messages.ts":()=>R(()=>import("./assets/messages-uDIARWjl.js"),[]),"./locales/zh_Hant/messages.ts":()=>R(()=>import("./assets/messages-Bs4XYOTm.js"),[])}),`./locales/${e}/messages.ts`,4).catch(()=>null),f=window.LinguiCore.i18n,A=window.MantineCore.Alert,Te=window.MantineCore.Badge,Ne=window.MantineCore.Button,Jr=window.MantineCore.Code,ee=window.MantineCore.Group,Xr=window.MantineCore.Loader,q=window.MantineCore.Stack,Kr=window.MantineCore.Switch,O=window.MantineCore.Table,D=window.MantineCore.Text,Qr=window.MantineCore.Title,De=window.MantineNotifications.notifications,xe=window.React.useCallback,Zr=window.React.useEffect,j=window.React.useMemo,U=window.React.useState,Ar="/plugin/batchcode/preview/",en="/plugin/batchcode/generate/";function tn({settings:e}){const t=j(()=>{const r=[];return e.PER_PART&&r.push(f._({id:"O/ICOy"})),e.PER_LOCATION&&r.push(f._({id:"qt+UdX"})),e.DAILY_RESET&&r.push(f._({id:"iHaxSq"})),[[f._({id:"kI1qVD"}),String(e.CODE_FORMAT??"")],[f._({id:"rNqTKZ"}),e.USE_LOCATION_PREFIX?f._({id:"j1yeuR",values:{0:String(e.LOCATION_FIELD)}}):String(e.PREFIX??"")],[f._({id:"NKnPpU"}),r.length?r.join(", "):f._({id:"SLbeKO"})],[f._({id:"H2Sfhg"}),String(e.TRIGGER_MODE??"")]]},[e]);return React.createElement(O,{withRowBorders:!1,verticalSpacing:"xs"},React.createElement(O.Tbody,null,t.map(([r,n])=>React.createElement(O.Tr,{key:r},React.createElement(O.Td,null,React.createElement(D,{size:"sm",c:"dimmed"},r)),React.createElement(O.Td,null,React.createElement(Jr,null,n))))))}function rn({context:e}){const t=j(()=>e.context?.settings??{},[e.context]),r=j(()=>!!e.context?.can_generate,[e.context]),n=j(()=>e.id??null,[e.id]),o=j(()=>e.instance?.batch||"",[e.instance]),[s,i]=U(""),[a,d]=U(""),[c,l]=U(!1),[_,m]=U(!1),[g,y]=U(!1),I=xe(()=>{n&&(l(!0),d(""),e.api.post(Ar,{item:n}).then(p=>i(p.data?.batch_code??"")).catch(()=>d(f._({id:"hPL4I9"}))).finally(()=>l(!1)))},[e.api,n]);Zr(()=>{I()},[I]);const h=xe(()=>{n&&(m(!0),e.api.post(en,{item:n,overwrite:g}).then(p=>{const P=p.data?.batch_code??"";De.show({title:f._({id:"T0z5Hw"}),message:P,color:"green"}),e.reloadInstance?.(),I()}).catch(p=>{const P=p?.response?.data?.item?.[0]??p?.response?.data?.detail??f._({id:"NEgaRI"});De.show({title:f._({id:"O8n/gF"}),message:String(P),color:"red"})}).finally(()=>m(!1)))},[e.api,e.reloadInstance,n,I,g]);return t.ENABLED?React.createElement(q,{gap:"md"},React.createElement(ee,{justify:"space-between",align:"flex-start"},React.createElement(q,{gap:2},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"nyqfpO"})),o?React.createElement(Te,{size:"lg",variant:"light",color:e.theme.primaryColor},o):React.createElement(D,{size:"sm",fs:"italic"},f._({id:"MTqQMG"}))),React.createElement(q,{gap:2,align:"flex-end"},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"ss5emH"})),c?React.createElement(Xr,{size:"sm"}):React.createElement(Te,{size:"lg",variant:"outline"},s||"—"))),a&&React.createElement(A,{color:"red",title:f._({id:"IF5r8v"})},a),r?React.createElement(ee,{justify:"space-between"},React.createElement(Kr,{checked:g,onChange:p=>y(p.currentTarget.checked),label:f._({id:"4tMAUR"}),disabled:!o}),React.createElement(ee,{gap:"xs"},React.createElement(Ne,{variant:"default",onClick:I,disabled:c},f._({id:"lCF0wC"})),React.createElement(Ne,{onClick:h,loading:_,disabled:!!o&&!g},f._({id:"DKa9ch"})))):React.createElement(A,{color:"blue",title:f._({id:"uNQ6eB"})},React.createElement(D,null,f._({id:"B4m81Y"}))),React.createElement(q,{gap:4},React.createElement(Qr,{order:5},f._({id:"ywFj2D"})),React.createElement(tn,{settings:t}))):React.createElement(A,{color:"yellow",title:f._({id:"DerUtL"})},React.createElement(D,null,f._({id:"hsSgoQ"})))}function an(e){return Hr(e),React.createElement(Gr,{i18n:e.i18n,locale:e.locale,loadLocale:zr},React.createElement(rn,{context:e}))}export{an as RenderBatchCodePluginPanel}; +//# sourceMappingURL=Panel-DT4MHQzh.js.map diff --git a/batchcode_plugin/static/Panel-DT4MHQzh.js.map b/batchcode_plugin/static/Panel-DT4MHQzh.js.map new file mode 100644 index 0000000..0881e7d --- /dev/null +++ b/batchcode_plugin/static/Panel-DT4MHQzh.js.map @@ -0,0 +1 @@ +{"version":3,"mappings":"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","names":["INVENTREE_PLUGIN_VERSION","ApiEndpoints","ApiEndpoints2","jsxRuntime","reactJsxRuntime_production","hasRequiredReactJsxRuntime_production","requireReactJsxRuntime_production","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","hasRequiredJsxRuntime","requireJsxRuntime","jsxRuntimeExports","DEBUG_BUILD","objectToString","isError","wat","isInstanceOf","isBuiltin","className","isPlainObject","isThenable","base","SDK_VERSION","GLOBAL_OBJ","getMainCarrier","getSentryCarrier","carrier","__SENTRY__","getGlobalSingleton","name","creator","obj","RESOLVED_RUNNER","withRandomSafeContext","cb","sym","globalWithSymbol","safeMathRandom","safeDateNow","getCrypto","gbl","emptyUuid","getRandomByte","uuid4","crypto","c","ONE_SECOND_IN_MS","dateTimestampInSeconds","createUnixTimestampInSecondsFunc","performance","timeOrigin","_cachedTimestampInSeconds","timestampInSeconds","updateSession","session","context","duration","PREFIX","originalConsoleMethods","consoleSandbox","callback","console","wrappedFuncs","wrappedLevels","level","originalConsoleMethod","enable","_getLoggerSettings","disable","isEnabled","log","args","_maybeLog","warn","error","debug","merge","initialObj","mergeObj","levels","output","generateTraceId","addNonEnumerableProperty","value","makeWeakRef","WeakRefImpl","derefWeakRef","ref","SCOPE_SPAN_FIELD","_setSpanForScope","scope","span","_getSpanForScope","truncate","str","max","DEFAULT_MAX_BREADCRUMBS","Scope","newScope","client","lastEventId","user","conversationId","tags","newAttributes","extras","extra","fingerprint","captureContext","scopeToMerge","scopeInstance","attributes","contexts","propagationContext","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","attachment","newData","exception","hint","eventId","syntheticException","message","event","getDefaultCurrentScope","getDefaultIsolationScope","isActualPromise","p","kChainedCopy","chainAndCopyPromiseLike","original","onSuccess","onError","chained","err","copyProps","mutated","AsyncContextStack","isolationScope","assignedScope","assignedIsolationScope","maybePromiseResult","e","getAsyncContextStack","registry","sentry","withScope","withSetScope","stack","withIsolationScope","getStackAsyncContextStrategy","_isolationScope","getAsyncContextStrategy","getCurrentScope","getIsolationScope","rest","acs","getClient","parseEventHintOrCaptureContext","hintIsScopeOrFunction","hintIsScopeContext","captureContextKeys","captureException","version","isAtLeastReact17","reactVersion","reactMajor","setCause","cause","seenErrors","recurse","error2","cause2","captureReactException","componentStack","errorBoundaryError","WINDOW","DSN_REGEX","isValidProtocol","protocol","dsnToString","dsn","withPassword","host","path","pass","port","projectId","publicKey","dsnFromString","match","lastPath","split","projectMatch","dsnFromComponents","components","validateDsn","component","makeDsn","from","getBaseApiEndpoint","getReportDialogEndpoint","dsnLike","dialogOptions","endpoint","encodedOptions","showReportDialog","options","optionalDocument","injectionPoint","mergedOptions","script","onLoad","onClose","reportDialogClosedMessageHandler","React","INITIAL_STATE","ErrorBoundary","props","errorInfo","beforeCapture","showDialog","handled","onMount","onUnmount","onReset","fallback","children","state","element","defaultAttributes","forwardRef","createElement","createReactComponent","iconName","iconNamePascal","iconNode","Component","color","size","stroke","title","tag","attrs","__iconNode","Subscribable","listener","FocusManager","#focused","#cleanup","#setup","onFocus","setup","focused","isFocused","OnlineManager","#online","onOnline","onlineListener","offlineListener","online","createValue","isReset","IsRestoringContext","Action","Action2","ResultType","ResultType2","AbortedDeferredError","validMutationMethodsArr","validRequestMethodsArr","AwaitContext","RouteContext","RouteErrorContext","RenderErrorBoundary","START_TRANSITION","AwaitRenderStatus","AwaitRenderStatus2","neverSettledPromise","AwaitErrorBoundary","errorElement","resolve","promise","status","renderError","data","ReactDOM","REACT_ROUTER_VERSION","FLUSH_SYNC","USE_ID","DataRouterHook","DataRouterHook2","DataRouterStateHook","DataRouterStateHook2","createJSONStorage","getStorage","storage","_a","parse","str2","newValue","toThenable","fn","input","result","onFulfilled","_onRejected","_onFulfilled","onRejected","persistImpl","baseOptions","set","get","api","persistedState","currentState","hasHydrated","hydrationVersion","hydrationListeners","finishHydrationListeners","setItem","savedSetState","replace","configResult","stateFromStorage","hydrate","_b","currentVersion","_a2","postRehydrationCallback","deserializedStorageValue","migration","migrationResult","migrated","migratedState","newOptions","persist","createStoreImpl","createState","listeners","setState","partial","nextState","previousState","getState","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","hotkeys","newHotkeys","details","DEFAULT_PAGE_SIZE","tableKey","sorting","names","columns","I18nProvider","Skeleton","useEffect","useState","tryLoadLocale","locale","loader","loadPluginLocale","i18n","messages","fallbackLocale","defaultLocaleLoader","_locale","LocalizedComponent","loadLocale","loaded","setLoaded","checkPluginVersion","systemVersion","__variableDynamicImportRuntimeHelper","__vitePreload","catch","_i18n","Alert","notifications","useCallback","PREVIEW_URL","GENERATE_URL","SettingsSummary","settings","rows","useMemo","scopes","PER_PART","push","_","id","PER_LOCATION","DAILY_RESET","String","CODE_FORMAT","USE_LOCATION_PREFIX","values","0","LOCATION_FIELD","length","join","TRIGGER_MODE","Table","map","label","Text","Code","BatchCodePanel","canGenerate","can_generate","itemId","currentCode","instance","batch","preview","setPreview","setError","loading","setLoading","busy","setBusy","overwrite","setOverwrite","loadPreview","post","item","then","response","batch_code","finally","generate","code","show","reloadInstance","detail","ENABLED","Stack","Group","Badge","theme","primaryColor","Loader","Switch","currentTarget","checked","Button","Title","RenderBatchCodePluginPanel"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],"sources":["../../frontend/node_modules/@inventreedb/ui/dist/types/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ApiEndpoints.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/Roles.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ModelInformation.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Notification.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime2.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/cjs/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ActionButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/is.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/version.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/worldwide.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/carrier.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/randomSafeContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/misc.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/time.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/session.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/debug-logger.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/merge.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/propagationContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/object.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/weakRef.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/spanOnScope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/string.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/scope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/defaultScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/chain-and-copy-promiselike.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/stackStrategy.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/currentScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/prepareEvent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/exports.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/error.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/helpers.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/dsn.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/api.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/report-dialog.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/errorboundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/components/Boundary.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ButtonMenu.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyButton.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyableCell.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ProgressBar.js","../../frontend/node_modules/@inventreedb/ui/dist/components/YesNoButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js","../../frontend/node_modules/@inventreedb/ui/dist/components/SearchInput.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TableColumnSelect.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TagsList.js","../../frontend/node_modules/@inventreedb/ui/dist/components/InvenTreeTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js","../../frontend/node_modules/@inventreedb/ui/dist/components/RowActions.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/subscribable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/focusManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorDataOutput.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorBackgroundTask.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-window-event/use-window-event.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-local-storage/create-storage.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseFilterSet.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@remix-run/router/dist/router.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router-dom/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/middleware.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/vanilla.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/react.js","../../frontend/node_modules/@inventreedb/ui/dist/states/LocalLibState.js","../../frontend/node_modules/@inventreedb/ui/dist/components/StylishText.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js","../../frontend/node_modules/@inventreedb/ui/dist/components/nav/DetailDrawer.js","../../frontend/node_modules/@inventreedb/ui/dist/states/StoredTableState.js","../../frontend/node_modules/@inventreedb/ui/dist/plugin/LocalizedComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Events.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.js","../../frontend/src/locales.tsx","../../frontend/src/Panel.tsx"],"sourcesContent":["const INVENTREE_PLUGIN_VERSION = \"1.5.0\";\nconst INVENTREE_REACT_VERSION = \"19.2.7\";\nconst INVENTREE_REACT_DOM_VERSION = (\n // @ts-ignore\n \"19.2.7\"\n);\nconst INVENTREE_MANTINE_VERSION = \"9.2.1\";\nexport {\n INVENTREE_MANTINE_VERSION,\n INVENTREE_PLUGIN_VERSION,\n INVENTREE_REACT_DOM_VERSION,\n INVENTREE_REACT_VERSION\n};\n//# sourceMappingURL=Plugins.js.map\n","var ApiEndpoints = /* @__PURE__ */ ((ApiEndpoints2) => {\n ApiEndpoints2[\"api_server_info\"] = \"\";\n ApiEndpoints2[\"user_list\"] = \"user/\";\n ApiEndpoints2[\"user_set_password\"] = \"user/:id/set-password/\";\n ApiEndpoints2[\"user_tokens\"] = \"user/tokens/\";\n ApiEndpoints2[\"user_simple_login\"] = \"email/generate/\";\n ApiEndpoints2[\"user_me_profile\"] = \"user/me/profile/\";\n ApiEndpoints2[\"user_me_roles\"] = \"user/me/roles/\";\n ApiEndpoints2[\"user_me_token\"] = \"user/me/token/\";\n ApiEndpoints2[\"user_me\"] = \"user/me/\";\n ApiEndpoints2[\"auth_base\"] = \"/auth/\";\n ApiEndpoints2[\"user_reset\"] = \"auth/v1/auth/password/request\";\n ApiEndpoints2[\"user_reset_set\"] = \"auth/v1/auth/password/reset\";\n ApiEndpoints2[\"auth_pwd_change\"] = \"auth/v1/account/password/change\";\n ApiEndpoints2[\"auth_login\"] = \"auth/v1/auth/login\";\n ApiEndpoints2[\"auth_login_2fa\"] = \"auth/v1/auth/2fa/authenticate\";\n ApiEndpoints2[\"auth_session\"] = \"auth/v1/auth/session\";\n ApiEndpoints2[\"auth_signup\"] = \"auth/v1/auth/signup\";\n ApiEndpoints2[\"auth_authenticators\"] = \"auth/v1/account/authenticators\";\n ApiEndpoints2[\"auth_recovery\"] = \"auth/v1/account/authenticators/recovery-codes\";\n ApiEndpoints2[\"auth_mfa_reauthenticate\"] = \"auth/v1/auth/2fa/reauthenticate\";\n ApiEndpoints2[\"auth_totp\"] = \"auth/v1/account/authenticators/totp\";\n ApiEndpoints2[\"auth_trust\"] = \"auth/v1/auth/2fa/trust\";\n ApiEndpoints2[\"auth_webauthn\"] = \"auth/v1/account/authenticators/webauthn\";\n ApiEndpoints2[\"auth_webauthn_login\"] = \"auth/v1/auth/webauthn/authenticate\";\n ApiEndpoints2[\"auth_reauthenticate\"] = \"auth/v1/auth/reauthenticate\";\n ApiEndpoints2[\"auth_email\"] = \"auth/v1/account/email\";\n ApiEndpoints2[\"auth_email_verify\"] = \"auth/v1/auth/email/verify\";\n ApiEndpoints2[\"auth_providers\"] = \"auth/v1/account/providers\";\n ApiEndpoints2[\"auth_provider_redirect\"] = \"auth/v1/auth/provider/redirect\";\n ApiEndpoints2[\"auth_config\"] = \"auth/v1/config\";\n ApiEndpoints2[\"currency_list\"] = \"currency/exchange/\";\n ApiEndpoints2[\"currency_refresh\"] = \"currency/refresh/\";\n ApiEndpoints2[\"all_units\"] = \"units/all/\";\n ApiEndpoints2[\"task_overview\"] = \"background-task/\";\n ApiEndpoints2[\"task_pending_list\"] = \"background-task/pending/\";\n ApiEndpoints2[\"task_scheduled_list\"] = \"background-task/scheduled/\";\n ApiEndpoints2[\"task_failed_list\"] = \"background-task/failed/\";\n ApiEndpoints2[\"api_search\"] = \"search/\";\n ApiEndpoints2[\"settings_global_list\"] = \"settings/global/\";\n ApiEndpoints2[\"settings_user_list\"] = \"settings/user/\";\n ApiEndpoints2[\"news\"] = \"news/\";\n ApiEndpoints2[\"global_status\"] = \"generic/status/\";\n ApiEndpoints2[\"custom_state_list\"] = \"generic/status/custom/\";\n ApiEndpoints2[\"version\"] = \"version/\";\n ApiEndpoints2[\"license\"] = \"license/\";\n ApiEndpoints2[\"group_list\"] = \"user/group/\";\n ApiEndpoints2[\"owner_list\"] = \"user/owner/\";\n ApiEndpoints2[\"ruleset_list\"] = \"user/ruleset/\";\n ApiEndpoints2[\"content_type_list\"] = \"contenttype/\";\n ApiEndpoints2[\"icons\"] = \"icons/\";\n ApiEndpoints2[\"selectionlist_list\"] = \"selection/\";\n ApiEndpoints2[\"selectionentry_list\"] = \"selection/:id/entry/\";\n ApiEndpoints2[\"barcode\"] = \"barcode/\";\n ApiEndpoints2[\"barcode_history\"] = \"barcode/history/\";\n ApiEndpoints2[\"barcode_link\"] = \"barcode/link/\";\n ApiEndpoints2[\"barcode_unlink\"] = \"barcode/unlink/\";\n ApiEndpoints2[\"barcode_generate\"] = \"barcode/generate/\";\n ApiEndpoints2[\"data_output\"] = \"data-output/\";\n ApiEndpoints2[\"import_session_list\"] = \"importer/session/\";\n ApiEndpoints2[\"import_session_accept_fields\"] = \"importer/session/:id/accept_fields/\";\n ApiEndpoints2[\"import_session_accept_rows\"] = \"importer/session/:id/accept_rows/\";\n ApiEndpoints2[\"import_session_column_mapping_list\"] = \"importer/column-mapping/\";\n ApiEndpoints2[\"import_session_row_list\"] = \"importer/row/\";\n ApiEndpoints2[\"notifications_list\"] = \"notifications/\";\n ApiEndpoints2[\"notifications_readall\"] = \"notifications/readall/\";\n ApiEndpoints2[\"build_order_list\"] = \"build/\";\n ApiEndpoints2[\"build_order_issue\"] = \"build/:id/issue/\";\n ApiEndpoints2[\"build_order_cancel\"] = \"build/:id/cancel/\";\n ApiEndpoints2[\"build_order_hold\"] = \"build/:id/hold/\";\n ApiEndpoints2[\"build_order_complete\"] = \"build/:id/finish/\";\n ApiEndpoints2[\"build_output_complete\"] = \"build/:id/complete/\";\n ApiEndpoints2[\"build_output_create\"] = \"build/:id/create-output/\";\n ApiEndpoints2[\"build_output_scrap\"] = \"build/:id/scrap-outputs/\";\n ApiEndpoints2[\"build_output_delete\"] = \"build/:id/delete-outputs/\";\n ApiEndpoints2[\"build_order_auto_allocate\"] = \"build/:id/auto-allocate/\";\n ApiEndpoints2[\"build_order_allocate\"] = \"build/:id/allocate/\";\n ApiEndpoints2[\"build_order_consume\"] = \"build/:id/consume/\";\n ApiEndpoints2[\"build_order_deallocate\"] = \"build/:id/unallocate/\";\n ApiEndpoints2[\"build_line_list\"] = \"build/line/\";\n ApiEndpoints2[\"build_item_list\"] = \"build/item/\";\n ApiEndpoints2[\"bom_list\"] = \"bom/\";\n ApiEndpoints2[\"bom_item_validate\"] = \"bom/:id/validate/\";\n ApiEndpoints2[\"bom_validate\"] = \"part/:id/bom-validate/\";\n ApiEndpoints2[\"bom_substitute_list\"] = \"bom/substitute/\";\n ApiEndpoints2[\"part_list\"] = \"part/\";\n ApiEndpoints2[\"part_thumbs_list\"] = \"part/thumbs/\";\n ApiEndpoints2[\"part_pricing\"] = \"part/:id/pricing/\";\n ApiEndpoints2[\"part_requirements\"] = \"part/:id/requirements/\";\n ApiEndpoints2[\"part_serial_numbers\"] = \"part/:id/serial-numbers/\";\n ApiEndpoints2[\"part_scheduling\"] = \"part/:id/scheduling/\";\n ApiEndpoints2[\"part_pricing_internal\"] = \"part/internal-price/\";\n ApiEndpoints2[\"part_pricing_sale\"] = \"part/sale-price/\";\n ApiEndpoints2[\"part_stocktake_list\"] = \"part/stocktake/\";\n ApiEndpoints2[\"part_stocktake_generate\"] = \"part/stocktake/generate/\";\n ApiEndpoints2[\"category_list\"] = \"part/category/\";\n ApiEndpoints2[\"category_tree\"] = \"part/category/tree/\";\n ApiEndpoints2[\"category_parameter_list\"] = \"part/category/parameters/\";\n ApiEndpoints2[\"related_part_list\"] = \"part/related/\";\n ApiEndpoints2[\"part_test_template_list\"] = \"part/test-template/\";\n ApiEndpoints2[\"company_list\"] = \"company/\";\n ApiEndpoints2[\"contact_list\"] = \"company/contact/\";\n ApiEndpoints2[\"address_list\"] = \"company/address/\";\n ApiEndpoints2[\"supplier_part_list\"] = \"company/part/\";\n ApiEndpoints2[\"supplier_part_pricing_list\"] = \"company/price-break/\";\n ApiEndpoints2[\"manufacturer_part_list\"] = \"company/part/manufacturer/\";\n ApiEndpoints2[\"stock_location_list\"] = \"stock/location/\";\n ApiEndpoints2[\"stock_location_type_list\"] = \"stock/location-type/\";\n ApiEndpoints2[\"stock_location_tree\"] = \"stock/location/tree/\";\n ApiEndpoints2[\"stock_item_list\"] = \"stock/\";\n ApiEndpoints2[\"stock_tracking_list\"] = \"stock/track/\";\n ApiEndpoints2[\"stock_test_result_list\"] = \"stock/test/\";\n ApiEndpoints2[\"stock_transfer\"] = \"stock/transfer/\";\n ApiEndpoints2[\"stock_remove\"] = \"stock/remove/\";\n ApiEndpoints2[\"stock_return\"] = \"stock/return/\";\n ApiEndpoints2[\"stock_add\"] = \"stock/add/\";\n ApiEndpoints2[\"stock_count\"] = \"stock/count/\";\n ApiEndpoints2[\"stock_change_status\"] = \"stock/change_status/\";\n ApiEndpoints2[\"stock_merge\"] = \"stock/merge/\";\n ApiEndpoints2[\"stock_assign\"] = \"stock/assign/\";\n ApiEndpoints2[\"stock_status\"] = \"stock/status/\";\n ApiEndpoints2[\"stock_convert\"] = \"stock/:id/convert/\";\n ApiEndpoints2[\"stock_disassemble\"] = \"stock/:id/disassemble/\";\n ApiEndpoints2[\"stock_install\"] = \"stock/:id/install/\";\n ApiEndpoints2[\"stock_uninstall\"] = \"stock/:id/uninstall/\";\n ApiEndpoints2[\"stock_serialize\"] = \"stock/:id/serialize/\";\n ApiEndpoints2[\"stock_serial_info\"] = \"stock/:id/serial-numbers/\";\n ApiEndpoints2[\"generate_batch_code\"] = \"generate/batch-code/\";\n ApiEndpoints2[\"generate_serial_number\"] = \"generate/serial-number/\";\n ApiEndpoints2[\"purchase_order_list\"] = \"order/po/\";\n ApiEndpoints2[\"purchase_order_issue\"] = \"order/po/:id/issue/\";\n ApiEndpoints2[\"purchase_order_hold\"] = \"order/po/:id/hold/\";\n ApiEndpoints2[\"purchase_order_cancel\"] = \"order/po/:id/cancel/\";\n ApiEndpoints2[\"purchase_order_complete\"] = \"order/po/:id/complete/\";\n ApiEndpoints2[\"purchase_order_line_list\"] = \"order/po-line/\";\n ApiEndpoints2[\"purchase_order_extra_line_list\"] = \"order/po-extra-line/\";\n ApiEndpoints2[\"purchase_order_receive\"] = \"order/po/:id/receive/\";\n ApiEndpoints2[\"sales_order_list\"] = \"order/so/\";\n ApiEndpoints2[\"sales_order_issue\"] = \"order/so/:id/issue/\";\n ApiEndpoints2[\"sales_order_hold\"] = \"order/so/:id/hold/\";\n ApiEndpoints2[\"sales_order_cancel\"] = \"order/so/:id/cancel/\";\n ApiEndpoints2[\"sales_order_ship\"] = \"order/so/:id/ship/\";\n ApiEndpoints2[\"sales_order_complete\"] = \"order/so/:id/complete/\";\n ApiEndpoints2[\"sales_order_allocate\"] = \"order/so/:id/allocate/\";\n ApiEndpoints2[\"sales_order_allocate_serials\"] = \"order/so/:id/allocate-serials/\";\n ApiEndpoints2[\"sales_order_auto_allocate\"] = \"order/so/:id/auto-allocate/\";\n ApiEndpoints2[\"sales_order_line_list\"] = \"order/so-line/\";\n ApiEndpoints2[\"sales_order_extra_line_list\"] = \"order/so-extra-line/\";\n ApiEndpoints2[\"sales_order_allocation_list\"] = \"order/so-allocation/\";\n ApiEndpoints2[\"sales_order_shipment_list\"] = \"order/so/shipment/\";\n ApiEndpoints2[\"sales_order_shipment_complete\"] = \"order/so/shipment/:id/ship/\";\n ApiEndpoints2[\"return_order_list\"] = \"order/ro/\";\n ApiEndpoints2[\"return_order_issue\"] = \"order/ro/:id/issue/\";\n ApiEndpoints2[\"return_order_hold\"] = \"order/ro/:id/hold/\";\n ApiEndpoints2[\"return_order_cancel\"] = \"order/ro/:id/cancel/\";\n ApiEndpoints2[\"return_order_complete\"] = \"order/ro/:id/complete/\";\n ApiEndpoints2[\"return_order_receive\"] = \"order/ro/:id/receive/\";\n ApiEndpoints2[\"return_order_line_list\"] = \"order/ro-line/\";\n ApiEndpoints2[\"return_order_extra_line_list\"] = \"order/ro-extra-line/\";\n ApiEndpoints2[\"transfer_order_list\"] = \"order/transfer-order/\";\n ApiEndpoints2[\"transfer_order_issue\"] = \"order/transfer-order/:id/issue/\";\n ApiEndpoints2[\"transfer_order_hold\"] = \"order/transfer-order/:id/hold/\";\n ApiEndpoints2[\"transfer_order_cancel\"] = \"order/transfer-order/:id/cancel/\";\n ApiEndpoints2[\"transfer_order_complete\"] = \"order/transfer-order/:id/complete/\";\n ApiEndpoints2[\"transfer_order_allocate\"] = \"order/transfer-order/:id/allocate/\";\n ApiEndpoints2[\"transfer_order_allocate_serials\"] = \"order/transfer-order/:id/allocate-serials/\";\n ApiEndpoints2[\"transfer_order_line_list\"] = \"order/transfer-order-line/\";\n ApiEndpoints2[\"transfer_order_allocation_list\"] = \"order/transfer-order-allocation/\";\n ApiEndpoints2[\"label_list\"] = \"label/template/\";\n ApiEndpoints2[\"label_print\"] = \"label/print/\";\n ApiEndpoints2[\"report_list\"] = \"report/template/\";\n ApiEndpoints2[\"report_print\"] = \"report/print/\";\n ApiEndpoints2[\"report_snippet\"] = \"report/snippet/\";\n ApiEndpoints2[\"report_asset\"] = \"report/asset/\";\n ApiEndpoints2[\"plugin_list\"] = \"plugins/\";\n ApiEndpoints2[\"plugin_setting_list\"] = \"plugins/:plugin/settings/\";\n ApiEndpoints2[\"plugin_user_setting_list\"] = \"plugins/:plugin/user-settings/\";\n ApiEndpoints2[\"plugin_registry_status\"] = \"plugins/status/\";\n ApiEndpoints2[\"plugin_install\"] = \"plugins/install/\";\n ApiEndpoints2[\"plugin_reload\"] = \"plugins/reload/\";\n ApiEndpoints2[\"plugin_activate\"] = \"plugins/:key/activate/\";\n ApiEndpoints2[\"plugin_uninstall\"] = \"plugins/:key/uninstall/\";\n ApiEndpoints2[\"plugin_admin\"] = \"plugins/:key/admin/\";\n ApiEndpoints2[\"plugin_ui_features_list\"] = \"plugins/ui/features/:feature_type/\";\n ApiEndpoints2[\"plugin_locate_item\"] = \"locate/\";\n ApiEndpoints2[\"plugin_supplier_list\"] = \"supplier/list/\";\n ApiEndpoints2[\"plugin_supplier_search\"] = \"supplier/search/\";\n ApiEndpoints2[\"plugin_supplier_import\"] = \"supplier/import/\";\n ApiEndpoints2[\"machine_types_list\"] = \"machine/types/\";\n ApiEndpoints2[\"machine_driver_list\"] = \"machine/drivers/\";\n ApiEndpoints2[\"machine_registry_status\"] = \"machine/status/\";\n ApiEndpoints2[\"machine_list\"] = \"machine/\";\n ApiEndpoints2[\"machine_restart\"] = \"machine/:machine/restart/\";\n ApiEndpoints2[\"machine_setting_list\"] = \"machine/:machine/settings/\";\n ApiEndpoints2[\"machine_setting_detail\"] = \"machine/:machine/settings/:config_type/\";\n ApiEndpoints2[\"attachment_list\"] = \"attachment/\";\n ApiEndpoints2[\"error_report_list\"] = \"error-report/\";\n ApiEndpoints2[\"project_code_list\"] = \"project-code/\";\n ApiEndpoints2[\"custom_unit_list\"] = \"units/\";\n ApiEndpoints2[\"notes_image_upload\"] = \"notes-image-upload/\";\n ApiEndpoints2[\"email_list\"] = \"admin/email/\";\n ApiEndpoints2[\"email_test\"] = \"admin/email/test/\";\n ApiEndpoints2[\"config_list\"] = \"admin/config/\";\n ApiEndpoints2[\"parameter_list\"] = \"parameter/\";\n ApiEndpoints2[\"parameter_template_list\"] = \"parameter/template/\";\n ApiEndpoints2[\"tag_list\"] = \"tag/\";\n ApiEndpoints2[\"system_internal_trace_end\"] = \"system-internal/observability/end\";\n return ApiEndpoints2;\n})(ApiEndpoints || {});\nexport {\n ApiEndpoints\n};\n//# sourceMappingURL=ApiEndpoints.js.map\n","window[\"LinguiCore\"].i18n;\nvar UserRoles = /* @__PURE__ */ ((UserRoles2) => {\n UserRoles2[\"admin\"] = \"admin\";\n UserRoles2[\"bom\"] = \"bom\";\n UserRoles2[\"build\"] = \"build\";\n UserRoles2[\"part\"] = \"part\";\n UserRoles2[\"part_category\"] = \"part_category\";\n UserRoles2[\"purchase_order\"] = \"purchase_order\";\n UserRoles2[\"return_order\"] = \"return_order\";\n UserRoles2[\"transfer_order\"] = \"transfer_order\";\n UserRoles2[\"sales_order\"] = \"sales_order\";\n UserRoles2[\"stock\"] = \"stock\";\n UserRoles2[\"stock_location\"] = \"stock_location\";\n return UserRoles2;\n})(UserRoles || {});\nvar UserPermissions = /* @__PURE__ */ ((UserPermissions2) => {\n UserPermissions2[\"view\"] = \"view\";\n UserPermissions2[\"add\"] = \"add\";\n UserPermissions2[\"change\"] = \"change\";\n UserPermissions2[\"delete\"] = \"delete\";\n return UserPermissions2;\n})(UserPermissions || {});\nexport {\n UserPermissions,\n UserRoles\n};\n//# sourceMappingURL=Roles.js.map\n","import { ApiEndpoints } from \"./ApiEndpoints.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ModelInformationDict = {\n part: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"vgP+9p\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"pmRbKZ\"\n }\n ),\n url_overview: \"/part/category/index/parts\",\n url_detail: \"/part/:pk/\",\n api_endpoint: ApiEndpoints.part_list,\n admin_url: \"/part/part/\",\n supports_barcode: true,\n icon: \"part\"\n },\n parameter: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"T/87By\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F18WP3\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_list,\n icon: \"list_details\"\n },\n parametertemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"+nwoLk\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"ciZG57\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_template_list,\n admin_url: \"/common/parametertemplate/\",\n icon: \"list\"\n },\n parttesttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"75lDy5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"KevMsQ\"\n }\n ),\n url_detail: \"/parttesttemplate/:pk/\",\n api_endpoint: ApiEndpoints.part_test_template_list,\n icon: \"test\"\n },\n supplierpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"nne72x\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"FcNRrt\"\n }\n ),\n url_overview: \"/purchasing/index/supplier-parts\",\n url_detail: \"/purchasing/supplier-part/:pk/\",\n api_endpoint: ApiEndpoints.supplier_part_list,\n admin_url: \"/company/supplierpart/\",\n supports_barcode: true,\n icon: \"supplier_part\",\n default_query_params: {\n part_detail: true,\n supplier_detail: true,\n manufacturer_detail: true\n }\n },\n manufacturerpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"bisS0I\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"d0fBfb\"\n }\n ),\n url_overview: \"/purchasing/index/manufacturer-parts\",\n url_detail: \"/purchasing/manufacturer-part/:pk/\",\n api_endpoint: ApiEndpoints.manufacturer_part_list,\n admin_url: \"/company/manufacturerpart/\",\n supports_barcode: true,\n icon: \"manufacturers\",\n default_query_params: {\n part_detail: true,\n manufacturer_detail: true\n }\n },\n partcategory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"QXANxH\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2GkbLI\"\n }\n ),\n url_overview: \"/part/category/parts/subcategories\",\n url_detail: \"/part/category/:pk/\",\n api_endpoint: ApiEndpoints.category_list,\n admin_url: \"/part/partcategory/\",\n icon: \"category\"\n },\n stockitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"igx8Og\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Jbck4N\"\n }\n ),\n url_overview: \"/stock/location/index/stock-items\",\n url_detail: \"/stock/item/:pk/\",\n api_endpoint: ApiEndpoints.stock_item_list,\n admin_url: \"/stock/stockitem/\",\n supports_barcode: true,\n icon: \"stock\",\n default_query_params: {\n part_detail: true\n }\n },\n stocklocation: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"adXdas\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1eBWAw\"\n }\n ),\n url_overview: \"/stock/location\",\n url_detail: \"/stock/location/:pk/\",\n api_endpoint: ApiEndpoints.stock_location_list,\n admin_url: \"/stock/stocklocation/\",\n supports_barcode: true,\n icon: \"location\"\n },\n stocklocationtype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"DjwC2f\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"vkPSyZ\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_location_type_list,\n icon: \"location\"\n },\n stockhistory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"cE4TWF\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"rewkgt\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_tracking_list,\n icon: \"history\"\n },\n build: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"YxwWvi\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"RCVhIP\"\n }\n ),\n url_overview: \"/manufacturing/index/buildorders/\",\n url_detail: \"/manufacturing/build-order/:pk/\",\n api_endpoint: ApiEndpoints.build_order_list,\n admin_url: \"/build/build/\",\n supports_barcode: true,\n icon: \"build_order\",\n default_query_params: {\n part_detail: true\n }\n },\n buildline: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"9TLpo1\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CRYIQ0\"\n }\n ),\n url_overview: \"/build/line\",\n url_detail: \"/build/line/:pk/\",\n api_endpoint: ApiEndpoints.build_line_list,\n icon: \"build_order\"\n },\n builditem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LN2ON5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"A7FuwR\"\n }\n ),\n api_endpoint: ApiEndpoints.build_item_list,\n icon: \"build_order\"\n },\n company: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7i8j3G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"s2QZS6\"\n }\n ),\n url_detail: \"/company/:pk/\",\n api_endpoint: ApiEndpoints.company_list,\n admin_url: \"/company/company/\",\n icon: \"building\"\n },\n projectcode: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Sdfr6G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"AklCpf\"\n }\n ),\n url_detail: \"/project-code/:pk/\",\n api_endpoint: ApiEndpoints.project_code_list,\n icon: \"list_details\"\n },\n purchaseorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"KxySMG\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"85Yvr2\"\n }\n ),\n url_overview: \"/purchasing/index/purchaseorders\",\n url_detail: \"/purchasing/purchase-order/:pk/\",\n api_endpoint: ApiEndpoints.purchase_order_list,\n admin_url: \"/order/purchaseorder/\",\n supports_barcode: true,\n icon: \"purchase_orders\",\n default_query_params: {\n supplier_detail: true\n }\n },\n purchaseorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Enr0Pf\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"MXjnQS\"\n }\n ),\n api_endpoint: ApiEndpoints.purchase_order_line_list,\n icon: \"purchase_orders\"\n },\n salesorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LozYBo\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"B1TL+X\"\n }\n ),\n url_overview: \"/sales/index/salesorders\",\n url_detail: \"/sales/sales-order/:pk/\",\n api_endpoint: ApiEndpoints.sales_order_list,\n admin_url: \"/order/salesorder/\",\n supports_barcode: true,\n icon: \"sales_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n salesordershipment: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"qGSobR\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"D/EkfS\"\n }\n ),\n url_overview: \"/sales/index/shipments\",\n url_detail: \"/sales/shipment/:pk/\",\n admin_url: \"/order/salesordershipment/\",\n api_endpoint: ApiEndpoints.sales_order_shipment_list,\n supports_barcode: true,\n icon: \"shipment\",\n default_query_params: {\n order_detail: true\n }\n },\n returnorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Z6ve1w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"LlTg8M\"\n }\n ),\n url_overview: \"/sales/index/returnorders\",\n url_detail: \"/sales/return-order/:pk/\",\n api_endpoint: ApiEndpoints.return_order_list,\n admin_url: \"/order/returnorder/\",\n supports_barcode: true,\n icon: \"return_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n returnorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Frsz7D\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"4dCpFa\"\n }\n ),\n api_endpoint: ApiEndpoints.return_order_line_list,\n icon: \"return_orders\"\n },\n transferorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"8P0cA/\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"IxhZtQ\"\n }\n ),\n url_overview: \"/stock/location/index/transfer-orders\",\n url_detail: \"/stock/transfer-order/:pk/\",\n api_endpoint: ApiEndpoints.transfer_order_list,\n admin_url: \"/order/transferorder/\",\n supports_barcode: true,\n icon: \"transfer_orders\"\n },\n transferorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"VKydzB\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"VkSETm\"\n }\n ),\n api_endpoint: ApiEndpoints.transfer_order_line_list,\n icon: \"transfer-orders\"\n },\n address: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Du6bPw\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"bYmAV1\"\n }\n ),\n url_detail: \"/address/:pk/\",\n api_endpoint: ApiEndpoints.address_list,\n icon: \"address\"\n },\n contact: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"jfC/xh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"gVfVfe\"\n }\n ),\n url_detail: \"/contact/:pk/\",\n api_endpoint: ApiEndpoints.contact_list,\n icon: \"group\"\n },\n owner: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LtI9AS\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CYRJEX\"\n }\n ),\n url_detail: \"/owner/:pk/\",\n api_endpoint: ApiEndpoints.owner_list,\n icon: \"group\"\n },\n user: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7PzzBU\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Sxm8rQ\"\n }\n ),\n url_detail: \"/core/user/:pk/\",\n api_endpoint: ApiEndpoints.user_list,\n icon: \"user\"\n },\n group: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"L8fEEm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"zhrjek\"\n }\n ),\n url_detail: \"/core/group/:pk/\",\n api_endpoint: ApiEndpoints.group_list,\n admin_url: \"/auth/group/\",\n icon: \"group\"\n },\n importsession: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"e5WBGh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1dn8uK\"\n }\n ),\n url_overview: \"/settings/admin/import\",\n url_detail: \"/import/:pk/\",\n api_endpoint: ApiEndpoints.import_session_list,\n icon: \"import\"\n },\n labeltemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"aKf3M5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"0qHiFS\"\n }\n ),\n url_overview: \"/settings/admin/labels\",\n url_detail: \"/settings/admin/labels/:pk/\",\n api_endpoint: ApiEndpoints.label_list,\n icon: \"labels\"\n },\n reporttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"F/A+39\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"SX006I\"\n }\n ),\n url_overview: \"/settings/admin/reports\",\n url_detail: \"/settings/admin/reports/:pk/\",\n api_endpoint: ApiEndpoints.report_list,\n icon: \"reports\"\n },\n pluginconfig: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"BFm1Jm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"7ybWp/\"\n }\n ),\n url_overview: \"/settings/admin/plugin\",\n url_detail: \"/settings/admin/plugin/:pk/\",\n api_endpoint: ApiEndpoints.plugin_list,\n icon: \"plugin\"\n },\n contenttype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"f9cDxV\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F7Jcuy\"\n }\n ),\n api_endpoint: ApiEndpoints.content_type_list,\n icon: \"list_details\"\n },\n selectionlist: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"ifEZiy\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2q2/qs\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionlist_list,\n icon: \"list_details\"\n },\n selectionentry: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"0Mx1/T\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"jDVRSq\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionentry_list,\n icon: \"list_details\"\n },\n error: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"SlfejT\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"UirGxE\"\n }\n ),\n api_endpoint: ApiEndpoints.error_report_list,\n url_overview: \"/settings/admin/errors\",\n url_detail: \"/settings/admin/errors/:pk/\",\n icon: \"exclamation\"\n },\n tag: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"UL8A9w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"OYHzN1\"\n }\n ),\n api_endpoint: ApiEndpoints.tag_list,\n icon: \"tag\"\n }\n};\nexport {\n ModelInformationDict\n};\n//# sourceMappingURL=ModelInformation.js.map\n","import { getHotkeyMatcher } from \"./parse-hotkey.js\";\nconst useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable = false) {\n if (event.target instanceof HTMLElement) {\n if (triggerOnContentEditable) return !tagsToIgnore.includes(event.target.tagName);\n return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);\n }\n return true;\n}\nfunction useHotkeys(hotkeys, tagsToIgnore = [\n \"INPUT\",\n \"TEXTAREA\",\n \"SELECT\"\n], triggerOnContentEditable = false) {\n const handleKeydown = useEffectEvent((event) => {\n hotkeys.forEach(([hotkey, handler, options = {\n preventDefault: true,\n usePhysicalKeys: false\n }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) && shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)) {\n if (options.preventDefault) event.preventDefault();\n handler(event);\n }\n });\n });\n useEffect(() => {\n document.documentElement.addEventListener(\"keydown\", handleKeydown);\n return () => document.documentElement.removeEventListener(\"keydown\", handleKeydown);\n }, []);\n}\nexport {\n useHotkeys\n};\n//# sourceMappingURL=use-hotkeys.js.map\n","const _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nfunction notYetImplemented() {\n notifications.hide(\"not-implemented\");\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"ipE2p4\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"WvSApV\"\n }\n ),\n color: \"red\",\n id: \"not-implemented\"\n });\n}\nfunction permissionDenied() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"JUwB5j\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"3WjGlZ\"\n }\n ),\n color: \"red\"\n });\n}\nfunction invalidResponse(returnCode) {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"J7PX+R\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"78bD8l\",\n values: {\n returnCode\n }\n }\n ),\n color: \"red\"\n });\n}\nfunction showTimeoutNotification() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"xY9s5E\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"g/KPkG\"\n }\n ),\n color: \"red\"\n });\n}\nexport {\n invalidResponse,\n notYetImplemented,\n permissionDenied,\n showTimeoutNotification\n};\n//# sourceMappingURL=Notification.js.map\n","var jsxRuntime = { exports: {} };\nexport {\n jsxRuntime as __module\n};\n//# sourceMappingURL=jsx-runtime2.js.map\n","var reactJsxRuntime_production = {};\nexport {\n reactJsxRuntime_production as __exports\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __exports as reactJsxRuntime_production } from \"../../../_virtual/react-jsx-runtime.production.js\";\nvar hasRequiredReactJsxRuntime_production;\nfunction requireReactJsxRuntime_production() {\n if (hasRequiredReactJsxRuntime_production) return reactJsxRuntime_production;\n hasRequiredReactJsxRuntime_production = 1;\n var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.transitional.element\"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.fragment\");\n function jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type,\n key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n }\n reactJsxRuntime_production.Fragment = REACT_FRAGMENT_TYPE;\n reactJsxRuntime_production.jsx = jsxProd;\n reactJsxRuntime_production.jsxs = jsxProd;\n return reactJsxRuntime_production;\n}\nexport {\n requireReactJsxRuntime_production as __require\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __module as jsxRuntime } from \"../../_virtual/jsx-runtime2.js\";\nimport { __require as requireReactJsxRuntime_production } from \"./cjs/react-jsx-runtime.production.js\";\nvar hasRequiredJsxRuntime;\nfunction requireJsxRuntime() {\n if (hasRequiredJsxRuntime) return jsxRuntime.exports;\n hasRequiredJsxRuntime = 1;\n {\n jsxRuntime.exports = requireReactJsxRuntime_production();\n }\n return jsxRuntime.exports;\n}\nexport {\n requireJsxRuntime as __require\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { __require as requireJsxRuntime } from \"../node_modules/react/jsx-runtime.js\";\nvar jsxRuntimeExports = requireJsxRuntime();\nexport {\n jsxRuntimeExports as j\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { identifierString } from \"../functions/Conversion.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Group = window[\"MantineCore\"].Group;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ActionButton(props) {\n const hidden = props.hidden ?? false;\n return !hidden && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { disabled: !props.tooltip && !props.text, label: props.tooltip ?? props.text, position: props.tooltipAlignment ?? \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { disabled: props.disabled, p: 17, radius: props.radius ?? \"xs\", color: props.color, size: props.size, \"aria-label\": `action-button-${identifierString(props.tooltip ?? props.text ?? \"\")}`, onClick: (event) => {\n props.onClick(event);\n }, variant: props.variant ?? \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Group, { gap: \"xs\", wrap: \"nowrap\", children: props.icon }) }, `action-icon-${props.tooltip ?? props.text}`) }, `tooltip-${props.tooltip ?? props.text}`);\n}\nexport {\n ActionButton\n};\n//# sourceMappingURL=ActionButton.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","const objectToString = Object.prototype.toString;\nfunction isError(wat) {\n switch (objectToString.call(wat)) {\n case \"[object Error]\":\n case \"[object Exception]\":\n case \"[object DOMException]\":\n case \"[object WebAssembly.Exception]\":\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\nfunction isBuiltin(wat, className) {\n return objectToString.call(wat) === `[object ${className}]`;\n}\nfunction isPlainObject(wat) {\n return isBuiltin(wat, \"Object\");\n}\nfunction isThenable(wat) {\n return Boolean(wat?.then && typeof wat.then === \"function\");\n}\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch {\n return false;\n }\n}\nexport {\n isError,\n isInstanceOf,\n isPlainObject,\n isThenable\n};\n//# sourceMappingURL=is.js.map\n","const SDK_VERSION = \"10.70.0\";\nexport {\n SDK_VERSION\n};\n//# sourceMappingURL=version.js.map\n","const GLOBAL_OBJ = globalThis;\nexport {\n GLOBAL_OBJ\n};\n//# sourceMappingURL=worldwide.js.map\n","import { SDK_VERSION } from \"./utils/version.js\";\nimport { GLOBAL_OBJ } from \"./utils/worldwide.js\";\nfunction getMainCarrier() {\n getSentryCarrier(GLOBAL_OBJ);\n return GLOBAL_OBJ;\n}\nfunction getSentryCarrier(carrier) {\n const __SENTRY__ = carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n return __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n}\nfunction getGlobalSingleton(name, creator, obj = GLOBAL_OBJ) {\n const __SENTRY__ = obj.__SENTRY__ = obj.__SENTRY__ || {};\n const carrier = __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n return carrier[name] || (carrier[name] = creator());\n}\nexport {\n getGlobalSingleton,\n getMainCarrier,\n getSentryCarrier\n};\n//# sourceMappingURL=carrier.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nlet RESOLVED_RUNNER;\nfunction withRandomSafeContext(cb) {\n if (RESOLVED_RUNNER !== void 0) {\n return RESOLVED_RUNNER ? RESOLVED_RUNNER(cb) : cb();\n }\n const sym = /* @__PURE__ */ Symbol.for(\"__SENTRY_SAFE_RANDOM_ID_WRAPPER__\");\n const globalWithSymbol = GLOBAL_OBJ;\n if (sym in globalWithSymbol && typeof globalWithSymbol[sym] === \"function\") {\n RESOLVED_RUNNER = globalWithSymbol[sym];\n return RESOLVED_RUNNER(cb);\n }\n RESOLVED_RUNNER = null;\n return cb();\n}\nfunction safeMathRandom() {\n return withRandomSafeContext(() => Math.random());\n}\nfunction safeDateNow() {\n return withRandomSafeContext(() => Date.now());\n}\nexport {\n safeDateNow,\n safeMathRandom,\n withRandomSafeContext\n};\n//# sourceMappingURL=randomSafeContext.js.map\n","import { withRandomSafeContext, safeMathRandom } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction getCrypto() {\n const gbl = GLOBAL_OBJ;\n return gbl.crypto || gbl.msCrypto;\n}\nlet emptyUuid;\nfunction getRandomByte() {\n return safeMathRandom() * 16;\n}\nfunction uuid4(crypto = getCrypto()) {\n try {\n if (crypto?.randomUUID) {\n return withRandomSafeContext(() => crypto.randomUUID()).replace(/-/g, \"\");\n }\n } catch {\n }\n if (!emptyUuid) {\n emptyUuid = \"10000000100040008000\" + 1e11;\n }\n return emptyUuid.replace(\n /[018]/g,\n (c) => (\n // eslint-disable-next-line no-bitwise\n (c ^ (getRandomByte() & 15) >> c / 4).toString(16)\n )\n );\n}\nexport {\n uuid4\n};\n//# sourceMappingURL=misc.js.map\n","import { safeDateNow, withRandomSafeContext } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst ONE_SECOND_IN_MS = 1e3;\nfunction dateTimestampInSeconds() {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\nfunction createUnixTimestampInSecondsFunc() {\n const { performance } = GLOBAL_OBJ;\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n const timeOrigin = performance.timeOrigin;\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\nlet _cachedTimestampInSeconds;\nfunction timestampInSeconds() {\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\nexport {\n dateTimestampInSeconds,\n timestampInSeconds\n};\n//# sourceMappingURL=time.js.map\n","import { uuid4 } from \"./utils/misc.js\";\nimport { timestampInSeconds } from \"./utils/time.js\";\nfunction updateSession(session, context = {}) {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n session.timestamp = context.timestamp || timestampInSeconds();\n if (context.abnormal_mechanism) {\n session.abnormal_mechanism = context.abnormal_mechanism;\n }\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== void 0) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === \"number\") {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = void 0;\n } else if (typeof context.duration === \"number\") {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === \"number\") {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\nexport {\n updateSession\n};\n//# sourceMappingURL=session.js.map\n","import { getGlobalSingleton } from \"../carrier.js\";\nimport { DEBUG_BUILD } from \"../debug-build.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst PREFIX = \"Sentry Logger \";\nconst originalConsoleMethods = {};\nfunction consoleSandbox(callback) {\n if (!(\"console\" in GLOBAL_OBJ)) {\n return callback();\n }\n const console = GLOBAL_OBJ.console;\n const wrappedFuncs = {};\n const wrappedLevels = Object.keys(originalConsoleMethods);\n wrappedLevels.forEach((level) => {\n const originalConsoleMethod = originalConsoleMethods[level];\n wrappedFuncs[level] = console[level];\n console[level] = originalConsoleMethod;\n });\n try {\n return callback();\n } finally {\n wrappedLevels.forEach((level) => {\n console[level] = wrappedFuncs[level];\n });\n }\n}\nfunction enable() {\n _getLoggerSettings().enabled = true;\n}\nfunction disable() {\n _getLoggerSettings().enabled = false;\n}\nfunction isEnabled() {\n return _getLoggerSettings().enabled;\n}\nfunction log(...args) {\n _maybeLog(\"log\", ...args);\n}\nfunction warn(...args) {\n _maybeLog(\"warn\", ...args);\n}\nfunction error(...args) {\n _maybeLog(\"error\", ...args);\n}\nfunction _maybeLog(level, ...args) {\n if (!DEBUG_BUILD) {\n return;\n }\n if (isEnabled()) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[level](`${PREFIX}[${level}]:`, ...args);\n });\n }\n}\nfunction _getLoggerSettings() {\n if (!DEBUG_BUILD) {\n return { enabled: false };\n }\n return getGlobalSingleton(\"loggerSettings\", () => ({ enabled: false }));\n}\nconst debug = {\n /** Enable logging. */\n enable,\n /** Disable logging. */\n disable,\n /** Check if logging is enabled. */\n isEnabled,\n /** Log a message. */\n log,\n /** Log a warning. */\n warn,\n /** Log an error. */\n error\n};\nexport {\n consoleSandbox,\n debug,\n originalConsoleMethods\n};\n//# sourceMappingURL=debug-logger.js.map\n","function merge(initialObj, mergeObj, levels = 2) {\n if (!mergeObj || typeof mergeObj !== \"object\" || levels <= 0) {\n return mergeObj;\n }\n if (initialObj && Object.keys(mergeObj).length === 0) {\n return initialObj;\n }\n const output = { ...initialObj };\n for (const key in mergeObj) {\n if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n output[key] = merge(output[key], mergeObj[key], levels - 1);\n }\n }\n return output;\n}\nexport {\n merge\n};\n//# sourceMappingURL=merge.js.map\n","import { uuid4 } from \"./misc.js\";\nfunction generateTraceId() {\n return uuid4();\n}\nexport {\n generateTraceId\n};\n//# sourceMappingURL=propagationContext.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { debug } from \"./debug-logger.js\";\nfunction addNonEnumerableProperty(obj, name, value) {\n try {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value,\n writable: true,\n configurable: true\n });\n } catch {\n DEBUG_BUILD && debug.log(`Failed to add non-enumerable property \"${String(name)}\" to object`, obj);\n }\n}\nexport {\n addNonEnumerableProperty\n};\n//# sourceMappingURL=object.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction makeWeakRef(value) {\n try {\n const WeakRefImpl = GLOBAL_OBJ.WeakRef;\n if (typeof WeakRefImpl === \"function\") {\n return new WeakRefImpl(value);\n }\n } catch {\n }\n return value;\n}\nfunction derefWeakRef(ref) {\n if (!ref) {\n return void 0;\n }\n if (typeof ref === \"object\" && \"deref\" in ref && typeof ref.deref === \"function\") {\n try {\n return ref.deref();\n } catch {\n return void 0;\n }\n }\n return ref;\n}\nexport {\n derefWeakRef,\n makeWeakRef\n};\n//# sourceMappingURL=weakRef.js.map\n","import { addNonEnumerableProperty } from \"./object.js\";\nimport { makeWeakRef, derefWeakRef } from \"./weakRef.js\";\nconst SCOPE_SPAN_FIELD = \"_sentrySpan\";\nfunction _setSpanForScope(scope, span) {\n if (span) {\n addNonEnumerableProperty(scope, SCOPE_SPAN_FIELD, makeWeakRef(span));\n } else {\n delete scope[SCOPE_SPAN_FIELD];\n }\n}\nfunction _getSpanForScope(scope) {\n return derefWeakRef(scope[SCOPE_SPAN_FIELD]);\n}\nexport {\n _getSpanForScope,\n _setSpanForScope\n};\n//# sourceMappingURL=spanOnScope.js.map\n","function truncate(str, max = 0) {\n if (typeof str !== \"string\" || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nexport {\n truncate\n};\n//# sourceMappingURL=string.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { updateSession } from \"./session.js\";\nimport { debug } from \"./utils/debug-logger.js\";\nimport { isPlainObject } from \"./utils/is.js\";\nimport { merge } from \"./utils/merge.js\";\nimport { uuid4 } from \"./utils/misc.js\";\nimport { generateTraceId } from \"./utils/propagationContext.js\";\nimport { safeMathRandom } from \"./utils/randomSafeContext.js\";\nimport { _setSpanForScope, _getSpanForScope } from \"./utils/spanOnScope.js\";\nimport { truncate } from \"./utils/string.js\";\nimport { dateTimestampInSeconds } from \"./utils/time.js\";\nconst DEFAULT_MAX_BREADCRUMBS = 100;\nclass Scope {\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n this._propagationContext = {\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n };\n }\n /**\n * Clone all data from this scope into a new scope.\n */\n clone() {\n const newScope = new Scope();\n newScope._breadcrumbs = [...this._breadcrumbs];\n newScope._tags = { ...this._tags };\n newScope._attributes = { ...this._attributes };\n newScope._extra = { ...this._extra };\n newScope._contexts = { ...this._contexts };\n if (this._contexts.flags) {\n newScope._contexts.flags = {\n values: [...this._contexts.flags.values]\n };\n }\n newScope._user = this._user;\n newScope._level = this._level;\n newScope._session = this._session;\n newScope._transactionName = this._transactionName;\n newScope._fingerprint = this._fingerprint;\n newScope._eventProcessors = [...this._eventProcessors];\n newScope._attachments = [...this._attachments];\n newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n newScope._propagationContext = { ...this._propagationContext };\n newScope._client = this._client;\n newScope._lastEventId = this._lastEventId;\n newScope._conversationId = this._conversationId;\n _setSpanForScope(newScope, _getSpanForScope(this));\n return newScope;\n }\n /**\n * Update the client assigned to this scope.\n * Note that not every scope will have a client assigned - isolation scopes & the global scope will generally not have a client,\n * as well as manually created scopes.\n */\n setClient(client) {\n this._client = client;\n }\n /**\n * Set the ID of the last captured error event.\n * This is generally only captured on the isolation scope.\n */\n setLastEventId(lastEventId) {\n this._lastEventId = lastEventId;\n }\n /**\n * Get the client assigned to this scope.\n */\n getClient() {\n return this._client;\n }\n /**\n * Get the ID of the last captured error event.\n * This is generally only available on the isolation scope.\n */\n lastEventId() {\n return this._lastEventId;\n }\n /**\n * @inheritDoc\n */\n addScopeListener(callback) {\n this._scopeListeners.push(callback);\n }\n /**\n * Add an event processor that will be called before an event is sent.\n */\n addEventProcessor(callback) {\n this._eventProcessors.push(callback);\n return this;\n }\n /**\n * Set the user for this scope.\n * Set to `null` to unset the user.\n */\n setUser(user) {\n this._user = user || {\n email: void 0,\n id: void 0,\n ip_address: void 0,\n username: void 0\n };\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the user from this scope.\n */\n getUser() {\n return this._user;\n }\n /**\n * Set the conversation ID for this scope.\n * Set to `null` to unset the conversation ID.\n */\n setConversationId(conversationId) {\n this._conversationId = conversationId || void 0;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set an object that will be merged into existing tags on the scope,\n * and will be sent as tags data with the event.\n */\n setTags(tags) {\n this._tags = {\n ...this._tags,\n ...tags\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single tag that will be sent as tags data with the event.\n */\n setTag(key, value) {\n return this.setTags({ [key]: value });\n }\n /**\n * Sets attributes onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param newAttributes - The attributes to set on the scope, as key-value pairs.\n *\n * @example\n * ```typescript\n * scope.setAttributes({\n * is_admin: true,\n * payment_selection: 'credit_card',\n * render_duration: 150,\n * });\n * ```\n */\n setAttributes(newAttributes) {\n this._attributes = {\n ...this._attributes,\n ...newAttributes\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets an attribute onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param key - The attribute key.\n * @param value - The attribute value.\n *\n * @example\n * ```typescript\n * scope.setAttribute('is_admin', true);\n * scope.setAttribute('render_duration', 150);\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAttribute(key, value) {\n return this.setAttributes({ [key]: value });\n }\n /**\n * Removes the attribute with the given key from the scope.\n *\n * @param key - The attribute key.\n *\n * @example\n * ```typescript\n * scope.removeAttribute('is_admin');\n * ```\n */\n removeAttribute(key) {\n if (key in this._attributes) {\n delete this._attributes[key];\n this._notifyScopeListeners();\n }\n return this;\n }\n /**\n * Set an object that will be merged into existing extra on the scope,\n * and will be sent as extra data with the event.\n */\n setExtras(extras) {\n this._extra = {\n ...this._extra,\n ...extras\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single key:value extra entry that will be sent as extra data with the event.\n */\n setExtra(key, extra) {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the fingerprint on the scope to send with the events.\n * @param {string[]} fingerprint Fingerprint to group events in Sentry.\n */\n setFingerprint(fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the level on the scope for future events.\n */\n setLevel(level) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the transaction name on the scope so that the name of e.g. taken server route or\n * the page location is attached to future events.\n *\n * IMPORTANT: Calling this function does NOT change the name of the currently active\n * root span. If you want to change the name of the active root span, use\n * `Sentry.updateSpanName(rootSpan, 'new name')` instead.\n *\n * By default, the SDK updates the scope's transaction name automatically on sensible\n * occasions, such as a page navigation or when handling a new request on the server.\n */\n setTransactionName(name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets context data with the given name.\n * Data passed as context will be normalized. You can also pass `null` to unset the context.\n * Note that context data will not be merged - calling `setContext` will overwrite an existing context with the same key.\n */\n setContext(key, context) {\n if (context === null) {\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set the session for the scope.\n */\n setSession(session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the session from the scope.\n */\n getSession() {\n return this._session;\n }\n /**\n * Updates the scope with provided data. Can work in three variations:\n * - plain object containing updatable attributes\n * - Scope instance that'll extract the attributes from\n * - callback function that'll receive the current scope as an argument and allow for modifications\n */\n update(captureContext) {\n if (!captureContext) {\n return this;\n }\n const scopeToMerge = typeof captureContext === \"function\" ? captureContext(this) : captureContext;\n const scopeInstance = scopeToMerge instanceof Scope ? scopeToMerge.getScopeData() : isPlainObject(scopeToMerge) ? captureContext : void 0;\n const {\n tags,\n attributes,\n extra,\n user,\n contexts,\n level,\n fingerprint = [],\n propagationContext,\n conversationId\n } = scopeInstance || {};\n this._tags = { ...this._tags, ...tags };\n this._attributes = { ...this._attributes, ...attributes };\n this._extra = { ...this._extra, ...extra };\n this._contexts = { ...this._contexts, ...contexts };\n if (user && Object.keys(user).length) {\n this._user = user;\n }\n if (level) {\n this._level = level;\n }\n if (fingerprint.length) {\n this._fingerprint = fingerprint;\n }\n if (propagationContext) {\n this._propagationContext = propagationContext;\n }\n if (conversationId) {\n this._conversationId = conversationId;\n }\n return this;\n }\n /**\n * Clears the current scope and resets its properties.\n * Note: The client will not be cleared.\n */\n clear() {\n this._breadcrumbs = [];\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = void 0;\n this._transactionName = void 0;\n this._fingerprint = void 0;\n this._session = void 0;\n this._conversationId = void 0;\n _setSpanForScope(this, void 0);\n this._attachments = [];\n this.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n });\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Adds a breadcrumb to the scope.\n * By default, the last 100 breadcrumbs are kept.\n */\n addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n const maxCrumbs = typeof maxBreadcrumbs === \"number\" ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n if (maxCrumbs <= 0) {\n return this;\n }\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n // Breadcrumb messages can theoretically be infinitely large and they're held in memory so we truncate them not to leak (too much) memory\n message: breadcrumb.message ? truncate(breadcrumb.message, 2048) : breadcrumb.message\n };\n this._breadcrumbs.push(mergedBreadcrumb);\n if (this._breadcrumbs.length > maxCrumbs) {\n this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs);\n this._client?.recordDroppedEvent(\"buffer_overflow\", \"log_item\");\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the last breadcrumb of the scope.\n */\n getLastBreadcrumb() {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n /**\n * Clear all breadcrumbs from the scope.\n */\n clearBreadcrumbs() {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Add an attachment to the scope.\n */\n addAttachment(attachment) {\n this._attachments.push(attachment);\n return this;\n }\n /**\n * Clear all attachments from the scope.\n */\n clearAttachments() {\n this._attachments = [];\n return this;\n }\n /**\n * Get the data of this scope, which should be applied to an event during processing.\n */\n getScopeData() {\n return {\n breadcrumbs: this._breadcrumbs,\n attachments: this._attachments,\n contexts: this._contexts,\n tags: this._tags,\n attributes: this._attributes,\n extra: this._extra,\n user: this._user,\n level: this._level,\n fingerprint: this._fingerprint || [],\n eventProcessors: this._eventProcessors,\n propagationContext: this._propagationContext,\n sdkProcessingMetadata: this._sdkProcessingMetadata,\n transactionName: this._transactionName,\n span: _getSpanForScope(this),\n conversationId: this._conversationId\n };\n }\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry.\n */\n setSDKProcessingMetadata(newData) {\n this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n return this;\n }\n /**\n * Add propagation context to the scope, used for distributed tracing\n */\n setPropagationContext(context) {\n this._propagationContext = context;\n return this;\n }\n /**\n * Get propagation context from the scope, used for distributed tracing\n */\n getPropagationContext() {\n return this._propagationContext;\n }\n /**\n * Capture an exception for this scope.\n *\n * @returns {string} The id of the captured Sentry event.\n */\n captureException(exception, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture exception!\");\n return eventId;\n }\n const syntheticException = new Error(\"Sentry syntheticException\");\n this._client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a message for this scope.\n *\n * @returns {string} The id of the captured message.\n */\n captureMessage(message, level, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture message!\");\n return eventId;\n }\n const syntheticException = hint?.syntheticException ?? new Error(message);\n this._client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a Sentry event for this scope.\n *\n * @returns {string} The id of the captured event.\n */\n captureEvent(event, hint) {\n const eventId = event.event_id || hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture event!\");\n return eventId;\n }\n this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n return eventId;\n }\n /**\n * This will be called on every set call.\n */\n _notifyScopeListeners() {\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach((callback) => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n}\nexport {\n Scope\n};\n//# sourceMappingURL=scope.js.map\n","import { getGlobalSingleton } from \"./carrier.js\";\nimport { Scope } from \"./scope.js\";\nfunction getDefaultCurrentScope() {\n return getGlobalSingleton(\"defaultCurrentScope\", () => new Scope());\n}\nfunction getDefaultIsolationScope() {\n return getGlobalSingleton(\"defaultIsolationScope\", () => new Scope());\n}\nexport {\n getDefaultCurrentScope,\n getDefaultIsolationScope\n};\n//# sourceMappingURL=defaultScopes.js.map\n","const isActualPromise = (p) => p instanceof Promise && !p[kChainedCopy];\nconst kChainedCopy = /* @__PURE__ */ Symbol(\"chained PromiseLike\");\nconst chainAndCopyPromiseLike = (original, onSuccess, onError) => {\n const chained = original.then(\n (value) => {\n onSuccess(value);\n return value;\n },\n (err) => {\n onError(err);\n throw err;\n }\n );\n return isActualPromise(chained) && isActualPromise(original) ? chained : copyProps(original, chained);\n};\nconst copyProps = (original, chained) => {\n if (!chained) return original;\n let mutated = false;\n for (const key in original) {\n if (key in chained) continue;\n mutated = true;\n const value = original[key];\n if (typeof value === \"function\") {\n Object.defineProperty(chained, key, {\n value: (...args) => value.apply(original, args),\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n chained[key] = value;\n }\n }\n if (mutated) Object.assign(chained, { [kChainedCopy]: true });\n return chained;\n};\nexport {\n chainAndCopyPromiseLike\n};\n//# sourceMappingURL=chain-and-copy-promiselike.js.map\n","import { getDefaultCurrentScope, getDefaultIsolationScope } from \"../defaultScopes.js\";\nimport { Scope } from \"../scope.js\";\nimport { chainAndCopyPromiseLike } from \"../utils/chain-and-copy-promiselike.js\";\nimport { isThenable } from \"../utils/is.js\";\nimport { getMainCarrier, getSentryCarrier } from \"../carrier.js\";\nclass AsyncContextStack {\n constructor(scope, isolationScope) {\n let assignedScope;\n if (!scope) {\n assignedScope = new Scope();\n } else {\n assignedScope = scope;\n }\n let assignedIsolationScope;\n if (!isolationScope) {\n assignedIsolationScope = new Scope();\n } else {\n assignedIsolationScope = isolationScope;\n }\n this._stack = [{ scope: assignedScope }];\n this._isolationScope = assignedIsolationScope;\n }\n /**\n * Fork a scope for the stack.\n */\n withScope(callback) {\n const scope = this._pushScope();\n let maybePromiseResult;\n try {\n maybePromiseResult = callback(scope);\n } catch (e) {\n this._popScope();\n throw e;\n }\n if (isThenable(maybePromiseResult)) {\n return chainAndCopyPromiseLike(\n maybePromiseResult,\n () => this._popScope(),\n () => this._popScope()\n );\n }\n this._popScope();\n return maybePromiseResult;\n }\n /**\n * Get the client of the stack.\n */\n getClient() {\n return this.getStackTop().client;\n }\n /**\n * Returns the scope of the top stack.\n */\n getScope() {\n return this.getStackTop().scope;\n }\n /**\n * Get the isolation scope for the stack.\n */\n getIsolationScope() {\n return this._isolationScope;\n }\n /**\n * Returns the topmost scope layer in the order domain > local > process.\n */\n getStackTop() {\n return this._stack[this._stack.length - 1];\n }\n /**\n * Push a scope to the stack.\n */\n _pushScope() {\n const scope = this.getScope().clone();\n this._stack.push({\n client: this.getClient(),\n scope\n });\n return scope;\n }\n /**\n * Pop a scope from the stack.\n */\n _popScope() {\n if (this._stack.length <= 1) return false;\n return !!this._stack.pop();\n }\n}\nfunction getAsyncContextStack() {\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n return sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope());\n}\nfunction withScope(callback) {\n return getAsyncContextStack().withScope(callback);\n}\nfunction withSetScope(scope, callback) {\n const stack = getAsyncContextStack();\n return stack.withScope(() => {\n stack.getStackTop().scope = scope;\n return callback(scope);\n });\n}\nfunction withIsolationScope(callback) {\n return getAsyncContextStack().withScope(() => {\n return callback(getAsyncContextStack().getIsolationScope());\n });\n}\nfunction getStackAsyncContextStrategy() {\n return {\n withIsolationScope,\n withScope,\n withSetScope,\n withSetIsolationScope: (_isolationScope, callback) => {\n return withIsolationScope(callback);\n },\n getCurrentScope: () => getAsyncContextStack().getScope(),\n getIsolationScope: () => getAsyncContextStack().getIsolationScope()\n };\n}\nexport {\n AsyncContextStack,\n getStackAsyncContextStrategy\n};\n//# sourceMappingURL=stackStrategy.js.map\n","import { getSentryCarrier } from \"../carrier.js\";\nimport { getStackAsyncContextStrategy } from \"./stackStrategy.js\";\nfunction getAsyncContextStrategy(carrier) {\n const sentry = getSentryCarrier(carrier);\n if (sentry.acs) {\n return sentry.acs;\n }\n return getStackAsyncContextStrategy();\n}\nexport {\n getAsyncContextStrategy\n};\n//# sourceMappingURL=index.js.map\n","import { getAsyncContextStrategy } from \"./asyncContext/index.js\";\nimport { getMainCarrier } from \"./carrier.js\";\nfunction getCurrentScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getCurrentScope();\n}\nfunction getIsolationScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getIsolationScope();\n}\nfunction withScope(...rest) {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (rest.length === 2) {\n const [scope, callback] = rest;\n if (!scope) {\n return acs.withScope(callback);\n }\n return acs.withSetScope(scope, callback);\n }\n return acs.withScope(rest[0]);\n}\nfunction getClient() {\n return getCurrentScope().getClient();\n}\nexport {\n getClient,\n getCurrentScope,\n getIsolationScope,\n withScope\n};\n//# sourceMappingURL=currentScopes.js.map\n","import { Scope } from \"../scope.js\";\nfunction parseEventHintOrCaptureContext(hint) {\n if (!hint) {\n return void 0;\n }\n if (hintIsScopeOrFunction(hint)) {\n return { captureContext: hint };\n }\n if (hintIsScopeContext(hint)) {\n return {\n captureContext: hint\n };\n }\n return hint;\n}\nfunction hintIsScopeOrFunction(hint) {\n return hint instanceof Scope || typeof hint === \"function\";\n}\nconst captureContextKeys = [\n \"user\",\n \"level\",\n \"extra\",\n \"contexts\",\n \"tags\",\n \"fingerprint\",\n \"propagationContext\"\n];\nfunction hintIsScopeContext(hint) {\n return Object.keys(hint).some((key) => captureContextKeys.includes(key));\n}\nexport {\n parseEventHintOrCaptureContext\n};\n//# sourceMappingURL=prepareEvent.js.map\n","import { getIsolationScope, getCurrentScope } from \"./currentScopes.js\";\nimport { parseEventHintOrCaptureContext } from \"./utils/prepareEvent.js\";\nfunction captureException(exception, hint) {\n return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\nfunction lastEventId() {\n return getIsolationScope().lastEventId();\n}\nexport {\n captureException,\n lastEventId\n};\n//# sourceMappingURL=exports.js.map\n","import { isError } from \"../../../core/build/esm/utils/is.js\";\nimport { captureException } from \"../../../core/build/esm/exports.js\";\nconst version = window[\"React\"].version;\nfunction isAtLeastReact17(reactVersion) {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\nfunction setCause(error, cause) {\n const seenErrors = /* @__PURE__ */ new WeakSet();\n function recurse(error2, cause2) {\n if (seenErrors.has(error2)) {\n return;\n }\n if (error2.cause) {\n seenErrors.add(error2);\n return recurse(error2.cause, cause2);\n }\n error2.cause = cause2;\n }\n recurse(error, cause);\n}\nfunction captureReactException(error, { componentStack }, hint) {\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n setCause(error, errorBoundaryError);\n }\n return captureException(error, hint);\n}\nexport {\n captureReactException,\n isAtLeastReact17,\n setCause\n};\n//# sourceMappingURL=error.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"../../../../../core/build/esm/utils/worldwide.js\";\nconst WINDOW = GLOBAL_OBJ;\nexport {\n WINDOW\n};\n//# sourceMappingURL=helpers.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { consoleSandbox, debug } from \"./debug-logger.js\";\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)((?:\\[[:.%\\w]+\\]|[\\w.-]+))(?::(\\d+))?\\/(.+)/;\nfunction isValidProtocol(protocol) {\n return protocol === \"http\" || protocol === \"https\";\n}\nfunction dsnToString(dsn, withPassword = false) {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : \"\"}@${host}${port ? `:${port}` : \"\"}/${path ? `${path}/` : path}${projectId}`;\n}\nfunction dsnFromString(str) {\n const match = DSN_REGEX.exec(str);\n if (!match) {\n consoleSandbox(() => {\n console.error(`Invalid Sentry Dsn: ${str}`);\n });\n return void 0;\n }\n const [protocol, publicKey, pass = \"\", host = \"\", port = \"\", lastPath = \"\"] = match.slice(1);\n let path = \"\";\n let projectId = lastPath;\n const split = projectId.split(\"/\");\n if (split.length > 1) {\n path = split.slice(0, -1).join(\"/\");\n projectId = split.pop();\n }\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n return dsnFromComponents({ host, pass, path, projectId, port, protocol, publicKey });\n}\nfunction dsnFromComponents(components) {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || \"\",\n pass: components.pass || \"\",\n host: components.host,\n port: components.port || \"\",\n path: components.path || \"\",\n projectId: components.projectId\n };\n}\nfunction validateDsn(dsn) {\n if (!DEBUG_BUILD) {\n return true;\n }\n const { port, projectId, protocol } = dsn;\n const requiredComponents = [\"protocol\", \"publicKey\", \"host\", \"projectId\"];\n const hasMissingRequiredComponent = requiredComponents.find((component) => {\n if (!dsn[component]) {\n debug.error(`Invalid Sentry Dsn: ${component} missing`);\n return true;\n }\n return false;\n });\n if (hasMissingRequiredComponent) {\n return false;\n }\n if (!projectId.match(/^\\d+$/)) {\n debug.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n return false;\n }\n if (!isValidProtocol(protocol)) {\n debug.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n return false;\n }\n if (port && isNaN(parseInt(port, 10))) {\n debug.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n return false;\n }\n return true;\n}\nfunction makeDsn(from) {\n const components = typeof from === \"string\" ? dsnFromString(from) : dsnFromComponents(from);\n if (!components || !validateDsn(components)) {\n return void 0;\n }\n return components;\n}\nexport {\n dsnFromString,\n dsnToString,\n makeDsn\n};\n//# sourceMappingURL=dsn.js.map\n","import { makeDsn, dsnToString } from \"./utils/dsn.js\";\nfunction getBaseApiEndpoint(dsn) {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : \"\";\n const port = dsn.port ? `:${dsn.port}` : \"\";\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : \"\"}/api/`;\n}\nfunction getReportDialogEndpoint(dsnLike, dialogOptions) {\n const dsn = makeDsn(dsnLike);\n if (!dsn) {\n return \"\";\n }\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === \"dsn\") {\n continue;\n }\n if (key === \"onClose\") {\n continue;\n }\n if (key === \"user\") {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key])}`;\n }\n }\n return `${endpoint}?${encodedOptions}`;\n}\nexport {\n getReportDialogEndpoint\n};\n//# sourceMappingURL=api.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { WINDOW } from \"./helpers.js\";\nimport { debug } from \"../../../../../core/build/esm/utils/debug-logger.js\";\nimport { getCurrentScope, getClient } from \"../../../../../core/build/esm/currentScopes.js\";\nimport { lastEventId } from \"../../../../../core/build/esm/exports.js\";\nimport { getReportDialogEndpoint } from \"../../../../../core/build/esm/api.js\";\nfunction showReportDialog(options = {}) {\n const optionalDocument = WINDOW.document;\n const injectionPoint = optionalDocument?.head || optionalDocument?.body;\n if (!injectionPoint) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] Global document not defined\");\n return;\n }\n const scope = getCurrentScope();\n const client = getClient();\n const dsn = client?.getDsn();\n if (!dsn) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] DSN not configured\");\n return;\n }\n const mergedOptions = {\n ...options,\n user: {\n ...scope.getUser(),\n ...options.user\n },\n eventId: options.eventId || lastEventId()\n };\n const script = WINDOW.document.createElement(\"script\");\n script.async = true;\n script.crossOrigin = \"anonymous\";\n script.src = getReportDialogEndpoint(dsn, mergedOptions);\n const { onLoad, onClose } = mergedOptions;\n if (onLoad) {\n script.onload = onLoad;\n }\n if (onClose) {\n const reportDialogClosedMessageHandler = (event) => {\n if (event.data === \"__sentry_reportdialog_closed__\") {\n try {\n onClose();\n } finally {\n WINDOW.removeEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n }\n };\n WINDOW.addEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n injectionPoint.appendChild(script);\n}\nexport {\n showReportDialog\n};\n//# sourceMappingURL=report-dialog.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { captureReactException } from \"./error.js\";\nimport { getClient, withScope } from \"../../../core/build/esm/currentScopes.js\";\nimport { showReportDialog } from \"../../../browser/build/npm/esm/prod/report-dialog.js\";\nimport { debug } from \"../../../core/build/esm/utils/debug-logger.js\";\nconst React = window[\"React\"];\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null\n};\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on(\"afterSendEvent\", (event) => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n componentDidCatch(error, errorInfo) {\n const { componentStack } = errorInfo;\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope((scope) => {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled, type: \"auto.function.react.error_boundary\" }\n });\n if (onError) {\n onError(error, componentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n this.setState({ error, componentStack, eventId });\n });\n }\n componentDidMount() {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n componentWillUnmount() {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n if (this.state === INITIAL_STATE) {\n onUnmount(null, null, null);\n } else {\n onUnmount(error, componentStack, eventId);\n }\n }\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = void 0;\n }\n }\n resetErrorBoundary() {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n onReset(error, componentStack, eventId);\n }\n this.setState(INITIAL_STATE);\n }\n render() {\n const { fallback, children } = this.props;\n const state = this.state;\n if (state.componentStack === null) {\n return typeof children === \"function\" ? children() : children;\n }\n const element = typeof fallback === \"function\" ? React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack,\n resetError: () => this.resetErrorBoundary(),\n eventId: state.eventId\n }) : fallback;\n if (React.isValidElement(element)) {\n return element;\n }\n if (fallback) {\n DEBUG_BUILD && debug.warn(\"fallback did not produce a valid ReactElement\");\n }\n return null;\n }\n}\nexport {\n ErrorBoundary\n};\n//# sourceMappingURL=errorboundary.js.map\n","var defaultAttributes = {\n outline: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n },\n filled: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n stroke: \"none\"\n }\n};\nexport {\n defaultAttributes as default\n};\n//# sourceMappingURL=defaultAttributes.js.map\n","import defaultAttributes from \"./defaultAttributes.js\";\nconst forwardRef = window[\"React\"].forwardRef;\nconst createElement = window[\"React\"].createElement;\nconst createReactComponent = (type, iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = \"currentColor\", size = 24, stroke = 2, title, className, children, ...rest }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(\" \"),\n ...{\n strokeWidth: stroke,\n stroke: color\n },\n ...rest\n },\n [\n title && createElement(\"title\", { key: \"svg-title\" }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n );\n Component.displayName = `${iconNamePascal}`;\n return Component;\n};\nexport {\n createReactComponent as default\n};\n//# sourceMappingURL=createReactComponent.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M12 16v.01\", \"key\": \"svg-2\" }]];\nconst IconExclamationCircle = createReactComponent(\"outline\", \"exclamation-circle\", \"ExclamationCircle\", __iconNode);\nexport {\n __iconNode,\n IconExclamationCircle as default\n};\n//# sourceMappingURL=IconExclamationCircle.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9h.01\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M11 12h1v4h1\", \"key\": \"svg-2\" }]];\nconst IconInfoCircle = createReactComponent(\"outline\", \"info-circle\", \"InfoCircle\", __iconNode);\nexport {\n __iconNode,\n IconInfoCircle as default\n};\n//# sourceMappingURL=IconInfoCircle.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { ErrorBoundary } from \"../node_modules/@sentry/react/build/esm/errorboundary.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconInfoCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Alert = window[\"MantineCore\"].Alert;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useState = window[\"React\"].useState;\nfunction DefaultFallback({\n title,\n error\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}), title: `INVE-E17: ${_i18n._(\n /*i18n*/\n {\n id: \"qwCNwv\"\n }\n )}: ${title}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"iqWQW8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"pz0nW1\"\n }\n ) })\n ] }) }),\n error && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconInfoCircle, {}), title: _i18n._(\n /*i18n*/\n {\n id: \"7Jw/XW\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: error }) })\n ] });\n}\nfunction Boundary({\n children,\n label,\n fallback\n}) {\n const [errorMessage, setErrorMessage] = useState(null);\n const onError = useCallback((error, componentStack, eventId) => {\n console.error(`ERR: Error rendering component: ${label}`);\n console.error(error);\n setErrorMessage(error instanceof Error ? error.message : String(error));\n }, []);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { fallback: fallback ?? /* @__PURE__ */ jsxRuntimeExports.jsx(DefaultFallback, { title: label, error: errorMessage }), onError, children });\n}\nexport {\n Boundary,\n DefaultFallback\n};\n//# sourceMappingURL=Boundary.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ButtonMenu({\n icon,\n actions,\n tooltip = \"\",\n label = \"\"\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"default\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: tooltip, children: icon }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { children: [\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: label }),\n actions.map((action, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: action }, `${i}-${action}`))\n ] })\n ] });\n}\nexport {\n ButtonMenu\n};\n//# sourceMappingURL=ButtonMenu.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l5 5l10 -10\", \"key\": \"svg-0\" }]];\nconst IconCheck = createReactComponent(\"outline\", \"check\", \"Check\", __iconNode);\nexport {\n __iconNode,\n IconCheck as default\n};\n//# sourceMappingURL=IconCheck.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1\", \"key\": \"svg-1\" }]];\nconst IconCopy = createReactComponent(\"outline\", \"copy\", \"Copy\", __iconNode);\nexport {\n __iconNode,\n IconCopy as default\n};\n//# sourceMappingURL=IconCopy.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Button = window[\"MantineCore\"].Button;\nconst MantineCopyButton = window[\"MantineCore\"].CopyButton;\nconst Text = window[\"MantineCore\"].Text;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction CopyButton({\n value,\n label,\n tooltip,\n disabled,\n tooltipPosition,\n content,\n size,\n color = \"gray\",\n variant = \"transparent\"\n}) {\n const ButtonComponent = label ? Button : ActionIcon;\n if (!window.isSecureContext) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(MantineCopyButton, { value, children: ({\n copied,\n copy\n }) => /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: copied ? _i18n._(\n /*i18n*/\n {\n id: \"6V3Ea3\"\n }\n ) : tooltip ?? _i18n._(\n /*i18n*/\n {\n id: \"he3ygx\"\n }\n ), withArrow: true, position: tooltipPosition, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(ButtonComponent, { disabled, color: copied ? \"teal\" : color, onClick: (e) => {\n e.stopPropagation();\n e.preventDefault();\n copy();\n }, variant: copied ? \"transparent\" : variant ?? \"transparent\", size: size ?? \"sm\", children: [\n copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {}),\n content,\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { p: size ?? \"sm\", size: size ?? \"sm\", children: label })\n ] }) }) });\n}\nexport {\n CopyButton\n};\n//# sourceMappingURL=CopyButton.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { CopyButton } from \"./CopyButton.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst useState = window[\"React\"].useState;\nfunction CopyableCell({\n children,\n value\n}) {\n const [isHovered, setIsHovered] = useState(false);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: 0, p: 0, wrap: \"nowrap\", onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), justify: \"space-between\", align: \"center\", children: [\n children,\n window.isSecureContext && isHovered && value != null && /* @__PURE__ */ jsxRuntimeExports.jsx(\"span\", { style: {\n position: \"relative\"\n }, onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntimeExports.jsx(\"div\", { style: {\n position: \"absolute\",\n right: 0,\n transform: \"translateY(-50%)\"\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(CopyButton, { value, variant: \"default\" }) }) })\n ] });\n}\nexport {\n CopyableCell\n};\n//# sourceMappingURL=CopyableCell.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { formatDecimal } from \"../functions/Formatting.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst Progress = window[\"MantineCore\"].Progress;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useMemo = window[\"React\"].useMemo;\nfunction ProgressBar(props) {\n const progress = useMemo(() => {\n const maximum = props.maximum ?? 100;\n const value = Math.max(props.value, 0);\n if (maximum == 0) {\n return 0;\n }\n return value / maximum * 100;\n }, [props]);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: 2, style: {\n flexGrow: 1,\n minWidth: \"100px\"\n }, children: [\n props.progressLabel && /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", justify: \"center\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { ta: \"center\", size: \"xs\", children: [\n formatDecimal(props.value),\n \" / \",\n formatDecimal(props.maximum)\n ] }),\n props.units && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { size: \"xs\", children: [\n \"[\",\n props.units,\n \"]\"\n ] })\n ] }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Progress, { value: progress, color: progress < 100 ? \"orange\" : progress > 100 ? \"blue\" : \"green\", size: props.size ?? \"md\", radius: \"sm\", animated: props.animated })\n ] });\n}\nexport {\n ProgressBar\n};\n//# sourceMappingURL=ProgressBar.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { isTrue } from \"../functions/Conversion.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Badge = window[\"MantineCore\"].Badge;\nwindow[\"MantineCore\"].Skeleton;\nfunction PassFailButton({\n value,\n passText,\n failText,\n passColor,\n failColor\n}) {\n const v = isTrue(value);\n const pass = passText ?? _i18n._(\n /*i18n*/\n {\n id: \"wFwgKk\"\n }\n );\n const fail = failText ?? _i18n._(\n /*i18n*/\n {\n id: \"qcloGZ\"\n }\n );\n const pColor = passColor ?? \"green\";\n const fColor = failColor ?? \"red\";\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { color: v ? pColor : fColor, variant: \"filled\", radius: \"lg\", size: \"sm\", style: {\n maxWidth: \"50px\"\n }, children: v ? pass : fail });\n}\nfunction YesNoButton({\n value\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(PassFailButton, { value, passText: _i18n._(\n /*i18n*/\n {\n id: \"l75CjT\"\n }\n ), failText: _i18n._(\n /*i18n*/\n {\n id: \"1UzENP\"\n }\n ), failColor: \"orange.6\" });\n}\nexport {\n PassFailButton,\n YesNoButton\n};\n//# sourceMappingURL=YesNoButton.js.map\n","const useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useRef = window[\"React\"].useRef;\nconst useState = window[\"React\"].useState;\nfunction useDebouncedValue(value, wait, options = { leading: false }) {\n const [_value, setValue] = useState(value);\n const mountedRef = useRef(false);\n const timeoutRef = useRef(null);\n const cooldownRef = useRef(false);\n const latestValueRef = useRef(value);\n latestValueRef.current = value;\n const cancel = useCallback(() => {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n cooldownRef.current = false;\n }, []);\n const flush = useCallback(() => {\n if (timeoutRef.current) {\n cancel();\n cooldownRef.current = false;\n setValue(latestValueRef.current);\n }\n }, []);\n useEffect(() => {\n if (mountedRef.current) if (!cooldownRef.current && options.leading) {\n cooldownRef.current = true;\n setValue(value);\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n }, wait);\n } else {\n cancel();\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n setValue(value);\n }, wait);\n }\n }, [\n value,\n options.leading,\n wait\n ]);\n useEffect(() => {\n mountedRef.current = true;\n return cancel;\n }, []);\n return [\n _value,\n cancel,\n {\n cancel,\n flush\n }\n ];\n}\nexport {\n useDebouncedValue\n};\n//# sourceMappingURL=use-debounced-value.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M21 21l-6 -6\", \"key\": \"svg-1\" }]];\nconst IconSearch = createReactComponent(\"outline\", \"search\", \"Search\", __iconNode);\nexport {\n __iconNode,\n IconSearch as default\n};\n//# sourceMappingURL=IconSearch.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDebouncedValue } from \"../node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js\";\nimport IconSearch from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst CloseButton = window[\"MantineCore\"].CloseButton;\nconst TextInput = window[\"MantineCore\"].TextInput;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction SearchInput({\n disabled,\n debounce,\n placeholder,\n searchCallback\n}) {\n const [value, setValue] = useState(\"\");\n const [searchText] = useDebouncedValue(value, debounce ?? 500);\n useEffect(() => {\n searchCallback(searchText);\n }, [searchText]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(TextInput, { value, disabled, \"aria-label\": \"table-search-input\", leftSection: /* @__PURE__ */ jsxRuntimeExports.jsx(IconSearch, {}), placeholder: placeholder ?? _i18n._(\n /*i18n*/\n {\n id: \"A1taO8\"\n }\n ), onChange: (event) => setValue(event.target.value), rightSection: value.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(CloseButton, { size: \"xs\", onClick: () => {\n setValue(\"\");\n searchCallback(\"\");\n } }) : null });\n}\nexport {\n SearchInput\n};\n//# sourceMappingURL=SearchInput.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M6 4v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M6 12v8\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M12 4v10\", \"key\": \"svg-4\" }], [\"path\", { \"d\": \"M12 18v2\", \"key\": \"svg-5\" }], [\"path\", { \"d\": \"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-6\" }], [\"path\", { \"d\": \"M18 4v1\", \"key\": \"svg-7\" }], [\"path\", { \"d\": \"M18 9v11\", \"key\": \"svg-8\" }]];\nconst IconAdjustments = createReactComponent(\"outline\", \"adjustments\", \"Adjustments\", __iconNode);\nexport {\n __iconNode,\n IconAdjustments as default\n};\n//# sourceMappingURL=IconAdjustments.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconAdjustments from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Checkbox = window[\"MantineCore\"].Checkbox;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction TableColumnSelect({\n columns,\n onToggleColumn\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", closeOnItemClick: false, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"transparent\", \"aria-label\": \"table-select-columns\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ), position: \"top-end\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconAdjustments, {}) }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { style: {\n maxHeight: \"400px\",\n overflowY: \"auto\"\n }, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n columns.filter((col) => (col.switchable ?? true) && !col.propHidden).map((col) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox, { checked: !col.hidden, label: col.title || col.accessor, onChange: () => onToggleColumn(col.accessor), radius: \"sm\" }) }, col.accessor))\n ] })\n ] });\n}\nexport {\n TableColumnSelect\n};\n//# sourceMappingURL=TableColumnSelect.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3\", \"key\": \"svg-1\" }]];\nconst IconTag = createReactComponent(\"outline\", \"tag\", \"Tag\", __iconNode);\nexport {\n __iconNode,\n IconTag as default\n};\n//# sourceMappingURL=IconTag.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconTag from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Badge = window[\"MantineCore\"].Badge;\nconst Group = window[\"MantineCore\"].Group;\nconst Paper = window[\"MantineCore\"].Paper;\nfunction TagsList({\n tags\n}) {\n if (!tags || tags.length === 0) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Paper, { p: \"xs\", shadow: \"xs\", withBorder: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { size: \"sm\", variant: \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTag, {}) }),\n tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: \"outline\", size: \"sm\", children: tag }, tag))\n ] }) });\n}\nexport {\n TagsList as default\n};\n//# sourceMappingURL=TagsList.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nconst Alert = window[\"MantineCore\"].Alert;\nfunction InvenTreeTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n context\n}) {\n if (!context?.tables?.renderTable) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { title: \"Plugin Version Error\", color: \"red\", children: [\n 'The component cannot be rendered because the plugin context is missing the \"renderTable\" function.',\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n \"This means that the InvenTree UI library version is incompatible with this plugin version.\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"Plugin Version:\" }),\n \" \",\n INVENTREE_PLUGIN_VERSION,\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"UI Version:\" }),\n \" \",\n context?.version?.inventree || \"unknown\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {})\n ] });\n }\n return context?.tables.renderTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n api: context.api,\n navigate: context.navigate\n });\n}\nexport {\n InvenTreeTable as default\n};\n//# sourceMappingURL=InvenTreeTable.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-2\" }]];\nconst IconDots = createReactComponent(\"outline\", \"dots\", \"Dots\", __iconNode);\nexport {\n __iconNode,\n IconDots as default\n};\n//# sourceMappingURL=IconDots.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 10l4 4m0 -4l-4 4\", \"key\": \"svg-1\" }]];\nconst IconCircleX = createReactComponent(\"outline\", \"circle-x\", \"CircleX\", __iconNode);\nexport {\n __iconNode,\n IconCircleX as default\n};\n//# sourceMappingURL=IconCircleX.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 7l16 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 11l0 6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M14 11l0 6\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3\", \"key\": \"svg-4\" }]];\nconst IconTrash = createReactComponent(\"outline\", \"trash\", \"Trash\", __iconNode);\nexport {\n __iconNode,\n IconTrash as default\n};\n//# sourceMappingURL=IconTrash.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M16 5l3 3\", \"key\": \"svg-2\" }]];\nconst IconEdit = createReactComponent(\"outline\", \"edit\", \"Edit\", __iconNode);\nexport {\n __iconNode,\n IconEdit as default\n};\n//# sourceMappingURL=IconEdit.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M13 18l6 -6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M13 6l6 6\", \"key\": \"svg-2\" }]];\nconst IconArrowRight = createReactComponent(\"outline\", \"arrow-right\", \"ArrowRight\", __iconNode);\nexport {\n __iconNode,\n IconArrowRight as default\n};\n//# sourceMappingURL=IconArrowRight.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { cancelEvent } from \"../functions/Events.js\";\nimport { eventModified, getDetailUrl, navigateToLink } from \"../functions/Navigation.js\";\nimport IconDots from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconTrash from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nimport IconEdit from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js\";\nimport IconArrowRight from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction RowViewAction(props) {\n return {\n ...props,\n color: void 0,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowRight, {}),\n onClick: (event) => {\n const showPreviewPanel = props.isPreviewEnabled?.() ?? false;\n if (!showPreviewPanel || eventModified(event) || !props.openPreview) {\n const url = getDetailUrl(props.modelType, props.modelId);\n navigateToLink(url, props.navigate, event);\n } else {\n props.openPreview(props.modelType, props.modelId);\n }\n }\n };\n}\nfunction RowDuplicateAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"euc6Ns\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {})\n };\n}\nfunction RowEditAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"ePK91l\"\n }\n ),\n color: \"blue\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconEdit, {})\n };\n}\nfunction RowDeleteAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"cnGeoo\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTrash, {})\n };\n}\nfunction RowCancelAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"dEgA5A\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {})\n };\n}\nfunction RowActions({\n title,\n actions,\n disabled = false,\n index\n}) {\n function openMenu(event) {\n cancelEvent(event);\n setOpened(!opened);\n }\n const [opened, setOpened] = useState(false);\n const visibleActions = useMemo(() => {\n return actions.filter((action) => !action.hidden);\n }, [actions]);\n function RowActionIcon(action) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: action.tooltip ?? action.title, position: \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { color: action.color, leftSection: action.icon, onClick: (event) => {\n cancelEvent(event);\n action.onClick?.(event);\n setOpened(false);\n }, disabled: action.disabled || false, children: action.title }) }, action.title);\n }\n return visibleActions.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { withinPortal: true, disabled, position: \"bottom-end\", opened, onChange: setOpened, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: title || _i18n._(\n /*i18n*/\n {\n id: \"7L01XJ\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { \"aria-label\": `row-action-menu-${index ?? \"\"}`, onClick: openMenu, disabled, variant: \"transparent\", size: \"sm\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconDots, {}) }, `row-action-menu-${index ?? \"\"}`) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Dropdown, { children: visibleActions.map((action) => /* @__PURE__ */ jsxRuntimeExports.jsx(RowActionIcon, { ...action }, action.title)) })\n ] });\n}\nexport {\n RowActions,\n RowCancelAction,\n RowDeleteAction,\n RowDuplicateAction,\n RowEditAction,\n RowViewAction\n};\n//# sourceMappingURL=RowActions.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useDocumentVisibility() {\n const [documentVisibility, setDocumentVisibility] = useState(\"visible\");\n useEffect(() => {\n setDocumentVisibility(document.visibilityState);\n const listener = () => setDocumentVisibility(document.visibilityState);\n document.addEventListener(\"visibilitychange\", listener);\n return () => document.removeEventListener(\"visibilitychange\", listener);\n }, []);\n return documentVisibility;\n}\nexport {\n useDocumentVisibility\n};\n//# sourceMappingURL=use-document-visibility.js.map\n","var Subscribable = class {\n constructor() {\n this.listeners = /* @__PURE__ */ new Set();\n this.subscribe = this.subscribe.bind(this);\n }\n subscribe(listener) {\n this.listeners.add(listener);\n this.onSubscribe();\n return () => {\n this.listeners.delete(listener);\n this.onUnsubscribe();\n };\n }\n hasListeners() {\n return this.listeners.size > 0;\n }\n onSubscribe() {\n }\n onUnsubscribe() {\n }\n};\nexport {\n Subscribable\n};\n//# sourceMappingURL=subscribable.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar FocusManager = class extends Subscribable {\n #focused;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onFocus) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const listener = () => onFocus();\n window.addEventListener(\"visibilitychange\", listener, false);\n return () => {\n window.removeEventListener(\"visibilitychange\", listener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup((focused) => {\n if (typeof focused === \"boolean\") {\n this.setFocused(focused);\n } else {\n this.onFocus();\n }\n });\n }\n setFocused(focused) {\n const changed = this.#focused !== focused;\n if (changed) {\n this.#focused = focused;\n this.onFocus();\n }\n }\n onFocus() {\n const isFocused = this.isFocused();\n this.listeners.forEach((listener) => {\n listener(isFocused);\n });\n }\n isFocused() {\n if (typeof this.#focused === \"boolean\") {\n return this.#focused;\n }\n return globalThis.document?.visibilityState !== \"hidden\";\n }\n};\nvar focusManager = new FocusManager();\nexport {\n FocusManager,\n focusManager\n};\n//# sourceMappingURL=focusManager.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar OnlineManager = class extends Subscribable {\n #online = true;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onOnline) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const onlineListener = () => onOnline(true);\n const offlineListener = () => onOnline(false);\n window.addEventListener(\"online\", onlineListener, false);\n window.addEventListener(\"offline\", offlineListener, false);\n return () => {\n window.removeEventListener(\"online\", onlineListener);\n window.removeEventListener(\"offline\", offlineListener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup(this.setOnline.bind(this));\n }\n setOnline(online) {\n const changed = this.#online !== online;\n if (changed) {\n this.#online = online;\n this.listeners.forEach((listener) => {\n listener(online);\n });\n }\n }\n isOnline() {\n return this.#online;\n }\n};\nvar onlineManager = new OnlineManager();\nexport {\n OnlineManager,\n onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nvar QueryClientContext = React.createContext(\n void 0\n);\nvar useQueryClient = (queryClient) => {\n const client = React.useContext(QueryClientContext);\n if (queryClient) {\n return queryClient;\n }\n if (!client) {\n throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n }\n return client;\n};\nexport {\n QueryClientContext,\n useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nexport {\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map\n","const React = window[\"React\"];\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nIsRestoringContext.Provider;\nexport {\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M9 12l2 2l4 -4\", \"key\": \"svg-1\" }]];\nconst IconCircleCheck = createReactComponent(\"outline\", \"circle-check\", \"CircleCheck\", __iconNode);\nexport {\n __iconNode,\n IconCircleCheck as default\n};\n//# sourceMappingURL=IconCircleCheck.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ProgressBar } from \"../components/ProgressBar.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorDataOutput(props) {\n const visibility = useDocumentVisibility();\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n if (!!props.id) {\n setLoading(true);\n showNotification({\n id: `data-output-${props.id}`,\n title: props.title,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", value: 0, progressLabel: true })\n });\n } else setLoading(false);\n }, [props.id, props.title]);\n useQuery({\n enabled: !!props.id && loading && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"data-output\", props.id, props.title],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.data_output, props.id)).then((response) => {\n const data = response?.data ?? {};\n if (!!data.errors || !!data.error) {\n setLoading(false);\n const error = data?.error ?? data?.errors?.error ?? _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n );\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}),\n autoClose: 2500,\n title: props.title,\n message: error,\n color: \"red\"\n });\n } else if (data.complete) {\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: _i18n._(\n /*i18n*/\n {\n id: \"TCOQbo\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {})\n });\n if (data.output) {\n const url = data.output;\n const base = props.hostname ?? window.location.origin;\n const downloadUrl = new URL(url, base);\n window.open(downloadUrl.toString(), \"_blank\");\n }\n } else {\n notifications.update({\n id: `data-output-${props.id}`,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", maximum: data.total, value: data.progress, progressLabel: data.total > 0, animated: true })\n });\n }\n return data;\n }).catch((error) => {\n console.error(\"Error in useMonitorDataOutput:\", error);\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: error.message || _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n ),\n color: \"red\"\n });\n return {};\n })\n }, props.queryClient);\n}\nexport {\n useMonitorDataOutput as default\n};\n//# sourceMappingURL=MonitorDataOutput.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorBackgroundTask(props) {\n const visibility = useDocumentVisibility();\n const [tracking, setTracking] = useState(false);\n useEffect(() => {\n if (!!props.taskId) {\n setTracking(true);\n showNotification({\n id: `background-task-${props.taskId}`,\n title: props.title,\n message: props.message,\n loading: true,\n autoClose: false,\n withCloseButton: false\n });\n } else {\n setTracking(false);\n }\n }, [props.taskId]);\n useQuery({\n enabled: !!props.taskId && tracking && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"background-task\", props.taskId],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.task_overview, props.taskId)).then((response) => {\n const data = response?.data ?? {};\n if (data.complete) {\n setTracking(false);\n props.onComplete?.();\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: data.success ? \"green\" : \"red\",\n message: response.data?.success ? props.successMessage ?? props.message : props.failureMessage ?? props.message,\n icon: response.data?.success ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {}),\n autoClose: 1e3,\n withCloseButton: true\n });\n if (data.success) {\n props.onSuccess?.();\n } else {\n props.onFailure?.();\n }\n }\n return response;\n }).catch((error) => {\n console.error(`Error fetching background task status for task ${props.taskId}:`, error);\n setTracking(false);\n props.onError?.(error);\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: \"red\",\n message: props.errorMessage ?? props.message,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, { color: \"red\" }),\n autoClose: 5e3,\n withCloseButton: true\n });\n })\n }, props.queryClient);\n}\nexport {\n useMonitorBackgroundTask as default\n};\n//# sourceMappingURL=MonitorBackgroundTask.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction useWindowEvent(type, listener, options) {\n const stableListener = useEffectEvent(listener);\n useEffect(() => {\n window.addEventListener(type, stableListener, options);\n return () => window.removeEventListener(type, stableListener, options);\n }, [type]);\n}\nexport {\n useWindowEvent\n};\n//# sourceMappingURL=use-window-event.js.map\n","import { useWindowEvent } from \"../use-window-event/use-window-event.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction serializeJSON(value, hookName = \"use-local-storage\") {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);\n }\n}\nfunction deserializeJSON(value) {\n try {\n return value && JSON.parse(value);\n } catch {\n return value;\n }\n}\nfunction createStorageHandler(type) {\n const getItem = (key) => {\n try {\n return window[type].getItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to get value from storage, localStorage is blocked\");\n return null;\n }\n };\n const setItem = (key, value) => {\n try {\n window[type].setItem(key, value);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to set value to storage, localStorage is blocked\");\n }\n };\n const removeItem = (key) => {\n try {\n window[type].removeItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to remove value from storage, localStorage is blocked\");\n }\n };\n return {\n getItem,\n setItem,\n removeItem\n };\n}\nfunction createStorage(type, hookName) {\n const eventName = \"mantine-local-storage\";\n const { getItem, setItem, removeItem } = createStorageHandler(type);\n return function useStorage({ key, defaultValue, getInitialValueInEffect = true, sync = true, deserialize = deserializeJSON, serialize = (value) => serializeJSON(value, hookName) }) {\n const readStorageValue = useCallback((skipStorage) => {\n let storageBlockedOrSkipped;\n try {\n storageBlockedOrSkipped = typeof window === \"undefined\" || !(type in window) || window[type] === null || !!skipStorage;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n if (storageBlockedOrSkipped) return defaultValue;\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : defaultValue;\n }, [key, defaultValue]);\n const [value, setValue] = useState(readStorageValue(getInitialValueInEffect));\n const setStorageValue = useCallback((val) => {\n if (val instanceof Function) setValue((current) => {\n const result = val(current);\n setItem(key, serialize(result));\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: result\n } }));\n });\n return result;\n });\n else {\n setItem(key, serialize(val));\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: val\n } }));\n setValue(val);\n }\n }, [key]);\n const removeStorageValue = useCallback(() => {\n removeItem(key);\n setValue(defaultValue);\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: defaultValue\n } }));\n }, [key, defaultValue]);\n useWindowEvent(\"storage\", (event) => {\n if (sync) {\n if (event.storageArea === window[type] && event.key === key) setValue(deserialize(event.newValue ?? void 0));\n }\n });\n useWindowEvent(eventName, (event) => {\n if (sync) {\n if (event.detail.key === key) setValue(event.detail.value);\n }\n });\n useEffect(() => {\n if (defaultValue !== void 0 && value === void 0) setStorageValue(defaultValue);\n }, [\n defaultValue,\n value,\n setStorageValue\n ]);\n useEffect(() => {\n const val = readStorageValue();\n val !== void 0 && setStorageValue(val);\n }, [key]);\n return [\n value === void 0 ? defaultValue : value,\n setStorageValue,\n removeStorageValue\n ];\n };\n}\nexport {\n createStorage\n};\n//# sourceMappingURL=create-storage.js.map\n","import { useLocalStorage } from \"../node_modules/@mantine/hooks/esm/use-local-storage/use-local-storage.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useMemo = window[\"React\"].useMemo;\nfunction useFilterSet(filterKey, initialFilters) {\n const [storedFilters, setStoredFilters] = useLocalStorage({\n key: `inventree-filterset-${filterKey}`,\n defaultValue: null,\n sync: false,\n getInitialValueInEffect: false\n });\n const [storedNamedSets, setStoredNamedSets] = useLocalStorage({\n key: `inventree-filtersets-${filterKey}`,\n defaultValue: [],\n sync: false,\n getInitialValueInEffect: false\n });\n useEffect(() => {\n if (storedFilters == null) {\n setStoredFilters(initialFilters || []);\n }\n }, [storedFilters, initialFilters, setStoredFilters]);\n const activeFilters = useMemo(() => {\n return storedFilters ?? initialFilters ?? [];\n }, [storedFilters, initialFilters]);\n const clearActiveFilters = useCallback(() => {\n setStoredFilters([]);\n }, []);\n const setActiveFilters = useCallback((filters) => {\n setStoredFilters(filters);\n }, [setStoredFilters]);\n const saveFilterSet = useCallback((name) => {\n const snapshot = activeFilters.map(({\n name: n,\n value,\n displayValue\n }) => ({\n name: n,\n value,\n displayValue\n }));\n setStoredNamedSets((prev) => {\n const without = (prev ?? []).filter((s) => s.name !== name);\n return [...without, {\n name,\n filters: snapshot\n }];\n });\n }, [activeFilters, setStoredNamedSets]);\n const loadFilterSet = useCallback((name) => {\n const saved = (storedNamedSets ?? []).find((s) => s.name === name);\n if (saved) {\n setStoredFilters(saved.filters);\n }\n }, [storedNamedSets, setStoredFilters]);\n const deleteFilterSet = useCallback((name) => {\n setStoredNamedSets((prev) => (prev ?? []).filter((s) => s.name !== name));\n }, [setStoredNamedSets]);\n return {\n filterKey,\n activeFilters,\n setActiveFilters,\n clearActiveFilters,\n savedFilterSets: storedNamedSets ?? [],\n saveFilterSet,\n loadFilterSet,\n deleteFilterSet\n };\n}\nexport {\n useFilterSet as default\n};\n//# sourceMappingURL=UseFilterSet.js.map\n","import { randomId } from \"../node_modules/@mantine/hooks/esm/utils/random-id/random-id.js\";\nimport useFilterSet from \"./UseFilterSet.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction useTable(tableName, tableProps = {\n idAccessor: \"pk\",\n initialFilters: []\n}) {\n function generateTableName() {\n return `${tableName.replaceAll(\"-\", \"\")}-${randomId()}`;\n }\n const [tableKey, setTableKey] = useState(generateTableName());\n const refreshTable = useCallback((clearSelection) => {\n setTableKey(generateTableName());\n if (clearSelection) {\n clearSelectedRecords();\n }\n }, [generateTableName]);\n const filterSet = useFilterSet(`table-${tableName}`, tableProps.initialFilters);\n const [expandedRecords, setExpandedRecords] = useState([]);\n const isRowExpanded = useCallback((pk) => {\n return expandedRecords.includes(pk);\n }, [expandedRecords]);\n const [hiddenColumns, setHiddenColumns] = useState([]);\n const [selectedRecords, setSelectedRecords] = useState([]);\n const selectedIds = useMemo(() => selectedRecords.map((r) => r[tableProps.idAccessor || \"pk\"]), [selectedRecords]);\n const clearSelectedRecords = useCallback(() => {\n setSelectedRecords([]);\n }, []);\n const hasSelectedRecords = useMemo(() => {\n return selectedRecords.length > 0;\n }, [selectedRecords]);\n const [recordCount, setRecordCount] = useState(0);\n const [page, setPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [records, setRecords] = useState([]);\n const updateRecord = useCallback((record) => {\n const _records = [...records];\n const index = _records.findIndex((r) => r[tableProps.idAccessor || \"pk\"] === record.pk);\n if (index >= 0) {\n _records[index] = {\n ..._records[index],\n ...record\n };\n } else {\n _records.push(record);\n }\n setRecords(_records);\n }, [records]);\n const idAccessor = useMemo(() => tableProps.idAccessor || \"pk\", [tableProps.idAccessor]);\n const [isLoading, setIsLoading] = useState(false);\n return {\n tableKey,\n refreshTable,\n isLoading,\n setIsLoading,\n filterSet,\n expandedRecords,\n setExpandedRecords,\n isRowExpanded,\n selectedRecords,\n selectedIds,\n setSelectedRecords,\n clearSelectedRecords,\n hasSelectedRecords,\n searchTerm,\n setSearchTerm,\n recordCount,\n setRecordCount,\n hiddenColumns,\n setHiddenColumns,\n page,\n setPage,\n records,\n setRecords,\n updateRecord,\n idAccessor\n };\n}\nexport {\n useTable as default\n};\n//# sourceMappingURL=UseTable.js.map\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nvar Action;\n(function(Action2) {\n Action2[\"Pop\"] = \"POP\";\n Action2[\"Push\"] = \"PUSH\";\n Action2[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n if (typeof console !== \"undefined\") console.warn(message);\n try {\n throw new Error(message);\n } catch (e) {\n }\n }\n}\nfunction createPath(_ref) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = _ref;\n if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nvar ResultType;\n(function(ResultType2) {\n ResultType2[\"data\"] = \"data\";\n ResultType2[\"deferred\"] = \"deferred\";\n ResultType2[\"redirect\"] = \"redirect\";\n ResultType2[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = \"/\";\n }\n return matchRoutesImpl(routes, locationArg, basename);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial) {\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n if (pathname == null) {\n return null;\n }\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n let decoded = decodePath(pathname);\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i], decoded);\n }\n return matches;\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n if (parentPath === void 0) {\n parentPath = \"\";\n }\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === void 0 ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(meta.relativePath.startsWith(parentPath), 'Absolute route path \"' + meta.relativePath + '\" nested under path ' + ('\"' + parentPath + '\" is not valid. An absolute child route path ') + \"must start with the combined path of all its parent routes.\");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n \"Index routes must not have child routes. Please remove \" + ('all child routes from route path \"' + path + '\".')\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n routes.forEach((route, index) => {\n var _route$path;\n if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n let isOptional = first.endsWith(\"?\");\n let required = first.replace(/\\?$/, \"\");\n if (rest.length === 0) {\n return isOptional ? [required, \"\"] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = [];\n result.push(...restExploded.map((subpath) => subpath === \"\" ? required : [required, subpath].join(\"/\")));\n if (isOptional) {\n result.push(...restExploded);\n }\n return result.map((exploded) => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score : compareIndexes(a.routesMeta.map((meta) => meta.childrenIndex), b.routesMeta.map((meta) => meta.childrenIndex)));\n}\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s) => s === \"*\";\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? (\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n ) : (\n // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0\n );\n}\nfunction matchRouteBranch(branch, pathname, allowPartial) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n let route = meta.route;\n if (!match) {\n return null;\n }\n Object.assign(matchedParams, match.params);\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce((memo, _ref, index) => {\n let {\n paramName,\n isOptional\n } = _ref;\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = void 0;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n if (end === void 0) {\n end = true;\n }\n warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), 'Route path \"' + path + '\" will be treated as if it were ' + ('\"' + path.replace(/\\*$/, \"/*\") + '\" because the `*` character must ') + \"always follow a `/` in the pattern. To get rid of this warning, \" + ('please change the route path to \"' + path.replace(/\\*$/, \"/*\") + '\".'));\n let params = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\").replace(/^\\/*/, \"/\").replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\").replace(/\\/:([\\w-]+)(\\?)?/g, (_, paramName, isOptional) => {\n params.push({\n paramName,\n isOptional: isOptional != null\n });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n });\n if (path.endsWith(\"*\")) {\n params.push({\n paramName: \"*\"\n });\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" : \"(?:\\\\/(.+)|\\\\/*)$\";\n } else if (end) {\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else ;\n let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : \"i\");\n return [matcher, params];\n}\nfunction decodePath(value) {\n try {\n return value.split(\"/\").map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\n } catch (error) {\n warning(false, 'The URL path \"' + value + '\" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent ' + (\"encoding (\" + error + \").\"));\n return value;\n }\n}\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n return null;\n }\n return pathname.slice(startIndex) || \"/\";\n}\nconst ABSOLUTE_URL_REGEX$1 = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX$1.test(url);\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = \"/\";\n }\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname;\n if (toPathname) {\n if (isAbsoluteUrl(toPathname)) {\n pathname = toPathname;\n } else {\n if (toPathname.includes(\"//\")) {\n let oldPathname = toPathname;\n toPathname = removeDoubleSlashes(toPathname);\n warning(false, \"Pathnames cannot have embedded double slashes - normalizing \" + (oldPathname + \" -> \" + toPathname));\n }\n if (toPathname.startsWith(\"/\")) {\n pathname = resolvePathname(toPathname.substring(1), \"/\");\n } else {\n pathname = resolvePathname(toPathname, fromPathname);\n }\n }\n } else {\n pathname = fromPathname;\n }\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"]. Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + 'a string in and the router will parse it for you.';\n}\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\nfunction getResolveToMatches(matches, v7_relativeSplatPath) {\n let pathMatches = getPathContributingMatches(matches);\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);\n }\n return pathMatches.map((match) => match.pathnameBase);\n}\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n let to;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n }\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from;\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join(\"/\");\n }\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n let path = resolvePath(to, from);\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n return path;\n}\nconst removeDoubleSlashes = (path) => path.replace(/\\/\\/+/g, \"/\");\nconst joinPaths = (paths) => removeDoubleSlashes(paths.join(\"/\"));\nconst normalizePathname = (pathname) => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\nconst normalizeSearch = (search) => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\nconst normalizeHash = (hash) => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\nclass AbortedDeferredError extends Error {\n}\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nnew Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nnew Set(validRequestMethodsArr);\nexport {\n AbortedDeferredError,\n Action,\n decodePath as UNSAFE_decodePath,\n getResolveToMatches as UNSAFE_getResolveToMatches,\n invariant as UNSAFE_invariant,\n warning as UNSAFE_warning,\n createPath,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n normalizePathname,\n parsePath,\n resolvePath,\n resolveTo,\n stripBasename\n};\n//# sourceMappingURL=router.js.map\n","import { UNSAFE_invariant as invariant, UNSAFE_getResolveToMatches as getResolveToMatches, resolveTo, joinPaths, parsePath, matchRoutes, Action, isRouteErrorResponse, AbortedDeferredError } from \"../../@remix-run/router/dist/router.js\";\nimport { createPath, matchPath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nconst DataRouterContext = /* @__PURE__ */ React.createContext(null);\nconst DataRouterStateContext = /* @__PURE__ */ React.createContext(null);\nconst AwaitContext = /* @__PURE__ */ React.createContext(null);\nconst NavigationContext = /* @__PURE__ */ React.createContext(null);\nconst LocationContext = /* @__PURE__ */ React.createContext(null);\nconst RouteContext = /* @__PURE__ */ React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nconst RouteErrorContext = /* @__PURE__ */ React.createContext(null);\nfunction useHref(to, _temp) {\n let {\n relative\n } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n hash,\n pathname,\n search\n } = useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname;\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\nfunction useInRouterContext() {\n return React.useContext(LocationContext) != null;\n}\nfunction useLocation() {\n !useInRouterContext() ? invariant(false) : void 0;\n return React.useContext(LocationContext).location;\n}\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n React.useLayoutEffect(cb);\n }\n}\nfunction useNavigate() {\n let {\n isDataRoute\n } = React.useContext(RouteContext);\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n !useInRouterContext() ? invariant(false) : void 0;\n let dataRouterContext = React.useContext(DataRouterContext);\n let {\n basename,\n future,\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\");\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n return navigate;\n}\nfunction useParams() {\n let {\n matches\n } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\nfunction useResolvedPath(to, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n future\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [to, routePathnamesJson, locationPathname, relative]);\n}\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\nfunction useRoutesImpl(routes, locationArg, dataRouterState, future) {\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches: parentMatches\n } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n routeMatch && routeMatch.route;\n let locationFromContext = useLocation();\n let location;\n if (locationArg) {\n var _parsedLocationArg$pa;\n let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? invariant(false) : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || \"/\";\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n let matches = matchRoutes(routes, {\n pathname: remainingPathname\n });\n let renderedMatches = _renderMatches(matches && matches.map((match) => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname\n ]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase\n ])\n })), parentMatches, dataRouterState, future);\n if (locationArg && renderedMatches) {\n return /* @__PURE__ */ React.createElement(LocationContext.Provider, {\n value: {\n location: _extends({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\"\n }, location),\n navigationType: Action.Pop\n }\n }, renderedMatches);\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = {\n padding: \"0.5rem\",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\"h2\", null, \"Unexpected Application Error!\"), /* @__PURE__ */ React.createElement(\"h3\", {\n style: {\n fontStyle: \"italic\"\n }\n }, message), stack ? /* @__PURE__ */ React.createElement(\"pre\", {\n style: preStyles\n }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /* @__PURE__ */ React.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n static getDerivedStateFromProps(props, state) {\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n return {\n error: props.error !== void 0 ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\"React Router caught the following error during render\", error, errorInfo);\n }\n render() {\n return this.state.error !== void 0 ? /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /* @__PURE__ */ React.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n}\nfunction RenderedRoute(_ref) {\n let {\n routeContext,\n match,\n children\n } = _ref;\n let dataRouterContext = React.useContext(DataRouterContext);\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState, future) {\n var _dataRouterState;\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n if (future === void 0) {\n future = null;\n }\n if (matches == null) {\n var _future;\n if (!dataRouterState) {\n return null;\n }\n if (dataRouterState.errors) {\n matches = dataRouterState.matches;\n } else if ((_future = future) != null && _future.v7_partialHydration && parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n let errors = (_dataRouterState = dataRouterState) == null ? void 0 : _dataRouterState.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex((m) => m.route.id && (errors == null ? void 0 : errors[m.route.id]) !== void 0);\n !(errorIndex >= 0) ? invariant(false) : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n if (match.route.id) {\n let {\n loaderData,\n errors: errors2\n } = dataRouterState;\n let needsToRunLoader = match.route.loader && loaderData[match.route.id] === void 0 && (!errors2 || errors2[match.route.id] === void 0);\n if (match.route.lazy || needsToRunLoader) {\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error;\n let shouldRenderHydrateFallback = false;\n let errorElement = null;\n let hydrateFallbackElement = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : void 0;\n errorElement = match.route.errorElement || defaultErrorElement;\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\"route-fallback\");\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n children = /* @__PURE__ */ React.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /* @__PURE__ */ React.createElement(RenderedRoute, {\n match,\n routeContext: {\n outlet,\n matches: matches2,\n isDataRoute: dataRouterState != null\n },\n children\n });\n };\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches: matches2,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook = /* @__PURE__ */ (function(DataRouterHook2) {\n DataRouterHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterHook2[\"UseNavigateStable\"] = \"useNavigate\";\n return DataRouterHook2;\n})(DataRouterHook || {});\nvar DataRouterStateHook = /* @__PURE__ */ (function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterStateHook2[\"UseLoaderData\"] = \"useLoaderData\";\n DataRouterStateHook2[\"UseActionData\"] = \"useActionData\";\n DataRouterStateHook2[\"UseRouteError\"] = \"useRouteError\";\n DataRouterStateHook2[\"UseNavigation\"] = \"useNavigation\";\n DataRouterStateHook2[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n DataRouterStateHook2[\"UseMatches\"] = \"useMatches\";\n DataRouterStateHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterStateHook2[\"UseNavigateStable\"] = \"useNavigate\";\n DataRouterStateHook2[\"UseRouteId\"] = \"useRouteId\";\n return DataRouterStateHook2;\n})(DataRouterStateHook || {});\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(DataRouterContext);\n !ctx ? invariant(false) : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = React.useContext(DataRouterStateContext);\n !state ? invariant(false) : void 0;\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = React.useContext(RouteContext);\n !route ? invariant(false) : void 0;\n return route;\n}\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext();\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? invariant(false) : void 0;\n return thisRoute.route.id;\n}\nfunction useRouteError() {\n var _state$errors;\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState();\n let routeId = useCurrentRouteId();\n if (error !== void 0) {\n return error;\n }\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\nfunction useNavigateStable() {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, _extends({\n fromRouteId: id\n }, options));\n }\n }, [router, id]);\n return navigate;\n}\nconst alreadyWarned$1 = {};\nfunction warningOnce(key, cond, message) {\n if (!alreadyWarned$1[key]) {\n alreadyWarned$1[key] = true;\n }\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nfunction Route(_props) {\n invariant(false);\n}\nfunction Routes(_ref6) {\n let {\n children,\n location\n } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\nvar AwaitRenderStatus = /* @__PURE__ */ (function(AwaitRenderStatus2) {\n AwaitRenderStatus2[AwaitRenderStatus2[\"pending\"] = 0] = \"pending\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"success\"] = 1] = \"success\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"error\"] = 2] = \"error\";\n return AwaitRenderStatus2;\n})(AwaitRenderStatus || {});\nconst neverSettledPromise = new Promise(() => {\n});\nclass AwaitErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\" caught the following error during render\", error, errorInfo);\n }\n render() {\n let {\n children,\n errorElement,\n resolve\n } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n if (!(resolve instanceof Promise)) {\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_data\", {\n get: () => resolve\n });\n } else if (this.state.error) {\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {\n });\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_error\", {\n get: () => renderError\n });\n } else if (resolve._tracked) {\n promise = resolve;\n status = \"_error\" in promise ? AwaitRenderStatus.error : \"_data\" in promise ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", {\n get: () => true\n });\n promise = resolve.then((data) => Object.defineProperty(resolve, \"_data\", {\n get: () => data\n }), (error) => Object.defineProperty(resolve, \"_error\", {\n get: () => error\n }));\n }\n if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n throw neverSettledPromise;\n }\n if (status === AwaitRenderStatus.error && !errorElement) {\n throw promise._error;\n }\n if (status === AwaitRenderStatus.error) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n if (status === AwaitRenderStatus.success) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children\n });\n }\n throw promise;\n }\n}\nfunction createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n let routes = [];\n React.Children.forEach(children, (element, index) => {\n if (!/* @__PURE__ */ React.isValidElement(element)) {\n return;\n }\n let treePath = [...parentPath, index];\n if (element.type === React.Fragment) {\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n !(element.type === Route) ? invariant(false) : void 0;\n !(!element.props.index || !element.props.children) ? invariant(false) : void 0;\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n routes.push(route);\n });\n return routes;\n}\nexport {\n AbortedDeferredError,\n Action as NavigationType,\n Route,\n Routes,\n DataRouterContext as UNSAFE_DataRouterContext,\n DataRouterStateContext as UNSAFE_DataRouterStateContext,\n LocationContext as UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n RouteContext as UNSAFE_RouteContext,\n useRoutesImpl as UNSAFE_useRoutesImpl,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","import { UNSAFE_NavigationContext as NavigationContext, useHref, useNavigate, useLocation, useResolvedPath } from \"../../react-router/dist/index.js\";\nimport { Route, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_RouteContext, createRoutesFromChildren, createRoutesFromChildren as createRoutesFromChildren2, useInRouterContext, useParams, useRouteError, useRoutes } from \"../../react-router/dist/index.js\";\nimport { stripBasename, createPath } from \"../../@remix-run/router/dist/router.js\";\nimport { AbortedDeferredError, Action, isRouteErrorResponse, matchPath, matchRoutes, parsePath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nconst ReactDOM = window[\"ReactDOM\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event);\n}\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\", \"viewTransition\"];\nconst REACT_ROUTER_VERSION = \"6\";\ntry {\n window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nReact[USE_ID];\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst Link = /* @__PURE__ */ React.forwardRef(function LinkWithRef(_ref7, ref) {\n let {\n onClick,\n relative,\n reloadDocument,\n replace: replace2,\n state,\n target,\n to,\n preventScrollReset,\n viewTransition\n } = _ref7, rest = _objectWithoutPropertiesLoose(_ref7, _excluded);\n let {\n basename\n } = React.useContext(NavigationContext);\n let absoluteHref;\n let isExternal = false;\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n absoluteHref = to;\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n }\n }\n }\n let href = useHref(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace: replace2,\n state,\n target,\n preventScrollReset,\n relative,\n viewTransition\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n /* @__PURE__ */ React.createElement(\"a\", _extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref,\n target\n }))\n );\n});\nvar DataRouterHook;\n(function(DataRouterHook2) {\n DataRouterHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n DataRouterHook2[\"UseSubmit\"] = \"useSubmit\";\n DataRouterHook2[\"UseSubmitFetcher\"] = \"useSubmitFetcher\";\n DataRouterHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterHook2[\"useViewTransitionState\"] = \"useViewTransitionState\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterStateHook2[\"UseFetchers\"] = \"useFetchers\";\n DataRouterStateHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction useLinkClickHandler(to, _temp) {\n let {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative,\n viewTransition\n } = _temp === void 0 ? {} : _temp;\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, {\n relative\n });\n return React.useCallback((event) => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path);\n navigate(to, {\n replace: replace2,\n state,\n preventScrollReset,\n relative,\n viewTransition\n });\n }\n }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative, viewTransition]);\n}\nexport {\n AbortedDeferredError,\n Link,\n Action as NavigationType,\n Route,\n Routes,\n UNSAFE_DataRouterContext,\n UNSAFE_DataRouterStateContext,\n UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n UNSAFE_RouteContext,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren2 as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLinkClickHandler,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","function createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, void 0);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, void 0)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => window.localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n let hydrationVersion = 0;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n return setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n return setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n const currentVersion = ++hydrationVersion;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n if (currentVersion !== hydrationVersion) {\n return;\n }\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(get(), void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\nexport {\n createJSONStorage,\n persist\n};\n//# sourceMappingURL=middleware.js.map\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\nexport {\n createStore\n};\n//# sourceMappingURL=vanilla.js.map\n","import { createStore } from \"./vanilla.js\";\nconst React = window[\"React\"];\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createImpl);\nexport {\n create,\n useStore\n};\n//# sourceMappingURL=react.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst useLocalLibState = create()(persist((set, get) => ({\n detailDrawerStack: 0,\n addDetailDrawer: (value) => {\n set({\n detailDrawerStack: value === false ? 0 : get().detailDrawerStack + value\n });\n },\n hotkeys: {},\n addHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const [ref, details] of hotkeys) {\n newHotkeys[ref] = details;\n }\n set({\n hotkeys: newHotkeys\n });\n },\n removeHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const ref of hotkeys) {\n delete newHotkeys[ref];\n }\n set({\n hotkeys: newHotkeys\n });\n }\n}), {\n name: \"session-settings-inventreedb_lib\"\n}));\nexport {\n useLocalLibState\n};\n//# sourceMappingURL=LocalLibState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst Text = window[\"MantineCore\"].Text;\nconst darken = window[\"MantineCore\"].darken;\nconst getThemeColor = window[\"MantineCore\"].getThemeColor;\nconst useMantineTheme = window[\"MantineCore\"].useMantineTheme;\nconst useMemo = window[\"React\"].useMemo;\nconst useThematicGradient = () => {\n const theme = useMantineTheme();\n const primary = useMemo(() => {\n return getThemeColor(theme.primaryColor, theme);\n }, [theme]);\n const secondary = useMemo(() => darken(primary, 0.25), [primary]);\n return useMemo(() => {\n return {\n primary,\n secondary\n };\n }, [primary, secondary]);\n};\nfunction StylishText({\n children,\n size\n}) {\n const {\n primary,\n secondary\n } = useThematicGradient();\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { fw: 700, size: size ?? \"xl\", variant: \"gradient\", gradient: {\n from: primary.toString(),\n to: secondary.toString()\n }, children });\n}\nexport {\n StylishText\n};\n//# sourceMappingURL=StylishText.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M15 6l-6 6l6 6\", \"key\": \"svg-0\" }]];\nconst IconChevronLeft = createReactComponent(\"outline\", \"chevron-left\", \"ChevronLeft\", __iconNode);\nexport {\n __iconNode,\n IconChevronLeft as default\n};\n//# sourceMappingURL=IconChevronLeft.js.map\n","import { j as jsxRuntimeExports } from \"../../_virtual/jsx-runtime.js\";\nimport { Link } from \"../../node_modules/react-router-dom/dist/index.js\";\nimport { useShallow } from \"../../node_modules/zustand/esm/react/shallow.js\";\nimport { useLocalLibState } from \"../../states/LocalLibState.js\";\nimport { StylishText } from \"../StylishText.js\";\nimport { flex } from \"./DetailDrawer.css.js\";\nimport { Routes, Route, useNavigate, useParams } from \"../../node_modules/react-router/dist/index.js\";\nimport IconChevronLeft from \"../../node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Drawer = window[\"MantineCore\"].Drawer;\nconst Group = window[\"MantineCore\"].Group;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nfunction DetailDrawerComponent({\n title,\n position = \"right\",\n size,\n closeOnEscape = true,\n renderContent\n}) {\n const navigate = useNavigate();\n const {\n id\n } = useParams();\n const content = renderContent(id);\n const opened = useMemo(() => !!id && !!content, [id, content]);\n const [detailDrawerStack, addDetailDrawer] = useLocalLibState(useShallow((state) => [state.detailDrawerStack, state.addDetailDrawer]));\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Drawer, { opened, onClose: () => {\n navigate(\"../\");\n addDetailDrawer(false);\n }, position, closeOnEscape, size, classNames: {\n root: flex,\n body: flex\n }, scrollAreaComponent: Stack, title: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { children: [\n detailDrawerStack > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"outline\", onClick: () => {\n navigate(-1);\n addDetailDrawer(-1);\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconChevronLeft, {}) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(StylishText, { size: \"xl\", children: title })\n ] }), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", className: flex, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n content\n ] }) });\n}\nfunction DetailDrawer(props) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Routes, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: \":id?/\", element: /* @__PURE__ */ jsxRuntimeExports.jsx(DetailDrawerComponent, { ...props }) }) });\n}\nfunction DetailDrawerLink({\n to,\n text\n}) {\n const addDetailDrawer = useLocalLibState(useShallow((state) => state.addDetailDrawer));\n const onNavigate = useCallback(() => {\n addDetailDrawer(1);\n }, [addDetailDrawer]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to, onClick: onNavigate, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { children: text }) });\n}\nexport {\n DetailDrawer,\n DetailDrawerComponent,\n DetailDrawerLink\n};\n//# sourceMappingURL=DetailDrawer.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst DEFAULT_PAGE_SIZE = 25;\nconst useStoredTableState = create()(persist((set, get) => ({\n pageSize: DEFAULT_PAGE_SIZE,\n setPageSize: (size) => {\n set((state) => ({\n pageSize: size\n }));\n },\n tableSorting: {},\n getTableSorting: (tableKey) => {\n return get().tableSorting[tableKey] || {};\n },\n setTableSorting: (tableKey) => (sorting) => {\n set({\n tableSorting: {\n ...get().tableSorting,\n [tableKey]: sorting\n }\n });\n },\n tableColumnNames: {},\n getTableColumnNames: (tableKey) => {\n return get().tableColumnNames[tableKey] || null;\n },\n setTableColumnNames: (tableKey) => (names) => {\n set({\n tableColumnNames: {\n ...get().tableColumnNames,\n [tableKey]: names\n }\n });\n },\n clearTableColumnNames: () => {\n set({\n tableColumnNames: {}\n });\n },\n hiddenColumns: {},\n getHiddenColumns: (tableKey) => {\n return get().hiddenColumns?.[tableKey] ?? null;\n },\n setHiddenColumns: (tableKey) => (columns) => {\n set({\n hiddenColumns: {\n ...get().hiddenColumns,\n [tableKey]: columns\n }\n });\n }\n}), {\n name: \"inventree-table-state\"\n}));\nexport {\n useStoredTableState\n};\n//# sourceMappingURL=StoredTableState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst I18nProvider = window[\"LinguiReact\"].I18nProvider;\nconst Skeleton = window[\"MantineCore\"].Skeleton;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nasync function tryLoadLocale(locale, loader) {\n try {\n return await loader(locale);\n } catch (error) {\n console.warn(`Failed to load locale ${locale}`);\n return null;\n }\n}\nasync function loadPluginLocale(i18n, locale, loader) {\n let messages = null;\n messages = await tryLoadLocale(locale, loader);\n if (!messages && locale.includes(\"-\")) {\n const fallbackLocale = locale.split(\"-\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale.includes(\"_\")) {\n const fallbackLocale = locale.split(\"_\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale !== \"en\") {\n console.debug(`Locale ${locale} not found, trying fallback locale en`);\n messages = await tryLoadLocale(\"en\", loader);\n }\n if (messages?.messages) {\n i18n.load(locale, messages.messages);\n i18n.activate(locale);\n } else {\n console.error(`Failed to load any locale for ${locale}`);\n }\n}\nconst defaultLocaleLoader = async (_locale) => null;\nfunction LocalizedComponent({\n i18n,\n locale,\n loadLocale,\n children\n}) {\n const [loaded, setLoaded] = useState(false);\n useEffect(() => {\n setLoaded(false);\n loadPluginLocale(i18n, locale, loadLocale ?? defaultLocaleLoader).then(() => {\n setLoaded(true);\n });\n }, [i18n, locale, loadLocale]);\n return loaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(I18nProvider, { i18n, children }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { w: \"100%\", animate: true });\n}\nexport {\n LocalizedComponent as default\n};\n//# sourceMappingURL=LocalizedComponent.js.map\n","import { useHotkeys } from \"../node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js\";\nimport \"../enums/Roles.js\";\nimport \"../enums/ModelInformation.js\";\nimport \"./Notification.js\";\nimport \"../components/ActionButton.js\";\nimport \"../_virtual/jsx-runtime.js\";\nimport \"../components/Boundary.js\";\nimport \"../components/ButtonMenu.js\";\nimport \"../components/CopyButton.js\";\nimport \"../components/CopyableCell.js\";\nimport \"../components/ProgressBar.js\";\nimport \"../components/YesNoButton.js\";\nimport \"../components/SearchInput.js\";\nimport \"../components/TableColumnSelect.js\";\nimport \"../components/TagsList.js\";\nimport \"../components/InvenTreeTable.js\";\nimport \"../components/RowActions.js\";\nimport \"../hooks/MonitorDataOutput.js\";\nimport \"../hooks/MonitorBackgroundTask.js\";\nimport \"../hooks/UseFilterSet.js\";\nimport \"../hooks/UseTable.js\";\nimport \"../components/nav/DetailDrawer.js\";\nimport \"../components/StylishText.js\";\nimport \"../states/StoredTableState.js\";\nimport { useLocalLibState } from \"../states/LocalLibState.js\";\nimport \"../plugin/LocalizedComponent.js\";\nconst useEffect = window[\"React\"].useEffect;\nfunction cancelEvent(event) {\n event?.preventDefault();\n event?.stopPropagation();\n event?.nativeEvent?.stopImmediatePropagation();\n}\nfunction useInvenTreeHotkeys(_keys, tagsToIgnore) {\n const keyelems = _keys.map(([key, description]) => [key, description]);\n const mappedHotkeys = _keys.map(([key, _, handler, options]) => [key, handler, options]);\n useHotkeys(mappedHotkeys, tagsToIgnore);\n useEffect(() => {\n useLocalLibState.getState().addHotkeys(keyelems);\n return () => useLocalLibState.getState().removeHotkeys(keyelems.map(([key]) => key));\n }, []);\n}\nexport {\n cancelEvent,\n useInvenTreeHotkeys\n};\n//# sourceMappingURL=Events.js.map\n","import { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nfunction checkPluginVersion(context) {\n const systemVersion = context?.version?.inventree || \"\";\n if (INVENTREE_PLUGIN_VERSION != systemVersion) {\n console.info(`Plugin version mismatch! Expected version ${INVENTREE_PLUGIN_VERSION}, got ${systemVersion}`);\n }\n}\nfunction initPlugin(context) {\n checkPluginVersion(context);\n context.i18n?.activate?.(context.locale);\n}\nexport {\n checkPluginVersion,\n initPlugin\n};\n//# sourceMappingURL=Plugins.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M12 5l0 14\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-1\" }]];\nconst IconPlus = createReactComponent(\"outline\", \"plus\", \"Plus\", __iconNode);\nexport {\n __iconNode,\n IconPlus as default\n};\n//# sourceMappingURL=IconPlus.js.map\n","import type { LocaleLoader } from '@inventreedb/ui';\n\n// Necessary callback function to dynamically load the locale messages for the plugin\nexport const loadLocale: LocaleLoader = async (locale: string) =>\n import(`./locales/${locale}/messages.ts`).catch(() => null);\n","import {\n checkPluginVersion,\n type InvenTreePluginContext,\n LocalizedComponent\n} from '@inventreedb/ui';\nimport { t } from '@lingui/core/macro';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Switch,\n Table,\n Text,\n Title\n} from '@mantine/core';\nimport { notifications } from '@mantine/notifications';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { loadLocale } from './locales';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\nconst GENERATE_URL = '/plugin/batchcode/generate/';\n\n/** Settings dict provided by BatchCodePlugin.get_ui_panels */\ntype BatchCodeSettings = Record;\n\n/**\n * Summary of the settings which decide what a generated code looks like.\n */\nfunction SettingsSummary({ settings }: { settings: BatchCodeSettings }) {\n const rows: [string, string][] = useMemo(() => {\n const scopes: string[] = [];\n\n if (settings.PER_PART) scopes.push(t`per part`);\n if (settings.PER_LOCATION) scopes.push(t`per location`);\n if (settings.DAILY_RESET) scopes.push(t`reset daily`);\n\n return [\n [t`Format`, String(settings.CODE_FORMAT ?? '')],\n [\n t`Prefix`,\n settings.USE_LOCATION_PREFIX\n ? t`from location field '${String(settings.LOCATION_FIELD)}'`\n : String(settings.PREFIX ?? '')\n ],\n [t`Counter`, scopes.length ? scopes.join(', ') : t`global`],\n [t`Trigger`, String(settings.TRIGGER_MODE ?? '')]\n ];\n }, [settings]);\n\n return (\n \n \n {rows.map(([label, value]) => (\n \n \n \n {label}\n \n \n \n {value}\n \n \n ))}\n \n
\n );\n}\n\nfunction BatchCodePanel({ context }: { context: InvenTreePluginContext }) {\n const settings: BatchCodeSettings = useMemo(\n () => context.context?.settings ?? {},\n [context.context]\n );\n\n const canGenerate: boolean = useMemo(\n () => !!context.context?.can_generate,\n [context.context]\n );\n\n const itemId = useMemo(() => context.id ?? null, [context.id]);\n\n const currentCode: string = useMemo(\n () => context.instance?.batch || '',\n [context.instance]\n );\n\n const [preview, setPreview] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [busy, setBusy] = useState(false);\n const [overwrite, setOverwrite] = useState(false);\n\n // Ask the backend which code would be issued next. This is a preview: it\n // does not advance the counter, so it can be refreshed freely.\n const loadPreview = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, { item: itemId })\n .then((response) => setPreview(response.data?.batch_code ?? ''))\n .catch(() => setError(t`Could not load a batch code preview`))\n .finally(() => setLoading(false));\n }, [context.api, itemId]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n const generate = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setBusy(true);\n\n context.api\n .post(GENERATE_URL, { item: itemId, overwrite: overwrite })\n .then((response) => {\n const code = response.data?.batch_code ?? '';\n\n notifications.show({\n title: t`Batch code generated`,\n message: code,\n color: 'green'\n });\n\n context.reloadInstance?.();\n loadPreview();\n })\n .catch((e) => {\n const detail =\n e?.response?.data?.item?.[0] ??\n e?.response?.data?.detail ??\n t`Could not generate a batch code`;\n\n notifications.show({\n title: t`Batch code not generated`,\n message: String(detail),\n color: 'red'\n });\n })\n .finally(() => setBusy(false));\n }, [context.api, context.reloadInstance, itemId, loadPreview, overwrite]);\n\n if (!settings.ENABLED) {\n return (\n \n \n {t`Enable the plugin setting 'Enabled' to generate batch codes.`}\n \n \n );\n }\n\n return (\n \n \n \n \n {t`Current batch code`}\n \n {currentCode ? (\n \n {currentCode}\n \n ) : (\n \n {t`Not set`}\n \n )}\n \n \n \n {t`Next code`}\n \n {loading ? (\n \n ) : (\n \n {preview || '—'}\n \n )}\n \n \n\n {error && (\n \n {error}\n \n )}\n\n {canGenerate ? (\n \n setOverwrite(event.currentTarget.checked)}\n label={t`Overwrite the existing batch code`}\n disabled={!currentCode}\n />\n \n \n \n {t`Generate and save`}\n \n \n \n ) : (\n \n {t`You do not have permission to generate batch codes.`}\n \n )}\n\n \n {t`Configuration`}\n \n \n \n );\n}\n\n// This is the function which is called by InvenTree to render the actual panel component\nexport function RenderBatchCodePluginPanel(context: InvenTreePluginContext) {\n checkPluginVersion(context);\n\n return (\n \n \n \n );\n}\n"],"file":"Panel-DT4MHQzh.js"} \ No newline at end of file diff --git a/batchcode_plugin/static/Panel.js b/batchcode_plugin/static/Panel.js new file mode 100644 index 0000000..c07725b --- /dev/null +++ b/batchcode_plugin/static/Panel.js @@ -0,0 +1,2 @@ +const ue="1.5.0";var u=(e=>(e.api_server_info="",e.user_list="user/",e.user_set_password="user/:id/set-password/",e.user_tokens="user/tokens/",e.user_simple_login="email/generate/",e.user_me_profile="user/me/profile/",e.user_me_roles="user/me/roles/",e.user_me_token="user/me/token/",e.user_me="user/me/",e.auth_base="/auth/",e.user_reset="auth/v1/auth/password/request",e.user_reset_set="auth/v1/auth/password/reset",e.auth_pwd_change="auth/v1/account/password/change",e.auth_login="auth/v1/auth/login",e.auth_login_2fa="auth/v1/auth/2fa/authenticate",e.auth_session="auth/v1/auth/session",e.auth_signup="auth/v1/auth/signup",e.auth_authenticators="auth/v1/account/authenticators",e.auth_recovery="auth/v1/account/authenticators/recovery-codes",e.auth_mfa_reauthenticate="auth/v1/auth/2fa/reauthenticate",e.auth_totp="auth/v1/account/authenticators/totp",e.auth_trust="auth/v1/auth/2fa/trust",e.auth_webauthn="auth/v1/account/authenticators/webauthn",e.auth_webauthn_login="auth/v1/auth/webauthn/authenticate",e.auth_reauthenticate="auth/v1/auth/reauthenticate",e.auth_email="auth/v1/account/email",e.auth_email_verify="auth/v1/auth/email/verify",e.auth_providers="auth/v1/account/providers",e.auth_provider_redirect="auth/v1/auth/provider/redirect",e.auth_config="auth/v1/config",e.currency_list="currency/exchange/",e.currency_refresh="currency/refresh/",e.all_units="units/all/",e.task_overview="background-task/",e.task_pending_list="background-task/pending/",e.task_scheduled_list="background-task/scheduled/",e.task_failed_list="background-task/failed/",e.api_search="search/",e.settings_global_list="settings/global/",e.settings_user_list="settings/user/",e.news="news/",e.global_status="generic/status/",e.custom_state_list="generic/status/custom/",e.version="version/",e.license="license/",e.group_list="user/group/",e.owner_list="user/owner/",e.ruleset_list="user/ruleset/",e.content_type_list="contenttype/",e.icons="icons/",e.selectionlist_list="selection/",e.selectionentry_list="selection/:id/entry/",e.barcode="barcode/",e.barcode_history="barcode/history/",e.barcode_link="barcode/link/",e.barcode_unlink="barcode/unlink/",e.barcode_generate="barcode/generate/",e.data_output="data-output/",e.import_session_list="importer/session/",e.import_session_accept_fields="importer/session/:id/accept_fields/",e.import_session_accept_rows="importer/session/:id/accept_rows/",e.import_session_column_mapping_list="importer/column-mapping/",e.import_session_row_list="importer/row/",e.notifications_list="notifications/",e.notifications_readall="notifications/readall/",e.build_order_list="build/",e.build_order_issue="build/:id/issue/",e.build_order_cancel="build/:id/cancel/",e.build_order_hold="build/:id/hold/",e.build_order_complete="build/:id/finish/",e.build_output_complete="build/:id/complete/",e.build_output_create="build/:id/create-output/",e.build_output_scrap="build/:id/scrap-outputs/",e.build_output_delete="build/:id/delete-outputs/",e.build_order_auto_allocate="build/:id/auto-allocate/",e.build_order_allocate="build/:id/allocate/",e.build_order_consume="build/:id/consume/",e.build_order_deallocate="build/:id/unallocate/",e.build_line_list="build/line/",e.build_item_list="build/item/",e.bom_list="bom/",e.bom_item_validate="bom/:id/validate/",e.bom_validate="part/:id/bom-validate/",e.bom_substitute_list="bom/substitute/",e.part_list="part/",e.part_thumbs_list="part/thumbs/",e.part_pricing="part/:id/pricing/",e.part_requirements="part/:id/requirements/",e.part_serial_numbers="part/:id/serial-numbers/",e.part_scheduling="part/:id/scheduling/",e.part_pricing_internal="part/internal-price/",e.part_pricing_sale="part/sale-price/",e.part_stocktake_list="part/stocktake/",e.part_stocktake_generate="part/stocktake/generate/",e.category_list="part/category/",e.category_tree="part/category/tree/",e.category_parameter_list="part/category/parameters/",e.related_part_list="part/related/",e.part_test_template_list="part/test-template/",e.company_list="company/",e.contact_list="company/contact/",e.address_list="company/address/",e.supplier_part_list="company/part/",e.supplier_part_pricing_list="company/price-break/",e.manufacturer_part_list="company/part/manufacturer/",e.stock_location_list="stock/location/",e.stock_location_type_list="stock/location-type/",e.stock_location_tree="stock/location/tree/",e.stock_item_list="stock/",e.stock_tracking_list="stock/track/",e.stock_test_result_list="stock/test/",e.stock_transfer="stock/transfer/",e.stock_remove="stock/remove/",e.stock_return="stock/return/",e.stock_add="stock/add/",e.stock_count="stock/count/",e.stock_change_status="stock/change_status/",e.stock_merge="stock/merge/",e.stock_assign="stock/assign/",e.stock_status="stock/status/",e.stock_convert="stock/:id/convert/",e.stock_disassemble="stock/:id/disassemble/",e.stock_install="stock/:id/install/",e.stock_uninstall="stock/:id/uninstall/",e.stock_serialize="stock/:id/serialize/",e.stock_serial_info="stock/:id/serial-numbers/",e.generate_batch_code="generate/batch-code/",e.generate_serial_number="generate/serial-number/",e.purchase_order_list="order/po/",e.purchase_order_issue="order/po/:id/issue/",e.purchase_order_hold="order/po/:id/hold/",e.purchase_order_cancel="order/po/:id/cancel/",e.purchase_order_complete="order/po/:id/complete/",e.purchase_order_line_list="order/po-line/",e.purchase_order_extra_line_list="order/po-extra-line/",e.purchase_order_receive="order/po/:id/receive/",e.sales_order_list="order/so/",e.sales_order_issue="order/so/:id/issue/",e.sales_order_hold="order/so/:id/hold/",e.sales_order_cancel="order/so/:id/cancel/",e.sales_order_ship="order/so/:id/ship/",e.sales_order_complete="order/so/:id/complete/",e.sales_order_allocate="order/so/:id/allocate/",e.sales_order_allocate_serials="order/so/:id/allocate-serials/",e.sales_order_auto_allocate="order/so/:id/auto-allocate/",e.sales_order_line_list="order/so-line/",e.sales_order_extra_line_list="order/so-extra-line/",e.sales_order_allocation_list="order/so-allocation/",e.sales_order_shipment_list="order/so/shipment/",e.sales_order_shipment_complete="order/so/shipment/:id/ship/",e.return_order_list="order/ro/",e.return_order_issue="order/ro/:id/issue/",e.return_order_hold="order/ro/:id/hold/",e.return_order_cancel="order/ro/:id/cancel/",e.return_order_complete="order/ro/:id/complete/",e.return_order_receive="order/ro/:id/receive/",e.return_order_line_list="order/ro-line/",e.return_order_extra_line_list="order/ro-extra-line/",e.transfer_order_list="order/transfer-order/",e.transfer_order_issue="order/transfer-order/:id/issue/",e.transfer_order_hold="order/transfer-order/:id/hold/",e.transfer_order_cancel="order/transfer-order/:id/cancel/",e.transfer_order_complete="order/transfer-order/:id/complete/",e.transfer_order_allocate="order/transfer-order/:id/allocate/",e.transfer_order_allocate_serials="order/transfer-order/:id/allocate-serials/",e.transfer_order_line_list="order/transfer-order-line/",e.transfer_order_allocation_list="order/transfer-order-allocation/",e.label_list="label/template/",e.label_print="label/print/",e.report_list="report/template/",e.report_print="report/print/",e.report_snippet="report/snippet/",e.report_asset="report/asset/",e.plugin_list="plugins/",e.plugin_setting_list="plugins/:plugin/settings/",e.plugin_user_setting_list="plugins/:plugin/user-settings/",e.plugin_registry_status="plugins/status/",e.plugin_install="plugins/install/",e.plugin_reload="plugins/reload/",e.plugin_activate="plugins/:key/activate/",e.plugin_uninstall="plugins/:key/uninstall/",e.plugin_admin="plugins/:key/admin/",e.plugin_ui_features_list="plugins/ui/features/:feature_type/",e.plugin_locate_item="locate/",e.plugin_supplier_list="supplier/list/",e.plugin_supplier_search="supplier/search/",e.plugin_supplier_import="supplier/import/",e.machine_types_list="machine/types/",e.machine_driver_list="machine/drivers/",e.machine_registry_status="machine/status/",e.machine_list="machine/",e.machine_restart="machine/:machine/restart/",e.machine_setting_list="machine/:machine/settings/",e.machine_setting_detail="machine/:machine/settings/:config_type/",e.attachment_list="attachment/",e.error_report_list="error-report/",e.project_code_list="project-code/",e.custom_unit_list="units/",e.notes_image_upload="notes-image-upload/",e.email_list="admin/email/",e.email_test="admin/email/test/",e.config_list="admin/config/",e.parameter_list="parameter/",e.parameter_template_list="parameter/template/",e.tag_list="tag/",e.system_internal_trace_end="system-internal/observability/end",e))(u||{});window.LinguiCore.i18n;window.LinguiCore.i18n;u.part_list,u.parameter_list,u.parameter_template_list,u.part_test_template_list,u.supplier_part_list,u.manufacturer_part_list,u.category_list,u.stock_item_list,u.stock_location_list,u.stock_location_type_list,u.stock_tracking_list,u.build_order_list,u.build_line_list,u.build_item_list,u.company_list,u.project_code_list,u.purchase_order_list,u.purchase_order_line_list,u.sales_order_list,u.sales_order_shipment_list,u.return_order_list,u.return_order_line_list,u.transfer_order_list,u.transfer_order_line_list,u.address_list,u.contact_list,u.owner_list,u.user_list,u.group_list,u.import_session_list,u.label_list,u.report_list,u.plugin_list,u.content_type_list,u.selectionlist_list,u.selectionentry_list,u.error_report_list,u.tag_list;window.React.useEffect;window.React.useEffectEvent;window.LinguiCore.i18n;window.MantineNotifications.notifications;var J={exports:{}},$={},de;function Xe(){if(de)return $;de=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function r(n,o,s){var i=null;if(s!==void 0&&(i=""+s),o.key!==void 0&&(i=""+o.key),"key"in o){s={};for(var a in o)a!=="key"&&(s[a]=o[a])}else s=o;return o=s.ref,{$$typeof:e,type:n,key:i,ref:o!==void 0?o:null,props:s}}return $.Fragment=t,$.jsx=r,$.jsxs=r,$}var _e;function Ke(){return _e||(_e=1,J.exports=Xe()),J.exports}var he=Ke();window.MantineCore.ActionIcon;window.MantineCore.Group;window.MantineCore.Tooltip;const Qe=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,$e=Object.prototype.toString;function Ze(e){switch($e.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return rt(e,Error)}}function Ae(e,t){return $e.call(e)===`[object ${t}]`}function et(e){return Ae(e,"Object")}function tt(e){return!!(e?.then&&typeof e.then=="function")}function rt(e,t){try{return e instanceof t}catch{return!1}}const E="10.70.0",k=globalThis;function Y(){return oe(k),k}function oe(e){const t=e.__SENTRY__=e.__SENTRY__||{};return t.version=t.version||E,t[E]=t[E]||{}}function se(e,t,r=k){const n=r.__SENTRY__=r.__SENTRY__||{},o=n[E]=n[E]||{};return o[e]||(o[e]=t())}const T=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__;let N;function W(e){if(N!==void 0)return N?N(e):e();const t=Symbol.for("__SENTRY_SAFE_RANDOM_ID_WRAPPER__"),r=k;return t in r&&typeof r[t]=="function"?(N=r[t],N(e)):(N=null,e())}function te(){return W(()=>Math.random())}function nt(){return W(()=>Date.now())}function ot(){const e=k;return e.crypto||e.msCrypto}let X;function st(){return te()*16}function F(e=ot()){try{if(e?.randomUUID)return W(()=>e.randomUUID()).replace(/-/g,"")}catch{}return X||(X="10000000100040008000"+1e11),X.replace(/[018]/g,t=>(t^(st()&15)>>t/4).toString(16))}const Oe=1e3;function Ue(){return nt()/Oe}function it(){const{performance:e}=k;if(!e?.now||!e.timeOrigin)return Ue;const t=e.timeOrigin;return()=>(t+W(()=>e.now()))/Oe}let fe;function at(){return(fe??(fe=it()))()}function ct(e,t={}){if(t.user&&(!e.ipAddress&&t.user.ip_address&&(e.ipAddress=t.user.ip_address),!e.did&&!t.did&&(e.did=t.user.id||t.user.email||t.user.username)),e.timestamp=t.timestamp||at(),t.abnormal_mechanism&&(e.abnormal_mechanism=t.abnormal_mechanism),t.ignoreDuration&&(e.ignoreDuration=t.ignoreDuration),t.sid&&(e.sid=t.sid.length===32?t.sid:F()),t.init!==void 0&&(e.init=t.init),!e.did&&t.did&&(e.did=`${t.did}`),typeof t.started=="number"&&(e.started=t.started),e.ignoreDuration)e.duration=void 0;else if(typeof t.duration=="number")e.duration=t.duration;else{const r=e.timestamp-e.started;e.duration=r>=0?r:0}t.release&&(e.release=t.release),t.environment&&(e.environment=t.environment),!e.ipAddress&&t.ipAddress&&(e.ipAddress=t.ipAddress),!e.userAgent&&t.userAgent&&(e.userAgent=t.userAgent),typeof t.errors=="number"&&(e.errors=t.errors),t.status&&(e.status=t.status)}const lt="Sentry Logger ",me={};function je(e){if(!("console"in k))return e();const t=k.console,r={},n=Object.keys(me);n.forEach(o=>{const s=me[o];r[o]=t[o],t[o]=s});try{return e()}finally{n.forEach(o=>{t[o]=r[o]})}}function ut(){ae().enabled=!0}function dt(){ae().enabled=!1}function Ee(){return ae().enabled}function _t(...e){ie("log",...e)}function ht(...e){ie("warn",...e)}function ft(...e){ie("error",...e)}function ie(e,...t){T&&Ee()&&je(()=>{k.console[e](`${lt}[${e}]:`,...t)})}function ae(){return T?se("loggerSettings",()=>({enabled:!1})):{enabled:!1}}const S={enable:ut,disable:dt,isEnabled:Ee,log:_t,warn:ht,error:ft};function Fe(e,t,r=2){if(!t||typeof t!="object"||r<=0)return t;if(e&&Object.keys(t).length===0)return e;const n={...e};for(const o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=Fe(n[o],t[o],r-1));return n}function ge(){return F()}function mt(e,t,r){try{Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0})}catch{T&&S.log(`Failed to add non-enumerable property "${String(t)}" to object`,e)}}function gt(e){try{const t=k.WeakRef;if(typeof t=="function")return new t(e)}catch{}return e}function pt(e){if(e){if(typeof e=="object"&&"deref"in e&&typeof e.deref=="function")try{return e.deref()}catch{return}return e}}const re="_sentrySpan";function pe(e,t){t?mt(e,re,gt(t)):delete e[re]}function we(e){return pt(e[re])}function wt(e,t=0){return typeof e!="string"||t===0||e.length<=t?e:`${e.slice(0,t)}...`}const vt=100;class L{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._attributes={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext={traceId:ge(),sampleRand:te()}}clone(){const t=new L;return t._breadcrumbs=[...this._breadcrumbs],t._tags={...this._tags},t._attributes={...this._attributes},t._extra={...this._extra},t._contexts={...this._contexts},this._contexts.flags&&(t._contexts.flags={values:[...this._contexts.flags.values]}),t._user=this._user,t._level=this._level,t._session=this._session,t._transactionName=this._transactionName,t._fingerprint=this._fingerprint,t._eventProcessors=[...this._eventProcessors],t._attachments=[...this._attachments],t._sdkProcessingMetadata={...this._sdkProcessingMetadata},t._propagationContext={...this._propagationContext},t._client=this._client,t._lastEventId=this._lastEventId,t._conversationId=this._conversationId,pe(t,we(this)),t}setClient(t){this._client=t}setLastEventId(t){this._lastEventId=t}getClient(){return this._client}lastEventId(){return this._lastEventId}addScopeListener(t){this._scopeListeners.push(t)}addEventProcessor(t){return this._eventProcessors.push(t),this}setUser(t){return this._user=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this._session&&ct(this._session,{user:t}),this._notifyScopeListeners(),this}getUser(){return this._user}setConversationId(t){return this._conversationId=t||void 0,this._notifyScopeListeners(),this}setTags(t){return this._tags={...this._tags,...t},this._notifyScopeListeners(),this}setTag(t,r){return this.setTags({[t]:r})}setAttributes(t){return this._attributes={...this._attributes,...t},this._notifyScopeListeners(),this}setAttribute(t,r){return this.setAttributes({[t]:r})}removeAttribute(t){return t in this._attributes&&(delete this._attributes[t],this._notifyScopeListeners()),this}setExtras(t){return this._extra={...this._extra,...t},this._notifyScopeListeners(),this}setExtra(t,r){return this._extra={...this._extra,[t]:r},this._notifyScopeListeners(),this}setFingerprint(t){return this._fingerprint=t,this._notifyScopeListeners(),this}setLevel(t){return this._level=t,this._notifyScopeListeners(),this}setTransactionName(t){return this._transactionName=t,this._notifyScopeListeners(),this}setContext(t,r){return r===null?delete this._contexts[t]:this._contexts[t]=r,this._notifyScopeListeners(),this}setSession(t){return t?this._session=t:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(t){if(!t)return this;const r=typeof t=="function"?t(this):t,n=r instanceof L?r.getScopeData():et(r)?t:void 0,{tags:o,attributes:s,extra:i,user:a,contexts:d,level:c,fingerprint:l=[],propagationContext:_,conversationId:m}=n||{};return this._tags={...this._tags,...o},this._attributes={...this._attributes,...s},this._extra={...this._extra,...i},this._contexts={...this._contexts,...d},a&&Object.keys(a).length&&(this._user=a),c&&(this._level=c),l.length&&(this._fingerprint=l),_&&(this._propagationContext=_),m&&(this._conversationId=m),this}clear(){return this._breadcrumbs=[],this._tags={},this._attributes={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._session=void 0,this._conversationId=void 0,pe(this,void 0),this._attachments=[],this.setPropagationContext({traceId:ge(),sampleRand:te()}),this._notifyScopeListeners(),this}addBreadcrumb(t,r){const n=typeof r=="number"?r:vt;if(n<=0)return this;const o={timestamp:Ue(),...t,message:t.message?wt(t.message,2048):t.message};return this._breadcrumbs.push(o),this._breadcrumbs.length>n&&(this._breadcrumbs=this._breadcrumbs.slice(-n),this._client?.recordDroppedEvent("buffer_overflow","log_item")),this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(t){return this._attachments.push(t),this}clearAttachments(){return this._attachments=[],this}getScopeData(){return{breadcrumbs:this._breadcrumbs,attachments:this._attachments,contexts:this._contexts,tags:this._tags,attributes:this._attributes,extra:this._extra,user:this._user,level:this._level,fingerprint:this._fingerprint||[],eventProcessors:this._eventProcessors,propagationContext:this._propagationContext,sdkProcessingMetadata:this._sdkProcessingMetadata,transactionName:this._transactionName,span:we(this),conversationId:this._conversationId}}setSDKProcessingMetadata(t){return this._sdkProcessingMetadata=Fe(this._sdkProcessingMetadata,t,2),this}setPropagationContext(t){return this._propagationContext=t,this}getPropagationContext(){return this._propagationContext}captureException(t,r){const n=r?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture exception!"),n;const o=new Error("Sentry syntheticException");return this._client.captureException(t,{originalException:t,syntheticException:o,...r,event_id:n},this),n}captureMessage(t,r,n){const o=n?.event_id||F();if(!this._client)return T&&S.warn("No client configured on scope - will not capture message!"),o;const s=n?.syntheticException??new Error(t);return this._client.captureMessage(t,r,{originalException:t,syntheticException:s,...n,event_id:o},this),o}captureEvent(t,r){const n=t.event_id||r?.event_id||F();return this._client?(this._client.captureEvent(t,{...r,event_id:n},this),n):(T&&S.warn("No client configured on scope - will not capture event!"),n)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach(t=>{t(this)}),this._notifyingListeners=!1)}}function bt(){return se("defaultCurrentScope",()=>new L)}function yt(){return se("defaultIsolationScope",()=>new L)}const ve=e=>e instanceof Promise&&!e[Be],Be=Symbol("chained PromiseLike"),St=(e,t,r)=>{const n=e.then(o=>(t(o),o),o=>{throw r(o),o});return ve(n)&&ve(e)?n:kt(e,n)},kt=(e,t)=>{if(!t)return e;let r=!1;for(const n in e){if(n in t)continue;r=!0;const o=e[n];typeof o=="function"?Object.defineProperty(t,n,{value:(...s)=>o.apply(e,s),enumerable:!0,configurable:!0,writable:!0}):t[n]=o}return r&&Object.assign(t,{[Be]:!0}),t};class Rt{constructor(t,r){let n;t?n=t:n=new L;let o;r?o=r:o=new L,this._stack=[{scope:n}],this._isolationScope=o}withScope(t){const r=this._pushScope();let n;try{n=t(r)}catch(o){throw this._popScope(),o}return tt(n)?St(n,()=>this._popScope(),()=>this._popScope()):(this._popScope(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStackTop(){return this._stack[this._stack.length-1]}_pushScope(){const t=this.getScope().clone();return this._stack.push({client:this.getClient(),scope:t}),t}_popScope(){return this._stack.length<=1?!1:!!this._stack.pop()}}function x(){const e=Y(),t=oe(e);return t.stack=t.stack||new Rt(bt(),yt())}function Ct(e){return x().withScope(e)}function Mt(e,t){const r=x();return r.withScope(()=>(r.getStackTop().scope=e,t(e)))}function be(e){return x().withScope(()=>e(x().getIsolationScope()))}function It(){return{withIsolationScope:be,withScope:Ct,withSetScope:Mt,withSetIsolationScope:(e,t)=>be(t),getCurrentScope:()=>x().getScope(),getIsolationScope:()=>x().getIsolationScope()}}function ce(e){const t=oe(e);return t.acs?t.acs:It()}function le(){const e=Y();return ce(e).getCurrentScope()}function Lt(){const e=Y();return ce(e).getIsolationScope()}function Pt(...e){const t=Y(),r=ce(t);if(e.length===2){const[n,o]=e;return n?r.withSetScope(n,o):r.withScope(o)}return r.withScope(e[0])}function Ge(){return le().getClient()}function Tt(e){if(e)return Nt(e)?{captureContext:e}:xt(e)?{captureContext:e}:e}function Nt(e){return e instanceof L||typeof e=="function"}const Dt=["user","level","extra","contexts","tags","fingerprint","propagationContext"];function xt(e){return Object.keys(e).some(t=>Dt.includes(t))}function $t(e,t){return le().captureException(e,Tt(t))}function Ot(){return Lt().lastEventId()}const Ut=window.React.version;function jt(e){const t=e.match(/^([^.]+)/);return t!==null&&parseInt(t[0])>=17}function Et(e,t){const r=new WeakSet;function n(o,s){if(!r.has(o)){if(o.cause)return r.add(o),n(o.cause,s);o.cause=s}}n(e,t)}function Ft(e,{componentStack:t},r){if(jt(Ut)&&Ze(e)&&t){const n=new Error(e.message);n.name=`React ErrorBoundary ${e.name}`,n.stack=t,Et(e,n)}return $t(e,r)}const ye=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,G=k,Bt=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)((?:\[[:.%\w]+\]|[\w.-]+))(?::(\d+))?\/(.+)/;function Gt(e){return e==="http"||e==="https"}function Ht(e,t=!1){const{host:r,path:n,pass:o,port:s,projectId:i,protocol:a,publicKey:d}=e;return`${a}://${d}${t&&o?`:${o}`:""}@${r}${s?`:${s}`:""}/${n&&`${n}/`}${i}`}function Vt(e){const t=Bt.exec(e);if(!t){je(()=>{console.error(`Invalid Sentry Dsn: ${e}`)});return}const[r,n,o="",s="",i="",a=""]=t.slice(1);let d="",c=a;const l=c.split("/");if(l.length>1&&(d=l.slice(0,-1).join("/"),c=l.pop()),c){const _=c.match(/^\d+/);_&&(c=_[0])}return He({host:s,pass:o,path:d,projectId:c,port:i,protocol:r,publicKey:n})}function He(e){return{protocol:e.protocol,publicKey:e.publicKey||"",pass:e.pass||"",host:e.host,port:e.port||"",path:e.path||"",projectId:e.projectId}}function qt(e){if(!T)return!0;const{port:t,projectId:r,protocol:n}=e;return["protocol","publicKey","host","projectId"].find(i=>e[i]?!1:(S.error(`Invalid Sentry Dsn: ${i} missing`),!0))?!1:r.match(/^\d+$/)?Gt(n)?t&&isNaN(parseInt(t,10))?(S.error(`Invalid Sentry Dsn: Invalid port ${t}`),!1):!0:(S.error(`Invalid Sentry Dsn: Invalid protocol ${n}`),!1):(S.error(`Invalid Sentry Dsn: Invalid projectId ${r}`),!1)}function Yt(e){const t=typeof e=="string"?Vt(e):He(e);if(!(!t||!qt(t)))return t}function Wt(e){const t=e.protocol?`${e.protocol}:`:"",r=e.port?`:${e.port}`:"";return`${t}//${e.host}${r}${e.path?`/${e.path}`:""}/api/`}function zt(e,t){const r=Yt(e);if(!r)return"";const n=`${Wt(r)}embed/error-page/`;let o=`dsn=${Ht(r)}`;for(const s in t)if(s!=="dsn"&&s!=="onClose")if(s==="user"){const i=t.user;if(!i)continue;i.name&&(o+=`&name=${encodeURIComponent(i.name)}`),i.email&&(o+=`&email=${encodeURIComponent(i.email)}`)}else o+=`&${encodeURIComponent(s)}=${encodeURIComponent(t[s])}`;return`${n}?${o}`}function Se(e={}){const t=G.document,r=t?.head||t?.body;if(!r){ye&&S.error("[showReportDialog] Global document not defined");return}const n=le(),s=Ge()?.getDsn();if(!s){ye&&S.error("[showReportDialog] DSN not configured");return}const i={...e,user:{...n.getUser(),...e.user},eventId:e.eventId||Ot()},a=G.document.createElement("script");a.async=!0,a.crossOrigin="anonymous",a.src=zt(s,i);const{onLoad:d,onClose:c}=i;if(d&&(a.onload=d),c){const l=_=>{if(_.data==="__sentry_reportdialog_closed__")try{c()}finally{G.removeEventListener("message",l)}};G.addEventListener("message",l)}r.appendChild(a)}const K=window.React,Q={componentStack:null,error:null,eventId:null};class nn extends K.Component{constructor(t){super(t),this.state=Q,this._openFallbackReportDialog=!0;const r=Ge();r&&t.showDialog&&(this._openFallbackReportDialog=!1,this._cleanupHook=r.on("afterSendEvent",n=>{!n.type&&this._lastEventId&&n.event_id===this._lastEventId&&Se({...t.dialogOptions,eventId:this._lastEventId})}))}componentDidCatch(t,r){const{componentStack:n}=r,{beforeCapture:o,onError:s,showDialog:i,dialogOptions:a}=this.props;Pt(d=>{o&&o(d,t,n);const c=this.props.handled!=null?this.props.handled:!!this.props.fallback,l=Ft(t,r,{mechanism:{handled:c,type:"auto.function.react.error_boundary"}});s&&s(t,n,l),i&&(this._lastEventId=l,this._openFallbackReportDialog&&Se({...a,eventId:l})),this.setState({error:t,componentStack:n,eventId:l})})}componentDidMount(){const{onMount:t}=this.props;t&&t()}componentWillUnmount(){const{error:t,componentStack:r,eventId:n}=this.state,{onUnmount:o}=this.props;o&&(this.state===Q?o(null,null,null):o(t,r,n)),this._cleanupHook&&(this._cleanupHook(),this._cleanupHook=void 0)}resetErrorBoundary(){const{onReset:t}=this.props,{error:r,componentStack:n,eventId:o}=this.state;t&&t(r,n,o),this.setState(Q)}render(){const{fallback:t,children:r}=this.props,n=this.state;if(n.componentStack===null)return typeof r=="function"?r():r;const o=typeof t=="function"?K.createElement(t,{error:n.error,componentStack:n.componentStack,resetError:()=>this.resetErrorBoundary(),eventId:n.eventId}):t;return K.isValidElement(o)?o:(t&&Qe&&S.warn("fallback did not produce a valid ReactElement"),null)}}var Jt={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};const Xt=window.React.forwardRef,Z=window.React.createElement,w=(e,t,r,n)=>{const o=Xt(({color:s="currentColor",size:i=24,stroke:a=2,title:d,className:c,children:l,..._},m)=>Z("svg",{ref:m,...Jt[e],width:i,height:i,className:["tabler-icon",`tabler-icon-${t}`,c].join(" "),strokeWidth:a,stroke:s,..._},[d&&Z("title",{key:"svg-title"},d),...n.map(([g,y])=>Z(g,y)),...Array.isArray(l)?l:[l]]));return o.displayName=`${r}`,o},Kt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M12 9v4",key:"svg-1"}],["path",{d:"M12 16v.01",key:"svg-2"}]];w("outline","exclamation-circle","ExclamationCircle",Kt);const Qt=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 9h.01",key:"svg-1"}],["path",{d:"M11 12h1v4h1",key:"svg-2"}]];w("outline","info-circle","InfoCircle",Qt);window.LinguiCore.i18n;window.MantineCore.Alert;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useState;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;const Zt=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]];w("outline","check","Check",Zt);const At=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]];w("outline","copy","Copy",At);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Button;window.MantineCore.CopyButton;window.MantineCore.Text;window.MantineCore.Tooltip;window.MantineCore.Group;window.React.useState;window.MantineCore.Group;window.MantineCore.Progress;window.MantineCore.Stack;window.MantineCore.Text;window.React.useMemo;window.LinguiCore.i18n;window.MantineCore.Badge;window.MantineCore.Skeleton;window.React.useCallback;window.React.useEffect;window.React.useRef;window.React.useState;const er=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]];w("outline","search","Search",er);window.LinguiCore.i18n;window.MantineCore.CloseButton;window.MantineCore.TextInput;window.React.useEffect;window.React.useState;const tr=[["path",{d:"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M6 4v4",key:"svg-1"}],["path",{d:"M6 12v8",key:"svg-2"}],["path",{d:"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-3"}],["path",{d:"M12 4v10",key:"svg-4"}],["path",{d:"M12 18v2",key:"svg-5"}],["path",{d:"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-6"}],["path",{d:"M18 4v1",key:"svg-7"}],["path",{d:"M18 9v11",key:"svg-8"}]];w("outline","adjustments","Adjustments",tr);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Checkbox;window.MantineCore.Divider;window.MantineCore.Menu;window.MantineCore.Tooltip;const rr=[["path",{d:"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3",key:"svg-1"}]];w("outline","tag","Tag",rr);window.MantineCore.ActionIcon;window.MantineCore.Badge;window.MantineCore.Group;window.MantineCore.Paper;window.MantineCore.Alert;const nr=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]];w("outline","dots","Dots",nr);const or=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M10 10l4 4m0 -4l-4 4",key:"svg-1"}]];w("outline","circle-x","CircleX",or);const sr=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]];w("outline","trash","Trash",sr);const ir=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]];w("outline","edit","Edit",ir);const ar=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]];w("outline","arrow-right","ArrowRight",ar);window.LinguiCore.i18n;window.MantineCore.ActionIcon;window.MantineCore.Menu;window.MantineCore.Tooltip;window.React.useMemo;window.React.useState;window.React.useEffect;window.React.useState;var Ve=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},cr=class extends Ve{#t;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e();return window.addEventListener("visibilitychange",t,!1),()=>{window.removeEventListener("visibilitychange",t)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(t=>{typeof t=="boolean"?this.setFocused(t):this.onFocus()})}setFocused(e){this.#t!==e&&(this.#t=e,this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#t=="boolean"?this.#t:globalThis.document?.visibilityState!=="hidden"}};new cr;var lr=class extends Ve{#t=!0;#e;#r;constructor(){super(),this.#r=e=>{if(typeof window<"u"&&window.addEventListener){const t=()=>e(!0),r=()=>e(!1);return window.addEventListener("online",t,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",t),window.removeEventListener("offline",r)}}}}onSubscribe(){this.#e||this.setEventListener(this.#r)}onUnsubscribe(){this.hasListeners()||(this.#e?.(),this.#e=void 0)}setEventListener(e){this.#r=e,this.#e?.(),this.#e=e(this.setOnline.bind(this))}setOnline(e){this.#t!==e&&(this.#t=e,this.listeners.forEach(r=>{r(e)}))}isOnline(){return this.#t}};new lr;const ur=window.React;ur.createContext(void 0);const dr=window.React;function _r(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}dr.createContext(_r());const hr=window.React;var fr=hr.createContext(!1);fr.Provider;const mr=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l2 2l4 -4",key:"svg-1"}]];w("outline","circle-check","CircleCheck",mr);window.LinguiCore.i18n;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.MantineNotifications.notifications;window.MantineNotifications.showNotification;window.React.useEffect;window.React.useState;window.React.useEffect;window.React.useEffectEvent;window.React.useCallback;window.React.useEffect;window.React.useState;window.React.useCallback;window.React.useEffect;window.React.useMemo;window.React.useCallback;window.React.useMemo;window.React.useState;var ke;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(ke||(ke={}));var Re;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Re||(Re={}));class gr extends Error{}const qe=["post","put","patch","delete"];new Set(qe);const pr=["get",...qe];new Set(pr);const C=window.React,Ce=C.createContext(null),wr=C.createContext({outlet:null,matches:[],isDataRoute:!1}),vr=C.createContext(null);class on extends C.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?C.createElement(wr.Provider,{value:this.props.routeContext},C.createElement(vr.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}const br="startTransition";C[br];var b=(function(e){return e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error",e})(b||{});const yr=new Promise(()=>{});class sn extends C.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error(" caught the following error during render",t,r)}render(){let{children:t,errorElement:r,resolve:n}=this.props,o=null,s=b.pending;if(!(n instanceof Promise))s=b.success,o=Promise.resolve(),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_data",{get:()=>n});else if(this.state.error){s=b.error;let i=this.state.error;o=Promise.reject().catch(()=>{}),Object.defineProperty(o,"_tracked",{get:()=>!0}),Object.defineProperty(o,"_error",{get:()=>i})}else n._tracked?(o=n,s="_error"in o?b.error:"_data"in o?b.success:b.pending):(s=b.pending,Object.defineProperty(n,"_tracked",{get:()=>!0}),o=n.then(i=>Object.defineProperty(n,"_data",{get:()=>i}),i=>Object.defineProperty(n,"_error",{get:()=>i})));if(s===b.error&&o._error instanceof gr)throw yr;if(s===b.error&&!r)throw o._error;if(s===b.error)return C.createElement(Ce.Provider,{value:o,children:r});if(s===b.success)return C.createElement(Ce.Provider,{value:o,children:t});throw o}}const Ye=window.React,Sr=window.ReactDOM,kr="6";try{window.__reactRouterVersion=kr}catch{}const Rr="startTransition";Ye[Rr];const Cr="flushSync";Sr[Cr];const Mr="useId";Ye[Mr];var Me;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Me||(Me={}));var Ie;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ie||(Ie={}));function Ir(e,t){let r;try{r=e()}catch{return}return{getItem:o=>{var s;const i=d=>d===null?null:JSON.parse(d,void 0),a=(s=r.getItem(o))!=null?s:null;return a instanceof Promise?a.then(i):i(a)},setItem:(o,s)=>r.setItem(o,JSON.stringify(s,void 0)),removeItem:o=>r.removeItem(o)}}const ne=e=>t=>{try{const r=e(t);return r instanceof Promise?r:{then(n){return ne(n)(r)},catch(n){return this}}}catch(r){return{then(n){return this},catch(n){return ne(n)(r)}}}},Lr=(e,t)=>(r,n,o)=>{let s={storage:Ir(()=>window.localStorage),partialize:h=>h,version:0,merge:(h,p)=>({...p,...h}),...t},i=!1,a=0;const d=new Set,c=new Set;let l=s.storage;if(!l)return e((...h)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),r(...h)},n,o);const _=()=>{const h=s.partialize({...n()});return l.setItem(s.name,{state:h,version:s.version})},m=o.setState;o.setState=(h,p)=>(m(h,p),_());const g=e((...h)=>(r(...h),_()),n,o);o.getInitialState=()=>g;let y;const I=()=>{var h,p;if(!l)return;const P=++a;i=!1,d.forEach(v=>{var M;return v((M=n())!=null?M:g)});const B=((p=s.onRehydrateStorage)==null?void 0:p.call(s,(h=n())!=null?h:g))||void 0;return ne(l.getItem.bind(l))(s.name).then(v=>{if(v)if(typeof v.version=="number"&&v.version!==s.version){if(s.migrate){const M=s.migrate(v.state,v.version);return M instanceof Promise?M.then(z=>[!0,z]):[!0,M]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,v.state];return[!1,void 0]}).then(v=>{var M;if(P!==a)return;const[z,Je]=v;if(y=s.merge(Je,(M=n())!=null?M:g),r(y,!0),z)return _()}).then(()=>{P===a&&(B?.(n(),void 0),y=n(),i=!0,c.forEach(v=>v(y)))}).catch(v=>{P===a&&B?.(void 0,v)})};return o.persist={setOptions:h=>{s={...s,...h},h.storage&&(l=h.storage)},clearStorage:()=>{l?.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>I(),hasHydrated:()=>i,onHydrate:h=>(d.add(h),()=>{d.delete(h)}),onFinishHydration:h=>(c.add(h),()=>{c.delete(h)})},s.skipHydration||I(),y||g},We=Lr,Le=e=>{let t;const r=new Set,n=(c,l)=>{const _=typeof c=="function"?c(t):c;if(!Object.is(_,t)){const m=t;t=l??(typeof _!="object"||_===null)?_:Object.assign({},t,_),r.forEach(g=>g(t,m))}},o=()=>t,a={setState:n,getState:o,getInitialState:()=>d,subscribe:c=>(r.add(c),()=>r.delete(c))},d=t=e(n,o,a);return a},Pr=(e=>e?Le(e):Le),H=window.React,Tr=e=>e;function Nr(e,t=Tr){const r=H.useSyncExternalStore(e.subscribe,H.useCallback(()=>t(e.getState()),[e,t]),H.useCallback(()=>t(e.getInitialState()),[e,t]));return H.useDebugValue(r),r}const Dr=e=>{const t=Pr(e),r=n=>Nr(t,n);return Object.assign(r,t),r},ze=(e=>Dr);ze()(We((e,t)=>({detailDrawerStack:0,addDetailDrawer:r=>{e({detailDrawerStack:r===!1?0:t().detailDrawerStack+r})},hotkeys:{},addHotkeys:r=>{const n={...t().hotkeys};for(const[o,s]of r)n[o]=s;e({hotkeys:n})},removeHotkeys:r=>{const n={...t().hotkeys};for(const o of r)delete n[o];e({hotkeys:n})}}),{name:"session-settings-inventreedb_lib"}));window.MantineCore.Text;window.MantineCore.darken;window.MantineCore.getThemeColor;window.MantineCore.useMantineTheme;window.React.useMemo;const xr=[["path",{d:"M15 6l-6 6l6 6",key:"svg-0"}]];w("outline","chevron-left","ChevronLeft",xr);window.MantineCore.ActionIcon;window.MantineCore.Divider;window.MantineCore.Drawer;window.MantineCore.Group;window.MantineCore.Stack;window.MantineCore.Text;window.React.useCallback;window.React.useMemo;const $r=25;ze()(We((e,t)=>({pageSize:$r,setPageSize:r=>{e(n=>({pageSize:r}))},tableSorting:{},getTableSorting:r=>t().tableSorting[r]||{},setTableSorting:r=>n=>{e({tableSorting:{...t().tableSorting,[r]:n}})},tableColumnNames:{},getTableColumnNames:r=>t().tableColumnNames[r]||null,setTableColumnNames:r=>n=>{e({tableColumnNames:{...t().tableColumnNames,[r]:n}})},clearTableColumnNames:()=>{e({tableColumnNames:{}})},hiddenColumns:{},getHiddenColumns:r=>t().hiddenColumns?.[r]??null,setHiddenColumns:r=>n=>{e({hiddenColumns:{...t().hiddenColumns,[r]:n}})}}),{name:"inventree-table-state"}));const Or=window.LinguiReact.I18nProvider,Ur=window.MantineCore.Skeleton,jr=window.React.useEffect,Er=window.React.useState;async function V(e,t){try{return await t(e)}catch{return console.warn(`Failed to load locale ${e}`),null}}async function Fr(e,t,r){let n=null;if(n=await V(t,r),!n&&t.includes("-")){const o=t.split("-")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}if(!n&&t.includes("_")){const o=t.split("_")[0];console.debug(`Locale ${t} not found, trying fallback locale ${o}`),n=await V(o,r)}!n&&t!=="en"&&(console.debug(`Locale ${t} not found, trying fallback locale en`),n=await V("en",r)),n?.messages?(e.load(t,n.messages),e.activate(t)):console.error(`Failed to load any locale for ${t}`)}const Br=async e=>null;function Gr({i18n:e,locale:t,loadLocale:r,children:n}){const[o,s]=Er(!1);return jr(()=>{s(!1),Fr(e,t,r??Br).then(()=>{s(!0)})},[e,t,r]),o?he.jsx(Or,{i18n:e,children:n}):he.jsx(Ur,{w:"100%",animate:!0})}window.React.useEffect;function Hr(e){const t=e?.version?.inventree||"";ue!=t&&console.info(`Plugin version mismatch! Expected version ${ue}, got ${t}`)}const Vr=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]];w("outline","plus","Plus",Vr);const qr="modulepreload",Yr=function(e){return"/"+e},Pe={},R=function(t,r,n){let o=Promise.resolve();if(r&&r.length>0){let i=function(c){return Promise.all(c.map(l=>Promise.resolve(l).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),d=a?.nonce||a?.getAttribute("nonce");o=i(r.map(c=>{if(c=Yr(c),c in Pe)return;Pe[c]=!0;const l=c.endsWith(".css"),_=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${_}`))return;const m=document.createElement("link");if(m.rel=l?"stylesheet":qr,l||(m.as="script"),m.crossOrigin="",m.href=c,d&&m.setAttribute("nonce",d),document.head.appendChild(m),l)return new Promise((g,y)=>{m.addEventListener("load",g),m.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(i){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i}return o.then(i=>{for(const a of i||[])a.status==="rejected"&&s(a.reason);return t().catch(s)})},Wr=(e,t,r)=>{const n=e[t];return n?typeof n=="function"?n():Promise.resolve(n):new Promise((o,s)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(s.bind(null,new Error("Unknown variable dynamic import: "+t+(t.split("/").length!==r?". Note that variables only represent file names one level deep.":""))))})},zr=async e=>Wr(Object.assign({"./locales/de/messages.ts":()=>R(()=>import("./assets/messages-SySx3VqF.js"),[]),"./locales/en/messages.ts":()=>R(()=>import("./assets/messages-BVqXLN8V.js"),[]),"./locales/es/messages.ts":()=>R(()=>import("./assets/messages-B19F09LY.js"),[]),"./locales/fr/messages.ts":()=>R(()=>import("./assets/messages-DtuQFlMQ.js"),[]),"./locales/it/messages.ts":()=>R(()=>import("./assets/messages-m7AYrdMP.js"),[]),"./locales/ja/messages.ts":()=>R(()=>import("./assets/messages-BwzuZfs7.js"),[]),"./locales/pseudo-LOCALE/messages.ts":()=>R(()=>import("./assets/messages-6MO-OwBA.js"),[]),"./locales/ru/messages.ts":()=>R(()=>import("./assets/messages-BaNfSHmL.js"),[]),"./locales/zh_Hans/messages.ts":()=>R(()=>import("./assets/messages-uDIARWjl.js"),[]),"./locales/zh_Hant/messages.ts":()=>R(()=>import("./assets/messages-Bs4XYOTm.js"),[])}),`./locales/${e}/messages.ts`,4).catch(()=>null),f=window.LinguiCore.i18n,A=window.MantineCore.Alert,Te=window.MantineCore.Badge,Ne=window.MantineCore.Button,Jr=window.MantineCore.Code,ee=window.MantineCore.Group,Xr=window.MantineCore.Loader,q=window.MantineCore.Stack,Kr=window.MantineCore.Switch,O=window.MantineCore.Table,D=window.MantineCore.Text,Qr=window.MantineCore.Title,De=window.MantineNotifications.notifications,xe=window.React.useCallback,Zr=window.React.useEffect,j=window.React.useMemo,U=window.React.useState,Ar="/plugin/batchcode/preview/",en="/plugin/batchcode/generate/";function tn({settings:e}){const t=j(()=>{const r=[];return e.PER_PART&&r.push(f._({id:"O/ICOy"})),e.PER_LOCATION&&r.push(f._({id:"qt+UdX"})),e.DAILY_RESET&&r.push(f._({id:"iHaxSq"})),[[f._({id:"kI1qVD"}),String(e.CODE_FORMAT??"")],[f._({id:"rNqTKZ"}),e.USE_LOCATION_PREFIX?f._({id:"j1yeuR",values:{0:String(e.LOCATION_FIELD)}}):String(e.PREFIX??"")],[f._({id:"NKnPpU"}),r.length?r.join(", "):f._({id:"SLbeKO"})],[f._({id:"H2Sfhg"}),String(e.TRIGGER_MODE??"")]]},[e]);return React.createElement(O,{withRowBorders:!1,verticalSpacing:"xs"},React.createElement(O.Tbody,null,t.map(([r,n])=>React.createElement(O.Tr,{key:r},React.createElement(O.Td,null,React.createElement(D,{size:"sm",c:"dimmed"},r)),React.createElement(O.Td,null,React.createElement(Jr,null,n))))))}function rn({context:e}){const t=j(()=>e.context?.settings??{},[e.context]),r=j(()=>!!e.context?.can_generate,[e.context]),n=j(()=>e.id??null,[e.id]),o=j(()=>e.instance?.batch||"",[e.instance]),[s,i]=U(""),[a,d]=U(""),[c,l]=U(!1),[_,m]=U(!1),[g,y]=U(!1),I=xe(()=>{n&&(l(!0),d(""),e.api.post(Ar,{item:n}).then(p=>i(p.data?.batch_code??"")).catch(()=>d(f._({id:"hPL4I9"}))).finally(()=>l(!1)))},[e.api,n]);Zr(()=>{I()},[I]);const h=xe(()=>{n&&(m(!0),e.api.post(en,{item:n,overwrite:g}).then(p=>{const P=p.data?.batch_code??"";De.show({title:f._({id:"T0z5Hw"}),message:P,color:"green"}),e.reloadInstance?.(),I()}).catch(p=>{const P=p?.response?.data?.item?.[0]??p?.response?.data?.detail??f._({id:"NEgaRI"});De.show({title:f._({id:"O8n/gF"}),message:String(P),color:"red"})}).finally(()=>m(!1)))},[e.api,e.reloadInstance,n,I,g]);return t.ENABLED?React.createElement(q,{gap:"md"},React.createElement(ee,{justify:"space-between",align:"flex-start"},React.createElement(q,{gap:2},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"nyqfpO"})),o?React.createElement(Te,{size:"lg",variant:"light",color:e.theme.primaryColor},o):React.createElement(D,{size:"sm",fs:"italic"},f._({id:"MTqQMG"}))),React.createElement(q,{gap:2,align:"flex-end"},React.createElement(D,{size:"sm",c:"dimmed"},f._({id:"ss5emH"})),c?React.createElement(Xr,{size:"sm"}):React.createElement(Te,{size:"lg",variant:"outline"},s||"—"))),a&&React.createElement(A,{color:"red",title:f._({id:"IF5r8v"})},a),r?React.createElement(ee,{justify:"space-between"},React.createElement(Kr,{checked:g,onChange:p=>y(p.currentTarget.checked),label:f._({id:"4tMAUR"}),disabled:!o}),React.createElement(ee,{gap:"xs"},React.createElement(Ne,{variant:"default",onClick:I,disabled:c},f._({id:"lCF0wC"})),React.createElement(Ne,{onClick:h,loading:_,disabled:!!o&&!g},f._({id:"DKa9ch"})))):React.createElement(A,{color:"blue",title:f._({id:"uNQ6eB"})},React.createElement(D,null,f._({id:"B4m81Y"}))),React.createElement(q,{gap:4},React.createElement(Qr,{order:5},f._({id:"ywFj2D"})),React.createElement(tn,{settings:t}))):React.createElement(A,{color:"yellow",title:f._({id:"DerUtL"})},React.createElement(D,null,f._({id:"hsSgoQ"})))}function an(e){return Hr(e),React.createElement(Gr,{i18n:e.i18n,locale:e.locale,loadLocale:zr},React.createElement(rn,{context:e}))}export{an as RenderBatchCodePluginPanel}; +//# sourceMappingURL=Panel.js.map diff --git a/batchcode_plugin/static/Panel.js.map b/batchcode_plugin/static/Panel.js.map new file mode 100644 index 0000000..43c356c --- /dev/null +++ b/batchcode_plugin/static/Panel.js.map @@ -0,0 +1 @@ +{"version":3,"mappings":"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","names":["INVENTREE_PLUGIN_VERSION","ApiEndpoints","ApiEndpoints2","jsxRuntime","reactJsxRuntime_production","hasRequiredReactJsxRuntime_production","requireReactJsxRuntime_production","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","hasRequiredJsxRuntime","requireJsxRuntime","jsxRuntimeExports","DEBUG_BUILD","objectToString","isError","wat","isInstanceOf","isBuiltin","className","isPlainObject","isThenable","base","SDK_VERSION","GLOBAL_OBJ","getMainCarrier","getSentryCarrier","carrier","__SENTRY__","getGlobalSingleton","name","creator","obj","RESOLVED_RUNNER","withRandomSafeContext","cb","sym","globalWithSymbol","safeMathRandom","safeDateNow","getCrypto","gbl","emptyUuid","getRandomByte","uuid4","crypto","c","ONE_SECOND_IN_MS","dateTimestampInSeconds","createUnixTimestampInSecondsFunc","performance","timeOrigin","_cachedTimestampInSeconds","timestampInSeconds","updateSession","session","context","duration","PREFIX","originalConsoleMethods","consoleSandbox","callback","console","wrappedFuncs","wrappedLevels","level","originalConsoleMethod","enable","_getLoggerSettings","disable","isEnabled","log","args","_maybeLog","warn","error","debug","merge","initialObj","mergeObj","levels","output","generateTraceId","addNonEnumerableProperty","value","makeWeakRef","WeakRefImpl","derefWeakRef","ref","SCOPE_SPAN_FIELD","_setSpanForScope","scope","span","_getSpanForScope","truncate","str","max","DEFAULT_MAX_BREADCRUMBS","Scope","newScope","client","lastEventId","user","conversationId","tags","newAttributes","extras","extra","fingerprint","captureContext","scopeToMerge","scopeInstance","attributes","contexts","propagationContext","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","attachment","newData","exception","hint","eventId","syntheticException","message","event","getDefaultCurrentScope","getDefaultIsolationScope","isActualPromise","p","kChainedCopy","chainAndCopyPromiseLike","original","onSuccess","onError","chained","err","copyProps","mutated","AsyncContextStack","isolationScope","assignedScope","assignedIsolationScope","maybePromiseResult","e","getAsyncContextStack","registry","sentry","withScope","withSetScope","stack","withIsolationScope","getStackAsyncContextStrategy","_isolationScope","getAsyncContextStrategy","getCurrentScope","getIsolationScope","rest","acs","getClient","parseEventHintOrCaptureContext","hintIsScopeOrFunction","hintIsScopeContext","captureContextKeys","captureException","version","isAtLeastReact17","reactVersion","reactMajor","setCause","cause","seenErrors","recurse","error2","cause2","captureReactException","componentStack","errorBoundaryError","WINDOW","DSN_REGEX","isValidProtocol","protocol","dsnToString","dsn","withPassword","host","path","pass","port","projectId","publicKey","dsnFromString","match","lastPath","split","projectMatch","dsnFromComponents","components","validateDsn","component","makeDsn","from","getBaseApiEndpoint","getReportDialogEndpoint","dsnLike","dialogOptions","endpoint","encodedOptions","showReportDialog","options","optionalDocument","injectionPoint","mergedOptions","script","onLoad","onClose","reportDialogClosedMessageHandler","React","INITIAL_STATE","ErrorBoundary","props","errorInfo","beforeCapture","showDialog","handled","onMount","onUnmount","onReset","fallback","children","state","element","defaultAttributes","forwardRef","createElement","createReactComponent","iconName","iconNamePascal","iconNode","Component","color","size","stroke","title","tag","attrs","__iconNode","Subscribable","listener","FocusManager","#focused","#cleanup","#setup","onFocus","setup","focused","isFocused","OnlineManager","#online","onOnline","onlineListener","offlineListener","online","createValue","isReset","IsRestoringContext","Action","Action2","ResultType","ResultType2","AbortedDeferredError","validMutationMethodsArr","validRequestMethodsArr","AwaitContext","RouteContext","RouteErrorContext","RenderErrorBoundary","START_TRANSITION","AwaitRenderStatus","AwaitRenderStatus2","neverSettledPromise","AwaitErrorBoundary","errorElement","resolve","promise","status","renderError","data","ReactDOM","REACT_ROUTER_VERSION","FLUSH_SYNC","USE_ID","DataRouterHook","DataRouterHook2","DataRouterStateHook","DataRouterStateHook2","createJSONStorage","getStorage","storage","_a","parse","str2","newValue","toThenable","fn","input","result","onFulfilled","_onRejected","_onFulfilled","onRejected","persistImpl","baseOptions","set","get","api","persistedState","currentState","hasHydrated","hydrationVersion","hydrationListeners","finishHydrationListeners","setItem","savedSetState","replace","configResult","stateFromStorage","hydrate","_b","currentVersion","_a2","postRehydrationCallback","deserializedStorageValue","migration","migrationResult","migrated","migratedState","newOptions","persist","createStoreImpl","createState","listeners","setState","partial","nextState","previousState","getState","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","hotkeys","newHotkeys","details","DEFAULT_PAGE_SIZE","tableKey","sorting","names","columns","I18nProvider","Skeleton","useEffect","useState","tryLoadLocale","locale","loader","loadPluginLocale","i18n","messages","fallbackLocale","defaultLocaleLoader","_locale","LocalizedComponent","loadLocale","loaded","setLoaded","checkPluginVersion","systemVersion","__variableDynamicImportRuntimeHelper","__vitePreload","catch","_i18n","Alert","notifications","useCallback","PREVIEW_URL","GENERATE_URL","SettingsSummary","settings","rows","useMemo","scopes","PER_PART","push","_","id","PER_LOCATION","DAILY_RESET","String","CODE_FORMAT","USE_LOCATION_PREFIX","values","0","LOCATION_FIELD","length","join","TRIGGER_MODE","Table","map","label","Text","Code","BatchCodePanel","canGenerate","can_generate","itemId","currentCode","instance","batch","preview","setPreview","setError","loading","setLoading","busy","setBusy","overwrite","setOverwrite","loadPreview","post","item","then","response","batch_code","finally","generate","code","show","reloadInstance","detail","ENABLED","Stack","Group","Badge","theme","primaryColor","Loader","Switch","currentTarget","checked","Button","Title","RenderBatchCodePluginPanel"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],"sources":["../../frontend/node_modules/@inventreedb/ui/dist/types/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ApiEndpoints.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/Roles.js","../../frontend/node_modules/@inventreedb/ui/dist/enums/ModelInformation.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Notification.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime2.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/cjs/react-jsx-runtime.production.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/_virtual/jsx-runtime.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ActionButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/is.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/version.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/worldwide.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/carrier.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/randomSafeContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/misc.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/time.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/session.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/debug-logger.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/merge.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/propagationContext.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/object.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/weakRef.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/spanOnScope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/string.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/scope.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/defaultScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/chain-and-copy-promiselike.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/stackStrategy.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/asyncContext/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/currentScopes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/prepareEvent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/exports.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/error.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/debug-build.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/helpers.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/utils/dsn.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/core/build/esm/api.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/browser/build/npm/esm/prod/report-dialog.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@sentry/react/build/esm/errorboundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/createReactComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js","../../frontend/node_modules/@inventreedb/ui/dist/components/Boundary.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ButtonMenu.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyButton.js","../../frontend/node_modules/@inventreedb/ui/dist/components/CopyableCell.js","../../frontend/node_modules/@inventreedb/ui/dist/components/ProgressBar.js","../../frontend/node_modules/@inventreedb/ui/dist/components/YesNoButton.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js","../../frontend/node_modules/@inventreedb/ui/dist/components/SearchInput.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TableColumnSelect.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js","../../frontend/node_modules/@inventreedb/ui/dist/components/TagsList.js","../../frontend/node_modules/@inventreedb/ui/dist/components/InvenTreeTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js","../../frontend/node_modules/@inventreedb/ui/dist/components/RowActions.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/subscribable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/focusManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorDataOutput.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/MonitorBackgroundTask.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-window-event/use-window-event.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@mantine/hooks/esm/use-local-storage/create-storage.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseFilterSet.js","../../frontend/node_modules/@inventreedb/ui/dist/hooks/UseTable.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@remix-run/router/dist/router.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/react-router-dom/dist/index.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/middleware.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/vanilla.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/zustand/esm/react.js","../../frontend/node_modules/@inventreedb/ui/dist/states/LocalLibState.js","../../frontend/node_modules/@inventreedb/ui/dist/components/StylishText.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js","../../frontend/node_modules/@inventreedb/ui/dist/components/nav/DetailDrawer.js","../../frontend/node_modules/@inventreedb/ui/dist/states/StoredTableState.js","../../frontend/node_modules/@inventreedb/ui/dist/plugin/LocalizedComponent.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Events.js","../../frontend/node_modules/@inventreedb/ui/dist/functions/Plugins.js","../../frontend/node_modules/@inventreedb/ui/dist/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.js","../../frontend/src/locales.tsx","../../frontend/src/Panel.tsx"],"sourcesContent":["const INVENTREE_PLUGIN_VERSION = \"1.5.0\";\nconst INVENTREE_REACT_VERSION = \"19.2.7\";\nconst INVENTREE_REACT_DOM_VERSION = (\n // @ts-ignore\n \"19.2.7\"\n);\nconst INVENTREE_MANTINE_VERSION = \"9.2.1\";\nexport {\n INVENTREE_MANTINE_VERSION,\n INVENTREE_PLUGIN_VERSION,\n INVENTREE_REACT_DOM_VERSION,\n INVENTREE_REACT_VERSION\n};\n//# sourceMappingURL=Plugins.js.map\n","var ApiEndpoints = /* @__PURE__ */ ((ApiEndpoints2) => {\n ApiEndpoints2[\"api_server_info\"] = \"\";\n ApiEndpoints2[\"user_list\"] = \"user/\";\n ApiEndpoints2[\"user_set_password\"] = \"user/:id/set-password/\";\n ApiEndpoints2[\"user_tokens\"] = \"user/tokens/\";\n ApiEndpoints2[\"user_simple_login\"] = \"email/generate/\";\n ApiEndpoints2[\"user_me_profile\"] = \"user/me/profile/\";\n ApiEndpoints2[\"user_me_roles\"] = \"user/me/roles/\";\n ApiEndpoints2[\"user_me_token\"] = \"user/me/token/\";\n ApiEndpoints2[\"user_me\"] = \"user/me/\";\n ApiEndpoints2[\"auth_base\"] = \"/auth/\";\n ApiEndpoints2[\"user_reset\"] = \"auth/v1/auth/password/request\";\n ApiEndpoints2[\"user_reset_set\"] = \"auth/v1/auth/password/reset\";\n ApiEndpoints2[\"auth_pwd_change\"] = \"auth/v1/account/password/change\";\n ApiEndpoints2[\"auth_login\"] = \"auth/v1/auth/login\";\n ApiEndpoints2[\"auth_login_2fa\"] = \"auth/v1/auth/2fa/authenticate\";\n ApiEndpoints2[\"auth_session\"] = \"auth/v1/auth/session\";\n ApiEndpoints2[\"auth_signup\"] = \"auth/v1/auth/signup\";\n ApiEndpoints2[\"auth_authenticators\"] = \"auth/v1/account/authenticators\";\n ApiEndpoints2[\"auth_recovery\"] = \"auth/v1/account/authenticators/recovery-codes\";\n ApiEndpoints2[\"auth_mfa_reauthenticate\"] = \"auth/v1/auth/2fa/reauthenticate\";\n ApiEndpoints2[\"auth_totp\"] = \"auth/v1/account/authenticators/totp\";\n ApiEndpoints2[\"auth_trust\"] = \"auth/v1/auth/2fa/trust\";\n ApiEndpoints2[\"auth_webauthn\"] = \"auth/v1/account/authenticators/webauthn\";\n ApiEndpoints2[\"auth_webauthn_login\"] = \"auth/v1/auth/webauthn/authenticate\";\n ApiEndpoints2[\"auth_reauthenticate\"] = \"auth/v1/auth/reauthenticate\";\n ApiEndpoints2[\"auth_email\"] = \"auth/v1/account/email\";\n ApiEndpoints2[\"auth_email_verify\"] = \"auth/v1/auth/email/verify\";\n ApiEndpoints2[\"auth_providers\"] = \"auth/v1/account/providers\";\n ApiEndpoints2[\"auth_provider_redirect\"] = \"auth/v1/auth/provider/redirect\";\n ApiEndpoints2[\"auth_config\"] = \"auth/v1/config\";\n ApiEndpoints2[\"currency_list\"] = \"currency/exchange/\";\n ApiEndpoints2[\"currency_refresh\"] = \"currency/refresh/\";\n ApiEndpoints2[\"all_units\"] = \"units/all/\";\n ApiEndpoints2[\"task_overview\"] = \"background-task/\";\n ApiEndpoints2[\"task_pending_list\"] = \"background-task/pending/\";\n ApiEndpoints2[\"task_scheduled_list\"] = \"background-task/scheduled/\";\n ApiEndpoints2[\"task_failed_list\"] = \"background-task/failed/\";\n ApiEndpoints2[\"api_search\"] = \"search/\";\n ApiEndpoints2[\"settings_global_list\"] = \"settings/global/\";\n ApiEndpoints2[\"settings_user_list\"] = \"settings/user/\";\n ApiEndpoints2[\"news\"] = \"news/\";\n ApiEndpoints2[\"global_status\"] = \"generic/status/\";\n ApiEndpoints2[\"custom_state_list\"] = \"generic/status/custom/\";\n ApiEndpoints2[\"version\"] = \"version/\";\n ApiEndpoints2[\"license\"] = \"license/\";\n ApiEndpoints2[\"group_list\"] = \"user/group/\";\n ApiEndpoints2[\"owner_list\"] = \"user/owner/\";\n ApiEndpoints2[\"ruleset_list\"] = \"user/ruleset/\";\n ApiEndpoints2[\"content_type_list\"] = \"contenttype/\";\n ApiEndpoints2[\"icons\"] = \"icons/\";\n ApiEndpoints2[\"selectionlist_list\"] = \"selection/\";\n ApiEndpoints2[\"selectionentry_list\"] = \"selection/:id/entry/\";\n ApiEndpoints2[\"barcode\"] = \"barcode/\";\n ApiEndpoints2[\"barcode_history\"] = \"barcode/history/\";\n ApiEndpoints2[\"barcode_link\"] = \"barcode/link/\";\n ApiEndpoints2[\"barcode_unlink\"] = \"barcode/unlink/\";\n ApiEndpoints2[\"barcode_generate\"] = \"barcode/generate/\";\n ApiEndpoints2[\"data_output\"] = \"data-output/\";\n ApiEndpoints2[\"import_session_list\"] = \"importer/session/\";\n ApiEndpoints2[\"import_session_accept_fields\"] = \"importer/session/:id/accept_fields/\";\n ApiEndpoints2[\"import_session_accept_rows\"] = \"importer/session/:id/accept_rows/\";\n ApiEndpoints2[\"import_session_column_mapping_list\"] = \"importer/column-mapping/\";\n ApiEndpoints2[\"import_session_row_list\"] = \"importer/row/\";\n ApiEndpoints2[\"notifications_list\"] = \"notifications/\";\n ApiEndpoints2[\"notifications_readall\"] = \"notifications/readall/\";\n ApiEndpoints2[\"build_order_list\"] = \"build/\";\n ApiEndpoints2[\"build_order_issue\"] = \"build/:id/issue/\";\n ApiEndpoints2[\"build_order_cancel\"] = \"build/:id/cancel/\";\n ApiEndpoints2[\"build_order_hold\"] = \"build/:id/hold/\";\n ApiEndpoints2[\"build_order_complete\"] = \"build/:id/finish/\";\n ApiEndpoints2[\"build_output_complete\"] = \"build/:id/complete/\";\n ApiEndpoints2[\"build_output_create\"] = \"build/:id/create-output/\";\n ApiEndpoints2[\"build_output_scrap\"] = \"build/:id/scrap-outputs/\";\n ApiEndpoints2[\"build_output_delete\"] = \"build/:id/delete-outputs/\";\n ApiEndpoints2[\"build_order_auto_allocate\"] = \"build/:id/auto-allocate/\";\n ApiEndpoints2[\"build_order_allocate\"] = \"build/:id/allocate/\";\n ApiEndpoints2[\"build_order_consume\"] = \"build/:id/consume/\";\n ApiEndpoints2[\"build_order_deallocate\"] = \"build/:id/unallocate/\";\n ApiEndpoints2[\"build_line_list\"] = \"build/line/\";\n ApiEndpoints2[\"build_item_list\"] = \"build/item/\";\n ApiEndpoints2[\"bom_list\"] = \"bom/\";\n ApiEndpoints2[\"bom_item_validate\"] = \"bom/:id/validate/\";\n ApiEndpoints2[\"bom_validate\"] = \"part/:id/bom-validate/\";\n ApiEndpoints2[\"bom_substitute_list\"] = \"bom/substitute/\";\n ApiEndpoints2[\"part_list\"] = \"part/\";\n ApiEndpoints2[\"part_thumbs_list\"] = \"part/thumbs/\";\n ApiEndpoints2[\"part_pricing\"] = \"part/:id/pricing/\";\n ApiEndpoints2[\"part_requirements\"] = \"part/:id/requirements/\";\n ApiEndpoints2[\"part_serial_numbers\"] = \"part/:id/serial-numbers/\";\n ApiEndpoints2[\"part_scheduling\"] = \"part/:id/scheduling/\";\n ApiEndpoints2[\"part_pricing_internal\"] = \"part/internal-price/\";\n ApiEndpoints2[\"part_pricing_sale\"] = \"part/sale-price/\";\n ApiEndpoints2[\"part_stocktake_list\"] = \"part/stocktake/\";\n ApiEndpoints2[\"part_stocktake_generate\"] = \"part/stocktake/generate/\";\n ApiEndpoints2[\"category_list\"] = \"part/category/\";\n ApiEndpoints2[\"category_tree\"] = \"part/category/tree/\";\n ApiEndpoints2[\"category_parameter_list\"] = \"part/category/parameters/\";\n ApiEndpoints2[\"related_part_list\"] = \"part/related/\";\n ApiEndpoints2[\"part_test_template_list\"] = \"part/test-template/\";\n ApiEndpoints2[\"company_list\"] = \"company/\";\n ApiEndpoints2[\"contact_list\"] = \"company/contact/\";\n ApiEndpoints2[\"address_list\"] = \"company/address/\";\n ApiEndpoints2[\"supplier_part_list\"] = \"company/part/\";\n ApiEndpoints2[\"supplier_part_pricing_list\"] = \"company/price-break/\";\n ApiEndpoints2[\"manufacturer_part_list\"] = \"company/part/manufacturer/\";\n ApiEndpoints2[\"stock_location_list\"] = \"stock/location/\";\n ApiEndpoints2[\"stock_location_type_list\"] = \"stock/location-type/\";\n ApiEndpoints2[\"stock_location_tree\"] = \"stock/location/tree/\";\n ApiEndpoints2[\"stock_item_list\"] = \"stock/\";\n ApiEndpoints2[\"stock_tracking_list\"] = \"stock/track/\";\n ApiEndpoints2[\"stock_test_result_list\"] = \"stock/test/\";\n ApiEndpoints2[\"stock_transfer\"] = \"stock/transfer/\";\n ApiEndpoints2[\"stock_remove\"] = \"stock/remove/\";\n ApiEndpoints2[\"stock_return\"] = \"stock/return/\";\n ApiEndpoints2[\"stock_add\"] = \"stock/add/\";\n ApiEndpoints2[\"stock_count\"] = \"stock/count/\";\n ApiEndpoints2[\"stock_change_status\"] = \"stock/change_status/\";\n ApiEndpoints2[\"stock_merge\"] = \"stock/merge/\";\n ApiEndpoints2[\"stock_assign\"] = \"stock/assign/\";\n ApiEndpoints2[\"stock_status\"] = \"stock/status/\";\n ApiEndpoints2[\"stock_convert\"] = \"stock/:id/convert/\";\n ApiEndpoints2[\"stock_disassemble\"] = \"stock/:id/disassemble/\";\n ApiEndpoints2[\"stock_install\"] = \"stock/:id/install/\";\n ApiEndpoints2[\"stock_uninstall\"] = \"stock/:id/uninstall/\";\n ApiEndpoints2[\"stock_serialize\"] = \"stock/:id/serialize/\";\n ApiEndpoints2[\"stock_serial_info\"] = \"stock/:id/serial-numbers/\";\n ApiEndpoints2[\"generate_batch_code\"] = \"generate/batch-code/\";\n ApiEndpoints2[\"generate_serial_number\"] = \"generate/serial-number/\";\n ApiEndpoints2[\"purchase_order_list\"] = \"order/po/\";\n ApiEndpoints2[\"purchase_order_issue\"] = \"order/po/:id/issue/\";\n ApiEndpoints2[\"purchase_order_hold\"] = \"order/po/:id/hold/\";\n ApiEndpoints2[\"purchase_order_cancel\"] = \"order/po/:id/cancel/\";\n ApiEndpoints2[\"purchase_order_complete\"] = \"order/po/:id/complete/\";\n ApiEndpoints2[\"purchase_order_line_list\"] = \"order/po-line/\";\n ApiEndpoints2[\"purchase_order_extra_line_list\"] = \"order/po-extra-line/\";\n ApiEndpoints2[\"purchase_order_receive\"] = \"order/po/:id/receive/\";\n ApiEndpoints2[\"sales_order_list\"] = \"order/so/\";\n ApiEndpoints2[\"sales_order_issue\"] = \"order/so/:id/issue/\";\n ApiEndpoints2[\"sales_order_hold\"] = \"order/so/:id/hold/\";\n ApiEndpoints2[\"sales_order_cancel\"] = \"order/so/:id/cancel/\";\n ApiEndpoints2[\"sales_order_ship\"] = \"order/so/:id/ship/\";\n ApiEndpoints2[\"sales_order_complete\"] = \"order/so/:id/complete/\";\n ApiEndpoints2[\"sales_order_allocate\"] = \"order/so/:id/allocate/\";\n ApiEndpoints2[\"sales_order_allocate_serials\"] = \"order/so/:id/allocate-serials/\";\n ApiEndpoints2[\"sales_order_auto_allocate\"] = \"order/so/:id/auto-allocate/\";\n ApiEndpoints2[\"sales_order_line_list\"] = \"order/so-line/\";\n ApiEndpoints2[\"sales_order_extra_line_list\"] = \"order/so-extra-line/\";\n ApiEndpoints2[\"sales_order_allocation_list\"] = \"order/so-allocation/\";\n ApiEndpoints2[\"sales_order_shipment_list\"] = \"order/so/shipment/\";\n ApiEndpoints2[\"sales_order_shipment_complete\"] = \"order/so/shipment/:id/ship/\";\n ApiEndpoints2[\"return_order_list\"] = \"order/ro/\";\n ApiEndpoints2[\"return_order_issue\"] = \"order/ro/:id/issue/\";\n ApiEndpoints2[\"return_order_hold\"] = \"order/ro/:id/hold/\";\n ApiEndpoints2[\"return_order_cancel\"] = \"order/ro/:id/cancel/\";\n ApiEndpoints2[\"return_order_complete\"] = \"order/ro/:id/complete/\";\n ApiEndpoints2[\"return_order_receive\"] = \"order/ro/:id/receive/\";\n ApiEndpoints2[\"return_order_line_list\"] = \"order/ro-line/\";\n ApiEndpoints2[\"return_order_extra_line_list\"] = \"order/ro-extra-line/\";\n ApiEndpoints2[\"transfer_order_list\"] = \"order/transfer-order/\";\n ApiEndpoints2[\"transfer_order_issue\"] = \"order/transfer-order/:id/issue/\";\n ApiEndpoints2[\"transfer_order_hold\"] = \"order/transfer-order/:id/hold/\";\n ApiEndpoints2[\"transfer_order_cancel\"] = \"order/transfer-order/:id/cancel/\";\n ApiEndpoints2[\"transfer_order_complete\"] = \"order/transfer-order/:id/complete/\";\n ApiEndpoints2[\"transfer_order_allocate\"] = \"order/transfer-order/:id/allocate/\";\n ApiEndpoints2[\"transfer_order_allocate_serials\"] = \"order/transfer-order/:id/allocate-serials/\";\n ApiEndpoints2[\"transfer_order_line_list\"] = \"order/transfer-order-line/\";\n ApiEndpoints2[\"transfer_order_allocation_list\"] = \"order/transfer-order-allocation/\";\n ApiEndpoints2[\"label_list\"] = \"label/template/\";\n ApiEndpoints2[\"label_print\"] = \"label/print/\";\n ApiEndpoints2[\"report_list\"] = \"report/template/\";\n ApiEndpoints2[\"report_print\"] = \"report/print/\";\n ApiEndpoints2[\"report_snippet\"] = \"report/snippet/\";\n ApiEndpoints2[\"report_asset\"] = \"report/asset/\";\n ApiEndpoints2[\"plugin_list\"] = \"plugins/\";\n ApiEndpoints2[\"plugin_setting_list\"] = \"plugins/:plugin/settings/\";\n ApiEndpoints2[\"plugin_user_setting_list\"] = \"plugins/:plugin/user-settings/\";\n ApiEndpoints2[\"plugin_registry_status\"] = \"plugins/status/\";\n ApiEndpoints2[\"plugin_install\"] = \"plugins/install/\";\n ApiEndpoints2[\"plugin_reload\"] = \"plugins/reload/\";\n ApiEndpoints2[\"plugin_activate\"] = \"plugins/:key/activate/\";\n ApiEndpoints2[\"plugin_uninstall\"] = \"plugins/:key/uninstall/\";\n ApiEndpoints2[\"plugin_admin\"] = \"plugins/:key/admin/\";\n ApiEndpoints2[\"plugin_ui_features_list\"] = \"plugins/ui/features/:feature_type/\";\n ApiEndpoints2[\"plugin_locate_item\"] = \"locate/\";\n ApiEndpoints2[\"plugin_supplier_list\"] = \"supplier/list/\";\n ApiEndpoints2[\"plugin_supplier_search\"] = \"supplier/search/\";\n ApiEndpoints2[\"plugin_supplier_import\"] = \"supplier/import/\";\n ApiEndpoints2[\"machine_types_list\"] = \"machine/types/\";\n ApiEndpoints2[\"machine_driver_list\"] = \"machine/drivers/\";\n ApiEndpoints2[\"machine_registry_status\"] = \"machine/status/\";\n ApiEndpoints2[\"machine_list\"] = \"machine/\";\n ApiEndpoints2[\"machine_restart\"] = \"machine/:machine/restart/\";\n ApiEndpoints2[\"machine_setting_list\"] = \"machine/:machine/settings/\";\n ApiEndpoints2[\"machine_setting_detail\"] = \"machine/:machine/settings/:config_type/\";\n ApiEndpoints2[\"attachment_list\"] = \"attachment/\";\n ApiEndpoints2[\"error_report_list\"] = \"error-report/\";\n ApiEndpoints2[\"project_code_list\"] = \"project-code/\";\n ApiEndpoints2[\"custom_unit_list\"] = \"units/\";\n ApiEndpoints2[\"notes_image_upload\"] = \"notes-image-upload/\";\n ApiEndpoints2[\"email_list\"] = \"admin/email/\";\n ApiEndpoints2[\"email_test\"] = \"admin/email/test/\";\n ApiEndpoints2[\"config_list\"] = \"admin/config/\";\n ApiEndpoints2[\"parameter_list\"] = \"parameter/\";\n ApiEndpoints2[\"parameter_template_list\"] = \"parameter/template/\";\n ApiEndpoints2[\"tag_list\"] = \"tag/\";\n ApiEndpoints2[\"system_internal_trace_end\"] = \"system-internal/observability/end\";\n return ApiEndpoints2;\n})(ApiEndpoints || {});\nexport {\n ApiEndpoints\n};\n//# sourceMappingURL=ApiEndpoints.js.map\n","window[\"LinguiCore\"].i18n;\nvar UserRoles = /* @__PURE__ */ ((UserRoles2) => {\n UserRoles2[\"admin\"] = \"admin\";\n UserRoles2[\"bom\"] = \"bom\";\n UserRoles2[\"build\"] = \"build\";\n UserRoles2[\"part\"] = \"part\";\n UserRoles2[\"part_category\"] = \"part_category\";\n UserRoles2[\"purchase_order\"] = \"purchase_order\";\n UserRoles2[\"return_order\"] = \"return_order\";\n UserRoles2[\"transfer_order\"] = \"transfer_order\";\n UserRoles2[\"sales_order\"] = \"sales_order\";\n UserRoles2[\"stock\"] = \"stock\";\n UserRoles2[\"stock_location\"] = \"stock_location\";\n return UserRoles2;\n})(UserRoles || {});\nvar UserPermissions = /* @__PURE__ */ ((UserPermissions2) => {\n UserPermissions2[\"view\"] = \"view\";\n UserPermissions2[\"add\"] = \"add\";\n UserPermissions2[\"change\"] = \"change\";\n UserPermissions2[\"delete\"] = \"delete\";\n return UserPermissions2;\n})(UserPermissions || {});\nexport {\n UserPermissions,\n UserRoles\n};\n//# sourceMappingURL=Roles.js.map\n","import { ApiEndpoints } from \"./ApiEndpoints.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ModelInformationDict = {\n part: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"vgP+9p\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"pmRbKZ\"\n }\n ),\n url_overview: \"/part/category/index/parts\",\n url_detail: \"/part/:pk/\",\n api_endpoint: ApiEndpoints.part_list,\n admin_url: \"/part/part/\",\n supports_barcode: true,\n icon: \"part\"\n },\n parameter: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"T/87By\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F18WP3\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_list,\n icon: \"list_details\"\n },\n parametertemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"+nwoLk\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"ciZG57\"\n }\n ),\n api_endpoint: ApiEndpoints.parameter_template_list,\n admin_url: \"/common/parametertemplate/\",\n icon: \"list\"\n },\n parttesttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"75lDy5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"KevMsQ\"\n }\n ),\n url_detail: \"/parttesttemplate/:pk/\",\n api_endpoint: ApiEndpoints.part_test_template_list,\n icon: \"test\"\n },\n supplierpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"nne72x\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"FcNRrt\"\n }\n ),\n url_overview: \"/purchasing/index/supplier-parts\",\n url_detail: \"/purchasing/supplier-part/:pk/\",\n api_endpoint: ApiEndpoints.supplier_part_list,\n admin_url: \"/company/supplierpart/\",\n supports_barcode: true,\n icon: \"supplier_part\",\n default_query_params: {\n part_detail: true,\n supplier_detail: true,\n manufacturer_detail: true\n }\n },\n manufacturerpart: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"bisS0I\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"d0fBfb\"\n }\n ),\n url_overview: \"/purchasing/index/manufacturer-parts\",\n url_detail: \"/purchasing/manufacturer-part/:pk/\",\n api_endpoint: ApiEndpoints.manufacturer_part_list,\n admin_url: \"/company/manufacturerpart/\",\n supports_barcode: true,\n icon: \"manufacturers\",\n default_query_params: {\n part_detail: true,\n manufacturer_detail: true\n }\n },\n partcategory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"QXANxH\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2GkbLI\"\n }\n ),\n url_overview: \"/part/category/parts/subcategories\",\n url_detail: \"/part/category/:pk/\",\n api_endpoint: ApiEndpoints.category_list,\n admin_url: \"/part/partcategory/\",\n icon: \"category\"\n },\n stockitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"igx8Og\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Jbck4N\"\n }\n ),\n url_overview: \"/stock/location/index/stock-items\",\n url_detail: \"/stock/item/:pk/\",\n api_endpoint: ApiEndpoints.stock_item_list,\n admin_url: \"/stock/stockitem/\",\n supports_barcode: true,\n icon: \"stock\",\n default_query_params: {\n part_detail: true\n }\n },\n stocklocation: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"adXdas\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1eBWAw\"\n }\n ),\n url_overview: \"/stock/location\",\n url_detail: \"/stock/location/:pk/\",\n api_endpoint: ApiEndpoints.stock_location_list,\n admin_url: \"/stock/stocklocation/\",\n supports_barcode: true,\n icon: \"location\"\n },\n stocklocationtype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"DjwC2f\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"vkPSyZ\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_location_type_list,\n icon: \"location\"\n },\n stockhistory: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"cE4TWF\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"rewkgt\"\n }\n ),\n api_endpoint: ApiEndpoints.stock_tracking_list,\n icon: \"history\"\n },\n build: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"YxwWvi\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"RCVhIP\"\n }\n ),\n url_overview: \"/manufacturing/index/buildorders/\",\n url_detail: \"/manufacturing/build-order/:pk/\",\n api_endpoint: ApiEndpoints.build_order_list,\n admin_url: \"/build/build/\",\n supports_barcode: true,\n icon: \"build_order\",\n default_query_params: {\n part_detail: true\n }\n },\n buildline: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"9TLpo1\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CRYIQ0\"\n }\n ),\n url_overview: \"/build/line\",\n url_detail: \"/build/line/:pk/\",\n api_endpoint: ApiEndpoints.build_line_list,\n icon: \"build_order\"\n },\n builditem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LN2ON5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"A7FuwR\"\n }\n ),\n api_endpoint: ApiEndpoints.build_item_list,\n icon: \"build_order\"\n },\n company: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7i8j3G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"s2QZS6\"\n }\n ),\n url_detail: \"/company/:pk/\",\n api_endpoint: ApiEndpoints.company_list,\n admin_url: \"/company/company/\",\n icon: \"building\"\n },\n projectcode: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Sdfr6G\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"AklCpf\"\n }\n ),\n url_detail: \"/project-code/:pk/\",\n api_endpoint: ApiEndpoints.project_code_list,\n icon: \"list_details\"\n },\n purchaseorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"KxySMG\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"85Yvr2\"\n }\n ),\n url_overview: \"/purchasing/index/purchaseorders\",\n url_detail: \"/purchasing/purchase-order/:pk/\",\n api_endpoint: ApiEndpoints.purchase_order_list,\n admin_url: \"/order/purchaseorder/\",\n supports_barcode: true,\n icon: \"purchase_orders\",\n default_query_params: {\n supplier_detail: true\n }\n },\n purchaseorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Enr0Pf\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"MXjnQS\"\n }\n ),\n api_endpoint: ApiEndpoints.purchase_order_line_list,\n icon: \"purchase_orders\"\n },\n salesorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LozYBo\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"B1TL+X\"\n }\n ),\n url_overview: \"/sales/index/salesorders\",\n url_detail: \"/sales/sales-order/:pk/\",\n api_endpoint: ApiEndpoints.sales_order_list,\n admin_url: \"/order/salesorder/\",\n supports_barcode: true,\n icon: \"sales_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n salesordershipment: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"qGSobR\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"D/EkfS\"\n }\n ),\n url_overview: \"/sales/index/shipments\",\n url_detail: \"/sales/shipment/:pk/\",\n admin_url: \"/order/salesordershipment/\",\n api_endpoint: ApiEndpoints.sales_order_shipment_list,\n supports_barcode: true,\n icon: \"shipment\",\n default_query_params: {\n order_detail: true\n }\n },\n returnorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Z6ve1w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"LlTg8M\"\n }\n ),\n url_overview: \"/sales/index/returnorders\",\n url_detail: \"/sales/return-order/:pk/\",\n api_endpoint: ApiEndpoints.return_order_list,\n admin_url: \"/order/returnorder/\",\n supports_barcode: true,\n icon: \"return_orders\",\n default_query_params: {\n customer_detail: true\n }\n },\n returnorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Frsz7D\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"4dCpFa\"\n }\n ),\n api_endpoint: ApiEndpoints.return_order_line_list,\n icon: \"return_orders\"\n },\n transferorder: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"8P0cA/\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"IxhZtQ\"\n }\n ),\n url_overview: \"/stock/location/index/transfer-orders\",\n url_detail: \"/stock/transfer-order/:pk/\",\n api_endpoint: ApiEndpoints.transfer_order_list,\n admin_url: \"/order/transferorder/\",\n supports_barcode: true,\n icon: \"transfer_orders\"\n },\n transferorderlineitem: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"VKydzB\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"VkSETm\"\n }\n ),\n api_endpoint: ApiEndpoints.transfer_order_line_list,\n icon: \"transfer-orders\"\n },\n address: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"Du6bPw\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"bYmAV1\"\n }\n ),\n url_detail: \"/address/:pk/\",\n api_endpoint: ApiEndpoints.address_list,\n icon: \"address\"\n },\n contact: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"jfC/xh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"gVfVfe\"\n }\n ),\n url_detail: \"/contact/:pk/\",\n api_endpoint: ApiEndpoints.contact_list,\n icon: \"group\"\n },\n owner: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"LtI9AS\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"CYRJEX\"\n }\n ),\n url_detail: \"/owner/:pk/\",\n api_endpoint: ApiEndpoints.owner_list,\n icon: \"group\"\n },\n user: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"7PzzBU\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"Sxm8rQ\"\n }\n ),\n url_detail: \"/core/user/:pk/\",\n api_endpoint: ApiEndpoints.user_list,\n icon: \"user\"\n },\n group: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"L8fEEm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"zhrjek\"\n }\n ),\n url_detail: \"/core/group/:pk/\",\n api_endpoint: ApiEndpoints.group_list,\n admin_url: \"/auth/group/\",\n icon: \"group\"\n },\n importsession: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"e5WBGh\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"1dn8uK\"\n }\n ),\n url_overview: \"/settings/admin/import\",\n url_detail: \"/import/:pk/\",\n api_endpoint: ApiEndpoints.import_session_list,\n icon: \"import\"\n },\n labeltemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"aKf3M5\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"0qHiFS\"\n }\n ),\n url_overview: \"/settings/admin/labels\",\n url_detail: \"/settings/admin/labels/:pk/\",\n api_endpoint: ApiEndpoints.label_list,\n icon: \"labels\"\n },\n reporttemplate: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"F/A+39\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"SX006I\"\n }\n ),\n url_overview: \"/settings/admin/reports\",\n url_detail: \"/settings/admin/reports/:pk/\",\n api_endpoint: ApiEndpoints.report_list,\n icon: \"reports\"\n },\n pluginconfig: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"BFm1Jm\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"7ybWp/\"\n }\n ),\n url_overview: \"/settings/admin/plugin\",\n url_detail: \"/settings/admin/plugin/:pk/\",\n api_endpoint: ApiEndpoints.plugin_list,\n icon: \"plugin\"\n },\n contenttype: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"f9cDxV\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"F7Jcuy\"\n }\n ),\n api_endpoint: ApiEndpoints.content_type_list,\n icon: \"list_details\"\n },\n selectionlist: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"ifEZiy\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"2q2/qs\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionlist_list,\n icon: \"list_details\"\n },\n selectionentry: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"0Mx1/T\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"jDVRSq\"\n }\n ),\n url_overview: \"/settings/admin/part-parameters\",\n api_endpoint: ApiEndpoints.selectionentry_list,\n icon: \"list_details\"\n },\n error: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"SlfejT\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"UirGxE\"\n }\n ),\n api_endpoint: ApiEndpoints.error_report_list,\n url_overview: \"/settings/admin/errors\",\n url_detail: \"/settings/admin/errors/:pk/\",\n icon: \"exclamation\"\n },\n tag: {\n label: () => _i18n._(\n /*i18n*/\n {\n id: \"UL8A9w\"\n }\n ),\n label_multiple: () => _i18n._(\n /*i18n*/\n {\n id: \"OYHzN1\"\n }\n ),\n api_endpoint: ApiEndpoints.tag_list,\n icon: \"tag\"\n }\n};\nexport {\n ModelInformationDict\n};\n//# sourceMappingURL=ModelInformation.js.map\n","import { getHotkeyMatcher } from \"./parse-hotkey.js\";\nconst useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable = false) {\n if (event.target instanceof HTMLElement) {\n if (triggerOnContentEditable) return !tagsToIgnore.includes(event.target.tagName);\n return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);\n }\n return true;\n}\nfunction useHotkeys(hotkeys, tagsToIgnore = [\n \"INPUT\",\n \"TEXTAREA\",\n \"SELECT\"\n], triggerOnContentEditable = false) {\n const handleKeydown = useEffectEvent((event) => {\n hotkeys.forEach(([hotkey, handler, options = {\n preventDefault: true,\n usePhysicalKeys: false\n }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) && shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)) {\n if (options.preventDefault) event.preventDefault();\n handler(event);\n }\n });\n });\n useEffect(() => {\n document.documentElement.addEventListener(\"keydown\", handleKeydown);\n return () => document.documentElement.removeEventListener(\"keydown\", handleKeydown);\n }, []);\n}\nexport {\n useHotkeys\n};\n//# sourceMappingURL=use-hotkeys.js.map\n","const _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nfunction notYetImplemented() {\n notifications.hide(\"not-implemented\");\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"ipE2p4\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"WvSApV\"\n }\n ),\n color: \"red\",\n id: \"not-implemented\"\n });\n}\nfunction permissionDenied() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"JUwB5j\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"3WjGlZ\"\n }\n ),\n color: \"red\"\n });\n}\nfunction invalidResponse(returnCode) {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"J7PX+R\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"78bD8l\",\n values: {\n returnCode\n }\n }\n ),\n color: \"red\"\n });\n}\nfunction showTimeoutNotification() {\n notifications.show({\n title: _i18n._(\n /*i18n*/\n {\n id: \"xY9s5E\"\n }\n ),\n message: _i18n._(\n /*i18n*/\n {\n id: \"g/KPkG\"\n }\n ),\n color: \"red\"\n });\n}\nexport {\n invalidResponse,\n notYetImplemented,\n permissionDenied,\n showTimeoutNotification\n};\n//# sourceMappingURL=Notification.js.map\n","var jsxRuntime = { exports: {} };\nexport {\n jsxRuntime as __module\n};\n//# sourceMappingURL=jsx-runtime2.js.map\n","var reactJsxRuntime_production = {};\nexport {\n reactJsxRuntime_production as __exports\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __exports as reactJsxRuntime_production } from \"../../../_virtual/react-jsx-runtime.production.js\";\nvar hasRequiredReactJsxRuntime_production;\nfunction requireReactJsxRuntime_production() {\n if (hasRequiredReactJsxRuntime_production) return reactJsxRuntime_production;\n hasRequiredReactJsxRuntime_production = 1;\n var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.transitional.element\"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for(\"react.fragment\");\n function jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type,\n key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n }\n reactJsxRuntime_production.Fragment = REACT_FRAGMENT_TYPE;\n reactJsxRuntime_production.jsx = jsxProd;\n reactJsxRuntime_production.jsxs = jsxProd;\n return reactJsxRuntime_production;\n}\nexport {\n requireReactJsxRuntime_production as __require\n};\n//# sourceMappingURL=react-jsx-runtime.production.js.map\n","import { __module as jsxRuntime } from \"../../_virtual/jsx-runtime2.js\";\nimport { __require as requireReactJsxRuntime_production } from \"./cjs/react-jsx-runtime.production.js\";\nvar hasRequiredJsxRuntime;\nfunction requireJsxRuntime() {\n if (hasRequiredJsxRuntime) return jsxRuntime.exports;\n hasRequiredJsxRuntime = 1;\n {\n jsxRuntime.exports = requireReactJsxRuntime_production();\n }\n return jsxRuntime.exports;\n}\nexport {\n requireJsxRuntime as __require\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { __require as requireJsxRuntime } from \"../node_modules/react/jsx-runtime.js\";\nvar jsxRuntimeExports = requireJsxRuntime();\nexport {\n jsxRuntimeExports as j\n};\n//# sourceMappingURL=jsx-runtime.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { identifierString } from \"../functions/Conversion.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Group = window[\"MantineCore\"].Group;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ActionButton(props) {\n const hidden = props.hidden ?? false;\n return !hidden && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { disabled: !props.tooltip && !props.text, label: props.tooltip ?? props.text, position: props.tooltipAlignment ?? \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { disabled: props.disabled, p: 17, radius: props.radius ?? \"xs\", color: props.color, size: props.size, \"aria-label\": `action-button-${identifierString(props.tooltip ?? props.text ?? \"\")}`, onClick: (event) => {\n props.onClick(event);\n }, variant: props.variant ?? \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Group, { gap: \"xs\", wrap: \"nowrap\", children: props.icon }) }, `action-icon-${props.tooltip ?? props.text}`) }, `tooltip-${props.tooltip ?? props.text}`);\n}\nexport {\n ActionButton\n};\n//# sourceMappingURL=ActionButton.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","const objectToString = Object.prototype.toString;\nfunction isError(wat) {\n switch (objectToString.call(wat)) {\n case \"[object Error]\":\n case \"[object Exception]\":\n case \"[object DOMException]\":\n case \"[object WebAssembly.Exception]\":\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\nfunction isBuiltin(wat, className) {\n return objectToString.call(wat) === `[object ${className}]`;\n}\nfunction isPlainObject(wat) {\n return isBuiltin(wat, \"Object\");\n}\nfunction isThenable(wat) {\n return Boolean(wat?.then && typeof wat.then === \"function\");\n}\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch {\n return false;\n }\n}\nexport {\n isError,\n isInstanceOf,\n isPlainObject,\n isThenable\n};\n//# sourceMappingURL=is.js.map\n","const SDK_VERSION = \"10.70.0\";\nexport {\n SDK_VERSION\n};\n//# sourceMappingURL=version.js.map\n","const GLOBAL_OBJ = globalThis;\nexport {\n GLOBAL_OBJ\n};\n//# sourceMappingURL=worldwide.js.map\n","import { SDK_VERSION } from \"./utils/version.js\";\nimport { GLOBAL_OBJ } from \"./utils/worldwide.js\";\nfunction getMainCarrier() {\n getSentryCarrier(GLOBAL_OBJ);\n return GLOBAL_OBJ;\n}\nfunction getSentryCarrier(carrier) {\n const __SENTRY__ = carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n return __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n}\nfunction getGlobalSingleton(name, creator, obj = GLOBAL_OBJ) {\n const __SENTRY__ = obj.__SENTRY__ = obj.__SENTRY__ || {};\n const carrier = __SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {};\n return carrier[name] || (carrier[name] = creator());\n}\nexport {\n getGlobalSingleton,\n getMainCarrier,\n getSentryCarrier\n};\n//# sourceMappingURL=carrier.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nlet RESOLVED_RUNNER;\nfunction withRandomSafeContext(cb) {\n if (RESOLVED_RUNNER !== void 0) {\n return RESOLVED_RUNNER ? RESOLVED_RUNNER(cb) : cb();\n }\n const sym = /* @__PURE__ */ Symbol.for(\"__SENTRY_SAFE_RANDOM_ID_WRAPPER__\");\n const globalWithSymbol = GLOBAL_OBJ;\n if (sym in globalWithSymbol && typeof globalWithSymbol[sym] === \"function\") {\n RESOLVED_RUNNER = globalWithSymbol[sym];\n return RESOLVED_RUNNER(cb);\n }\n RESOLVED_RUNNER = null;\n return cb();\n}\nfunction safeMathRandom() {\n return withRandomSafeContext(() => Math.random());\n}\nfunction safeDateNow() {\n return withRandomSafeContext(() => Date.now());\n}\nexport {\n safeDateNow,\n safeMathRandom,\n withRandomSafeContext\n};\n//# sourceMappingURL=randomSafeContext.js.map\n","import { withRandomSafeContext, safeMathRandom } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction getCrypto() {\n const gbl = GLOBAL_OBJ;\n return gbl.crypto || gbl.msCrypto;\n}\nlet emptyUuid;\nfunction getRandomByte() {\n return safeMathRandom() * 16;\n}\nfunction uuid4(crypto = getCrypto()) {\n try {\n if (crypto?.randomUUID) {\n return withRandomSafeContext(() => crypto.randomUUID()).replace(/-/g, \"\");\n }\n } catch {\n }\n if (!emptyUuid) {\n emptyUuid = \"10000000100040008000\" + 1e11;\n }\n return emptyUuid.replace(\n /[018]/g,\n (c) => (\n // eslint-disable-next-line no-bitwise\n (c ^ (getRandomByte() & 15) >> c / 4).toString(16)\n )\n );\n}\nexport {\n uuid4\n};\n//# sourceMappingURL=misc.js.map\n","import { safeDateNow, withRandomSafeContext } from \"./randomSafeContext.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst ONE_SECOND_IN_MS = 1e3;\nfunction dateTimestampInSeconds() {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\nfunction createUnixTimestampInSecondsFunc() {\n const { performance } = GLOBAL_OBJ;\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n const timeOrigin = performance.timeOrigin;\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\nlet _cachedTimestampInSeconds;\nfunction timestampInSeconds() {\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\nexport {\n dateTimestampInSeconds,\n timestampInSeconds\n};\n//# sourceMappingURL=time.js.map\n","import { uuid4 } from \"./utils/misc.js\";\nimport { timestampInSeconds } from \"./utils/time.js\";\nfunction updateSession(session, context = {}) {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n session.timestamp = context.timestamp || timestampInSeconds();\n if (context.abnormal_mechanism) {\n session.abnormal_mechanism = context.abnormal_mechanism;\n }\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== void 0) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === \"number\") {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = void 0;\n } else if (typeof context.duration === \"number\") {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === \"number\") {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\nexport {\n updateSession\n};\n//# sourceMappingURL=session.js.map\n","import { getGlobalSingleton } from \"../carrier.js\";\nimport { DEBUG_BUILD } from \"../debug-build.js\";\nimport { GLOBAL_OBJ } from \"./worldwide.js\";\nconst PREFIX = \"Sentry Logger \";\nconst originalConsoleMethods = {};\nfunction consoleSandbox(callback) {\n if (!(\"console\" in GLOBAL_OBJ)) {\n return callback();\n }\n const console = GLOBAL_OBJ.console;\n const wrappedFuncs = {};\n const wrappedLevels = Object.keys(originalConsoleMethods);\n wrappedLevels.forEach((level) => {\n const originalConsoleMethod = originalConsoleMethods[level];\n wrappedFuncs[level] = console[level];\n console[level] = originalConsoleMethod;\n });\n try {\n return callback();\n } finally {\n wrappedLevels.forEach((level) => {\n console[level] = wrappedFuncs[level];\n });\n }\n}\nfunction enable() {\n _getLoggerSettings().enabled = true;\n}\nfunction disable() {\n _getLoggerSettings().enabled = false;\n}\nfunction isEnabled() {\n return _getLoggerSettings().enabled;\n}\nfunction log(...args) {\n _maybeLog(\"log\", ...args);\n}\nfunction warn(...args) {\n _maybeLog(\"warn\", ...args);\n}\nfunction error(...args) {\n _maybeLog(\"error\", ...args);\n}\nfunction _maybeLog(level, ...args) {\n if (!DEBUG_BUILD) {\n return;\n }\n if (isEnabled()) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[level](`${PREFIX}[${level}]:`, ...args);\n });\n }\n}\nfunction _getLoggerSettings() {\n if (!DEBUG_BUILD) {\n return { enabled: false };\n }\n return getGlobalSingleton(\"loggerSettings\", () => ({ enabled: false }));\n}\nconst debug = {\n /** Enable logging. */\n enable,\n /** Disable logging. */\n disable,\n /** Check if logging is enabled. */\n isEnabled,\n /** Log a message. */\n log,\n /** Log a warning. */\n warn,\n /** Log an error. */\n error\n};\nexport {\n consoleSandbox,\n debug,\n originalConsoleMethods\n};\n//# sourceMappingURL=debug-logger.js.map\n","function merge(initialObj, mergeObj, levels = 2) {\n if (!mergeObj || typeof mergeObj !== \"object\" || levels <= 0) {\n return mergeObj;\n }\n if (initialObj && Object.keys(mergeObj).length === 0) {\n return initialObj;\n }\n const output = { ...initialObj };\n for (const key in mergeObj) {\n if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n output[key] = merge(output[key], mergeObj[key], levels - 1);\n }\n }\n return output;\n}\nexport {\n merge\n};\n//# sourceMappingURL=merge.js.map\n","import { uuid4 } from \"./misc.js\";\nfunction generateTraceId() {\n return uuid4();\n}\nexport {\n generateTraceId\n};\n//# sourceMappingURL=propagationContext.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { debug } from \"./debug-logger.js\";\nfunction addNonEnumerableProperty(obj, name, value) {\n try {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value,\n writable: true,\n configurable: true\n });\n } catch {\n DEBUG_BUILD && debug.log(`Failed to add non-enumerable property \"${String(name)}\" to object`, obj);\n }\n}\nexport {\n addNonEnumerableProperty\n};\n//# sourceMappingURL=object.js.map\n","import { GLOBAL_OBJ } from \"./worldwide.js\";\nfunction makeWeakRef(value) {\n try {\n const WeakRefImpl = GLOBAL_OBJ.WeakRef;\n if (typeof WeakRefImpl === \"function\") {\n return new WeakRefImpl(value);\n }\n } catch {\n }\n return value;\n}\nfunction derefWeakRef(ref) {\n if (!ref) {\n return void 0;\n }\n if (typeof ref === \"object\" && \"deref\" in ref && typeof ref.deref === \"function\") {\n try {\n return ref.deref();\n } catch {\n return void 0;\n }\n }\n return ref;\n}\nexport {\n derefWeakRef,\n makeWeakRef\n};\n//# sourceMappingURL=weakRef.js.map\n","import { addNonEnumerableProperty } from \"./object.js\";\nimport { makeWeakRef, derefWeakRef } from \"./weakRef.js\";\nconst SCOPE_SPAN_FIELD = \"_sentrySpan\";\nfunction _setSpanForScope(scope, span) {\n if (span) {\n addNonEnumerableProperty(scope, SCOPE_SPAN_FIELD, makeWeakRef(span));\n } else {\n delete scope[SCOPE_SPAN_FIELD];\n }\n}\nfunction _getSpanForScope(scope) {\n return derefWeakRef(scope[SCOPE_SPAN_FIELD]);\n}\nexport {\n _getSpanForScope,\n _setSpanForScope\n};\n//# sourceMappingURL=spanOnScope.js.map\n","function truncate(str, max = 0) {\n if (typeof str !== \"string\" || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nexport {\n truncate\n};\n//# sourceMappingURL=string.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { updateSession } from \"./session.js\";\nimport { debug } from \"./utils/debug-logger.js\";\nimport { isPlainObject } from \"./utils/is.js\";\nimport { merge } from \"./utils/merge.js\";\nimport { uuid4 } from \"./utils/misc.js\";\nimport { generateTraceId } from \"./utils/propagationContext.js\";\nimport { safeMathRandom } from \"./utils/randomSafeContext.js\";\nimport { _setSpanForScope, _getSpanForScope } from \"./utils/spanOnScope.js\";\nimport { truncate } from \"./utils/string.js\";\nimport { dateTimestampInSeconds } from \"./utils/time.js\";\nconst DEFAULT_MAX_BREADCRUMBS = 100;\nclass Scope {\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n this._propagationContext = {\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n };\n }\n /**\n * Clone all data from this scope into a new scope.\n */\n clone() {\n const newScope = new Scope();\n newScope._breadcrumbs = [...this._breadcrumbs];\n newScope._tags = { ...this._tags };\n newScope._attributes = { ...this._attributes };\n newScope._extra = { ...this._extra };\n newScope._contexts = { ...this._contexts };\n if (this._contexts.flags) {\n newScope._contexts.flags = {\n values: [...this._contexts.flags.values]\n };\n }\n newScope._user = this._user;\n newScope._level = this._level;\n newScope._session = this._session;\n newScope._transactionName = this._transactionName;\n newScope._fingerprint = this._fingerprint;\n newScope._eventProcessors = [...this._eventProcessors];\n newScope._attachments = [...this._attachments];\n newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n newScope._propagationContext = { ...this._propagationContext };\n newScope._client = this._client;\n newScope._lastEventId = this._lastEventId;\n newScope._conversationId = this._conversationId;\n _setSpanForScope(newScope, _getSpanForScope(this));\n return newScope;\n }\n /**\n * Update the client assigned to this scope.\n * Note that not every scope will have a client assigned - isolation scopes & the global scope will generally not have a client,\n * as well as manually created scopes.\n */\n setClient(client) {\n this._client = client;\n }\n /**\n * Set the ID of the last captured error event.\n * This is generally only captured on the isolation scope.\n */\n setLastEventId(lastEventId) {\n this._lastEventId = lastEventId;\n }\n /**\n * Get the client assigned to this scope.\n */\n getClient() {\n return this._client;\n }\n /**\n * Get the ID of the last captured error event.\n * This is generally only available on the isolation scope.\n */\n lastEventId() {\n return this._lastEventId;\n }\n /**\n * @inheritDoc\n */\n addScopeListener(callback) {\n this._scopeListeners.push(callback);\n }\n /**\n * Add an event processor that will be called before an event is sent.\n */\n addEventProcessor(callback) {\n this._eventProcessors.push(callback);\n return this;\n }\n /**\n * Set the user for this scope.\n * Set to `null` to unset the user.\n */\n setUser(user) {\n this._user = user || {\n email: void 0,\n id: void 0,\n ip_address: void 0,\n username: void 0\n };\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the user from this scope.\n */\n getUser() {\n return this._user;\n }\n /**\n * Set the conversation ID for this scope.\n * Set to `null` to unset the conversation ID.\n */\n setConversationId(conversationId) {\n this._conversationId = conversationId || void 0;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set an object that will be merged into existing tags on the scope,\n * and will be sent as tags data with the event.\n */\n setTags(tags) {\n this._tags = {\n ...this._tags,\n ...tags\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single tag that will be sent as tags data with the event.\n */\n setTag(key, value) {\n return this.setTags({ [key]: value });\n }\n /**\n * Sets attributes onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param newAttributes - The attributes to set on the scope, as key-value pairs.\n *\n * @example\n * ```typescript\n * scope.setAttributes({\n * is_admin: true,\n * payment_selection: 'credit_card',\n * render_duration: 150,\n * });\n * ```\n */\n setAttributes(newAttributes) {\n this._attributes = {\n ...this._attributes,\n ...newAttributes\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets an attribute onto the scope.\n *\n * These attributes are applied to logs, metrics and streamed spans.\n *\n * Supported attribute value types are `string`, `number`, `boolean`, `string[]`, `number[]` and `boolean[]`.\n *\n * @param key - The attribute key.\n * @param value - The attribute value.\n *\n * @example\n * ```typescript\n * scope.setAttribute('is_admin', true);\n * scope.setAttribute('render_duration', 150);\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAttribute(key, value) {\n return this.setAttributes({ [key]: value });\n }\n /**\n * Removes the attribute with the given key from the scope.\n *\n * @param key - The attribute key.\n *\n * @example\n * ```typescript\n * scope.removeAttribute('is_admin');\n * ```\n */\n removeAttribute(key) {\n if (key in this._attributes) {\n delete this._attributes[key];\n this._notifyScopeListeners();\n }\n return this;\n }\n /**\n * Set an object that will be merged into existing extra on the scope,\n * and will be sent as extra data with the event.\n */\n setExtras(extras) {\n this._extra = {\n ...this._extra,\n ...extras\n };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set a single key:value extra entry that will be sent as extra data with the event.\n */\n setExtra(key, extra) {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the fingerprint on the scope to send with the events.\n * @param {string[]} fingerprint Fingerprint to group events in Sentry.\n */\n setFingerprint(fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the level on the scope for future events.\n */\n setLevel(level) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets the transaction name on the scope so that the name of e.g. taken server route or\n * the page location is attached to future events.\n *\n * IMPORTANT: Calling this function does NOT change the name of the currently active\n * root span. If you want to change the name of the active root span, use\n * `Sentry.updateSpanName(rootSpan, 'new name')` instead.\n *\n * By default, the SDK updates the scope's transaction name automatically on sensible\n * occasions, such as a page navigation or when handling a new request on the server.\n */\n setTransactionName(name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Sets context data with the given name.\n * Data passed as context will be normalized. You can also pass `null` to unset the context.\n * Note that context data will not be merged - calling `setContext` will overwrite an existing context with the same key.\n */\n setContext(key, context) {\n if (context === null) {\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Set the session for the scope.\n */\n setSession(session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the session from the scope.\n */\n getSession() {\n return this._session;\n }\n /**\n * Updates the scope with provided data. Can work in three variations:\n * - plain object containing updatable attributes\n * - Scope instance that'll extract the attributes from\n * - callback function that'll receive the current scope as an argument and allow for modifications\n */\n update(captureContext) {\n if (!captureContext) {\n return this;\n }\n const scopeToMerge = typeof captureContext === \"function\" ? captureContext(this) : captureContext;\n const scopeInstance = scopeToMerge instanceof Scope ? scopeToMerge.getScopeData() : isPlainObject(scopeToMerge) ? captureContext : void 0;\n const {\n tags,\n attributes,\n extra,\n user,\n contexts,\n level,\n fingerprint = [],\n propagationContext,\n conversationId\n } = scopeInstance || {};\n this._tags = { ...this._tags, ...tags };\n this._attributes = { ...this._attributes, ...attributes };\n this._extra = { ...this._extra, ...extra };\n this._contexts = { ...this._contexts, ...contexts };\n if (user && Object.keys(user).length) {\n this._user = user;\n }\n if (level) {\n this._level = level;\n }\n if (fingerprint.length) {\n this._fingerprint = fingerprint;\n }\n if (propagationContext) {\n this._propagationContext = propagationContext;\n }\n if (conversationId) {\n this._conversationId = conversationId;\n }\n return this;\n }\n /**\n * Clears the current scope and resets its properties.\n * Note: The client will not be cleared.\n */\n clear() {\n this._breadcrumbs = [];\n this._tags = {};\n this._attributes = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = void 0;\n this._transactionName = void 0;\n this._fingerprint = void 0;\n this._session = void 0;\n this._conversationId = void 0;\n _setSpanForScope(this, void 0);\n this._attachments = [];\n this.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom()\n });\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Adds a breadcrumb to the scope.\n * By default, the last 100 breadcrumbs are kept.\n */\n addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n const maxCrumbs = typeof maxBreadcrumbs === \"number\" ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n if (maxCrumbs <= 0) {\n return this;\n }\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n // Breadcrumb messages can theoretically be infinitely large and they're held in memory so we truncate them not to leak (too much) memory\n message: breadcrumb.message ? truncate(breadcrumb.message, 2048) : breadcrumb.message\n };\n this._breadcrumbs.push(mergedBreadcrumb);\n if (this._breadcrumbs.length > maxCrumbs) {\n this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs);\n this._client?.recordDroppedEvent(\"buffer_overflow\", \"log_item\");\n }\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Get the last breadcrumb of the scope.\n */\n getLastBreadcrumb() {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n /**\n * Clear all breadcrumbs from the scope.\n */\n clearBreadcrumbs() {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n /**\n * Add an attachment to the scope.\n */\n addAttachment(attachment) {\n this._attachments.push(attachment);\n return this;\n }\n /**\n * Clear all attachments from the scope.\n */\n clearAttachments() {\n this._attachments = [];\n return this;\n }\n /**\n * Get the data of this scope, which should be applied to an event during processing.\n */\n getScopeData() {\n return {\n breadcrumbs: this._breadcrumbs,\n attachments: this._attachments,\n contexts: this._contexts,\n tags: this._tags,\n attributes: this._attributes,\n extra: this._extra,\n user: this._user,\n level: this._level,\n fingerprint: this._fingerprint || [],\n eventProcessors: this._eventProcessors,\n propagationContext: this._propagationContext,\n sdkProcessingMetadata: this._sdkProcessingMetadata,\n transactionName: this._transactionName,\n span: _getSpanForScope(this),\n conversationId: this._conversationId\n };\n }\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry.\n */\n setSDKProcessingMetadata(newData) {\n this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n return this;\n }\n /**\n * Add propagation context to the scope, used for distributed tracing\n */\n setPropagationContext(context) {\n this._propagationContext = context;\n return this;\n }\n /**\n * Get propagation context from the scope, used for distributed tracing\n */\n getPropagationContext() {\n return this._propagationContext;\n }\n /**\n * Capture an exception for this scope.\n *\n * @returns {string} The id of the captured Sentry event.\n */\n captureException(exception, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture exception!\");\n return eventId;\n }\n const syntheticException = new Error(\"Sentry syntheticException\");\n this._client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a message for this scope.\n *\n * @returns {string} The id of the captured message.\n */\n captureMessage(message, level, hint) {\n const eventId = hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture message!\");\n return eventId;\n }\n const syntheticException = hint?.syntheticException ?? new Error(message);\n this._client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId\n },\n this\n );\n return eventId;\n }\n /**\n * Capture a Sentry event for this scope.\n *\n * @returns {string} The id of the captured event.\n */\n captureEvent(event, hint) {\n const eventId = event.event_id || hint?.event_id || uuid4();\n if (!this._client) {\n DEBUG_BUILD && debug.warn(\"No client configured on scope - will not capture event!\");\n return eventId;\n }\n this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n return eventId;\n }\n /**\n * This will be called on every set call.\n */\n _notifyScopeListeners() {\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach((callback) => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n}\nexport {\n Scope\n};\n//# sourceMappingURL=scope.js.map\n","import { getGlobalSingleton } from \"./carrier.js\";\nimport { Scope } from \"./scope.js\";\nfunction getDefaultCurrentScope() {\n return getGlobalSingleton(\"defaultCurrentScope\", () => new Scope());\n}\nfunction getDefaultIsolationScope() {\n return getGlobalSingleton(\"defaultIsolationScope\", () => new Scope());\n}\nexport {\n getDefaultCurrentScope,\n getDefaultIsolationScope\n};\n//# sourceMappingURL=defaultScopes.js.map\n","const isActualPromise = (p) => p instanceof Promise && !p[kChainedCopy];\nconst kChainedCopy = /* @__PURE__ */ Symbol(\"chained PromiseLike\");\nconst chainAndCopyPromiseLike = (original, onSuccess, onError) => {\n const chained = original.then(\n (value) => {\n onSuccess(value);\n return value;\n },\n (err) => {\n onError(err);\n throw err;\n }\n );\n return isActualPromise(chained) && isActualPromise(original) ? chained : copyProps(original, chained);\n};\nconst copyProps = (original, chained) => {\n if (!chained) return original;\n let mutated = false;\n for (const key in original) {\n if (key in chained) continue;\n mutated = true;\n const value = original[key];\n if (typeof value === \"function\") {\n Object.defineProperty(chained, key, {\n value: (...args) => value.apply(original, args),\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n chained[key] = value;\n }\n }\n if (mutated) Object.assign(chained, { [kChainedCopy]: true });\n return chained;\n};\nexport {\n chainAndCopyPromiseLike\n};\n//# sourceMappingURL=chain-and-copy-promiselike.js.map\n","import { getDefaultCurrentScope, getDefaultIsolationScope } from \"../defaultScopes.js\";\nimport { Scope } from \"../scope.js\";\nimport { chainAndCopyPromiseLike } from \"../utils/chain-and-copy-promiselike.js\";\nimport { isThenable } from \"../utils/is.js\";\nimport { getMainCarrier, getSentryCarrier } from \"../carrier.js\";\nclass AsyncContextStack {\n constructor(scope, isolationScope) {\n let assignedScope;\n if (!scope) {\n assignedScope = new Scope();\n } else {\n assignedScope = scope;\n }\n let assignedIsolationScope;\n if (!isolationScope) {\n assignedIsolationScope = new Scope();\n } else {\n assignedIsolationScope = isolationScope;\n }\n this._stack = [{ scope: assignedScope }];\n this._isolationScope = assignedIsolationScope;\n }\n /**\n * Fork a scope for the stack.\n */\n withScope(callback) {\n const scope = this._pushScope();\n let maybePromiseResult;\n try {\n maybePromiseResult = callback(scope);\n } catch (e) {\n this._popScope();\n throw e;\n }\n if (isThenable(maybePromiseResult)) {\n return chainAndCopyPromiseLike(\n maybePromiseResult,\n () => this._popScope(),\n () => this._popScope()\n );\n }\n this._popScope();\n return maybePromiseResult;\n }\n /**\n * Get the client of the stack.\n */\n getClient() {\n return this.getStackTop().client;\n }\n /**\n * Returns the scope of the top stack.\n */\n getScope() {\n return this.getStackTop().scope;\n }\n /**\n * Get the isolation scope for the stack.\n */\n getIsolationScope() {\n return this._isolationScope;\n }\n /**\n * Returns the topmost scope layer in the order domain > local > process.\n */\n getStackTop() {\n return this._stack[this._stack.length - 1];\n }\n /**\n * Push a scope to the stack.\n */\n _pushScope() {\n const scope = this.getScope().clone();\n this._stack.push({\n client: this.getClient(),\n scope\n });\n return scope;\n }\n /**\n * Pop a scope from the stack.\n */\n _popScope() {\n if (this._stack.length <= 1) return false;\n return !!this._stack.pop();\n }\n}\nfunction getAsyncContextStack() {\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n return sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope());\n}\nfunction withScope(callback) {\n return getAsyncContextStack().withScope(callback);\n}\nfunction withSetScope(scope, callback) {\n const stack = getAsyncContextStack();\n return stack.withScope(() => {\n stack.getStackTop().scope = scope;\n return callback(scope);\n });\n}\nfunction withIsolationScope(callback) {\n return getAsyncContextStack().withScope(() => {\n return callback(getAsyncContextStack().getIsolationScope());\n });\n}\nfunction getStackAsyncContextStrategy() {\n return {\n withIsolationScope,\n withScope,\n withSetScope,\n withSetIsolationScope: (_isolationScope, callback) => {\n return withIsolationScope(callback);\n },\n getCurrentScope: () => getAsyncContextStack().getScope(),\n getIsolationScope: () => getAsyncContextStack().getIsolationScope()\n };\n}\nexport {\n AsyncContextStack,\n getStackAsyncContextStrategy\n};\n//# sourceMappingURL=stackStrategy.js.map\n","import { getSentryCarrier } from \"../carrier.js\";\nimport { getStackAsyncContextStrategy } from \"./stackStrategy.js\";\nfunction getAsyncContextStrategy(carrier) {\n const sentry = getSentryCarrier(carrier);\n if (sentry.acs) {\n return sentry.acs;\n }\n return getStackAsyncContextStrategy();\n}\nexport {\n getAsyncContextStrategy\n};\n//# sourceMappingURL=index.js.map\n","import { getAsyncContextStrategy } from \"./asyncContext/index.js\";\nimport { getMainCarrier } from \"./carrier.js\";\nfunction getCurrentScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getCurrentScope();\n}\nfunction getIsolationScope() {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getIsolationScope();\n}\nfunction withScope(...rest) {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (rest.length === 2) {\n const [scope, callback] = rest;\n if (!scope) {\n return acs.withScope(callback);\n }\n return acs.withSetScope(scope, callback);\n }\n return acs.withScope(rest[0]);\n}\nfunction getClient() {\n return getCurrentScope().getClient();\n}\nexport {\n getClient,\n getCurrentScope,\n getIsolationScope,\n withScope\n};\n//# sourceMappingURL=currentScopes.js.map\n","import { Scope } from \"../scope.js\";\nfunction parseEventHintOrCaptureContext(hint) {\n if (!hint) {\n return void 0;\n }\n if (hintIsScopeOrFunction(hint)) {\n return { captureContext: hint };\n }\n if (hintIsScopeContext(hint)) {\n return {\n captureContext: hint\n };\n }\n return hint;\n}\nfunction hintIsScopeOrFunction(hint) {\n return hint instanceof Scope || typeof hint === \"function\";\n}\nconst captureContextKeys = [\n \"user\",\n \"level\",\n \"extra\",\n \"contexts\",\n \"tags\",\n \"fingerprint\",\n \"propagationContext\"\n];\nfunction hintIsScopeContext(hint) {\n return Object.keys(hint).some((key) => captureContextKeys.includes(key));\n}\nexport {\n parseEventHintOrCaptureContext\n};\n//# sourceMappingURL=prepareEvent.js.map\n","import { getIsolationScope, getCurrentScope } from \"./currentScopes.js\";\nimport { parseEventHintOrCaptureContext } from \"./utils/prepareEvent.js\";\nfunction captureException(exception, hint) {\n return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\nfunction lastEventId() {\n return getIsolationScope().lastEventId();\n}\nexport {\n captureException,\n lastEventId\n};\n//# sourceMappingURL=exports.js.map\n","import { isError } from \"../../../core/build/esm/utils/is.js\";\nimport { captureException } from \"../../../core/build/esm/exports.js\";\nconst version = window[\"React\"].version;\nfunction isAtLeastReact17(reactVersion) {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\nfunction setCause(error, cause) {\n const seenErrors = /* @__PURE__ */ new WeakSet();\n function recurse(error2, cause2) {\n if (seenErrors.has(error2)) {\n return;\n }\n if (error2.cause) {\n seenErrors.add(error2);\n return recurse(error2.cause, cause2);\n }\n error2.cause = cause2;\n }\n recurse(error, cause);\n}\nfunction captureReactException(error, { componentStack }, hint) {\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n setCause(error, errorBoundaryError);\n }\n return captureException(error, hint);\n}\nexport {\n captureReactException,\n isAtLeastReact17,\n setCause\n};\n//# sourceMappingURL=error.js.map\n","const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === \"undefined\" || __SENTRY_DEBUG__;\nexport {\n DEBUG_BUILD\n};\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from \"../../../../../core/build/esm/utils/worldwide.js\";\nconst WINDOW = GLOBAL_OBJ;\nexport {\n WINDOW\n};\n//# sourceMappingURL=helpers.js.map\n","import { DEBUG_BUILD } from \"../debug-build.js\";\nimport { consoleSandbox, debug } from \"./debug-logger.js\";\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)((?:\\[[:.%\\w]+\\]|[\\w.-]+))(?::(\\d+))?\\/(.+)/;\nfunction isValidProtocol(protocol) {\n return protocol === \"http\" || protocol === \"https\";\n}\nfunction dsnToString(dsn, withPassword = false) {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : \"\"}@${host}${port ? `:${port}` : \"\"}/${path ? `${path}/` : path}${projectId}`;\n}\nfunction dsnFromString(str) {\n const match = DSN_REGEX.exec(str);\n if (!match) {\n consoleSandbox(() => {\n console.error(`Invalid Sentry Dsn: ${str}`);\n });\n return void 0;\n }\n const [protocol, publicKey, pass = \"\", host = \"\", port = \"\", lastPath = \"\"] = match.slice(1);\n let path = \"\";\n let projectId = lastPath;\n const split = projectId.split(\"/\");\n if (split.length > 1) {\n path = split.slice(0, -1).join(\"/\");\n projectId = split.pop();\n }\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n return dsnFromComponents({ host, pass, path, projectId, port, protocol, publicKey });\n}\nfunction dsnFromComponents(components) {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || \"\",\n pass: components.pass || \"\",\n host: components.host,\n port: components.port || \"\",\n path: components.path || \"\",\n projectId: components.projectId\n };\n}\nfunction validateDsn(dsn) {\n if (!DEBUG_BUILD) {\n return true;\n }\n const { port, projectId, protocol } = dsn;\n const requiredComponents = [\"protocol\", \"publicKey\", \"host\", \"projectId\"];\n const hasMissingRequiredComponent = requiredComponents.find((component) => {\n if (!dsn[component]) {\n debug.error(`Invalid Sentry Dsn: ${component} missing`);\n return true;\n }\n return false;\n });\n if (hasMissingRequiredComponent) {\n return false;\n }\n if (!projectId.match(/^\\d+$/)) {\n debug.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n return false;\n }\n if (!isValidProtocol(protocol)) {\n debug.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n return false;\n }\n if (port && isNaN(parseInt(port, 10))) {\n debug.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n return false;\n }\n return true;\n}\nfunction makeDsn(from) {\n const components = typeof from === \"string\" ? dsnFromString(from) : dsnFromComponents(from);\n if (!components || !validateDsn(components)) {\n return void 0;\n }\n return components;\n}\nexport {\n dsnFromString,\n dsnToString,\n makeDsn\n};\n//# sourceMappingURL=dsn.js.map\n","import { makeDsn, dsnToString } from \"./utils/dsn.js\";\nfunction getBaseApiEndpoint(dsn) {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : \"\";\n const port = dsn.port ? `:${dsn.port}` : \"\";\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : \"\"}/api/`;\n}\nfunction getReportDialogEndpoint(dsnLike, dialogOptions) {\n const dsn = makeDsn(dsnLike);\n if (!dsn) {\n return \"\";\n }\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === \"dsn\") {\n continue;\n }\n if (key === \"onClose\") {\n continue;\n }\n if (key === \"user\") {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key])}`;\n }\n }\n return `${endpoint}?${encodedOptions}`;\n}\nexport {\n getReportDialogEndpoint\n};\n//# sourceMappingURL=api.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { WINDOW } from \"./helpers.js\";\nimport { debug } from \"../../../../../core/build/esm/utils/debug-logger.js\";\nimport { getCurrentScope, getClient } from \"../../../../../core/build/esm/currentScopes.js\";\nimport { lastEventId } from \"../../../../../core/build/esm/exports.js\";\nimport { getReportDialogEndpoint } from \"../../../../../core/build/esm/api.js\";\nfunction showReportDialog(options = {}) {\n const optionalDocument = WINDOW.document;\n const injectionPoint = optionalDocument?.head || optionalDocument?.body;\n if (!injectionPoint) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] Global document not defined\");\n return;\n }\n const scope = getCurrentScope();\n const client = getClient();\n const dsn = client?.getDsn();\n if (!dsn) {\n DEBUG_BUILD && debug.error(\"[showReportDialog] DSN not configured\");\n return;\n }\n const mergedOptions = {\n ...options,\n user: {\n ...scope.getUser(),\n ...options.user\n },\n eventId: options.eventId || lastEventId()\n };\n const script = WINDOW.document.createElement(\"script\");\n script.async = true;\n script.crossOrigin = \"anonymous\";\n script.src = getReportDialogEndpoint(dsn, mergedOptions);\n const { onLoad, onClose } = mergedOptions;\n if (onLoad) {\n script.onload = onLoad;\n }\n if (onClose) {\n const reportDialogClosedMessageHandler = (event) => {\n if (event.data === \"__sentry_reportdialog_closed__\") {\n try {\n onClose();\n } finally {\n WINDOW.removeEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n }\n };\n WINDOW.addEventListener(\"message\", reportDialogClosedMessageHandler);\n }\n injectionPoint.appendChild(script);\n}\nexport {\n showReportDialog\n};\n//# sourceMappingURL=report-dialog.js.map\n","import { DEBUG_BUILD } from \"./debug-build.js\";\nimport { captureReactException } from \"./error.js\";\nimport { getClient, withScope } from \"../../../core/build/esm/currentScopes.js\";\nimport { showReportDialog } from \"../../../browser/build/npm/esm/prod/report-dialog.js\";\nimport { debug } from \"../../../core/build/esm/utils/debug-logger.js\";\nconst React = window[\"React\"];\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null\n};\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on(\"afterSendEvent\", (event) => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n componentDidCatch(error, errorInfo) {\n const { componentStack } = errorInfo;\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope((scope) => {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled, type: \"auto.function.react.error_boundary\" }\n });\n if (onError) {\n onError(error, componentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n this.setState({ error, componentStack, eventId });\n });\n }\n componentDidMount() {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n componentWillUnmount() {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n if (this.state === INITIAL_STATE) {\n onUnmount(null, null, null);\n } else {\n onUnmount(error, componentStack, eventId);\n }\n }\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = void 0;\n }\n }\n resetErrorBoundary() {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n onReset(error, componentStack, eventId);\n }\n this.setState(INITIAL_STATE);\n }\n render() {\n const { fallback, children } = this.props;\n const state = this.state;\n if (state.componentStack === null) {\n return typeof children === \"function\" ? children() : children;\n }\n const element = typeof fallback === \"function\" ? React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack,\n resetError: () => this.resetErrorBoundary(),\n eventId: state.eventId\n }) : fallback;\n if (React.isValidElement(element)) {\n return element;\n }\n if (fallback) {\n DEBUG_BUILD && debug.warn(\"fallback did not produce a valid ReactElement\");\n }\n return null;\n }\n}\nexport {\n ErrorBoundary\n};\n//# sourceMappingURL=errorboundary.js.map\n","var defaultAttributes = {\n outline: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n },\n filled: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n stroke: \"none\"\n }\n};\nexport {\n defaultAttributes as default\n};\n//# sourceMappingURL=defaultAttributes.js.map\n","import defaultAttributes from \"./defaultAttributes.js\";\nconst forwardRef = window[\"React\"].forwardRef;\nconst createElement = window[\"React\"].createElement;\nconst createReactComponent = (type, iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = \"currentColor\", size = 24, stroke = 2, title, className, children, ...rest }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(\" \"),\n ...{\n strokeWidth: stroke,\n stroke: color\n },\n ...rest\n },\n [\n title && createElement(\"title\", { key: \"svg-title\" }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n );\n Component.displayName = `${iconNamePascal}`;\n return Component;\n};\nexport {\n createReactComponent as default\n};\n//# sourceMappingURL=createReactComponent.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M12 16v.01\", \"key\": \"svg-2\" }]];\nconst IconExclamationCircle = createReactComponent(\"outline\", \"exclamation-circle\", \"ExclamationCircle\", __iconNode);\nexport {\n __iconNode,\n IconExclamationCircle as default\n};\n//# sourceMappingURL=IconExclamationCircle.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M12 9h.01\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M11 12h1v4h1\", \"key\": \"svg-2\" }]];\nconst IconInfoCircle = createReactComponent(\"outline\", \"info-circle\", \"InfoCircle\", __iconNode);\nexport {\n __iconNode,\n IconInfoCircle as default\n};\n//# sourceMappingURL=IconInfoCircle.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { ErrorBoundary } from \"../node_modules/@sentry/react/build/esm/errorboundary.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconInfoCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconInfoCircle.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Alert = window[\"MantineCore\"].Alert;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useState = window[\"React\"].useState;\nfunction DefaultFallback({\n title,\n error\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}), title: `INVE-E17: ${_i18n._(\n /*i18n*/\n {\n id: \"qwCNwv\"\n }\n )}: ${title}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"iqWQW8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: _i18n._(\n /*i18n*/\n {\n id: \"pz0nW1\"\n }\n ) })\n ] }) }),\n error && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { color: \"red\", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconInfoCircle, {}), title: _i18n._(\n /*i18n*/\n {\n id: \"7Jw/XW\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { size: \"sm\", children: error }) })\n ] });\n}\nfunction Boundary({\n children,\n label,\n fallback\n}) {\n const [errorMessage, setErrorMessage] = useState(null);\n const onError = useCallback((error, componentStack, eventId) => {\n console.error(`ERR: Error rendering component: ${label}`);\n console.error(error);\n setErrorMessage(error instanceof Error ? error.message : String(error));\n }, []);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { fallback: fallback ?? /* @__PURE__ */ jsxRuntimeExports.jsx(DefaultFallback, { title: label, error: errorMessage }), onError, children });\n}\nexport {\n Boundary,\n DefaultFallback\n};\n//# sourceMappingURL=Boundary.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction ButtonMenu({\n icon,\n actions,\n tooltip = \"\",\n label = \"\"\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"default\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: tooltip, children: icon }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { children: [\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: label }),\n actions.map((action, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: action }, `${i}-${action}`))\n ] })\n ] });\n}\nexport {\n ButtonMenu\n};\n//# sourceMappingURL=ButtonMenu.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l5 5l10 -10\", \"key\": \"svg-0\" }]];\nconst IconCheck = createReactComponent(\"outline\", \"check\", \"Check\", __iconNode);\nexport {\n __iconNode,\n IconCheck as default\n};\n//# sourceMappingURL=IconCheck.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1\", \"key\": \"svg-1\" }]];\nconst IconCopy = createReactComponent(\"outline\", \"copy\", \"Copy\", __iconNode);\nexport {\n __iconNode,\n IconCopy as default\n};\n//# sourceMappingURL=IconCopy.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Button = window[\"MantineCore\"].Button;\nconst MantineCopyButton = window[\"MantineCore\"].CopyButton;\nconst Text = window[\"MantineCore\"].Text;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction CopyButton({\n value,\n label,\n tooltip,\n disabled,\n tooltipPosition,\n content,\n size,\n color = \"gray\",\n variant = \"transparent\"\n}) {\n const ButtonComponent = label ? Button : ActionIcon;\n if (!window.isSecureContext) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(MantineCopyButton, { value, children: ({\n copied,\n copy\n }) => /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: copied ? _i18n._(\n /*i18n*/\n {\n id: \"6V3Ea3\"\n }\n ) : tooltip ?? _i18n._(\n /*i18n*/\n {\n id: \"he3ygx\"\n }\n ), withArrow: true, position: tooltipPosition, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(ButtonComponent, { disabled, color: copied ? \"teal\" : color, onClick: (e) => {\n e.stopPropagation();\n e.preventDefault();\n copy();\n }, variant: copied ? \"transparent\" : variant ?? \"transparent\", size: size ?? \"sm\", children: [\n copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {}),\n content,\n label && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { p: size ?? \"sm\", size: size ?? \"sm\", children: label })\n ] }) }) });\n}\nexport {\n CopyButton\n};\n//# sourceMappingURL=CopyButton.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { CopyButton } from \"./CopyButton.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst useState = window[\"React\"].useState;\nfunction CopyableCell({\n children,\n value\n}) {\n const [isHovered, setIsHovered] = useState(false);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: 0, p: 0, wrap: \"nowrap\", onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), justify: \"space-between\", align: \"center\", children: [\n children,\n window.isSecureContext && isHovered && value != null && /* @__PURE__ */ jsxRuntimeExports.jsx(\"span\", { style: {\n position: \"relative\"\n }, onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntimeExports.jsx(\"div\", { style: {\n position: \"absolute\",\n right: 0,\n transform: \"translateY(-50%)\"\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(CopyButton, { value, variant: \"default\" }) }) })\n ] });\n}\nexport {\n CopyableCell\n};\n//# sourceMappingURL=CopyableCell.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { formatDecimal } from \"../functions/Formatting.js\";\nconst Group = window[\"MantineCore\"].Group;\nconst Progress = window[\"MantineCore\"].Progress;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useMemo = window[\"React\"].useMemo;\nfunction ProgressBar(props) {\n const progress = useMemo(() => {\n const maximum = props.maximum ?? 100;\n const value = Math.max(props.value, 0);\n if (maximum == 0) {\n return 0;\n }\n return value / maximum * 100;\n }, [props]);\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: 2, style: {\n flexGrow: 1,\n minWidth: \"100px\"\n }, children: [\n props.progressLabel && /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", justify: \"center\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { ta: \"center\", size: \"xs\", children: [\n formatDecimal(props.value),\n \" / \",\n formatDecimal(props.maximum)\n ] }),\n props.units && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { size: \"xs\", children: [\n \"[\",\n props.units,\n \"]\"\n ] })\n ] }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Progress, { value: progress, color: progress < 100 ? \"orange\" : progress > 100 ? \"blue\" : \"green\", size: props.size ?? \"md\", radius: \"sm\", animated: props.animated })\n ] });\n}\nexport {\n ProgressBar\n};\n//# sourceMappingURL=ProgressBar.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { isTrue } from \"../functions/Conversion.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst Badge = window[\"MantineCore\"].Badge;\nwindow[\"MantineCore\"].Skeleton;\nfunction PassFailButton({\n value,\n passText,\n failText,\n passColor,\n failColor\n}) {\n const v = isTrue(value);\n const pass = passText ?? _i18n._(\n /*i18n*/\n {\n id: \"wFwgKk\"\n }\n );\n const fail = failText ?? _i18n._(\n /*i18n*/\n {\n id: \"qcloGZ\"\n }\n );\n const pColor = passColor ?? \"green\";\n const fColor = failColor ?? \"red\";\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { color: v ? pColor : fColor, variant: \"filled\", radius: \"lg\", size: \"sm\", style: {\n maxWidth: \"50px\"\n }, children: v ? pass : fail });\n}\nfunction YesNoButton({\n value\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(PassFailButton, { value, passText: _i18n._(\n /*i18n*/\n {\n id: \"l75CjT\"\n }\n ), failText: _i18n._(\n /*i18n*/\n {\n id: \"1UzENP\"\n }\n ), failColor: \"orange.6\" });\n}\nexport {\n PassFailButton,\n YesNoButton\n};\n//# sourceMappingURL=YesNoButton.js.map\n","const useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useRef = window[\"React\"].useRef;\nconst useState = window[\"React\"].useState;\nfunction useDebouncedValue(value, wait, options = { leading: false }) {\n const [_value, setValue] = useState(value);\n const mountedRef = useRef(false);\n const timeoutRef = useRef(null);\n const cooldownRef = useRef(false);\n const latestValueRef = useRef(value);\n latestValueRef.current = value;\n const cancel = useCallback(() => {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n cooldownRef.current = false;\n }, []);\n const flush = useCallback(() => {\n if (timeoutRef.current) {\n cancel();\n cooldownRef.current = false;\n setValue(latestValueRef.current);\n }\n }, []);\n useEffect(() => {\n if (mountedRef.current) if (!cooldownRef.current && options.leading) {\n cooldownRef.current = true;\n setValue(value);\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n }, wait);\n } else {\n cancel();\n timeoutRef.current = window.setTimeout(() => {\n cooldownRef.current = false;\n setValue(value);\n }, wait);\n }\n }, [\n value,\n options.leading,\n wait\n ]);\n useEffect(() => {\n mountedRef.current = true;\n return cancel;\n }, []);\n return [\n _value,\n cancel,\n {\n cancel,\n flush\n }\n ];\n}\nexport {\n useDebouncedValue\n};\n//# sourceMappingURL=use-debounced-value.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M21 21l-6 -6\", \"key\": \"svg-1\" }]];\nconst IconSearch = createReactComponent(\"outline\", \"search\", \"Search\", __iconNode);\nexport {\n __iconNode,\n IconSearch as default\n};\n//# sourceMappingURL=IconSearch.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDebouncedValue } from \"../node_modules/@mantine/hooks/esm/use-debounced-value/use-debounced-value.js\";\nimport IconSearch from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst CloseButton = window[\"MantineCore\"].CloseButton;\nconst TextInput = window[\"MantineCore\"].TextInput;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction SearchInput({\n disabled,\n debounce,\n placeholder,\n searchCallback\n}) {\n const [value, setValue] = useState(\"\");\n const [searchText] = useDebouncedValue(value, debounce ?? 500);\n useEffect(() => {\n searchCallback(searchText);\n }, [searchText]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(TextInput, { value, disabled, \"aria-label\": \"table-search-input\", leftSection: /* @__PURE__ */ jsxRuntimeExports.jsx(IconSearch, {}), placeholder: placeholder ?? _i18n._(\n /*i18n*/\n {\n id: \"A1taO8\"\n }\n ), onChange: (event) => setValue(event.target.value), rightSection: value.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(CloseButton, { size: \"xs\", onClick: () => {\n setValue(\"\");\n searchCallback(\"\");\n } }) : null });\n}\nexport {\n SearchInput\n};\n//# sourceMappingURL=SearchInput.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M6 4v4\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M6 12v8\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M12 4v10\", \"key\": \"svg-4\" }], [\"path\", { \"d\": \"M12 18v2\", \"key\": \"svg-5\" }], [\"path\", { \"d\": \"M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0\", \"key\": \"svg-6\" }], [\"path\", { \"d\": \"M18 4v1\", \"key\": \"svg-7\" }], [\"path\", { \"d\": \"M18 9v11\", \"key\": \"svg-8\" }]];\nconst IconAdjustments = createReactComponent(\"outline\", \"adjustments\", \"Adjustments\", __iconNode);\nexport {\n __iconNode,\n IconAdjustments as default\n};\n//# sourceMappingURL=IconAdjustments.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconAdjustments from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustments.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Checkbox = window[\"MantineCore\"].Checkbox;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nfunction TableColumnSelect({\n columns,\n onToggleColumn\n}) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { shadow: \"xs\", closeOnItemClick: false, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"transparent\", \"aria-label\": \"table-select-columns\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ), position: \"top-end\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconAdjustments, {}) }) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu.Dropdown, { style: {\n maxHeight: \"400px\",\n overflowY: \"auto\"\n }, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Label, { children: _i18n._(\n /*i18n*/\n {\n id: \"kCTFU8\"\n }\n ) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n columns.filter((col) => (col.switchable ?? true) && !col.propHidden).map((col) => /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox, { checked: !col.hidden, label: col.title || col.accessor, onChange: () => onToggleColumn(col.accessor), radius: \"sm\" }) }, col.accessor))\n ] })\n ] });\n}\nexport {\n TableColumnSelect\n};\n//# sourceMappingURL=TableColumnSelect.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592 -5.592a2.41 2.41 0 0 0 0 -3.408l-7.71 -7.71a2 2 0 0 0 -1.414 -.586h-5.172a3 3 0 0 0 -3 3\", \"key\": \"svg-1\" }]];\nconst IconTag = createReactComponent(\"outline\", \"tag\", \"Tag\", __iconNode);\nexport {\n __iconNode,\n IconTag as default\n};\n//# sourceMappingURL=IconTag.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport IconTag from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTag.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Badge = window[\"MantineCore\"].Badge;\nconst Group = window[\"MantineCore\"].Group;\nconst Paper = window[\"MantineCore\"].Paper;\nfunction TagsList({\n tags\n}) {\n if (!tags || tags.length === 0) {\n return null;\n }\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Paper, { p: \"xs\", shadow: \"xs\", withBorder: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { gap: \"xs\", children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { size: \"sm\", variant: \"transparent\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTag, {}) }),\n tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: \"outline\", size: \"sm\", children: tag }, tag))\n ] }) });\n}\nexport {\n TagsList as default\n};\n//# sourceMappingURL=TagsList.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nconst Alert = window[\"MantineCore\"].Alert;\nfunction InvenTreeTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n context\n}) {\n if (!context?.tables?.renderTable) {\n return /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { title: \"Plugin Version Error\", color: \"red\", children: [\n 'The component cannot be rendered because the plugin context is missing the \"renderTable\" function.',\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n \"This means that the InvenTree UI library version is incompatible with this plugin version.\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"Plugin Version:\" }),\n \" \",\n INVENTREE_PLUGIN_VERSION,\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {}),\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"b\", { children: \"UI Version:\" }),\n \" \",\n context?.version?.inventree || \"unknown\",\n /* @__PURE__ */ jsxRuntimeExports.jsx(\"br\", {})\n ] });\n }\n return context?.tables.renderTable({\n url,\n tableState,\n tableData,\n columns,\n props,\n api: context.api,\n navigate: context.navigate\n });\n}\nexport {\n InvenTreeTable as default\n};\n//# sourceMappingURL=InvenTreeTable.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\", \"key\": \"svg-2\" }]];\nconst IconDots = createReactComponent(\"outline\", \"dots\", \"Dots\", __iconNode);\nexport {\n __iconNode,\n IconDots as default\n};\n//# sourceMappingURL=IconDots.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 10l4 4m0 -4l-4 4\", \"key\": \"svg-1\" }]];\nconst IconCircleX = createReactComponent(\"outline\", \"circle-x\", \"CircleX\", __iconNode);\nexport {\n __iconNode,\n IconCircleX as default\n};\n//# sourceMappingURL=IconCircleX.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M4 7l16 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M10 11l0 6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M14 11l0 6\", \"key\": \"svg-2\" }], [\"path\", { \"d\": \"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12\", \"key\": \"svg-3\" }], [\"path\", { \"d\": \"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3\", \"key\": \"svg-4\" }]];\nconst IconTrash = createReactComponent(\"outline\", \"trash\", \"Trash\", __iconNode);\nexport {\n __iconNode,\n IconTrash as default\n};\n//# sourceMappingURL=IconTrash.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M16 5l3 3\", \"key\": \"svg-2\" }]];\nconst IconEdit = createReactComponent(\"outline\", \"edit\", \"Edit\", __iconNode);\nexport {\n __iconNode,\n IconEdit as default\n};\n//# sourceMappingURL=IconEdit.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M13 18l6 -6\", \"key\": \"svg-1\" }], [\"path\", { \"d\": \"M13 6l6 6\", \"key\": \"svg-2\" }]];\nconst IconArrowRight = createReactComponent(\"outline\", \"arrow-right\", \"ArrowRight\", __iconNode);\nexport {\n __iconNode,\n IconArrowRight as default\n};\n//# sourceMappingURL=IconArrowRight.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { cancelEvent } from \"../functions/Events.js\";\nimport { eventModified, getDetailUrl, navigateToLink } from \"../functions/Navigation.js\";\nimport IconDots from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconDots.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconTrash from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.js\";\nimport IconCopy from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.js\";\nimport IconEdit from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.js\";\nimport IconArrowRight from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconArrowRight.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Menu = window[\"MantineCore\"].Menu;\nconst Tooltip = window[\"MantineCore\"].Tooltip;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction RowViewAction(props) {\n return {\n ...props,\n color: void 0,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowRight, {}),\n onClick: (event) => {\n const showPreviewPanel = props.isPreviewEnabled?.() ?? false;\n if (!showPreviewPanel || eventModified(event) || !props.openPreview) {\n const url = getDetailUrl(props.modelType, props.modelId);\n navigateToLink(url, props.navigate, event);\n } else {\n props.openPreview(props.modelType, props.modelId);\n }\n }\n };\n}\nfunction RowDuplicateAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"euc6Ns\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCopy, {})\n };\n}\nfunction RowEditAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"ePK91l\"\n }\n ),\n color: \"blue\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconEdit, {})\n };\n}\nfunction RowDeleteAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"cnGeoo\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconTrash, {})\n };\n}\nfunction RowCancelAction(props) {\n return {\n ...props,\n title: _i18n._(\n /*i18n*/\n {\n id: \"dEgA5A\"\n }\n ),\n color: \"red\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {})\n };\n}\nfunction RowActions({\n title,\n actions,\n disabled = false,\n index\n}) {\n function openMenu(event) {\n cancelEvent(event);\n setOpened(!opened);\n }\n const [opened, setOpened] = useState(false);\n const visibleActions = useMemo(() => {\n return actions.filter((action) => !action.hidden);\n }, [actions]);\n function RowActionIcon(action) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: action.tooltip ?? action.title, position: \"left\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Item, { color: action.color, leftSection: action.icon, onClick: (event) => {\n cancelEvent(event);\n action.onClick?.(event);\n setOpened(false);\n }, disabled: action.disabled || false, children: action.title }) }, action.title);\n }\n return visibleActions.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Menu, { withinPortal: true, disabled, position: \"bottom-end\", opened, onChange: setOpened, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Target, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { withinPortal: true, label: title || _i18n._(\n /*i18n*/\n {\n id: \"7L01XJ\"\n }\n ), children: /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { \"aria-label\": `row-action-menu-${index ?? \"\"}`, onClick: openMenu, disabled, variant: \"transparent\", size: \"sm\", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconDots, {}) }, `row-action-menu-${index ?? \"\"}`) }) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(Menu.Dropdown, { children: visibleActions.map((action) => /* @__PURE__ */ jsxRuntimeExports.jsx(RowActionIcon, { ...action }, action.title)) })\n ] });\n}\nexport {\n RowActions,\n RowCancelAction,\n RowDeleteAction,\n RowDuplicateAction,\n RowEditAction,\n RowViewAction\n};\n//# sourceMappingURL=RowActions.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useDocumentVisibility() {\n const [documentVisibility, setDocumentVisibility] = useState(\"visible\");\n useEffect(() => {\n setDocumentVisibility(document.visibilityState);\n const listener = () => setDocumentVisibility(document.visibilityState);\n document.addEventListener(\"visibilitychange\", listener);\n return () => document.removeEventListener(\"visibilitychange\", listener);\n }, []);\n return documentVisibility;\n}\nexport {\n useDocumentVisibility\n};\n//# sourceMappingURL=use-document-visibility.js.map\n","var Subscribable = class {\n constructor() {\n this.listeners = /* @__PURE__ */ new Set();\n this.subscribe = this.subscribe.bind(this);\n }\n subscribe(listener) {\n this.listeners.add(listener);\n this.onSubscribe();\n return () => {\n this.listeners.delete(listener);\n this.onUnsubscribe();\n };\n }\n hasListeners() {\n return this.listeners.size > 0;\n }\n onSubscribe() {\n }\n onUnsubscribe() {\n }\n};\nexport {\n Subscribable\n};\n//# sourceMappingURL=subscribable.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar FocusManager = class extends Subscribable {\n #focused;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onFocus) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const listener = () => onFocus();\n window.addEventListener(\"visibilitychange\", listener, false);\n return () => {\n window.removeEventListener(\"visibilitychange\", listener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup((focused) => {\n if (typeof focused === \"boolean\") {\n this.setFocused(focused);\n } else {\n this.onFocus();\n }\n });\n }\n setFocused(focused) {\n const changed = this.#focused !== focused;\n if (changed) {\n this.#focused = focused;\n this.onFocus();\n }\n }\n onFocus() {\n const isFocused = this.isFocused();\n this.listeners.forEach((listener) => {\n listener(isFocused);\n });\n }\n isFocused() {\n if (typeof this.#focused === \"boolean\") {\n return this.#focused;\n }\n return globalThis.document?.visibilityState !== \"hidden\";\n }\n};\nvar focusManager = new FocusManager();\nexport {\n FocusManager,\n focusManager\n};\n//# sourceMappingURL=focusManager.js.map\n","import { Subscribable } from \"./subscribable.js\";\nvar OnlineManager = class extends Subscribable {\n #online = true;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onOnline) => {\n if (typeof window !== \"undefined\" && window.addEventListener) {\n const onlineListener = () => onOnline(true);\n const offlineListener = () => onOnline(false);\n window.addEventListener(\"online\", onlineListener, false);\n window.addEventListener(\"offline\", offlineListener, false);\n return () => {\n window.removeEventListener(\"online\", onlineListener);\n window.removeEventListener(\"offline\", offlineListener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup(this.setOnline.bind(this));\n }\n setOnline(online) {\n const changed = this.#online !== online;\n if (changed) {\n this.#online = online;\n this.listeners.forEach((listener) => {\n listener(online);\n });\n }\n }\n isOnline() {\n return this.#online;\n }\n};\nvar onlineManager = new OnlineManager();\nexport {\n OnlineManager,\n onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nvar QueryClientContext = React.createContext(\n void 0\n);\nvar useQueryClient = (queryClient) => {\n const client = React.useContext(QueryClientContext);\n if (queryClient) {\n return queryClient;\n }\n if (!client) {\n throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n }\n return client;\n};\nexport {\n QueryClientContext,\n useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map\n","import \"../../../../../_virtual/jsx-runtime.js\";\nconst React = window[\"React\"];\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nexport {\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map\n","const React = window[\"React\"];\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nIsRestoringContext.Provider;\nexport {\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M9 12l2 2l4 -4\", \"key\": \"svg-1\" }]];\nconst IconCircleCheck = createReactComponent(\"outline\", \"circle-check\", \"CircleCheck\", __iconNode);\nexport {\n __iconNode,\n IconCircleCheck as default\n};\n//# sourceMappingURL=IconCircleCheck.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ProgressBar } from \"../components/ProgressBar.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nconst _i18n = window[\"LinguiCore\"].i18n;\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorDataOutput(props) {\n const visibility = useDocumentVisibility();\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n if (!!props.id) {\n setLoading(true);\n showNotification({\n id: `data-output-${props.id}`,\n title: props.title,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", value: 0, progressLabel: true })\n });\n } else setLoading(false);\n }, [props.id, props.title]);\n useQuery({\n enabled: !!props.id && loading && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"data-output\", props.id, props.title],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.data_output, props.id)).then((response) => {\n const data = response?.data ?? {};\n if (!!data.errors || !!data.error) {\n setLoading(false);\n const error = data?.error ?? data?.errors?.error ?? _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n );\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, {}),\n autoClose: 2500,\n title: props.title,\n message: error,\n color: \"red\"\n });\n } else if (data.complete) {\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: _i18n._(\n /*i18n*/\n {\n id: \"TCOQbo\"\n }\n ),\n color: \"green\",\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {})\n });\n if (data.output) {\n const url = data.output;\n const base = props.hostname ?? window.location.origin;\n const downloadUrl = new URL(url, base);\n window.open(downloadUrl.toString(), \"_blank\");\n }\n } else {\n notifications.update({\n id: `data-output-${props.id}`,\n loading: true,\n autoClose: false,\n withCloseButton: false,\n message: /* @__PURE__ */ jsxRuntimeExports.jsx(ProgressBar, { size: \"lg\", maximum: data.total, value: data.progress, progressLabel: data.total > 0, animated: true })\n });\n }\n return data;\n }).catch((error) => {\n console.error(\"Error in useMonitorDataOutput:\", error);\n setLoading(false);\n notifications.update({\n id: `data-output-${props.id}`,\n loading: false,\n autoClose: 2500,\n title: props.title,\n message: error.message || _i18n._(\n /*i18n*/\n {\n id: \"gzjOvt\"\n }\n ),\n color: \"red\"\n });\n return {};\n })\n }, props.queryClient);\n}\nexport {\n useMonitorDataOutput as default\n};\n//# sourceMappingURL=MonitorDataOutput.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nimport { useDocumentVisibility } from \"../node_modules/@mantine/hooks/esm/use-document-visibility/use-document-visibility.js\";\nimport { useQuery } from \"../node_modules/@tanstack/react-query/build/modern/useQuery.js\";\nimport { ApiEndpoints } from \"../enums/ApiEndpoints.js\";\nimport { apiUrl } from \"../functions/Api.js\";\nimport IconCircleCheck from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleCheck.js\";\nimport IconCircleX from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleX.js\";\nimport IconExclamationCircle from \"../node_modules/@tabler/icons-react/dist/esm/icons/IconExclamationCircle.js\";\nconst notifications = window[\"MantineNotifications\"].notifications;\nconst showNotification = window[\"MantineNotifications\"].showNotification;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction useMonitorBackgroundTask(props) {\n const visibility = useDocumentVisibility();\n const [tracking, setTracking] = useState(false);\n useEffect(() => {\n if (!!props.taskId) {\n setTracking(true);\n showNotification({\n id: `background-task-${props.taskId}`,\n title: props.title,\n message: props.message,\n loading: true,\n autoClose: false,\n withCloseButton: false\n });\n } else {\n setTracking(false);\n }\n }, [props.taskId]);\n useQuery({\n enabled: !!props.taskId && tracking && visibility === \"visible\",\n refetchInterval: 500,\n queryKey: [\"background-task\", props.taskId],\n queryFn: () => props.api.get(apiUrl(ApiEndpoints.task_overview, props.taskId)).then((response) => {\n const data = response?.data ?? {};\n if (data.complete) {\n setTracking(false);\n props.onComplete?.();\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: data.success ? \"green\" : \"red\",\n message: response.data?.success ? props.successMessage ?? props.message : props.failureMessage ?? props.message,\n icon: response.data?.success ? /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleCheck, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconCircleX, {}),\n autoClose: 1e3,\n withCloseButton: true\n });\n if (data.success) {\n props.onSuccess?.();\n } else {\n props.onFailure?.();\n }\n }\n return response;\n }).catch((error) => {\n console.error(`Error fetching background task status for task ${props.taskId}:`, error);\n setTracking(false);\n props.onError?.(error);\n notifications.update({\n id: `background-task-${props.taskId}`,\n title: props.title,\n loading: false,\n color: \"red\",\n message: props.errorMessage ?? props.message,\n icon: /* @__PURE__ */ jsxRuntimeExports.jsx(IconExclamationCircle, { color: \"red\" }),\n autoClose: 5e3,\n withCloseButton: true\n });\n })\n }, props.queryClient);\n}\nexport {\n useMonitorBackgroundTask as default\n};\n//# sourceMappingURL=MonitorBackgroundTask.js.map\n","const useEffect = window[\"React\"].useEffect;\nconst useEffectEvent = window[\"React\"].useEffectEvent;\nfunction useWindowEvent(type, listener, options) {\n const stableListener = useEffectEvent(listener);\n useEffect(() => {\n window.addEventListener(type, stableListener, options);\n return () => window.removeEventListener(type, stableListener, options);\n }, [type]);\n}\nexport {\n useWindowEvent\n};\n//# sourceMappingURL=use-window-event.js.map\n","import { useWindowEvent } from \"../use-window-event/use-window-event.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nfunction serializeJSON(value, hookName = \"use-local-storage\") {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);\n }\n}\nfunction deserializeJSON(value) {\n try {\n return value && JSON.parse(value);\n } catch {\n return value;\n }\n}\nfunction createStorageHandler(type) {\n const getItem = (key) => {\n try {\n return window[type].getItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to get value from storage, localStorage is blocked\");\n return null;\n }\n };\n const setItem = (key, value) => {\n try {\n window[type].setItem(key, value);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to set value to storage, localStorage is blocked\");\n }\n };\n const removeItem = (key) => {\n try {\n window[type].removeItem(key);\n } catch (error) {\n console.warn(\"use-local-storage: Failed to remove value from storage, localStorage is blocked\");\n }\n };\n return {\n getItem,\n setItem,\n removeItem\n };\n}\nfunction createStorage(type, hookName) {\n const eventName = \"mantine-local-storage\";\n const { getItem, setItem, removeItem } = createStorageHandler(type);\n return function useStorage({ key, defaultValue, getInitialValueInEffect = true, sync = true, deserialize = deserializeJSON, serialize = (value) => serializeJSON(value, hookName) }) {\n const readStorageValue = useCallback((skipStorage) => {\n let storageBlockedOrSkipped;\n try {\n storageBlockedOrSkipped = typeof window === \"undefined\" || !(type in window) || window[type] === null || !!skipStorage;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n if (storageBlockedOrSkipped) return defaultValue;\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : defaultValue;\n }, [key, defaultValue]);\n const [value, setValue] = useState(readStorageValue(getInitialValueInEffect));\n const setStorageValue = useCallback((val) => {\n if (val instanceof Function) setValue((current) => {\n const result = val(current);\n setItem(key, serialize(result));\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: result\n } }));\n });\n return result;\n });\n else {\n setItem(key, serialize(val));\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: val\n } }));\n setValue(val);\n }\n }, [key]);\n const removeStorageValue = useCallback(() => {\n removeItem(key);\n setValue(defaultValue);\n window.dispatchEvent(new CustomEvent(eventName, { detail: {\n key,\n value: defaultValue\n } }));\n }, [key, defaultValue]);\n useWindowEvent(\"storage\", (event) => {\n if (sync) {\n if (event.storageArea === window[type] && event.key === key) setValue(deserialize(event.newValue ?? void 0));\n }\n });\n useWindowEvent(eventName, (event) => {\n if (sync) {\n if (event.detail.key === key) setValue(event.detail.value);\n }\n });\n useEffect(() => {\n if (defaultValue !== void 0 && value === void 0) setStorageValue(defaultValue);\n }, [\n defaultValue,\n value,\n setStorageValue\n ]);\n useEffect(() => {\n const val = readStorageValue();\n val !== void 0 && setStorageValue(val);\n }, [key]);\n return [\n value === void 0 ? defaultValue : value,\n setStorageValue,\n removeStorageValue\n ];\n };\n}\nexport {\n createStorage\n};\n//# sourceMappingURL=create-storage.js.map\n","import { useLocalStorage } from \"../node_modules/@mantine/hooks/esm/use-local-storage/use-local-storage.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useEffect = window[\"React\"].useEffect;\nconst useMemo = window[\"React\"].useMemo;\nfunction useFilterSet(filterKey, initialFilters) {\n const [storedFilters, setStoredFilters] = useLocalStorage({\n key: `inventree-filterset-${filterKey}`,\n defaultValue: null,\n sync: false,\n getInitialValueInEffect: false\n });\n const [storedNamedSets, setStoredNamedSets] = useLocalStorage({\n key: `inventree-filtersets-${filterKey}`,\n defaultValue: [],\n sync: false,\n getInitialValueInEffect: false\n });\n useEffect(() => {\n if (storedFilters == null) {\n setStoredFilters(initialFilters || []);\n }\n }, [storedFilters, initialFilters, setStoredFilters]);\n const activeFilters = useMemo(() => {\n return storedFilters ?? initialFilters ?? [];\n }, [storedFilters, initialFilters]);\n const clearActiveFilters = useCallback(() => {\n setStoredFilters([]);\n }, []);\n const setActiveFilters = useCallback((filters) => {\n setStoredFilters(filters);\n }, [setStoredFilters]);\n const saveFilterSet = useCallback((name) => {\n const snapshot = activeFilters.map(({\n name: n,\n value,\n displayValue\n }) => ({\n name: n,\n value,\n displayValue\n }));\n setStoredNamedSets((prev) => {\n const without = (prev ?? []).filter((s) => s.name !== name);\n return [...without, {\n name,\n filters: snapshot\n }];\n });\n }, [activeFilters, setStoredNamedSets]);\n const loadFilterSet = useCallback((name) => {\n const saved = (storedNamedSets ?? []).find((s) => s.name === name);\n if (saved) {\n setStoredFilters(saved.filters);\n }\n }, [storedNamedSets, setStoredFilters]);\n const deleteFilterSet = useCallback((name) => {\n setStoredNamedSets((prev) => (prev ?? []).filter((s) => s.name !== name));\n }, [setStoredNamedSets]);\n return {\n filterKey,\n activeFilters,\n setActiveFilters,\n clearActiveFilters,\n savedFilterSets: storedNamedSets ?? [],\n saveFilterSet,\n loadFilterSet,\n deleteFilterSet\n };\n}\nexport {\n useFilterSet as default\n};\n//# sourceMappingURL=UseFilterSet.js.map\n","import { randomId } from \"../node_modules/@mantine/hooks/esm/utils/random-id/random-id.js\";\nimport useFilterSet from \"./UseFilterSet.js\";\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nconst useState = window[\"React\"].useState;\nfunction useTable(tableName, tableProps = {\n idAccessor: \"pk\",\n initialFilters: []\n}) {\n function generateTableName() {\n return `${tableName.replaceAll(\"-\", \"\")}-${randomId()}`;\n }\n const [tableKey, setTableKey] = useState(generateTableName());\n const refreshTable = useCallback((clearSelection) => {\n setTableKey(generateTableName());\n if (clearSelection) {\n clearSelectedRecords();\n }\n }, [generateTableName]);\n const filterSet = useFilterSet(`table-${tableName}`, tableProps.initialFilters);\n const [expandedRecords, setExpandedRecords] = useState([]);\n const isRowExpanded = useCallback((pk) => {\n return expandedRecords.includes(pk);\n }, [expandedRecords]);\n const [hiddenColumns, setHiddenColumns] = useState([]);\n const [selectedRecords, setSelectedRecords] = useState([]);\n const selectedIds = useMemo(() => selectedRecords.map((r) => r[tableProps.idAccessor || \"pk\"]), [selectedRecords]);\n const clearSelectedRecords = useCallback(() => {\n setSelectedRecords([]);\n }, []);\n const hasSelectedRecords = useMemo(() => {\n return selectedRecords.length > 0;\n }, [selectedRecords]);\n const [recordCount, setRecordCount] = useState(0);\n const [page, setPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [records, setRecords] = useState([]);\n const updateRecord = useCallback((record) => {\n const _records = [...records];\n const index = _records.findIndex((r) => r[tableProps.idAccessor || \"pk\"] === record.pk);\n if (index >= 0) {\n _records[index] = {\n ..._records[index],\n ...record\n };\n } else {\n _records.push(record);\n }\n setRecords(_records);\n }, [records]);\n const idAccessor = useMemo(() => tableProps.idAccessor || \"pk\", [tableProps.idAccessor]);\n const [isLoading, setIsLoading] = useState(false);\n return {\n tableKey,\n refreshTable,\n isLoading,\n setIsLoading,\n filterSet,\n expandedRecords,\n setExpandedRecords,\n isRowExpanded,\n selectedRecords,\n selectedIds,\n setSelectedRecords,\n clearSelectedRecords,\n hasSelectedRecords,\n searchTerm,\n setSearchTerm,\n recordCount,\n setRecordCount,\n hiddenColumns,\n setHiddenColumns,\n page,\n setPage,\n records,\n setRecords,\n updateRecord,\n idAccessor\n };\n}\nexport {\n useTable as default\n};\n//# sourceMappingURL=UseTable.js.map\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nvar Action;\n(function(Action2) {\n Action2[\"Pop\"] = \"POP\";\n Action2[\"Push\"] = \"PUSH\";\n Action2[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n if (typeof console !== \"undefined\") console.warn(message);\n try {\n throw new Error(message);\n } catch (e) {\n }\n }\n}\nfunction createPath(_ref) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = _ref;\n if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nvar ResultType;\n(function(ResultType2) {\n ResultType2[\"data\"] = \"data\";\n ResultType2[\"deferred\"] = \"deferred\";\n ResultType2[\"redirect\"] = \"redirect\";\n ResultType2[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = \"/\";\n }\n return matchRoutesImpl(routes, locationArg, basename);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial) {\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n if (pathname == null) {\n return null;\n }\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n let decoded = decodePath(pathname);\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i], decoded);\n }\n return matches;\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n if (parentPath === void 0) {\n parentPath = \"\";\n }\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === void 0 ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(meta.relativePath.startsWith(parentPath), 'Absolute route path \"' + meta.relativePath + '\" nested under path ' + ('\"' + parentPath + '\" is not valid. An absolute child route path ') + \"must start with the combined path of all its parent routes.\");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n \"Index routes must not have child routes. Please remove \" + ('all child routes from route path \"' + path + '\".')\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n routes.forEach((route, index) => {\n var _route$path;\n if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n let isOptional = first.endsWith(\"?\");\n let required = first.replace(/\\?$/, \"\");\n if (rest.length === 0) {\n return isOptional ? [required, \"\"] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = [];\n result.push(...restExploded.map((subpath) => subpath === \"\" ? required : [required, subpath].join(\"/\")));\n if (isOptional) {\n result.push(...restExploded);\n }\n return result.map((exploded) => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score : compareIndexes(a.routesMeta.map((meta) => meta.childrenIndex), b.routesMeta.map((meta) => meta.childrenIndex)));\n}\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s) => s === \"*\";\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? (\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n ) : (\n // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0\n );\n}\nfunction matchRouteBranch(branch, pathname, allowPartial) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n let route = meta.route;\n if (!match) {\n return null;\n }\n Object.assign(matchedParams, match.params);\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce((memo, _ref, index) => {\n let {\n paramName,\n isOptional\n } = _ref;\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = void 0;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n if (end === void 0) {\n end = true;\n }\n warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), 'Route path \"' + path + '\" will be treated as if it were ' + ('\"' + path.replace(/\\*$/, \"/*\") + '\" because the `*` character must ') + \"always follow a `/` in the pattern. To get rid of this warning, \" + ('please change the route path to \"' + path.replace(/\\*$/, \"/*\") + '\".'));\n let params = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\").replace(/^\\/*/, \"/\").replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\").replace(/\\/:([\\w-]+)(\\?)?/g, (_, paramName, isOptional) => {\n params.push({\n paramName,\n isOptional: isOptional != null\n });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n });\n if (path.endsWith(\"*\")) {\n params.push({\n paramName: \"*\"\n });\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" : \"(?:\\\\/(.+)|\\\\/*)$\";\n } else if (end) {\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else ;\n let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : \"i\");\n return [matcher, params];\n}\nfunction decodePath(value) {\n try {\n return value.split(\"/\").map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\n } catch (error) {\n warning(false, 'The URL path \"' + value + '\" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent ' + (\"encoding (\" + error + \").\"));\n return value;\n }\n}\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n return null;\n }\n return pathname.slice(startIndex) || \"/\";\n}\nconst ABSOLUTE_URL_REGEX$1 = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX$1.test(url);\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = \"/\";\n }\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname;\n if (toPathname) {\n if (isAbsoluteUrl(toPathname)) {\n pathname = toPathname;\n } else {\n if (toPathname.includes(\"//\")) {\n let oldPathname = toPathname;\n toPathname = removeDoubleSlashes(toPathname);\n warning(false, \"Pathnames cannot have embedded double slashes - normalizing \" + (oldPathname + \" -> \" + toPathname));\n }\n if (toPathname.startsWith(\"/\")) {\n pathname = resolvePathname(toPathname.substring(1), \"/\");\n } else {\n pathname = resolvePathname(toPathname, fromPathname);\n }\n }\n } else {\n pathname = fromPathname;\n }\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"]. Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + 'a string in and the router will parse it for you.';\n}\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\nfunction getResolveToMatches(matches, v7_relativeSplatPath) {\n let pathMatches = getPathContributingMatches(matches);\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);\n }\n return pathMatches.map((match) => match.pathnameBase);\n}\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n let to;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n }\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from;\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join(\"/\");\n }\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n let path = resolvePath(to, from);\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n return path;\n}\nconst removeDoubleSlashes = (path) => path.replace(/\\/\\/+/g, \"/\");\nconst joinPaths = (paths) => removeDoubleSlashes(paths.join(\"/\"));\nconst normalizePathname = (pathname) => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\nconst normalizeSearch = (search) => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\nconst normalizeHash = (hash) => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\nclass AbortedDeferredError extends Error {\n}\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nnew Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nnew Set(validRequestMethodsArr);\nexport {\n AbortedDeferredError,\n Action,\n decodePath as UNSAFE_decodePath,\n getResolveToMatches as UNSAFE_getResolveToMatches,\n invariant as UNSAFE_invariant,\n warning as UNSAFE_warning,\n createPath,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n normalizePathname,\n parsePath,\n resolvePath,\n resolveTo,\n stripBasename\n};\n//# sourceMappingURL=router.js.map\n","import { UNSAFE_invariant as invariant, UNSAFE_getResolveToMatches as getResolveToMatches, resolveTo, joinPaths, parsePath, matchRoutes, Action, isRouteErrorResponse, AbortedDeferredError } from \"../../@remix-run/router/dist/router.js\";\nimport { createPath, matchPath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nconst DataRouterContext = /* @__PURE__ */ React.createContext(null);\nconst DataRouterStateContext = /* @__PURE__ */ React.createContext(null);\nconst AwaitContext = /* @__PURE__ */ React.createContext(null);\nconst NavigationContext = /* @__PURE__ */ React.createContext(null);\nconst LocationContext = /* @__PURE__ */ React.createContext(null);\nconst RouteContext = /* @__PURE__ */ React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nconst RouteErrorContext = /* @__PURE__ */ React.createContext(null);\nfunction useHref(to, _temp) {\n let {\n relative\n } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n hash,\n pathname,\n search\n } = useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname;\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\nfunction useInRouterContext() {\n return React.useContext(LocationContext) != null;\n}\nfunction useLocation() {\n !useInRouterContext() ? invariant(false) : void 0;\n return React.useContext(LocationContext).location;\n}\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n React.useLayoutEffect(cb);\n }\n}\nfunction useNavigate() {\n let {\n isDataRoute\n } = React.useContext(RouteContext);\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n !useInRouterContext() ? invariant(false) : void 0;\n let dataRouterContext = React.useContext(DataRouterContext);\n let {\n basename,\n future,\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\");\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n return navigate;\n}\nfunction useParams() {\n let {\n matches\n } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\nfunction useResolvedPath(to, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n future\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches, future.v7_relativeSplatPath));\n return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [to, routePathnamesJson, locationPathname, relative]);\n}\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\nfunction useRoutesImpl(routes, locationArg, dataRouterState, future) {\n !useInRouterContext() ? invariant(false) : void 0;\n let {\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches: parentMatches\n } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n routeMatch && routeMatch.route;\n let locationFromContext = useLocation();\n let location;\n if (locationArg) {\n var _parsedLocationArg$pa;\n let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? invariant(false) : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || \"/\";\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n let matches = matchRoutes(routes, {\n pathname: remainingPathname\n });\n let renderedMatches = _renderMatches(matches && matches.map((match) => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname\n ]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase\n ])\n })), parentMatches, dataRouterState, future);\n if (locationArg && renderedMatches) {\n return /* @__PURE__ */ React.createElement(LocationContext.Provider, {\n value: {\n location: _extends({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\"\n }, location),\n navigationType: Action.Pop\n }\n }, renderedMatches);\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = {\n padding: \"0.5rem\",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\"h2\", null, \"Unexpected Application Error!\"), /* @__PURE__ */ React.createElement(\"h3\", {\n style: {\n fontStyle: \"italic\"\n }\n }, message), stack ? /* @__PURE__ */ React.createElement(\"pre\", {\n style: preStyles\n }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /* @__PURE__ */ React.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n static getDerivedStateFromProps(props, state) {\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n return {\n error: props.error !== void 0 ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\"React Router caught the following error during render\", error, errorInfo);\n }\n render() {\n return this.state.error !== void 0 ? /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /* @__PURE__ */ React.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n}\nfunction RenderedRoute(_ref) {\n let {\n routeContext,\n match,\n children\n } = _ref;\n let dataRouterContext = React.useContext(DataRouterContext);\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /* @__PURE__ */ React.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState, future) {\n var _dataRouterState;\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n if (future === void 0) {\n future = null;\n }\n if (matches == null) {\n var _future;\n if (!dataRouterState) {\n return null;\n }\n if (dataRouterState.errors) {\n matches = dataRouterState.matches;\n } else if ((_future = future) != null && _future.v7_partialHydration && parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n let errors = (_dataRouterState = dataRouterState) == null ? void 0 : _dataRouterState.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex((m) => m.route.id && (errors == null ? void 0 : errors[m.route.id]) !== void 0);\n !(errorIndex >= 0) ? invariant(false) : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n if (match.route.id) {\n let {\n loaderData,\n errors: errors2\n } = dataRouterState;\n let needsToRunLoader = match.route.loader && loaderData[match.route.id] === void 0 && (!errors2 || errors2[match.route.id] === void 0);\n if (match.route.lazy || needsToRunLoader) {\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error;\n let shouldRenderHydrateFallback = false;\n let errorElement = null;\n let hydrateFallbackElement = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : void 0;\n errorElement = match.route.errorElement || defaultErrorElement;\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\"route-fallback\");\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n children = /* @__PURE__ */ React.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /* @__PURE__ */ React.createElement(RenderedRoute, {\n match,\n routeContext: {\n outlet,\n matches: matches2,\n isDataRoute: dataRouterState != null\n },\n children\n });\n };\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches: matches2,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook = /* @__PURE__ */ (function(DataRouterHook2) {\n DataRouterHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterHook2[\"UseNavigateStable\"] = \"useNavigate\";\n return DataRouterHook2;\n})(DataRouterHook || {});\nvar DataRouterStateHook = /* @__PURE__ */ (function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseBlocker\"] = \"useBlocker\";\n DataRouterStateHook2[\"UseLoaderData\"] = \"useLoaderData\";\n DataRouterStateHook2[\"UseActionData\"] = \"useActionData\";\n DataRouterStateHook2[\"UseRouteError\"] = \"useRouteError\";\n DataRouterStateHook2[\"UseNavigation\"] = \"useNavigation\";\n DataRouterStateHook2[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n DataRouterStateHook2[\"UseMatches\"] = \"useMatches\";\n DataRouterStateHook2[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterStateHook2[\"UseNavigateStable\"] = \"useNavigate\";\n DataRouterStateHook2[\"UseRouteId\"] = \"useRouteId\";\n return DataRouterStateHook2;\n})(DataRouterStateHook || {});\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(DataRouterContext);\n !ctx ? invariant(false) : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = React.useContext(DataRouterStateContext);\n !state ? invariant(false) : void 0;\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = React.useContext(RouteContext);\n !route ? invariant(false) : void 0;\n return route;\n}\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext();\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? invariant(false) : void 0;\n return thisRoute.route.id;\n}\nfunction useRouteError() {\n var _state$errors;\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState();\n let routeId = useCurrentRouteId();\n if (error !== void 0) {\n return error;\n }\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\nfunction useNavigateStable() {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function(to, options) {\n if (options === void 0) {\n options = {};\n }\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, _extends({\n fromRouteId: id\n }, options));\n }\n }, [router, id]);\n return navigate;\n}\nconst alreadyWarned$1 = {};\nfunction warningOnce(key, cond, message) {\n if (!alreadyWarned$1[key]) {\n alreadyWarned$1[key] = true;\n }\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nfunction Route(_props) {\n invariant(false);\n}\nfunction Routes(_ref6) {\n let {\n children,\n location\n } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\nvar AwaitRenderStatus = /* @__PURE__ */ (function(AwaitRenderStatus2) {\n AwaitRenderStatus2[AwaitRenderStatus2[\"pending\"] = 0] = \"pending\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"success\"] = 1] = \"success\";\n AwaitRenderStatus2[AwaitRenderStatus2[\"error\"] = 2] = \"error\";\n return AwaitRenderStatus2;\n})(AwaitRenderStatus || {});\nconst neverSettledPromise = new Promise(() => {\n});\nclass AwaitErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error(\" caught the following error during render\", error, errorInfo);\n }\n render() {\n let {\n children,\n errorElement,\n resolve\n } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n if (!(resolve instanceof Promise)) {\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_data\", {\n get: () => resolve\n });\n } else if (this.state.error) {\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {\n });\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_error\", {\n get: () => renderError\n });\n } else if (resolve._tracked) {\n promise = resolve;\n status = \"_error\" in promise ? AwaitRenderStatus.error : \"_data\" in promise ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", {\n get: () => true\n });\n promise = resolve.then((data) => Object.defineProperty(resolve, \"_data\", {\n get: () => data\n }), (error) => Object.defineProperty(resolve, \"_error\", {\n get: () => error\n }));\n }\n if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n throw neverSettledPromise;\n }\n if (status === AwaitRenderStatus.error && !errorElement) {\n throw promise._error;\n }\n if (status === AwaitRenderStatus.error) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n if (status === AwaitRenderStatus.success) {\n return /* @__PURE__ */ React.createElement(AwaitContext.Provider, {\n value: promise,\n children\n });\n }\n throw promise;\n }\n}\nfunction createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n let routes = [];\n React.Children.forEach(children, (element, index) => {\n if (!/* @__PURE__ */ React.isValidElement(element)) {\n return;\n }\n let treePath = [...parentPath, index];\n if (element.type === React.Fragment) {\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n !(element.type === Route) ? invariant(false) : void 0;\n !(!element.props.index || !element.props.children) ? invariant(false) : void 0;\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n routes.push(route);\n });\n return routes;\n}\nexport {\n AbortedDeferredError,\n Action as NavigationType,\n Route,\n Routes,\n DataRouterContext as UNSAFE_DataRouterContext,\n DataRouterStateContext as UNSAFE_DataRouterStateContext,\n LocationContext as UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n RouteContext as UNSAFE_RouteContext,\n useRoutesImpl as UNSAFE_useRoutesImpl,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","import { UNSAFE_NavigationContext as NavigationContext, useHref, useNavigate, useLocation, useResolvedPath } from \"../../react-router/dist/index.js\";\nimport { Route, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_RouteContext, createRoutesFromChildren, createRoutesFromChildren as createRoutesFromChildren2, useInRouterContext, useParams, useRouteError, useRoutes } from \"../../react-router/dist/index.js\";\nimport { stripBasename, createPath } from \"../../@remix-run/router/dist/router.js\";\nimport { AbortedDeferredError, Action, isRouteErrorResponse, matchPath, matchRoutes, parsePath, resolvePath } from \"../../@remix-run/router/dist/router.js\";\nconst React = window[\"React\"];\nconst ReactDOM = window[\"ReactDOM\"];\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function(n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event);\n}\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\", \"viewTransition\"];\nconst REACT_ROUTER_VERSION = \"6\";\ntry {\n window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n}\nconst START_TRANSITION = \"startTransition\";\nReact[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nReact[USE_ID];\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst Link = /* @__PURE__ */ React.forwardRef(function LinkWithRef(_ref7, ref) {\n let {\n onClick,\n relative,\n reloadDocument,\n replace: replace2,\n state,\n target,\n to,\n preventScrollReset,\n viewTransition\n } = _ref7, rest = _objectWithoutPropertiesLoose(_ref7, _excluded);\n let {\n basename\n } = React.useContext(NavigationContext);\n let absoluteHref;\n let isExternal = false;\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n absoluteHref = to;\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n }\n }\n }\n let href = useHref(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace: replace2,\n state,\n target,\n preventScrollReset,\n relative,\n viewTransition\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n /* @__PURE__ */ React.createElement(\"a\", _extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref,\n target\n }))\n );\n});\nvar DataRouterHook;\n(function(DataRouterHook2) {\n DataRouterHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n DataRouterHook2[\"UseSubmit\"] = \"useSubmit\";\n DataRouterHook2[\"UseSubmitFetcher\"] = \"useSubmitFetcher\";\n DataRouterHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterHook2[\"useViewTransitionState\"] = \"useViewTransitionState\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function(DataRouterStateHook2) {\n DataRouterStateHook2[\"UseFetcher\"] = \"useFetcher\";\n DataRouterStateHook2[\"UseFetchers\"] = \"useFetchers\";\n DataRouterStateHook2[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction useLinkClickHandler(to, _temp) {\n let {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative,\n viewTransition\n } = _temp === void 0 ? {} : _temp;\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, {\n relative\n });\n return React.useCallback((event) => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path);\n navigate(to, {\n replace: replace2,\n state,\n preventScrollReset,\n relative,\n viewTransition\n });\n }\n }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative, viewTransition]);\n}\nexport {\n AbortedDeferredError,\n Link,\n Action as NavigationType,\n Route,\n Routes,\n UNSAFE_DataRouterContext,\n UNSAFE_DataRouterStateContext,\n UNSAFE_LocationContext,\n NavigationContext as UNSAFE_NavigationContext,\n UNSAFE_RouteContext,\n createPath,\n createRoutesFromChildren,\n createRoutesFromChildren2 as createRoutesFromElements,\n isRouteErrorResponse,\n matchPath,\n matchRoutes,\n parsePath,\n resolvePath,\n useHref,\n useInRouterContext,\n useLinkClickHandler,\n useLocation,\n useNavigate,\n useParams,\n useResolvedPath,\n useRouteError,\n useRoutes\n};\n//# sourceMappingURL=index.js.map\n","function createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, void 0);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, void 0)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => window.localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n let hydrationVersion = 0;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n return setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n return setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n const currentVersion = ++hydrationVersion;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n if (currentVersion !== hydrationVersion) {\n return;\n }\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(get(), void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\nexport {\n createJSONStorage,\n persist\n};\n//# sourceMappingURL=middleware.js.map\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\nexport {\n createStore\n};\n//# sourceMappingURL=vanilla.js.map\n","import { createStore } from \"./vanilla.js\";\nconst React = window[\"React\"];\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createImpl);\nexport {\n create,\n useStore\n};\n//# sourceMappingURL=react.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst useLocalLibState = create()(persist((set, get) => ({\n detailDrawerStack: 0,\n addDetailDrawer: (value) => {\n set({\n detailDrawerStack: value === false ? 0 : get().detailDrawerStack + value\n });\n },\n hotkeys: {},\n addHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const [ref, details] of hotkeys) {\n newHotkeys[ref] = details;\n }\n set({\n hotkeys: newHotkeys\n });\n },\n removeHotkeys: (hotkeys) => {\n const newHotkeys = {\n ...get().hotkeys\n };\n for (const ref of hotkeys) {\n delete newHotkeys[ref];\n }\n set({\n hotkeys: newHotkeys\n });\n }\n}), {\n name: \"session-settings-inventreedb_lib\"\n}));\nexport {\n useLocalLibState\n};\n//# sourceMappingURL=LocalLibState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst Text = window[\"MantineCore\"].Text;\nconst darken = window[\"MantineCore\"].darken;\nconst getThemeColor = window[\"MantineCore\"].getThemeColor;\nconst useMantineTheme = window[\"MantineCore\"].useMantineTheme;\nconst useMemo = window[\"React\"].useMemo;\nconst useThematicGradient = () => {\n const theme = useMantineTheme();\n const primary = useMemo(() => {\n return getThemeColor(theme.primaryColor, theme);\n }, [theme]);\n const secondary = useMemo(() => darken(primary, 0.25), [primary]);\n return useMemo(() => {\n return {\n primary,\n secondary\n };\n }, [primary, secondary]);\n};\nfunction StylishText({\n children,\n size\n}) {\n const {\n primary,\n secondary\n } = useThematicGradient();\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { fw: 700, size: size ?? \"xl\", variant: \"gradient\", gradient: {\n from: primary.toString(),\n to: secondary.toString()\n }, children });\n}\nexport {\n StylishText\n};\n//# sourceMappingURL=StylishText.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M15 6l-6 6l6 6\", \"key\": \"svg-0\" }]];\nconst IconChevronLeft = createReactComponent(\"outline\", \"chevron-left\", \"ChevronLeft\", __iconNode);\nexport {\n __iconNode,\n IconChevronLeft as default\n};\n//# sourceMappingURL=IconChevronLeft.js.map\n","import { j as jsxRuntimeExports } from \"../../_virtual/jsx-runtime.js\";\nimport { Link } from \"../../node_modules/react-router-dom/dist/index.js\";\nimport { useShallow } from \"../../node_modules/zustand/esm/react/shallow.js\";\nimport { useLocalLibState } from \"../../states/LocalLibState.js\";\nimport { StylishText } from \"../StylishText.js\";\nimport { flex } from \"./DetailDrawer.css.js\";\nimport { Routes, Route, useNavigate, useParams } from \"../../node_modules/react-router/dist/index.js\";\nimport IconChevronLeft from \"../../node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.js\";\nconst ActionIcon = window[\"MantineCore\"].ActionIcon;\nconst Divider = window[\"MantineCore\"].Divider;\nconst Drawer = window[\"MantineCore\"].Drawer;\nconst Group = window[\"MantineCore\"].Group;\nconst Stack = window[\"MantineCore\"].Stack;\nconst Text = window[\"MantineCore\"].Text;\nconst useCallback = window[\"React\"].useCallback;\nconst useMemo = window[\"React\"].useMemo;\nfunction DetailDrawerComponent({\n title,\n position = \"right\",\n size,\n closeOnEscape = true,\n renderContent\n}) {\n const navigate = useNavigate();\n const {\n id\n } = useParams();\n const content = renderContent(id);\n const opened = useMemo(() => !!id && !!content, [id, content]);\n const [detailDrawerStack, addDetailDrawer] = useLocalLibState(useShallow((state) => [state.detailDrawerStack, state.addDetailDrawer]));\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Drawer, { opened, onClose: () => {\n navigate(\"../\");\n addDetailDrawer(false);\n }, position, closeOnEscape, size, classNames: {\n root: flex,\n body: flex\n }, scrollAreaComponent: Stack, title: /* @__PURE__ */ jsxRuntimeExports.jsxs(Group, { children: [\n detailDrawerStack > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ActionIcon, { variant: \"outline\", onClick: () => {\n navigate(-1);\n addDetailDrawer(-1);\n }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconChevronLeft, {}) }),\n /* @__PURE__ */ jsxRuntimeExports.jsx(StylishText, { size: \"xl\", children: title })\n ] }), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { gap: \"xs\", className: flex, children: [\n /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, {}),\n content\n ] }) });\n}\nfunction DetailDrawer(props) {\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Routes, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: \":id?/\", element: /* @__PURE__ */ jsxRuntimeExports.jsx(DetailDrawerComponent, { ...props }) }) });\n}\nfunction DetailDrawerLink({\n to,\n text\n}) {\n const addDetailDrawer = useLocalLibState(useShallow((state) => state.addDetailDrawer));\n const onNavigate = useCallback(() => {\n addDetailDrawer(1);\n }, [addDetailDrawer]);\n return /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to, onClick: onNavigate, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { children: text }) });\n}\nexport {\n DetailDrawer,\n DetailDrawerComponent,\n DetailDrawerLink\n};\n//# sourceMappingURL=DetailDrawer.js.map\n","import { persist } from \"../node_modules/zustand/esm/middleware.js\";\nimport { create } from \"../node_modules/zustand/esm/react.js\";\nconst DEFAULT_PAGE_SIZE = 25;\nconst useStoredTableState = create()(persist((set, get) => ({\n pageSize: DEFAULT_PAGE_SIZE,\n setPageSize: (size) => {\n set((state) => ({\n pageSize: size\n }));\n },\n tableSorting: {},\n getTableSorting: (tableKey) => {\n return get().tableSorting[tableKey] || {};\n },\n setTableSorting: (tableKey) => (sorting) => {\n set({\n tableSorting: {\n ...get().tableSorting,\n [tableKey]: sorting\n }\n });\n },\n tableColumnNames: {},\n getTableColumnNames: (tableKey) => {\n return get().tableColumnNames[tableKey] || null;\n },\n setTableColumnNames: (tableKey) => (names) => {\n set({\n tableColumnNames: {\n ...get().tableColumnNames,\n [tableKey]: names\n }\n });\n },\n clearTableColumnNames: () => {\n set({\n tableColumnNames: {}\n });\n },\n hiddenColumns: {},\n getHiddenColumns: (tableKey) => {\n return get().hiddenColumns?.[tableKey] ?? null;\n },\n setHiddenColumns: (tableKey) => (columns) => {\n set({\n hiddenColumns: {\n ...get().hiddenColumns,\n [tableKey]: columns\n }\n });\n }\n}), {\n name: \"inventree-table-state\"\n}));\nexport {\n useStoredTableState\n};\n//# sourceMappingURL=StoredTableState.js.map\n","import { j as jsxRuntimeExports } from \"../_virtual/jsx-runtime.js\";\nconst I18nProvider = window[\"LinguiReact\"].I18nProvider;\nconst Skeleton = window[\"MantineCore\"].Skeleton;\nconst useEffect = window[\"React\"].useEffect;\nconst useState = window[\"React\"].useState;\nasync function tryLoadLocale(locale, loader) {\n try {\n return await loader(locale);\n } catch (error) {\n console.warn(`Failed to load locale ${locale}`);\n return null;\n }\n}\nasync function loadPluginLocale(i18n, locale, loader) {\n let messages = null;\n messages = await tryLoadLocale(locale, loader);\n if (!messages && locale.includes(\"-\")) {\n const fallbackLocale = locale.split(\"-\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale.includes(\"_\")) {\n const fallbackLocale = locale.split(\"_\")[0];\n console.debug(`Locale ${locale} not found, trying fallback locale ${fallbackLocale}`);\n messages = await tryLoadLocale(fallbackLocale, loader);\n }\n if (!messages && locale !== \"en\") {\n console.debug(`Locale ${locale} not found, trying fallback locale en`);\n messages = await tryLoadLocale(\"en\", loader);\n }\n if (messages?.messages) {\n i18n.load(locale, messages.messages);\n i18n.activate(locale);\n } else {\n console.error(`Failed to load any locale for ${locale}`);\n }\n}\nconst defaultLocaleLoader = async (_locale) => null;\nfunction LocalizedComponent({\n i18n,\n locale,\n loadLocale,\n children\n}) {\n const [loaded, setLoaded] = useState(false);\n useEffect(() => {\n setLoaded(false);\n loadPluginLocale(i18n, locale, loadLocale ?? defaultLocaleLoader).then(() => {\n setLoaded(true);\n });\n }, [i18n, locale, loadLocale]);\n return loaded ? /* @__PURE__ */ jsxRuntimeExports.jsx(I18nProvider, { i18n, children }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { w: \"100%\", animate: true });\n}\nexport {\n LocalizedComponent as default\n};\n//# sourceMappingURL=LocalizedComponent.js.map\n","import { useHotkeys } from \"../node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.js\";\nimport \"../enums/Roles.js\";\nimport \"../enums/ModelInformation.js\";\nimport \"./Notification.js\";\nimport \"../components/ActionButton.js\";\nimport \"../_virtual/jsx-runtime.js\";\nimport \"../components/Boundary.js\";\nimport \"../components/ButtonMenu.js\";\nimport \"../components/CopyButton.js\";\nimport \"../components/CopyableCell.js\";\nimport \"../components/ProgressBar.js\";\nimport \"../components/YesNoButton.js\";\nimport \"../components/SearchInput.js\";\nimport \"../components/TableColumnSelect.js\";\nimport \"../components/TagsList.js\";\nimport \"../components/InvenTreeTable.js\";\nimport \"../components/RowActions.js\";\nimport \"../hooks/MonitorDataOutput.js\";\nimport \"../hooks/MonitorBackgroundTask.js\";\nimport \"../hooks/UseFilterSet.js\";\nimport \"../hooks/UseTable.js\";\nimport \"../components/nav/DetailDrawer.js\";\nimport \"../components/StylishText.js\";\nimport \"../states/StoredTableState.js\";\nimport { useLocalLibState } from \"../states/LocalLibState.js\";\nimport \"../plugin/LocalizedComponent.js\";\nconst useEffect = window[\"React\"].useEffect;\nfunction cancelEvent(event) {\n event?.preventDefault();\n event?.stopPropagation();\n event?.nativeEvent?.stopImmediatePropagation();\n}\nfunction useInvenTreeHotkeys(_keys, tagsToIgnore) {\n const keyelems = _keys.map(([key, description]) => [key, description]);\n const mappedHotkeys = _keys.map(([key, _, handler, options]) => [key, handler, options]);\n useHotkeys(mappedHotkeys, tagsToIgnore);\n useEffect(() => {\n useLocalLibState.getState().addHotkeys(keyelems);\n return () => useLocalLibState.getState().removeHotkeys(keyelems.map(([key]) => key));\n }, []);\n}\nexport {\n cancelEvent,\n useInvenTreeHotkeys\n};\n//# sourceMappingURL=Events.js.map\n","import { INVENTREE_PLUGIN_VERSION } from \"../types/Plugins.js\";\nfunction checkPluginVersion(context) {\n const systemVersion = context?.version?.inventree || \"\";\n if (INVENTREE_PLUGIN_VERSION != systemVersion) {\n console.info(`Plugin version mismatch! Expected version ${INVENTREE_PLUGIN_VERSION}, got ${systemVersion}`);\n }\n}\nfunction initPlugin(context) {\n checkPluginVersion(context);\n context.i18n?.activate?.(context.locale);\n}\nexport {\n checkPluginVersion,\n initPlugin\n};\n//# sourceMappingURL=Plugins.js.map\n","import createReactComponent from \"../createReactComponent.js\";\nconst __iconNode = [[\"path\", { \"d\": \"M12 5l0 14\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M5 12l14 0\", \"key\": \"svg-1\" }]];\nconst IconPlus = createReactComponent(\"outline\", \"plus\", \"Plus\", __iconNode);\nexport {\n __iconNode,\n IconPlus as default\n};\n//# sourceMappingURL=IconPlus.js.map\n","import type { LocaleLoader } from '@inventreedb/ui';\n\n// Necessary callback function to dynamically load the locale messages for the plugin\nexport const loadLocale: LocaleLoader = async (locale: string) =>\n import(`./locales/${locale}/messages.ts`).catch(() => null);\n","import {\n checkPluginVersion,\n type InvenTreePluginContext,\n LocalizedComponent\n} from '@inventreedb/ui';\nimport { t } from '@lingui/core/macro';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Switch,\n Table,\n Text,\n Title\n} from '@mantine/core';\nimport { notifications } from '@mantine/notifications';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { loadLocale } from './locales';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\nconst GENERATE_URL = '/plugin/batchcode/generate/';\n\n/** Settings dict provided by BatchCodePlugin.get_ui_panels */\ntype BatchCodeSettings = Record;\n\n/**\n * Summary of the settings which decide what a generated code looks like.\n */\nfunction SettingsSummary({ settings }: { settings: BatchCodeSettings }) {\n const rows: [string, string][] = useMemo(() => {\n const scopes: string[] = [];\n\n if (settings.PER_PART) scopes.push(t`per part`);\n if (settings.PER_LOCATION) scopes.push(t`per location`);\n if (settings.DAILY_RESET) scopes.push(t`reset daily`);\n\n return [\n [t`Format`, String(settings.CODE_FORMAT ?? '')],\n [\n t`Prefix`,\n settings.USE_LOCATION_PREFIX\n ? t`from location field '${String(settings.LOCATION_FIELD)}'`\n : String(settings.PREFIX ?? '')\n ],\n [t`Counter`, scopes.length ? scopes.join(', ') : t`global`],\n [t`Trigger`, String(settings.TRIGGER_MODE ?? '')]\n ];\n }, [settings]);\n\n return (\n \n \n {rows.map(([label, value]) => (\n \n \n \n {label}\n \n \n \n {value}\n \n \n ))}\n \n
\n );\n}\n\nfunction BatchCodePanel({ context }: { context: InvenTreePluginContext }) {\n const settings: BatchCodeSettings = useMemo(\n () => context.context?.settings ?? {},\n [context.context]\n );\n\n const canGenerate: boolean = useMemo(\n () => !!context.context?.can_generate,\n [context.context]\n );\n\n const itemId = useMemo(() => context.id ?? null, [context.id]);\n\n const currentCode: string = useMemo(\n () => context.instance?.batch || '',\n [context.instance]\n );\n\n const [preview, setPreview] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [busy, setBusy] = useState(false);\n const [overwrite, setOverwrite] = useState(false);\n\n // Ask the backend which code would be issued next. This is a preview: it\n // does not advance the counter, so it can be refreshed freely.\n const loadPreview = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, { item: itemId })\n .then((response) => setPreview(response.data?.batch_code ?? ''))\n .catch(() => setError(t`Could not load a batch code preview`))\n .finally(() => setLoading(false));\n }, [context.api, itemId]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n const generate = useCallback(() => {\n if (!itemId) {\n return;\n }\n\n setBusy(true);\n\n context.api\n .post(GENERATE_URL, { item: itemId, overwrite: overwrite })\n .then((response) => {\n const code = response.data?.batch_code ?? '';\n\n notifications.show({\n title: t`Batch code generated`,\n message: code,\n color: 'green'\n });\n\n context.reloadInstance?.();\n loadPreview();\n })\n .catch((e) => {\n const detail =\n e?.response?.data?.item?.[0] ??\n e?.response?.data?.detail ??\n t`Could not generate a batch code`;\n\n notifications.show({\n title: t`Batch code not generated`,\n message: String(detail),\n color: 'red'\n });\n })\n .finally(() => setBusy(false));\n }, [context.api, context.reloadInstance, itemId, loadPreview, overwrite]);\n\n if (!settings.ENABLED) {\n return (\n \n \n {t`Enable the plugin setting 'Enabled' to generate batch codes.`}\n \n \n );\n }\n\n return (\n \n \n \n \n {t`Current batch code`}\n \n {currentCode ? (\n \n {currentCode}\n \n ) : (\n \n {t`Not set`}\n \n )}\n \n \n \n {t`Next code`}\n \n {loading ? (\n \n ) : (\n \n {preview || '—'}\n \n )}\n \n \n\n {error && (\n \n {error}\n \n )}\n\n {canGenerate ? (\n \n setOverwrite(event.currentTarget.checked)}\n label={t`Overwrite the existing batch code`}\n disabled={!currentCode}\n />\n \n \n \n {t`Generate and save`}\n \n \n \n ) : (\n \n {t`You do not have permission to generate batch codes.`}\n \n )}\n\n \n {t`Configuration`}\n \n \n \n );\n}\n\n// This is the function which is called by InvenTree to render the actual panel component\nexport function RenderBatchCodePluginPanel(context: InvenTreePluginContext) {\n checkPluginVersion(context);\n\n return (\n \n \n \n );\n}\n"],"file":"Panel.js"} \ No newline at end of file diff --git a/batchcode_plugin/static/Settings-D5NnX1mC.js b/batchcode_plugin/static/Settings-D5NnX1mC.js new file mode 100644 index 0000000..4052de1 --- /dev/null +++ b/batchcode_plugin/static/Settings-D5NnX1mC.js @@ -0,0 +1,2 @@ +const R=window.MantineCore.Alert,w=window.MantineCore.Badge,E=window.MantineCore.Button,e=window.MantineCore.Code,g=window.MantineCore.Group,p=window.MantineCore.Loader,u=window.MantineCore.Stack,c=window.MantineCore.Text,h=window.React.useCallback,C=window.React.useEffect,l=window.React.useState,f="/plugin/batchcode/preview/";function b({context:t}){const[m,o]=l(""),[r,i]=l(""),[s,d]=l(!1),a=h(()=>{d(!0),i(""),t.api.post(f,{}).then(n=>o(n.data?.batch_code??"")).catch(n=>{i(String(n?.response?.data?.detail??"Could not render a preview code")),o("")}).finally(()=>d(!1))},[t.api]);return C(()=>{a()},[a]),React.createElement(u,{gap:"sm"},React.createElement(R,{color:"blue",title:"Format preview"},React.createElement(u,{gap:"sm"},React.createElement(c,{size:"sm"},"The next batch code for the global counter, using the settings above. Part, location and date placeholders resolve against the actual stock item when a code is generated."),React.createElement(g,{gap:"sm",align:"center"},s?React.createElement(p,{size:"sm"}):React.createElement(w,{size:"lg",variant:"light"},m||"—"),React.createElement(E,{size:"xs",variant:"default",onClick:a,disabled:s},"Refresh")),r&&React.createElement(c,{size:"sm",c:"red"},r))),React.createElement(c,{size:"xs",c:"dimmed"},"Placeholders: ",React.createElement(e,null,"{prefix}")," ",React.createElement(e,null,"{num}")," ",React.createElement(e,null,"{sep}")," ",React.createElement(e,null,"{date}")," ",React.createElement(e,null,"{part}")," ",React.createElement(e,null,"{ipn}")," ",React.createElement(e,null,"{loc}")," ",React.createElement(e,null,"{year}")," ",React.createElement(e,null,"{month}")," ",React.createElement(e,null,"{day}")," ",React.createElement(e,null,"{week}")))}function v(t){return React.createElement(b,{context:t})}export{v as RenderPluginSettings}; +//# sourceMappingURL=Settings-D5NnX1mC.js.map diff --git a/batchcode_plugin/static/Settings-D5NnX1mC.js.map b/batchcode_plugin/static/Settings-D5NnX1mC.js.map new file mode 100644 index 0000000..bbbcc31 --- /dev/null +++ b/batchcode_plugin/static/Settings-D5NnX1mC.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Settings-D5NnX1mC.js","sources":["../../frontend/src/Settings.tsx"],"sourcesContent":["import type { InvenTreePluginContext } from '@inventreedb/ui';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Text\n} from '@mantine/core';\nimport { useCallback, useEffect, useState } from 'react';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\n\n/**\n * Rendered on the plugin settings page, below the settings themselves.\n *\n * Shows the code the current settings would produce. The preview endpoint\n * does not advance the counter, so this can be refreshed after each settings\n * change to check a format before it is used for real.\n */\nfunction PluginSettingsDisplay({\n context\n}: {\n context: InvenTreePluginContext;\n}) {\n const [code, setCode] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const loadPreview = useCallback(() => {\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, {})\n .then((response) => setCode(response.data?.batch_code ?? ''))\n .catch((e) => {\n setError(\n String(e?.response?.data?.detail ?? 'Could not render a preview code')\n );\n setCode('');\n })\n .finally(() => setLoading(false));\n }, [context.api]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n return (\n \n \n \n \n The next batch code for the global counter, using the settings\n above. Part, location and date placeholders resolve against the\n actual stock item when a code is generated.\n \n \n {loading ? (\n \n ) : (\n \n {code || '—'}\n \n )}\n \n Refresh\n \n \n {error && (\n \n {error}\n \n )}\n \n \n \n Placeholders: {'{prefix}'} {'{num}'}{' '}\n {'{sep}'} {'{date}'} {'{part}'}{' '}\n {'{ipn}'} {'{loc}'} {'{year}'}{' '}\n {'{month}'} {'{day}'} {'{week}'}\n \n \n );\n}\n\nexport function RenderPluginSettings(context: InvenTreePluginContext) {\n return ;\n}\n"],"names":["Alert","useCallback","PREVIEW_URL","PluginSettingsDisplay","context","code","setCode","useState","error","setError","loading","setLoading","loadPreview","api","post","then","response","data","batch_code","catch","e","String","detail","finally","useEffect","Stack","Text","Group","Loader","Badge","Button","Code","RenderPluginSettings"],"mappings":"AACA,MAAAA,EAAA,OAAA,YAAA,mMAUAC,EAAA,OAAA,MAAA,6DAEMC,EAAc,6BASpB,SAASC,EAAsB,CAC7BC,QAAAA,CAGF,EAAG,CACD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAiB,EAAE,EACrC,CAACC,EAAOC,CAAQ,EAAIF,EAAiB,EAAE,EACvC,CAACG,EAASC,CAAU,EAAIJ,EAAkB,EAAK,EAE/CK,EAAcX,EAAY,IAAM,CACpCU,EAAW,EAAI,EACfF,EAAS,EAAE,EAEXL,EAAQS,IACLC,KAAKZ,EAAa,CAAA,CAAE,EACpBa,KAAMC,GAAaV,EAAQU,EAASC,MAAMC,YAAc,EAAE,CAAC,EAC3DC,MAAOC,GAAM,CACZX,EACEY,OAAOD,GAAGJ,UAAUC,MAAMK,QAAU,iCAAiC,CACvE,EACAhB,EAAQ,EAAE,CACZ,CAAC,EACAiB,QAAQ,IAAMZ,EAAW,EAAK,CAAC,CACpC,EAAG,CAACP,EAAQS,GAAG,CAAC,EAEhBW,OAAAA,EAAU,IAAM,CACdZ,EAAAA,CACF,EAAG,CAACA,CAAW,CAAC,EAGd,MAAA,cAACa,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACzB,EAAA,CAAM,MAAM,OAAO,MAAM,gBAAA,EACxB,MAAA,cAACyB,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACC,EAAA,CAAK,KAAK,IAAA,EAAI,4KAIf,EACA,MAAA,cAACC,EAAA,CAAM,IAAI,KAAK,MAAM,UACnBjB,EACC,MAAA,cAACkB,EAAA,CAAO,KAAK,IAAA,CAAI,EAEjB,MAAA,cAACC,EAAA,CAAM,KAAK,KAAK,QAAQ,OAAA,EACtBxB,GAAQ,GACX,EAEF,MAAA,cAACyB,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAASlB,EACT,SAAUF,GAAQ,SAGpB,CACF,EACCF,GACC,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,OACflB,CACH,CAEJ,CACF,EACA,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,QAAA,EAAQ,iBACV,MAAA,cAACK,EAAA,KAAM,UAAW,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAQ,IAC/D,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACvE,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACtE,MAAA,cAACA,EAAA,KAAM,SAAU,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,CAClE,CACF,CAEJ,CAEO,SAASC,EAAqB5B,EAAiC,CACpE,OAAO,MAAA,cAACD,GAAsB,QAAAC,CAAA,CAAiB,CACjD"} \ No newline at end of file diff --git a/batchcode_plugin/static/Settings.js b/batchcode_plugin/static/Settings.js new file mode 100644 index 0000000..688c6dd --- /dev/null +++ b/batchcode_plugin/static/Settings.js @@ -0,0 +1,2 @@ +const R=window.MantineCore.Alert,w=window.MantineCore.Badge,E=window.MantineCore.Button,e=window.MantineCore.Code,g=window.MantineCore.Group,p=window.MantineCore.Loader,u=window.MantineCore.Stack,c=window.MantineCore.Text,h=window.React.useCallback,C=window.React.useEffect,l=window.React.useState,f="/plugin/batchcode/preview/";function b({context:t}){const[m,o]=l(""),[r,i]=l(""),[s,d]=l(!1),a=h(()=>{d(!0),i(""),t.api.post(f,{}).then(n=>o(n.data?.batch_code??"")).catch(n=>{i(String(n?.response?.data?.detail??"Could not render a preview code")),o("")}).finally(()=>d(!1))},[t.api]);return C(()=>{a()},[a]),React.createElement(u,{gap:"sm"},React.createElement(R,{color:"blue",title:"Format preview"},React.createElement(u,{gap:"sm"},React.createElement(c,{size:"sm"},"The next batch code for the global counter, using the settings above. Part, location and date placeholders resolve against the actual stock item when a code is generated."),React.createElement(g,{gap:"sm",align:"center"},s?React.createElement(p,{size:"sm"}):React.createElement(w,{size:"lg",variant:"light"},m||"—"),React.createElement(E,{size:"xs",variant:"default",onClick:a,disabled:s},"Refresh")),r&&React.createElement(c,{size:"sm",c:"red"},r))),React.createElement(c,{size:"xs",c:"dimmed"},"Placeholders: ",React.createElement(e,null,"{prefix}")," ",React.createElement(e,null,"{num}")," ",React.createElement(e,null,"{sep}")," ",React.createElement(e,null,"{date}")," ",React.createElement(e,null,"{part}")," ",React.createElement(e,null,"{ipn}")," ",React.createElement(e,null,"{loc}")," ",React.createElement(e,null,"{year}")," ",React.createElement(e,null,"{month}")," ",React.createElement(e,null,"{day}")," ",React.createElement(e,null,"{week}")))}function v(t){return React.createElement(b,{context:t})}export{v as RenderPluginSettings}; +//# sourceMappingURL=Settings.js.map diff --git a/batchcode_plugin/static/Settings.js.map b/batchcode_plugin/static/Settings.js.map new file mode 100644 index 0000000..24de4ff --- /dev/null +++ b/batchcode_plugin/static/Settings.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Settings.js","sources":["../../frontend/src/Settings.tsx"],"sourcesContent":["import type { InvenTreePluginContext } from '@inventreedb/ui';\nimport {\n Alert,\n Badge,\n Button,\n Code,\n Group,\n Loader,\n Stack,\n Text\n} from '@mantine/core';\nimport { useCallback, useEffect, useState } from 'react';\n\nconst PREVIEW_URL = '/plugin/batchcode/preview/';\n\n/**\n * Rendered on the plugin settings page, below the settings themselves.\n *\n * Shows the code the current settings would produce. The preview endpoint\n * does not advance the counter, so this can be refreshed after each settings\n * change to check a format before it is used for real.\n */\nfunction PluginSettingsDisplay({\n context\n}: {\n context: InvenTreePluginContext;\n}) {\n const [code, setCode] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const loadPreview = useCallback(() => {\n setLoading(true);\n setError('');\n\n context.api\n .post(PREVIEW_URL, {})\n .then((response) => setCode(response.data?.batch_code ?? ''))\n .catch((e) => {\n setError(\n String(e?.response?.data?.detail ?? 'Could not render a preview code')\n );\n setCode('');\n })\n .finally(() => setLoading(false));\n }, [context.api]);\n\n useEffect(() => {\n loadPreview();\n }, [loadPreview]);\n\n return (\n \n \n \n \n The next batch code for the global counter, using the settings\n above. Part, location and date placeholders resolve against the\n actual stock item when a code is generated.\n \n \n {loading ? (\n \n ) : (\n \n {code || '—'}\n \n )}\n \n Refresh\n \n \n {error && (\n \n {error}\n \n )}\n \n \n \n Placeholders: {'{prefix}'} {'{num}'}{' '}\n {'{sep}'} {'{date}'} {'{part}'}{' '}\n {'{ipn}'} {'{loc}'} {'{year}'}{' '}\n {'{month}'} {'{day}'} {'{week}'}\n \n \n );\n}\n\nexport function RenderPluginSettings(context: InvenTreePluginContext) {\n return ;\n}\n"],"names":["Alert","useCallback","PREVIEW_URL","PluginSettingsDisplay","context","code","setCode","useState","error","setError","loading","setLoading","loadPreview","api","post","then","response","data","batch_code","catch","e","String","detail","finally","useEffect","Stack","Text","Group","Loader","Badge","Button","Code","RenderPluginSettings"],"mappings":"AACA,MAAAA,EAAA,OAAA,YAAA,mMAUAC,EAAA,OAAA,MAAA,6DAEMC,EAAc,6BASpB,SAASC,EAAsB,CAC7BC,QAAAA,CAGF,EAAG,CACD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAiB,EAAE,EACrC,CAACC,EAAOC,CAAQ,EAAIF,EAAiB,EAAE,EACvC,CAACG,EAASC,CAAU,EAAIJ,EAAkB,EAAK,EAE/CK,EAAcX,EAAY,IAAM,CACpCU,EAAW,EAAI,EACfF,EAAS,EAAE,EAEXL,EAAQS,IACLC,KAAKZ,EAAa,CAAA,CAAE,EACpBa,KAAMC,GAAaV,EAAQU,EAASC,MAAMC,YAAc,EAAE,CAAC,EAC3DC,MAAOC,GAAM,CACZX,EACEY,OAAOD,GAAGJ,UAAUC,MAAMK,QAAU,iCAAiC,CACvE,EACAhB,EAAQ,EAAE,CACZ,CAAC,EACAiB,QAAQ,IAAMZ,EAAW,EAAK,CAAC,CACpC,EAAG,CAACP,EAAQS,GAAG,CAAC,EAEhBW,OAAAA,EAAU,IAAM,CACdZ,EAAAA,CACF,EAAG,CAACA,CAAW,CAAC,EAGd,MAAA,cAACa,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACzB,EAAA,CAAM,MAAM,OAAO,MAAM,gBAAA,EACxB,MAAA,cAACyB,EAAA,CAAM,IAAI,IAAA,EACT,MAAA,cAACC,EAAA,CAAK,KAAK,IAAA,EAAI,4KAIf,EACA,MAAA,cAACC,EAAA,CAAM,IAAI,KAAK,MAAM,UACnBjB,EACC,MAAA,cAACkB,EAAA,CAAO,KAAK,IAAA,CAAI,EAEjB,MAAA,cAACC,EAAA,CAAM,KAAK,KAAK,QAAQ,OAAA,EACtBxB,GAAQ,GACX,EAEF,MAAA,cAACyB,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAASlB,EACT,SAAUF,GAAQ,SAGpB,CACF,EACCF,GACC,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,OACflB,CACH,CAEJ,CACF,EACA,MAAA,cAACkB,EAAA,CAAK,KAAK,KAAK,EAAE,QAAA,EAAQ,iBACV,MAAA,cAACK,EAAA,KAAM,UAAW,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAQ,IAC/D,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACvE,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,EAAQ,IACtE,MAAA,cAACA,EAAA,KAAM,SAAU,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,OAAQ,EAAO,IAAC,MAAA,cAACA,EAAA,KAAM,QAAS,CAClE,CACF,CAEJ,CAEO,SAASC,EAAqB5B,EAAiC,CACpE,OAAO,MAAA,cAACD,GAAsB,QAAAC,CAAA,CAAiB,CACjD"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-6MO-OwBA.js b/batchcode_plugin/static/assets/messages-6MO-OwBA.js new file mode 100644 index 0000000..c127abb --- /dev/null +++ b/batchcode_plugin/static/assets/messages-6MO-OwBA.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-6MO-OwBA.js.map diff --git a/batchcode_plugin/static/assets/messages-6MO-OwBA.js.map b/batchcode_plugin/static/assets/messages-6MO-OwBA.js.map new file mode 100644 index 0000000..965820f --- /dev/null +++ b/batchcode_plugin/static/assets/messages-6MO-OwBA.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-6MO-OwBA.js","sources":["../../../frontend/src/locales/pseudo-LOCALE/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-B19F09LY.js b/batchcode_plugin/static/assets/messages-B19F09LY.js new file mode 100644 index 0000000..f5ee4e8 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-B19F09LY.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-B19F09LY.js.map diff --git a/batchcode_plugin/static/assets/messages-B19F09LY.js.map b/batchcode_plugin/static/assets/messages-B19F09LY.js.map new file mode 100644 index 0000000..c5d48c0 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-B19F09LY.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-B19F09LY.js","sources":["../../../frontend/src/locales/es/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-BVqXLN8V.js b/batchcode_plugin/static/assets/messages-BVqXLN8V.js new file mode 100644 index 0000000..1b90887 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BVqXLN8V.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-BVqXLN8V.js.map diff --git a/batchcode_plugin/static/assets/messages-BVqXLN8V.js.map b/batchcode_plugin/static/assets/messages-BVqXLN8V.js.map new file mode 100644 index 0000000..3c2a649 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BVqXLN8V.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-BVqXLN8V.js","sources":["../../../frontend/src/locales/en/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-BaNfSHmL.js b/batchcode_plugin/static/assets/messages-BaNfSHmL.js new file mode 100644 index 0000000..2bf98ab --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BaNfSHmL.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-BaNfSHmL.js.map diff --git a/batchcode_plugin/static/assets/messages-BaNfSHmL.js.map b/batchcode_plugin/static/assets/messages-BaNfSHmL.js.map new file mode 100644 index 0000000..99a9142 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BaNfSHmL.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-BaNfSHmL.js","sources":["../../../frontend/src/locales/ru/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-Bs4XYOTm.js b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js new file mode 100644 index 0000000..5cded04 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-Bs4XYOTm.js.map diff --git a/batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map new file mode 100644 index 0000000..0b59d96 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-Bs4XYOTm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-Bs4XYOTm.js","sources":["../../../frontend/src/locales/zh_Hant/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-BwzuZfs7.js b/batchcode_plugin/static/assets/messages-BwzuZfs7.js new file mode 100644 index 0000000..37d6c65 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BwzuZfs7.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-BwzuZfs7.js.map diff --git a/batchcode_plugin/static/assets/messages-BwzuZfs7.js.map b/batchcode_plugin/static/assets/messages-BwzuZfs7.js.map new file mode 100644 index 0000000..b524b67 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-BwzuZfs7.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-BwzuZfs7.js","sources":["../../../frontend/src/locales/ja/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-DtuQFlMQ.js b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js new file mode 100644 index 0000000..e3cc21c --- /dev/null +++ b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-DtuQFlMQ.js.map diff --git a/batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map new file mode 100644 index 0000000..83f0ed3 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-DtuQFlMQ.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-DtuQFlMQ.js","sources":["../../../frontend/src/locales/fr/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-SySx3VqF.js b/batchcode_plugin/static/assets/messages-SySx3VqF.js new file mode 100644 index 0000000..b58c7ab --- /dev/null +++ b/batchcode_plugin/static/assets/messages-SySx3VqF.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-SySx3VqF.js.map diff --git a/batchcode_plugin/static/assets/messages-SySx3VqF.js.map b/batchcode_plugin/static/assets/messages-SySx3VqF.js.map new file mode 100644 index 0000000..6bb50d1 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-SySx3VqF.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-SySx3VqF.js","sources":["../../../frontend/src/locales/de/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-m7AYrdMP.js b/batchcode_plugin/static/assets/messages-m7AYrdMP.js new file mode 100644 index 0000000..fdb35fb --- /dev/null +++ b/batchcode_plugin/static/assets/messages-m7AYrdMP.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Sovrascrivi il codice batch esistente"],"B4m81Y":["Non hai i permessi per generare codici batch."],"DKa9ch":["Genera e salva"],"DerUtL":["La generazione dei codici batch è disattivata"],"H2Sfhg":["Attivazione"],"IF5r8v":["Anteprima non disponibile"],"MTqQMG":["Non impostato"],"NEgaRI":["Impossibile generare il codice batch"],"NKnPpU":["Contatore"],"O/ICOy":["per articolo"],"O8n/gF":["Codice batch non generato"],"SLbeKO":["globale"],"T0z5Hw":["Codice batch generato"],"hPL4I9":["Impossibile caricare l'anteprima del codice batch"],"hsSgoQ":["Attiva l'impostazione 'Enabled' del plugin per generare i codici batch."],"iHaxSq":["azzerato ogni giorno"],"j1yeuR":["dal campo ubicazione {0}"],"kI1qVD":["Formato"],"lCF0wC":["Aggiorna"],"nyqfpO":["Codice batch attuale"],"qt+UdX":["per ubicazione"],"rNqTKZ":["Prefisso"],"ss5emH":["Prossimo codice"],"uNQ6eB":["Sola lettura"],"ywFj2D":["Configurazione"]}`);export{e as messages}; +//# sourceMappingURL=messages-m7AYrdMP.js.map diff --git a/batchcode_plugin/static/assets/messages-m7AYrdMP.js.map b/batchcode_plugin/static/assets/messages-m7AYrdMP.js.map new file mode 100644 index 0000000..1f458ee --- /dev/null +++ b/batchcode_plugin/static/assets/messages-m7AYrdMP.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-m7AYrdMP.js","sources":["../../../frontend/src/locales/it/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Sovrascrivi il codice batch esistente\\\"],\\\"B4m81Y\\\":[\\\"Non hai i permessi per generare codici batch.\\\"],\\\"DKa9ch\\\":[\\\"Genera e salva\\\"],\\\"DerUtL\\\":[\\\"La generazione dei codici batch è disattivata\\\"],\\\"H2Sfhg\\\":[\\\"Attivazione\\\"],\\\"IF5r8v\\\":[\\\"Anteprima non disponibile\\\"],\\\"MTqQMG\\\":[\\\"Non impostato\\\"],\\\"NEgaRI\\\":[\\\"Impossibile generare il codice batch\\\"],\\\"NKnPpU\\\":[\\\"Contatore\\\"],\\\"O/ICOy\\\":[\\\"per articolo\\\"],\\\"O8n/gF\\\":[\\\"Codice batch non generato\\\"],\\\"SLbeKO\\\":[\\\"globale\\\"],\\\"T0z5Hw\\\":[\\\"Codice batch generato\\\"],\\\"hPL4I9\\\":[\\\"Impossibile caricare l'anteprima del codice batch\\\"],\\\"hsSgoQ\\\":[\\\"Attiva l'impostazione 'Enabled' del plugin per generare i codici batch.\\\"],\\\"iHaxSq\\\":[\\\"azzerato ogni giorno\\\"],\\\"j1yeuR\\\":[\\\"dal campo ubicazione {0}\\\"],\\\"kI1qVD\\\":[\\\"Formato\\\"],\\\"lCF0wC\\\":[\\\"Aggiorna\\\"],\\\"nyqfpO\\\":[\\\"Codice batch attuale\\\"],\\\"qt+UdX\\\":[\\\"per ubicazione\\\"],\\\"rNqTKZ\\\":[\\\"Prefisso\\\"],\\\"ss5emH\\\":[\\\"Prossimo codice\\\"],\\\"uNQ6eB\\\":[\\\"Sola lettura\\\"],\\\"ywFj2D\\\":[\\\"Configurazione\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,m5BAAu/B"} \ No newline at end of file diff --git a/batchcode_plugin/static/assets/messages-uDIARWjl.js b/batchcode_plugin/static/assets/messages-uDIARWjl.js new file mode 100644 index 0000000..78a8a39 --- /dev/null +++ b/batchcode_plugin/static/assets/messages-uDIARWjl.js @@ -0,0 +1,2 @@ +const e=JSON.parse(`{"4tMAUR":["Overwrite the existing batch code"],"B4m81Y":["You do not have permission to generate batch codes."],"DKa9ch":["Generate and save"],"DerUtL":["Batch code generation is disabled"],"H2Sfhg":["Trigger"],"IF5r8v":["Preview unavailable"],"MTqQMG":["Not set"],"NEgaRI":["Could not generate a batch code"],"NKnPpU":["Counter"],"O/ICOy":["per part"],"O8n/gF":["Batch code not generated"],"SLbeKO":["global"],"T0z5Hw":["Batch code generated"],"hPL4I9":["Could not load a batch code preview"],"hsSgoQ":["Enable the plugin setting 'Enabled' to generate batch codes."],"iHaxSq":["reset daily"],"j1yeuR":["from location field {0}"],"kI1qVD":["Format"],"lCF0wC":["Refresh"],"nyqfpO":["Current batch code"],"qt+UdX":["per location"],"rNqTKZ":["Prefix"],"ss5emH":["Next code"],"uNQ6eB":["Read only"],"ywFj2D":["Configuration"]}`);export{e as messages}; +//# sourceMappingURL=messages-uDIARWjl.js.map diff --git a/batchcode_plugin/static/assets/messages-uDIARWjl.js.map b/batchcode_plugin/static/assets/messages-uDIARWjl.js.map new file mode 100644 index 0000000..be2283c --- /dev/null +++ b/batchcode_plugin/static/assets/messages-uDIARWjl.js.map @@ -0,0 +1 @@ +{"version":3,"file":"messages-uDIARWjl.js","sources":["../../../frontend/src/locales/zh_Hans/messages.ts"],"sourcesContent":["/*eslint-disable*/import type{Messages}from\"@lingui/core\";export const messages=JSON.parse(\"{\\\"4tMAUR\\\":[\\\"Overwrite the existing batch code\\\"],\\\"B4m81Y\\\":[\\\"You do not have permission to generate batch codes.\\\"],\\\"DKa9ch\\\":[\\\"Generate and save\\\"],\\\"DerUtL\\\":[\\\"Batch code generation is disabled\\\"],\\\"H2Sfhg\\\":[\\\"Trigger\\\"],\\\"IF5r8v\\\":[\\\"Preview unavailable\\\"],\\\"MTqQMG\\\":[\\\"Not set\\\"],\\\"NEgaRI\\\":[\\\"Could not generate a batch code\\\"],\\\"NKnPpU\\\":[\\\"Counter\\\"],\\\"O/ICOy\\\":[\\\"per part\\\"],\\\"O8n/gF\\\":[\\\"Batch code not generated\\\"],\\\"SLbeKO\\\":[\\\"global\\\"],\\\"T0z5Hw\\\":[\\\"Batch code generated\\\"],\\\"hPL4I9\\\":[\\\"Could not load a batch code preview\\\"],\\\"hsSgoQ\\\":[\\\"Enable the plugin setting 'Enabled' to generate batch codes.\\\"],\\\"iHaxSq\\\":[\\\"reset daily\\\"],\\\"j1yeuR\\\":[\\\"from location field {0}\\\"],\\\"kI1qVD\\\":[\\\"Format\\\"],\\\"lCF0wC\\\":[\\\"Refresh\\\"],\\\"nyqfpO\\\":[\\\"Current batch code\\\"],\\\"qt+UdX\\\":[\\\"per location\\\"],\\\"rNqTKZ\\\":[\\\"Prefix\\\"],\\\"ss5emH\\\":[\\\"Next code\\\"],\\\"uNQ6eB\\\":[\\\"Read only\\\"],\\\"ywFj2D\\\":[\\\"Configuration\\\"]}\")as Messages;"],"names":["messages","JSON","parse"],"mappings":"AAAiE,MAAMA,EAASC,KAAKC,MAAM,yzBAA65B"} \ No newline at end of file diff --git a/batchcode_plugin/urls.py b/batchcode_plugin/urls.py deleted file mode 100644 index 98d2ae3..0000000 --- a/batchcode_plugin/urls.py +++ /dev/null @@ -1,59 +0,0 @@ -# batchcode_plugin/urls.py -from django.urls import path -from rest_framework.decorators import api_view, permission_classes -from rest_framework.permissions import IsAuthenticated -from rest_framework.response import Response - -from .plugin import BatchCodePlugin -from stock.models import StockItem - -@api_view(["POST"]) -@permission_classes([IsAuthenticated]) -def preview(request): - """ - POST /api/plugins/batchcode/preview/ - body: { part: ?, location: ?, prefix: ?, code_format: ? } - returns: {"batch_code": "..."} - """ - plugin = BatchCodePlugin() - data = request.data or {} - # Allow preview by passing part/location/name etc. - batch = plugin.generate_batch_code(**data) - if batch is None: - return Response({"detail": "Could not generate batch"}, status=400) - return Response({"batch_code": batch}) - -@api_view(["POST"]) -@permission_classes([IsAuthenticated]) -def manual(request): - """ - POST /api/plugins/batchcode/manual/ - body: { id: } - requires permission: user must be allowed by plugin setting (handled on frontend too) - """ - plugin = BatchCodePlugin() - item_id = request.data.get("id") or request.query_params.get("id") - if not item_id: - return Response({"detail": "Missing stockitem id"}, status=400) - try: - stock_item = StockItem.objects.get(pk=item_id) - except StockItem.DoesNotExist: - return Response({"detail": "StockItem not found"}, status=404) - - # check role - role = plugin.get_setting("MANUAL_BUTTON_ROLE", "staff") - user = request.user - if role == "superuser" and not user.is_superuser: - return Response({"detail": "Permission denied"}, status=403) - if role == "staff" and not user.is_staff: - return Response({"detail": "Permission denied"}, status=403) - - code = plugin.manual_generate_and_save(stock_item) - if not code: - return Response({"detail": "Could not generate batch"}, status=400) - return Response({"batch_code": code}) - -urlpatterns = [ - path("preview/", preview, name="batchcode_preview"), - path("manual/", manual, name="batchcode_manual"), -] diff --git a/batchcode_plugin/views.py b/batchcode_plugin/views.py new file mode 100644 index 0000000..2e8c2c7 --- /dev/null +++ b/batchcode_plugin/views.py @@ -0,0 +1,107 @@ +"""API views for the BatchCodePlugin plugin. + +Mounted by :meth:`BatchCodePlugin.setup_urls` under +``/plugin/batchcode/`` - see the UrlsMixin documentation. +""" + +from django.utils.translation import gettext_lazy as _ +from rest_framework import permissions +from rest_framework.exceptions import PermissionDenied, ValidationError +from rest_framework.response import Response +from rest_framework.views import APIView + +from .serializers import ( + BatchCodeResponseSerializer, + GenerateBatchCodeSerializer, + PreviewBatchCodeSerializer, +) + + +def get_plugin(): + """Return the registered plugin instance. + + Instantiating the plugin class directly would bypass the registry, and its + settings would not resolve against the database. + """ + from plugin.registry import registry + + plugin = registry.get_plugin('batchcode') + + if plugin is None: + raise ValidationError(_('The BatchCode plugin is not active')) + + return plugin + + +class PreviewBatchCodeView(APIView): + """Render the batch code which would be issued next. + + This does not advance the counter, so it is safe to call repeatedly - for + instance to show a live preview while settings are being edited. + """ + + permission_classes = [permissions.IsAuthenticated] + serializer_class = PreviewBatchCodeSerializer + + def post(self, request, *args, **kwargs): + """Preview a batch code for the supplied context.""" + plugin = get_plugin() + + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + + data = serializer.validated_data + + code = plugin.preview_code( + item=data.get('item'), + part=data.get('part'), + location=data.get('location'), + force=True, + ) + + return Response( + BatchCodeResponseSerializer({'batch_code': code}).data, status=200 + ) + + +class GenerateBatchCodeView(APIView): + """Issue a batch code and save it onto a stock item. + + The counter is advanced, so each successful call returns a distinct code. + """ + + permission_classes = [permissions.IsAuthenticated] + serializer_class = GenerateBatchCodeSerializer + + def post(self, request, *args, **kwargs): + """Generate and store a batch code for the supplied stock item.""" + plugin = get_plugin() + + if not plugin.user_can_generate(request.user): + raise PermissionDenied( + _('You do not have permission to generate batch codes') + ) + + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + + data = serializer.validated_data + + item = data['item'] + + if item.batch and not data.get('overwrite'): + raise ValidationError( + {'item': _('This stock item already has a batch code')} + ) + + code = plugin.build_code(commit=True, item=item, force=True) + + if not code: + raise ValidationError(_('Could not generate a batch code')) + + item.batch = code + item.save(update_fields=['batch']) + + return Response( + BatchCodeResponseSerializer({'batch_code': code}).data, status=200 + ) diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..1cfa533 --- /dev/null +++ b/biome.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "files": { + "includes": [ + "**", + "frontend/src/**", + "!frontend/src/locales/**" + ] + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "single", + "trailingCommas": "none", + "indentStyle": "space" + } + }, + "linter": { + "rules": { + "suspicious" : { + "noExplicitAny": "off", + "noDoubleEquals": "off", + "noArrayIndexKey": "off", + "useDefaultSwitchClauseLast": "off" + }, + "style": { + "noUselessElse": "off", + "noNonNullAssertion": "off", + "noParameterAssign": "off" + }, "correctness":{ + "useExhaustiveDependencies": "off", + "useJsxKeyInIterable": "off", + "noUnsafeOptionalChaining": "off", + "noSwitchDeclarations": "off", + "noUnusedImports":"error" + }, "complexity": { + "noBannedTypes": "off", + "noExtraBooleanCast": "off", + "noForEach": "off", + "noUselessSwitchCase": "off", + "useLiteralKeys":"off" + }, "performance": { + "noDelete":"off" + } + } +} +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..0c6253c --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,6 @@ +# Node modules +node_modules +*.tsbuildinfo + +# Compiled static code +static \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..d69ffe4 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,79 @@ +# Batch Code Generator- Frontend Code + +This directory contains the frontend code for the Batch Code Generator plugin. + +## Architecture + +The frontend code is designed to integrate natively with the InvenTree user interface. + +### Frameworks + +We use Mantine, running on React, to match the InvenTree stack. + +- [React](https://react.dev/) +- [Mantine](https://mantine.dev/) + +## Project Setup + +This project uses [Vite](https://vitejs.dev/) as the build tool. We followed [this guide](https://vitejs.dev/guide/#scaffolding-your-first-vite-project) to scaffold the project. + +*Note: The following instructions assume you are already in the `frontend` directory.* + +### Install Frontend Libraries + +Install the required frontend libraries: + +```bash +npm install +``` + +### Translate + +If you have translation support enabled, run: + +```bash +npm run translate +``` + +### Building + +To compile the frontend code, run: + +```bash +npm run build +``` + +This will compile the frontend into the `../batchcode_plugin/static` directory (ready for distribution). + +Note: The target directory is intentionally outside of the frontend directory, so that the compiled files are correctly bundled into the python package install. + +### Testing + +To run the frontend code in a test environment, run: + +```bash +npm run dev +``` + +This will start a development server (usually on `localhost:5174`) which will automatically reload when changes are made to the source code. + +Note: You will also need the InvenTree frontend dev server to be running on `localhost:5173` (using `invoke dev.frontend-server` in the InvenTree project). + +### Linting / Formatting + +The frontend code is linted and formatted using [biomejs](https://biomejs.dev/). + +To *check* the code for linting errors, run: + +```bash +npm run lint +``` + +To *fix* any linting errors, run: + +```bash +npm run lint:fix +``` + +Any formatting errors will be automatically fixed when you run the `lint:fix` command. + diff --git a/frontend/lingui.config.ts b/frontend/lingui.config.ts new file mode 100644 index 0000000..900b012 --- /dev/null +++ b/frontend/lingui.config.ts @@ -0,0 +1,31 @@ +import { formatter } from "@lingui/format-po"; + +/** @type {import('@lingui/conf').LinguiConfig} */ +export default { + locales: [ + "de", + "en", + "es", + "fr", + "it", + "ja", + "ru", + "zh_Hans", + "zh_Hant", + "pseudo-LOCALE", + ], + sourceLocale: "en", + fallbackLocales: { + default: "en", + "pseudo-LOCALE": "en", + }, + catalogs: [ + { + path: "src/locales/{locale}/messages", + include: ["src"], + exclude: ["**/node_modules/**", "./dist/**"], + }, + ], + format: formatter({ lineNumbers: false }), + orderBy: "origin", +}; diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..bf3a53e --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,7105 @@ +{ + "name": "inventree-batchcode-plugin", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "inventree-batchcode-plugin", + "version": "2.0.0", + "dependencies": { + "@inventreedb/ui": "latest", + "@mantine/core": ">= 9.2.1", + "@mantine/hooks": ">= 9.2.1", + "@mantine/modals": ">= 9.2.1", + "@mantine/notifications": ">= 9.2.1", + "react": ">= 19.2.4", + "react-dom": ">= 19.2.4" + }, + "devDependencies": { + "@biomejs/biome": "2.0.0", + "@lingui/swc-plugin": "latest", + "@lingui/vite-plugin": "latest", + "@types/react": "latest", + "@types/react-dom": "latest", + "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react-swc": "latest", + "globals": "^15.14.0", + "typescript": "~5.6.2", + "vite": "^6.4.2", + "vite-plugin-externals": "^0.6.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.0.tgz", + "integrity": "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.0.0", + "@biomejs/cli-darwin-x64": "2.0.0", + "@biomejs/cli-linux-arm64": "2.0.0", + "@biomejs/cli-linux-arm64-musl": "2.0.0", + "@biomejs/cli-linux-x64": "2.0.0", + "@biomejs/cli-linux-x64-musl": "2.0.0", + "@biomejs/cli-win32-arm64": "2.0.0", + "@biomejs/cli-win32-x64": "2.0.0" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz", + "integrity": "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz", + "integrity": "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz", + "integrity": "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz", + "integrity": "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz", + "integrity": "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz", + "integrity": "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz", + "integrity": "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz", + "integrity": "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz", + "integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-liquid": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.3.2.tgz", + "integrity": "sha512-6PDVU3ZnfeYyz1at1E/ttorErZvZFXXt1OPhtfe1EZJ2V2iDFa0CwPqPgG5F7NXN0yONGoBogKmFAafKTqlwIw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.1" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.2.tgz", + "integrity": "sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.2.tgz", + "integrity": "sha512-U3RiPX62Wl/Gx4ftQ7UxLlloSfsFTQqKa+7vFBYteZGCzkp6oBqcsD7iSwniWRGobCAmDcwZSY+Six3+3ztdfg==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.10", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.10.tgz", + "integrity": "sha512-vVWLvd4fKWYN/pMcwUrg6dWeublxmSz+V+52ZjW3h64IVN9cRUYLk5Km4JDT9vifxAFfDtNOIFxKYENthcolJQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.20", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", + "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.9", + "@floating-ui/utils": "^0.2.12", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.3.1.tgz", + "integrity": "sha512-k0C0sdHmZtAo6dRDtd1Z/qcpyHbL0CKsjV8seMY/21xGhY5Wsv0XRmiI/xEEH4y2c9b1+jvgNs/3EqhV27yUEA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.3.1.tgz", + "integrity": "sha512-BoxVN3PKnMbgStHhjoaky/oWdxHomDqmBVA24IA3KEmssFGeI7u9YT/BJceOjIum/t6TpPa/vcMKaVYQeIQ/3Q==", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.3.1.tgz", + "integrity": "sha512-q1EsmL7Q8DDnkRBUjSvrxbq7c9oVwwVjCn/xa5apKmdp65YSgzUg2y0Ltnd5aDbT6GdAQQdXql5Ha90ArqIReQ==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.3.1.tgz", + "integrity": "sha512-v0BLa0eqg7ubvVWeNSHVBs8fWH/GJicERZoJaxJ3FE/lj67VSqzoMg9pzfZVOfLMX10y0pGwQAuxoRVVH2patg==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-3.5.0.tgz", + "integrity": "sha512-63mlRr6fiBbJ0wjr1Cf6dsDGtP2lNvk9lnatKgxs/fIkhslsZT291hIUzJkuUkI9yr69ZvWnWfgb2qXm4QyVaA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~6 || ~7", + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@fullcalendar/core": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.21.tgz", + "integrity": "sha512-t3u/+sqh3Iq7TWtUnVLcGDUE6OWZh0UD3c04bI/l7lSLAgAKr3kngBmhHiQD1QXpwC8ZN5iNqG7a7gOVixhSKQ==", + "license": "MIT", + "dependencies": { + "preact": "~10.12.1" + } + }, + "node_modules/@fullcalendar/daygrid": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.21.tgz", + "integrity": "sha512-QYb1y40RGYLlOxKpYWg8O+7njEnKnFG8Tt7qjnubJGR35s1phQg67E+81y2TyAbbm59p2JFOCXGDk9t6KDujIA==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.21" + } + }, + "node_modules/@fullcalendar/interaction": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.21.tgz", + "integrity": "sha512-WPYpqtljDWmU0Xm2cOtFrLlocgxv7cgkOppj34Q6OUUat8a6Cnd6kYo2JR+irP223PE5lBYHFNp1qh7SIpJc0w==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.21" + } + }, + "node_modules/@fullcalendar/react": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.21.tgz", + "integrity": "sha512-TLpmGUd5k/PMdCh8XbeFC9PW9wuGvMms1oCxWgXyjK3EFPXAAd0PLfcvwKdyxoAS5eK1E4RJFkjMHvsYHpimcg==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.21", + "react": "^16.7.0 || ^17 || ^18 || ^19", + "react-dom": "^16.7.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/@github/webauthn-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-2.1.1.tgz", + "integrity": "sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==", + "deprecated": "Deprecated: Modern browsers support built-in WebAuthn JSON methods. Please use native browser methods instead. For more information, visit https://github.com/github/webauthn-json", + "license": "MIT", + "bin": { + "webauthn-json": "dist/bin/main.js" + } + }, + "node_modules/@inventreedb/ui": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inventreedb/ui/-/ui-1.5.0.tgz", + "integrity": "sha512-bi3oZKCJuyYEuI1wLloUEyMxwF3r3R/LayOvA/fm54k22D6OMSKQ2O1OLJaGtYascz8OB2d4h6lPIY4NLGPEqw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.20.1", + "@codemirror/lang-liquid": "^6.3.2", + "@codemirror/language": "^6.12.2", + "@codemirror/lint": "^6.9.5", + "@codemirror/search": "^6.6.0", + "@codemirror/state": "^6.6.0", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.40.0", + "@emotion/react": "^11.14.0", + "@fortawesome/fontawesome-svg-core": "^7.2.0", + "@fortawesome/free-regular-svg-icons": "^7.2.0", + "@fortawesome/free-solid-svg-icons": "^7.2.0", + "@fortawesome/react-fontawesome": "^3.3.1", + "@fullcalendar/core": "^6.1.21", + "@fullcalendar/daygrid": "^6.1.21", + "@fullcalendar/interaction": "^6.1.21", + "@fullcalendar/react": "6.1.21", + "@github/webauthn-json": "^2.1.1", + "@lingui/core": "^5.9.2", + "@lingui/react": "^5.9.2", + "@mantine/carousel": "^9.2.1", + "@mantine/charts": "^9.2.1", + "@mantine/core": "^9.2.1", + "@mantine/dates": "^9.2.1", + "@mantine/dropzone": "^9.2.1", + "@mantine/form": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@mantine/modals": "^9.2.1", + "@mantine/notifications": "^9.2.1", + "@mantine/spotlight": "^9.2.1", + "@mantine/vanilla-extract": "^9.2.1", + "@messageformat/date-skeleton": "^1.1.0", + "@sentry/react": "^10.57.0", + "@tabler/icons-react": "^3.44.0", + "@tanstack/react-query": "^5.101.0", + "@uiw/codemirror-theme-vscode": "^4.25.8", + "@uiw/react-codemirror": "^4.25.8", + "@uiw/react-split": "^5.9.4", + "@vanilla-extract/css": "^1.20.1", + "axios": "^1.17.0", + "clsx": "^2.1.1", + "codemirror": "^6.0.2", + "dayjs": "^1.11.21", + "dompurify": "^3.4.8", + "easymde": "^2.21.0", + "embla-carousel": "^8.6.0", + "embla-carousel-react": "^8.6.0", + "fuse.js": "^7.4.2", + "html5-qrcode": "^2.3.8", + "mantine-contextmenu": "^9.2.1", + "mantine-datatable": "^9.2.2", + "qrcode": "^1.5.4", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-grid-layout": "1.4.4", + "react-hook-form": "^7.78.0", + "react-is": "^19.2.7", + "react-router-dom": "^6.30.4", + "react-select": "^5.10.2", + "react-simplemde-editor": "^5.2.0", + "react-window": "1.8.11", + "recharts": "^3.8.1", + "styled-components": "^6.4.2", + "undici": "^8.4.1", + "zustand": "^5.0.14" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-5.9.5.tgz", + "integrity": "sha512-XOAXMPOkpy45784q5bCNN5PizoAecxkBm8kv8CEusI/f9kR3vMCcpH4kvSchU05JkKAVE8eIsdxb2zM6eDJTeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.9.5.tgz", + "integrity": "sha512-TDIrOa2hAz8kXrZ0JfMGaIiFIE4TEdqI2he4OpkTSCfBh3ec/gSCn1kNW5HdviO7x46Gvy567YOgHNOI9/e4Fg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "5.9.5", + "@lingui/core": "5.9.5", + "@lingui/message-utils": "5.9.5" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro/node_modules/@lingui/conf": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.9.5.tgz", + "integrity": "sha512-k5r9ssOZirhS5BlqdsK5L0rzlqnHeryoJHAQIpUpeh8g5ymgpbUN7L4+4C4hAX/tddAFiCFN8boHTiu6Wbt83Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lingui/cli": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-5.9.5.tgz", + "integrity": "sha512-gonY7U75nzKic8GvEciy1/otQv1WpfwGW5wGMjmBXUMaMnIsycm/wo3t0+2hzqFp+RNfEKZcScoM7aViK3XuLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/generator": "^7.21.1", + "@babel/parser": "^7.22.0", + "@babel/runtime": "^7.21.0", + "@babel/types": "^7.21.2", + "@lingui/babel-plugin-extract-messages": "5.9.5", + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "@lingui/conf": "5.9.5", + "@lingui/core": "5.9.5", + "@lingui/format-po": "5.9.5", + "@lingui/message-utils": "5.9.5", + "chokidar": "3.5.1", + "cli-table": "^0.3.11", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "date-fns": "^3.6.0", + "esbuild": "^0.25.1", + "glob": "^11.0.0", + "micromatch": "^4.0.7", + "ms": "^2.1.3", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "picocolors": "^1.1.1", + "pofile": "^1.1.4", + "pseudolocale": "^2.0.0", + "source-map": "^0.7.6", + "threads": "^1.7.0" + }, + "bin": { + "lingui": "dist/lingui.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/@lingui/conf": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.9.5.tgz", + "integrity": "sha512-k5r9ssOZirhS5BlqdsK5L0rzlqnHeryoJHAQIpUpeh8g5ymgpbUN7L4+4C4hAX/tddAFiCFN8boHTiu6Wbt83Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lingui/cli/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lingui/cli/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@lingui/conf": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-6.6.0.tgz", + "integrity": "sha512-4NUxQh6VXZSBocAKATuJJ6+dOF/M3OTd5WtbND7eSi5tZtVKF0qFMcKFfx8aiUJFo+KP/wYnBBiDPvPLkJvqcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "lilconfig": "^3.1.3", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@lingui/core": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-5.9.5.tgz", + "integrity": "sha512-Y+iZq9NqnqZOqHNgPomUFP21KH/zs4oTTizWoz0AKAkBbq9T9yb1DSz/ugtBRjF1YLtKMF9tq28v3thMHANSiQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/message-utils": "5.9.5" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lingui/format-po": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-5.9.5.tgz", + "integrity": "sha512-abawxkaEMhAUCqxrnim2NTTeu2gd55X9tkFN8jfRM0B1LE2KjZLWCA8gSD90J/DblDwej8jK8A2BynXlcQdluQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/conf": "5.9.5", + "@lingui/message-utils": "5.9.5", + "date-fns": "^3.6.0", + "pofile": "^1.1.4" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/format-po/node_modules/@lingui/conf": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.9.5.tgz", + "integrity": "sha512-k5r9ssOZirhS5BlqdsK5L0rzlqnHeryoJHAQIpUpeh8g5ymgpbUN7L4+4C4hAX/tddAFiCFN8boHTiu6Wbt83Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^2.5.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/format-po/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lingui/message-utils": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-5.9.5.tgz", + "integrity": "sha512-t3dNbjb1dWkvcpXGMXIEyBDO3l4B8J2ColZXi0NTG1ioAj+sDfFxFB8fepVgd3JAk+AwARlOLvF14oS0mAdgpw==", + "license": "MIT", + "dependencies": { + "@messageformat/parser": "^5.0.0", + "js-sha256": "^0.10.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/react": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-5.9.5.tgz", + "integrity": "sha512-jzYoA/f4jrTfpOB+jrMhlC835UwqSXJdepr7cfWsmg+Rpp3HBSREtfrogaz1LqLI/AVnkmfp10Mo6VOp/8qeOQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/core": "5.9.5" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "babel-plugin-macros": "2 || 3", + "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lingui/swc-plugin": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@lingui/swc-plugin/-/swc-plugin-6.7.0.tgz", + "integrity": "sha512-TRLHfeQT/q9JXy0cBGOtbfcEWJFF1szjPCVM4AT1HdZyfGj+dQ0r8hHq+08c4iXZLzlsYilzw+bZJ3TahG5g5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/conf": "5 || 6" + }, + "peerDependencies": { + "@lingui/core": "5 || 6" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "next": { + "optional": true + } + } + }, + "node_modules/@lingui/vite-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-6.6.0.tgz", + "integrity": "sha512-1kZMeGNk5hYQzrEPA3RcXQKb106VC26GqxpXpjVIhS4r2sT4c4gztk70T65VSwyZ7Uyc1pIpXxys3uY2DTfHKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/cli": "6.6.0", + "@lingui/conf": "6.6.0" + }, + "engines": { + "node": ">=22.19.0" + }, + "peerDependencies": { + "@babel/core": "^7.29.0 || ^8.0.0", + "@lingui/babel-plugin-lingui-macro": "^5 || ^6", + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "rolldown": "^1.0.0-rc.5", + "vite": "^6.3.0 || ^7 || ^8" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "@rolldown/plugin-babel": { + "optional": true + }, + "rolldown": { + "optional": true + } + } + }, + "node_modules/@mantine/carousel": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/carousel/-/carousel-9.6.0.tgz", + "integrity": "sha512-+bYTs7XfsRkv+vR+ojL+EKUxY8wBXeirOMIB3d/4YKmKleMiqJh2J3ejEVcINelzLVjvod7+fg+edKDy9N2aSA==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "embla-carousel": ">=8.0.0", + "embla-carousel-react": ">=8.0.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/charts": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/charts/-/charts-9.6.0.tgz", + "integrity": "sha512-xGRzoY0bJSR3r1DrIhpW8k81xtvh2EfYnRiZi2QtgdtkzSXFx9gMDJfr7Jo0i0joj5XuL0O4tPhCg0ZxjGFNrw==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "recharts": ">=3.2.1" + } + }, + "node_modules/@mantine/core": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.6.0.tgz", + "integrity": "sha512-WpdtSv9q2k4RrAVUxBlABMyEul4vv94EkjoVuQglBBC7jVmLhBBgI64HltE6di/l6zvj9D7k1vgkbVjyxQsn1g==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.27.20", + "clsx": "^2.1.1", + "react-number-format": "^5.4.5", + "react-remove-scroll": "^2.7.2", + "type-fest": "^5.8.0" + }, + "peerDependencies": { + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/dates": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-9.6.0.tgz", + "integrity": "sha512-fcMGrbwKj7F5KkRtwuKeXz/MBh+l0Y3ljLyJ3eaF7NL0CLJSXO7YJxpeZDXBMDF0w+iUs9c2zilnTTidh9ICPQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "dayjs": ">=1.0.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/dropzone": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-9.6.0.tgz", + "integrity": "sha512-XvUx2Mxl2wKMUB1HoRPc+b6h5WDJ1ZPfYt4g6xDzNI4m8mnyKXmPJSgmEJD1RWzNA1CtxTX6rqRaiOUar4hbAw==", + "license": "MIT", + "dependencies": { + "react-dropzone": "20.1.1" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/form": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-9.6.0.tgz", + "integrity": "sha512-4TbT/DiixG5uWjgm/HNQlS3Ac0Ov35WVcAW6HQ7Q4+NGuj8mED4gBXHzqVywNi7PhshivdNMox3zADvHIOyUdA==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "fast-deep-equal": "^3.1.3", + "klona": "^2.0.6" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/@mantine/hooks": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.6.0.tgz", + "integrity": "sha512-r+1RWxc0F2XK9exKIk3Cxc17eyDTEtRqvomeQMCqI4S2Z3A78ObAGuNS8WXn8aqDGN66MJlO+WV7oCgQn2iQfQ==", + "license": "MIT", + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/@mantine/modals": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-9.6.0.tgz", + "integrity": "sha512-uNNwdYkk5ZqsPKi6zVe+bHq09RCM/HRbzC+UFGXmmOKq2AgOuCoLPNimvVV3y6GQ+jcPFFlkR4D7wbv4eQKPAQ==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/notifications": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-9.6.0.tgz", + "integrity": "sha512-1sTE7EaGpr6LX7ykE8DOwpTNxi3U7AHF7Ve/oBd1VEe2k/5RmEYLTWpexxf7WwNpEmHCi99MvG7qUMQJyqc9Fg==", + "license": "MIT", + "dependencies": { + "@mantine/store": "9.6.0", + "react-transition-group": "4.4.5" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/spotlight": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/spotlight/-/spotlight-9.6.0.tgz", + "integrity": "sha512-ZJgdrMWnhZDWSu6/OHcUkk5cXgLhkBnICCWWnHpuaapAKIa+ya3jj0BXDA8fzb3iY6yKCF06bqpKY5rhiuKaCw==", + "license": "MIT", + "dependencies": { + "@mantine/store": "9.6.0" + }, + "peerDependencies": { + "@mantine/core": "9.6.0", + "@mantine/hooks": "9.6.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/store": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/store/-/store-9.6.0.tgz", + "integrity": "sha512-nYt2tfn1/e6CK35a5TWlPbOL3Xwf7OzBmBElV0l+Ae6mswVaMip1WHm0mCaHAbTKgsOnvL/tooDTVxBBrmm87Q==", + "license": "MIT", + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/@mantine/vanilla-extract": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/vanilla-extract/-/vanilla-extract-9.6.0.tgz", + "integrity": "sha512-dLTSnwb9+kbe4GmfkJbmnlszHch/MrEkClX6eIimyzzP14YTJEiz7l+U5Wv/hYzFmWPPiSHhBizRYohS0+2zNQ==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "9.6.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", + "license": "MIT" + }, + "node_modules/@messageformat/date-skeleton": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.1.0.tgz", + "integrity": "sha512-rmGAfB1tIPER+gh3p/RgA+PVeRE/gxuQ2w4snFWPF5xtb5mbWR7Cbw7wCOftcUypbD6HVoxrVdyyghPm3WzP5A==", + "license": "MIT" + }, + "node_modules/@messageformat/parser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz", + "integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==", + "license": "MIT", + "dependencies": { + "moo": "^0.5.1" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.4.tgz", + "integrity": "sha512-q7j5geK7xs3UJSdm9/iytUNclBnLmYx1EnSeCFXHPeutdqgIMeFeHtUZgS3EhlKxdBEAu8OwtJCwmLrEzpSs7Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sentry/browser": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.73.0.tgz", + "integrity": "sha512-HqTe1S5RrWLufhX2LaFP3yNoMxfNDroh120bq1zdGHZfFDBMJQ0CDXxHO+L4UJfQ5dWdCCzWbXIAiZuWGa/DFQ==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.73.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.73.0", + "@sentry/feedback": "10.73.0", + "@sentry/replay": "10.73.0", + "@sentry/replay-canvas": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/browser-utils": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/browser-utils/-/browser-utils-10.73.0.tgz", + "integrity": "sha512-qQygxJZ+RV779+iL1+lrJ4f4sZLgbgW0/JWPNp0YlcEAE62yCsdKbqoTEjB/EugdS4mSjBMX0chZC6rblu2Ycw==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/conventions": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@sentry/conventions/-/conventions-0.16.0.tgz", + "integrity": "sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sentry/core": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.73.0.tgz", + "integrity": "sha512-FLO1UgH19RyasVpofu612WCOgb2nEH0dZy+R72d7p65XU9i0wxlMKm3+sgfwKmiSJp1Qhilaaxs4Jg6BbiM5HA==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/feedback": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/feedback/-/feedback-10.73.0.tgz", + "integrity": "sha512-D6nSngX+e46Mae2/oh2bxBvxNK1z2NERbuMAhB5sx9x4xMBWIyGnYYTECehvEqV9+AqGAgxxhOZoYIG3AmRwww==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/react": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.73.0.tgz", + "integrity": "sha512-wJrzS98ddPvhGS/MKNHZyE8X7ecd4KwKdz7fHino2qkqBBrF4cxWr+q/uLTIk5PYWMkeJ4oKMjHAjOqmzGR4tg==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "10.73.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } + }, + "node_modules/@sentry/replay": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-10.73.0.tgz", + "integrity": "sha512-nN2wjN/Y0J5BOJV5hqRHUEBfxwUsipp1PKjcDHh6Fpxnrtfldu3Y99E8cQInseo5heFdzEvrOHBBrqWZXOHVKQ==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.73.0", + "@sentry/core": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/replay-canvas": { + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/replay-canvas/-/replay-canvas-10.73.0.tgz", + "integrity": "sha512-sxa2lKkHPfF/j5xFpW7gocthWXRqyoHz8KCPy6yGc8plT477nl57iGSKhQDYsx1Ny10TLjs7YkIuPP1GY/Ax2Q==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.73.0", + "@sentry/replay": "10.73.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/core": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.16.1.tgz", + "integrity": "sha512-nUaeu91O5QZKrQdaDCHd402ogUIoNOOjpkZNq0UomWK0G6gDaGmLhvddF1/3BXf5O8aLyo6ZPY/aMDWvaJQ/hg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.28" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.16.1", + "@swc/core-darwin-x64": "1.16.1", + "@swc/core-linux-arm-gnueabihf": "1.16.1", + "@swc/core-linux-arm64-gnu": "1.16.1", + "@swc/core-linux-arm64-musl": "1.16.1", + "@swc/core-linux-ppc64-gnu": "1.16.1", + "@swc/core-linux-s390x-gnu": "1.16.1", + "@swc/core-linux-x64-gnu": "1.16.1", + "@swc/core-linux-x64-musl": "1.16.1", + "@swc/core-win32-arm64-msvc": "1.16.1", + "@swc/core-win32-ia32-msvc": "1.16.1", + "@swc/core-win32-x64-msvc": "1.16.1" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.1.tgz", + "integrity": "sha512-zlJblJ8ncErD43lKdxjbUaUskJQf+LxiPXYcWXD8/8ZMV+7uuAT+CwjciLXpyZBd5Pq/S726bMpeeAwSeL1hhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.16.1.tgz", + "integrity": "sha512-IN0BmPWb0YAh/17mmlWB/HDBtTw2MfuW4hulf/tQAgTQBRH17l+z499bNJLK6LizSjqs0P7V+jU38Zj+vJC1DA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.1.tgz", + "integrity": "sha512-EYgrx2YOCQ2Twz2S793kqNjPkpvYVUPzzR95bIb7by+VQcyaai4lZZ2iz/tZvcFVKSNcN3/JTKwx+aBn2ZL52A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.1.tgz", + "integrity": "sha512-moyKm0YZlHdHohzm1YwgAyesqnE853rO0REMfJLFAova51wF9BNi+3ZW2PeS7Vqvn6HeJuepLpAHbBdZctxpHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.1.tgz", + "integrity": "sha512-kKGBO9wdapiSzuf5ZzZ2fYtlu1BNSYtIIUxvH1ir/gcelTOREEHGDCLTDFx/2Knf878nU11A40z7LxwasEFxqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.1.tgz", + "integrity": "sha512-nZ6qahtLxC3PM54cWOQZHxt4lTCF/3J4LIoWWzz6v7A+rLs8Dx54anYQf7mH3eIi8KlNpgKci/ie8ZSqFN8O7A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.1.tgz", + "integrity": "sha512-4ji5PNzhYq193Z4/4xUaSoNJza6iCkDJSzhetrbB6KOYxsr+kxtQr8ePWhMJUiMt6JUWtXaZ1PYT8FhtED+nGA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.1.tgz", + "integrity": "sha512-VJQxqrisHV+B394IgrOu8YsIIXZgffnf5tO+yc9Z/hoUpuZEvuQTjWwlnpZdpyD+0nx6LTD1/3k646JYm43yJA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.1.tgz", + "integrity": "sha512-r9oV1mwxxsIGcLV1IQ/tw76MW3doatKze1QFWuC+a7QqJUkhY/bKTSVk6NpKKUGm2LDsE33Va8VqSClfA7vSiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.1.tgz", + "integrity": "sha512-6huNRessoBLxWEqBm5zJXyCQ27TO7anvkdiuQ5MDO4CJni0nOXEqKtV9RllQ2TdyENKKsUMXVnIfW2hIXx/R5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.1.tgz", + "integrity": "sha512-OVKJFUzphrGmsh+BGtcZDesx0YryV7/Yvy5XGgTqnrZfjnyfcr5uaqYQugCckdIlupc5Vs3XtDjRAj12z4ZPlw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.1.tgz", + "integrity": "sha512-Bt+VIhWYCGk4urklnkkteLUOeLv1VxigwTCeB/xC6rBZxY6IIKdDwCJf6on3E3SUGsIqmQS6QqtuJQc1VxF4Aw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz", + "integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tabler/icons": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.46.0.tgz", + "integrity": "sha512-f2RYFl3fzPwj5WO82x6en0dmkjefxEfOm16D1ByM6cj/McNiwOkL4VaPUoP9VVIrXAD9WnTSVFr70px703b//A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.46.0.tgz", + "integrity": "sha512-CCm7xJWhDT2PH4ZIFkP6AgYKtVhq0gpYkjUN+GVh1AzmIQaa77OW0bQPBPQiTE0PsXMR9oSxFqA3qBglzPyrVQ==", + "license": "MIT", + "dependencies": { + "@tabler/icons": "3.46.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.8.tgz", + "integrity": "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.8.tgz", + "integrity": "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.102.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.18", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.18.tgz", + "integrity": "sha512-aSBOPXH2PXRYixxUpVP1sJ5+S0vEfKDvR+lABZ7Kju/9Qb0SSbZk72NihWaKoQbANyibs92q4DBfYasywxnNkA==", + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/marked": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz", + "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.11.tgz", + "integrity": "sha512-otyFa+n9IOYtEjaKOxPedHkj15fTPUF21wdR9pv0GpZPfuGl27cvmcv6+tognbRu9VvEcsHKE+ESoszeo3KfTw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/autocomplete": ">=6.0.0", + "@codemirror/commands": ">=6.0.0", + "@codemirror/language": ">=6.0.0", + "@codemirror/lint": ">=6.0.0", + "@codemirror/search": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/codemirror-theme-vscode": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.25.11.tgz", + "integrity": "sha512-fTQ5676L9iV3Y6UyDBDd8Wt9Gewh55aC5rqnCtIpwyVFb6zJEHJScI4g43lzAD2IKhY7HlozB1ucrS3UqBFNEQ==", + "license": "MIT", + "dependencies": { + "@uiw/codemirror-themes": "4.25.11" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/@uiw/codemirror-themes": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.11.tgz", + "integrity": "sha512-SBNCOgRsCtewGNocRbmjbCkltGXlFcPJsvhxQ351VynQjnWUiPbUrFcEU/haQ3HanROdAAjWXZJPk5bMBxl2jw==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/language": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/react-codemirror": { + "version": "4.25.11", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.11.tgz", + "integrity": "sha512-DYVFAKLX+F/4JS9N/7xexh+TICrlncwkX9HKKInrP1bwO0tSfc3k0GB6oawTYhelVKh20cX3TuRx+NJSkVXuMw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@codemirror/commands": "^6.1.0", + "@codemirror/state": "^6.1.1", + "@codemirror/theme-one-dark": "^6.0.0", + "@uiw/codemirror-extensions-basic-setup": "4.25.11", + "codemirror": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.11.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/theme-one-dark": ">=6.0.0", + "@codemirror/view": ">=6.0.0", + "codemirror": ">=6.0.0", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@uiw/react-split": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/@uiw/react-split/-/react-split-5.9.4.tgz", + "integrity": "sha512-gZbMMAV9xFDJQ3aKAzMXVvQfrCFWPILvxFGM2DSdIvhKwjSWP+yTl8fNI246Nu3XR4iHyB4Cohh9JJZEbfIXjQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@vanilla-extract/css": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.21.2.tgz", + "integrity": "sha512-ehF/tmv2MxQwOJB1DicALUqnjZTnmY9Y7J2ccKB578JzZpYeL6sLAUqbaXo1taw1Erp0qBq0I4Kejs0uU/pBfg==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.9", + "css-what": "^6.1.0", + "csstype": "^3.2.3", + "dedent": "^1.5.3", + "deep-object-diff": "^1.1.9", + "deepmerge": "^4.2.2", + "lru-cache": "^10.4.3", + "media-query-parser": "^2.0.2", + "modern-ahocorasick": "^1.0.0", + "picocolors": "^1.0.0" + } + }, + "node_modules/@vanilla-extract/css/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.9.tgz", + "integrity": "sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.3.3.tgz", + "integrity": "sha512-bti8ZAcvz4Lh6/e4Uk2k3aa1TiUXbbMsahuqOHvd3MveFTkKDZOA6wQVkpj7J/+tepX/wGfe+lsGh/t24HTXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1", + "@swc/core": "^1.15.46" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/@vitejs/plugin-react-swc/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "devOptional": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-4.0.0.tgz", + "integrity": "sha512-hmCnJClmeKNKlsBHgbM8yLZRiQZ4/20UXbLJb6OUT16eWcM5/xNZerr80a/zCYob768KIGq++aLrQNTuwPsIOQ==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/codemirror-spell-checker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz", + "integrity": "sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==", + "license": "MIT", + "dependencies": { + "typo-js": "*" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dompurify": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/easymde": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/easymde/-/easymde-2.21.0.tgz", + "integrity": "sha512-5uE7I/DEN8gvGRwxaqAv7h1PMEK2ykNXVX5zL0dK3nCYROGja3AMbdQz8eCEELnfvCfy7tRkTmLuvyJG8uSWjQ==", + "license": "MIT", + "dependencies": { + "@types/codemirror": "^5.60.10", + "@types/marked": "^4.0.7", + "codemirror": "^5.65.15", + "codemirror-spell-checker": "1.1.2", + "marked": "^4.1.0" + } + }, + "node_modules/easymde/node_modules/codemirror": { + "version": "5.65.21", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.21.tgz", + "integrity": "sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.420", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", + "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-react": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", + "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", + "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz", + "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types", + "tests/browser-compat" + ] + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-5.0.1.tgz", + "integrity": "sha512-v0g/PTeuQgvKCBrVRsfVudvwXlRHSWHEQkVgKawgCGHkEpKA1clp3Om5jvEVhz8G9W/mOYjJH9FhkH4C888PgQ==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz", + "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/html5-qrcode": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", + "license": "Apache-2.0" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immer": { + "version": "11.1.18", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.18.tgz", + "integrity": "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "ISC" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-observable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "devOptional": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mantine-contextmenu": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/mantine-contextmenu/-/mantine-contextmenu-9.4.0.tgz", + "integrity": "sha512-sSlHnGbBkPKg11dLSyRsoZxZPTiBKpuTaNGW/6/sJMbzp7DnlSMFnapDbtL6+eb9qgenwoSodcivr5biXid9bg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/icflorescu" + }, + "peerDependencies": { + "@mantine/core": ">=9", + "@mantine/hooks": ">=9", + "clsx": ">=2", + "react": ">=19", + "react-dom": ">=19" + } + }, + "node_modules/mantine-datatable": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/mantine-datatable/-/mantine-datatable-9.4.0.tgz", + "integrity": "sha512-yFym2vlboGaqSD1bqXVtADMWg8YJtdyc3USQUTSqcLgEWzRPQqK/9WBBU0+XVE2qvMHZfiunuJK+UZV4aa2KmA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/icflorescu" + }, + "peerDependencies": { + "@mantine/core": ">=9.0", + "@mantine/hooks": ">=9.0", + "clsx": ">=2", + "react": ">=19", + "react-dom": ">=19" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-query-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", + "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/modern-ahocorasick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", + "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==", + "license": "MIT" + }, + "node_modules/moo": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", + "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", + "license": "BSD-3-Clause" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", + "dev": true, + "license": "MIT" + }, + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "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.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/pseudolocale": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-2.3.0.tgz", + "integrity": "sha512-2RfZuwSSZ8sopelTIIZ2JhmO4GLnHflJQBmtMPF2APWEtmfKOsvqCIWsi8KQJ6EQ0D0+zVllPnLLGijUauSlqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "pseudolocale": "dist/cli.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-draggable": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.1.tgz", + "integrity": "sha512-wa3tzfFnYt3yaZLuyU58fl1TNunfWfBekDgWhZA1+gb2jnp42wZ0ymuopR6M5kqDYmm4hKmzGlcKWjZf3Zb6RQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-dropzone": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-20.1.1.tgz", + "integrity": "sha512-2cilRFP8bsjDOHpV0sJ6XY8pzJhmz4/cQ6s9yeckOACWYDR+n4MGGtnJh3Rycq/9SLhDWugqDx1z5mtfmOOZhw==", + "license": "MIT", + "dependencies": { + "attr-accept": "^4.0.0", + "file-selector": "^5.0.0" + }, + "engines": { + "node": ">= 22" + }, + "peerDependencies": { + "@types/react": "*", + "react": ">= 18" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-grid-layout": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.4.4.tgz", + "integrity": "sha512-7+Lg8E8O8HfOH5FrY80GCIR1SHTn2QnAYKh27/5spoz+OHhMmEhU/14gIkRzJOtympDPaXcVRX/nT1FjmeOUmQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.5", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.87.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.87.0.tgz", + "integrity": "sha512-zhFzWvLxNHH+8839OnZcUxgMZw88ah2jZWDWvKWgF3Tpbnd0vKL+dlcuU3nZVWESZQjd81EW8K+wU+cYfYAc0w==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" + }, + "node_modules/react-number-format": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz", + "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==", + "license": "MIT", + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.2.0.tgz", + "integrity": "sha512-3NKQ0SLZV7rs3LQHeXlOzDSRQfFrkX6TVet77/Qk03zqiZyee37b7N8/gwDJAA8UUjRz7PdWCCy49hcso45SMQ==", + "license": "MIT", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.5.0" + }, + "peerDependencies": { + "react": ">= 16.3", + "react-dom": ">= 16.3" + } + }, + "node_modules/react-router": { + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.6.tgz", + "integrity": "sha512-5HfK7k5im7LTOB0EqCQmfvy4C13G92Ssj1VTmouTK3AJvyjKTnFuCV0vcMAD/JS+JC4DvDIBRrlAeJIFjh5VWg==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.6.tgz", + "integrity": "sha512-0RHKZz7wwffvkU+2MFVT2NnjK44ssLEV+m0CAJaS2Ksmorrwj7WxH00jO0SOCW26/tINUnJHToXblDs33I38YQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.4", + "react-router": "6.30.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-select": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", + "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-simplemde-editor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-simplemde-editor/-/react-simplemde-editor-5.2.0.tgz", + "integrity": "sha512-GkTg1MlQHVK2Rks++7sjuQr/GVS/xm6y+HchZ4GPBWrhcgLieh4CjK04GTKbsfYorSRYKa0n37rtNSJmOzEDkQ==", + "license": "MIT", + "dependencies": { + "@types/codemirror": "~5.60.5" + }, + "peerDependencies": { + "easymde": ">= 2.0.0 < 3.0.0", + "react": ">=16.8.2", + "react-dom": ">=16.8.2" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-window": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", + "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-window/node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^11.1.8", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.2.0", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "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/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/styled-components": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.5.3.tgz", + "integrity": "sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "stylis": "4.3.6" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "css-to-react-native": ">= 3.2.0", + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-native": ">= 0.68.0" + }, + "peerDependenciesMeta": { + "css-to-react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/styled-components/node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "license": "MIT" + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1" + }, + "funding": { + "url": "https://github.com/andywer/threads.js?sponsor=1" + }, + "optionalDependencies": { + "tiny-worker": ">= 2" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "esm": "^3.2.25" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", + "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typo-js": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.3.2.tgz", + "integrity": "sha512-Z1YkJ7IIYNrFeOxAlHUercY4Q2I+PhYD/3VkWpJGy/Oqudy3bFpNcQxnv6Oa9fTSXCHPGz1eDoX1bZYm2Z891A==", + "license": "BSD-3-Clause" + }, + "node_modules/undici": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.1.tgz", + "integrity": "sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-externals": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/vite-plugin-externals/-/vite-plugin-externals-0.6.2.tgz", + "integrity": "sha512-R5oVY8xDJjLXLTs2XDYzvYbc/RTZuIwOx2xcFbYf+/VXB6eJuatDgt8jzQ7kZ+IrgwQhe6tU8U2fTyy72C25CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.4.0", + "es-module-lexer": "^0.4.1", + "fs-extra": "^10.0.0", + "magic-string": "^0.25.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "extraneous": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/zustand": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz", + "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..2d0c73e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,45 @@ +{ + "name": "inventree-batchcode-plugin", + "private": true, + "version": "2.0.0", + "type": "module", + "scripts": { + "extract": "lingui extract", + "compile": "lingui compile --typescript", + "translate": "lingui extract && lingui compile --typescript", + "lint": "npx @biomejs/biome check ./src", + "lint:fix": "npx @biomejs/biome check ./src --fix", + "build": "tsc -b && vite build --emptyOutDir", + "dev": "vite --config vite.dev.config.ts --host" + }, + "dependencies": { + "@inventreedb/ui": "latest", + "react": ">= 19.2.4", + "react-dom": ">= 19.2.4", + "@mantine/core": ">= 9.2.1", + "@mantine/hooks": ">= 9.2.1", + "@mantine/modals": ">= 9.2.1", + "@mantine/notifications": ">= 9.2.1" + }, + "peerDependencies": {}, + "devDependencies": { + "@biomejs/biome": "2.0.0", + "@lingui/swc-plugin": "latest", + "@lingui/vite-plugin": "latest", + "@vitejs/plugin-react-swc": "latest", + "@types/react": "latest", + "@types/react-dom": "latest", + "@vitejs/plugin-react": "^4.7.0", + "globals": "^15.14.0", + "typescript": "~5.6.2", + "vite": "^6.4.2", + "vite-plugin-externals": "^0.6.2" + }, + "overrides": { + "@lingui/core": "^5.9.2", + "@lingui/cli": "^5.9.2", + "@lingui/macro": "^5.9.2", + "glob": ">= 13.0.0", + "vite": "^6.4.2" + } +} diff --git a/frontend/src/Panel.tsx b/frontend/src/Panel.tsx new file mode 100644 index 0000000..ce2d898 --- /dev/null +++ b/frontend/src/Panel.tsx @@ -0,0 +1,251 @@ +import { + checkPluginVersion, + type InvenTreePluginContext, + LocalizedComponent +} from '@inventreedb/ui'; +import { t } from '@lingui/core/macro'; +import { + Alert, + Badge, + Button, + Code, + Group, + Loader, + Stack, + Switch, + Table, + Text, + Title +} from '@mantine/core'; +import { notifications } from '@mantine/notifications'; +import { useCallback, useEffect, useMemo, useState } from 'react'; + +import { loadLocale } from './locales'; + +const PREVIEW_URL = '/plugin/batchcode/preview/'; +const GENERATE_URL = '/plugin/batchcode/generate/'; + +/** Settings dict provided by BatchCodePlugin.get_ui_panels */ +type BatchCodeSettings = Record; + +/** + * Summary of the settings which decide what a generated code looks like. + */ +function SettingsSummary({ settings }: { settings: BatchCodeSettings }) { + const rows: [string, string][] = useMemo(() => { + const scopes: string[] = []; + + if (settings.PER_PART) scopes.push(t`per part`); + if (settings.PER_LOCATION) scopes.push(t`per location`); + if (settings.DAILY_RESET) scopes.push(t`reset daily`); + + return [ + [t`Format`, String(settings.CODE_FORMAT ?? '')], + [ + t`Prefix`, + settings.USE_LOCATION_PREFIX + ? t`from location field '${String(settings.LOCATION_FIELD)}'` + : String(settings.PREFIX ?? '') + ], + [t`Counter`, scopes.length ? scopes.join(', ') : t`global`], + [t`Trigger`, String(settings.TRIGGER_MODE ?? '')] + ]; + }, [settings]); + + return ( + + + {rows.map(([label, value]) => ( + + + + {label} + + + + {value} + + + ))} + +
+ ); +} + +function BatchCodePanel({ context }: { context: InvenTreePluginContext }) { + const settings: BatchCodeSettings = useMemo( + () => context.context?.settings ?? {}, + [context.context] + ); + + const canGenerate: boolean = useMemo( + () => !!context.context?.can_generate, + [context.context] + ); + + const itemId = useMemo(() => context.id ?? null, [context.id]); + + const currentCode: string = useMemo( + () => context.instance?.batch || '', + [context.instance] + ); + + const [preview, setPreview] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + const [busy, setBusy] = useState(false); + const [overwrite, setOverwrite] = useState(false); + + // Ask the backend which code would be issued next. This is a preview: it + // does not advance the counter, so it can be refreshed freely. + const loadPreview = useCallback(() => { + if (!itemId) { + return; + } + + setLoading(true); + setError(''); + + context.api + .post(PREVIEW_URL, { item: itemId }) + .then((response) => setPreview(response.data?.batch_code ?? '')) + .catch(() => setError(t`Could not load a batch code preview`)) + .finally(() => setLoading(false)); + }, [context.api, itemId]); + + useEffect(() => { + loadPreview(); + }, [loadPreview]); + + const generate = useCallback(() => { + if (!itemId) { + return; + } + + setBusy(true); + + context.api + .post(GENERATE_URL, { item: itemId, overwrite: overwrite }) + .then((response) => { + const code = response.data?.batch_code ?? ''; + + notifications.show({ + title: t`Batch code generated`, + message: code, + color: 'green' + }); + + context.reloadInstance?.(); + loadPreview(); + }) + .catch((e) => { + const detail = + e?.response?.data?.item?.[0] ?? + e?.response?.data?.detail ?? + t`Could not generate a batch code`; + + notifications.show({ + title: t`Batch code not generated`, + message: String(detail), + color: 'red' + }); + }) + .finally(() => setBusy(false)); + }, [context.api, context.reloadInstance, itemId, loadPreview, overwrite]); + + if (!settings.ENABLED) { + return ( + + + {t`Enable the plugin setting 'Enabled' to generate batch codes.`} + + + ); + } + + return ( + + + + + {t`Current batch code`} + + {currentCode ? ( + + {currentCode} + + ) : ( + + {t`Not set`} + + )} + + + + {t`Next code`} + + {loading ? ( + + ) : ( + + {preview || '—'} + + )} + + + + {error && ( + + {error} + + )} + + {canGenerate ? ( + + setOverwrite(event.currentTarget.checked)} + label={t`Overwrite the existing batch code`} + disabled={!currentCode} + /> + + + + + + ) : ( + + {t`You do not have permission to generate batch codes.`} + + )} + + + {t`Configuration`} + + + + ); +} + +// This is the function which is called by InvenTree to render the actual panel component +export function RenderBatchCodePluginPanel(context: InvenTreePluginContext) { + checkPluginVersion(context); + + return ( + + + + ); +} diff --git a/frontend/src/Settings.tsx b/frontend/src/Settings.tsx new file mode 100644 index 0000000..97f9959 --- /dev/null +++ b/frontend/src/Settings.tsx @@ -0,0 +1,97 @@ +import type { InvenTreePluginContext } from '@inventreedb/ui'; +import { + Alert, + Badge, + Button, + Code, + Group, + Loader, + Stack, + Text +} from '@mantine/core'; +import { useCallback, useEffect, useState } from 'react'; + +const PREVIEW_URL = '/plugin/batchcode/preview/'; + +/** + * Rendered on the plugin settings page, below the settings themselves. + * + * Shows the code the current settings would produce. The preview endpoint + * does not advance the counter, so this can be refreshed after each settings + * change to check a format before it is used for real. + */ +function PluginSettingsDisplay({ + context +}: { + context: InvenTreePluginContext; +}) { + const [code, setCode] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + const loadPreview = useCallback(() => { + setLoading(true); + setError(''); + + context.api + .post(PREVIEW_URL, {}) + .then((response) => setCode(response.data?.batch_code ?? '')) + .catch((e) => { + setError( + String(e?.response?.data?.detail ?? 'Could not render a preview code') + ); + setCode(''); + }) + .finally(() => setLoading(false)); + }, [context.api]); + + useEffect(() => { + loadPreview(); + }, [loadPreview]); + + return ( + + + + + The next batch code for the global counter, using the settings + above. Part, location and date placeholders resolve against the + actual stock item when a code is generated. + + + {loading ? ( + + ) : ( + + {code || '—'} + + )} + + + {error && ( + + {error} + + )} + + + + Placeholders: {'{prefix}'} {'{num}'}{' '} + {'{sep}'} {'{date}'} {'{part}'}{' '} + {'{ipn}'} {'{loc}'} {'{year}'}{' '} + {'{month}'} {'{day}'} {'{week}'} + + + ); +} + +export function RenderPluginSettings(context: InvenTreePluginContext) { + return ; +} diff --git a/frontend/src/locales.tsx b/frontend/src/locales.tsx new file mode 100644 index 0000000..c62adee --- /dev/null +++ b/frontend/src/locales.tsx @@ -0,0 +1,5 @@ +import type { LocaleLoader } from '@inventreedb/ui'; + +// Necessary callback function to dynamically load the locale messages for the plugin +export const loadLocale: LocaleLoader = async (locale: string) => + import(`./locales/${locale}/messages.ts`).catch(() => null); diff --git a/frontend/src/locales/de/messages.d.ts b/frontend/src/locales/de/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/de/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/de/messages.po b/frontend/src/locales/de/messages.po new file mode 100644 index 0000000..a91f697 --- /dev/null +++ b/frontend/src/locales/de/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: de\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/de/messages.ts b/frontend/src/locales/de/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/de/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/en/messages.d.ts b/frontend/src/locales/en/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/en/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/en/messages.po b/frontend/src/locales/en/messages.po new file mode 100644 index 0000000..f9a6709 --- /dev/null +++ b/frontend/src/locales/en/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "per part" + +#: src/Panel.tsx +msgid "per location" +msgstr "per location" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "reset daily" + +#: src/Panel.tsx +msgid "Format" +msgstr "Format" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "Prefix" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "from location field '{0}'" + +#: src/Panel.tsx +msgid "Counter" +msgstr "Counter" + +#: src/Panel.tsx +msgid "global" +msgstr "global" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "Trigger" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "Could not load a batch code preview" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "Batch code generated" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "Could not generate a batch code" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "Batch code not generated" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "Batch code generation is disabled" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "Enable the plugin setting 'Enabled' to generate batch codes." + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "Current batch code" + +#: src/Panel.tsx +msgid "Not set" +msgstr "Not set" + +#: src/Panel.tsx +msgid "Next code" +msgstr "Next code" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "Preview unavailable" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "Overwrite the existing batch code" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "Refresh" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "Generate and save" + +#: src/Panel.tsx +msgid "Read only" +msgstr "Read only" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "You do not have permission to generate batch codes." + +#: src/Panel.tsx +msgid "Configuration" +msgstr "Configuration" diff --git a/frontend/src/locales/en/messages.ts b/frontend/src/locales/en/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/en/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/es/messages.d.ts b/frontend/src/locales/es/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/es/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/es/messages.po b/frontend/src/locales/es/messages.po new file mode 100644 index 0000000..8ca26ca --- /dev/null +++ b/frontend/src/locales/es/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: es\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/es/messages.ts b/frontend/src/locales/es/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/es/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/fr/messages.d.ts b/frontend/src/locales/fr/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/fr/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/fr/messages.po b/frontend/src/locales/fr/messages.po new file mode 100644 index 0000000..20cc2c9 --- /dev/null +++ b/frontend/src/locales/fr/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: fr\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/fr/messages.ts b/frontend/src/locales/fr/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/fr/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/it/messages.d.ts b/frontend/src/locales/it/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/it/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/it/messages.po b/frontend/src/locales/it/messages.po new file mode 100644 index 0000000..3da41b7 --- /dev/null +++ b/frontend/src/locales/it/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: it\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "per articolo" + +#: src/Panel.tsx +msgid "per location" +msgstr "per ubicazione" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "azzerato ogni giorno" + +#: src/Panel.tsx +msgid "Format" +msgstr "Formato" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "Prefisso" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "dal campo ubicazione '{0}'" + +#: src/Panel.tsx +msgid "Counter" +msgstr "Contatore" + +#: src/Panel.tsx +msgid "global" +msgstr "globale" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "Attivazione" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "Impossibile caricare l'anteprima del codice batch" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "Codice batch generato" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "Impossibile generare il codice batch" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "Codice batch non generato" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "La generazione dei codici batch è disattivata" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "Attiva l'impostazione 'Enabled' del plugin per generare i codici batch." + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "Codice batch attuale" + +#: src/Panel.tsx +msgid "Not set" +msgstr "Non impostato" + +#: src/Panel.tsx +msgid "Next code" +msgstr "Prossimo codice" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "Anteprima non disponibile" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "Sovrascrivi il codice batch esistente" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "Aggiorna" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "Genera e salva" + +#: src/Panel.tsx +msgid "Read only" +msgstr "Sola lettura" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "Non hai i permessi per generare codici batch." + +#: src/Panel.tsx +msgid "Configuration" +msgstr "Configurazione" diff --git a/frontend/src/locales/it/messages.ts b/frontend/src/locales/it/messages.ts new file mode 100644 index 0000000..a89499d --- /dev/null +++ b/frontend/src/locales/it/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Sovrascrivi il codice batch esistente\"],\"B4m81Y\":[\"Non hai i permessi per generare codici batch.\"],\"DKa9ch\":[\"Genera e salva\"],\"DerUtL\":[\"La generazione dei codici batch è disattivata\"],\"H2Sfhg\":[\"Attivazione\"],\"IF5r8v\":[\"Anteprima non disponibile\"],\"MTqQMG\":[\"Non impostato\"],\"NEgaRI\":[\"Impossibile generare il codice batch\"],\"NKnPpU\":[\"Contatore\"],\"O/ICOy\":[\"per articolo\"],\"O8n/gF\":[\"Codice batch non generato\"],\"SLbeKO\":[\"globale\"],\"T0z5Hw\":[\"Codice batch generato\"],\"hPL4I9\":[\"Impossibile caricare l'anteprima del codice batch\"],\"hsSgoQ\":[\"Attiva l'impostazione 'Enabled' del plugin per generare i codici batch.\"],\"iHaxSq\":[\"azzerato ogni giorno\"],\"j1yeuR\":[\"dal campo ubicazione {0}\"],\"kI1qVD\":[\"Formato\"],\"lCF0wC\":[\"Aggiorna\"],\"nyqfpO\":[\"Codice batch attuale\"],\"qt+UdX\":[\"per ubicazione\"],\"rNqTKZ\":[\"Prefisso\"],\"ss5emH\":[\"Prossimo codice\"],\"uNQ6eB\":[\"Sola lettura\"],\"ywFj2D\":[\"Configurazione\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/ja/messages.d.ts b/frontend/src/locales/ja/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/ja/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/ja/messages.po b/frontend/src/locales/ja/messages.po new file mode 100644 index 0000000..76f86ea --- /dev/null +++ b/frontend/src/locales/ja/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-05 13:54+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ja\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/ja/messages.ts b/frontend/src/locales/ja/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/ja/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/pseudo-LOCALE/messages.d.ts b/frontend/src/locales/pseudo-LOCALE/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/pseudo-LOCALE/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/pseudo-LOCALE/messages.po b/frontend/src/locales/pseudo-LOCALE/messages.po new file mode 100644 index 0000000..c502699 --- /dev/null +++ b/frontend/src/locales/pseudo-LOCALE/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2025-08-13 10:52+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pseudo-LOCALE\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/pseudo-LOCALE/messages.ts b/frontend/src/locales/pseudo-LOCALE/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/pseudo-LOCALE/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/ru/messages.d.ts b/frontend/src/locales/ru/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/ru/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/ru/messages.po b/frontend/src/locales/ru/messages.po new file mode 100644 index 0000000..9babe68 --- /dev/null +++ b/frontend/src/locales/ru/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-02 10:56+0200\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ru\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/ru/messages.ts b/frontend/src/locales/ru/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/ru/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/zh_Hans/messages.d.ts b/frontend/src/locales/zh_Hans/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/zh_Hans/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/zh_Hans/messages.po b/frontend/src/locales/zh_Hans/messages.po new file mode 100644 index 0000000..65c3c78 --- /dev/null +++ b/frontend/src/locales/zh_Hans/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-02 10:56+0200\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh_Hans\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/zh_Hans/messages.ts b/frontend/src/locales/zh_Hans/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/zh_Hans/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/locales/zh_Hant/messages.d.ts b/frontend/src/locales/zh_Hant/messages.d.ts new file mode 100644 index 0000000..1c1427c --- /dev/null +++ b/frontend/src/locales/zh_Hant/messages.d.ts @@ -0,0 +1,4 @@ +import { Messages } from '@lingui/core'; + declare const messages: Messages; + export { messages }; + \ No newline at end of file diff --git a/frontend/src/locales/zh_Hant/messages.po b/frontend/src/locales/zh_Hant/messages.po new file mode 100644 index 0000000..5f4d65b --- /dev/null +++ b/frontend/src/locales/zh_Hant/messages.po @@ -0,0 +1,115 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-02 10:56+0200\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh_Hant\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/Panel.tsx +msgid "per part" +msgstr "" + +#: src/Panel.tsx +msgid "per location" +msgstr "" + +#: src/Panel.tsx +msgid "reset daily" +msgstr "" + +#: src/Panel.tsx +msgid "Format" +msgstr "" + +#: src/Panel.tsx +msgid "Prefix" +msgstr "" + +#. placeholder {0}: String(settings.LOCATION_FIELD) +#: src/Panel.tsx +msgid "from location field '{0}'" +msgstr "" + +#: src/Panel.tsx +msgid "Counter" +msgstr "" + +#: src/Panel.tsx +msgid "global" +msgstr "" + +#: src/Panel.tsx +msgid "Trigger" +msgstr "" + +#: src/Panel.tsx +msgid "Could not load a batch code preview" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generated" +msgstr "" + +#: src/Panel.tsx +msgid "Could not generate a batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code not generated" +msgstr "" + +#: src/Panel.tsx +msgid "Batch code generation is disabled" +msgstr "" + +#: src/Panel.tsx +msgid "Enable the plugin setting 'Enabled' to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Current batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Not set" +msgstr "" + +#: src/Panel.tsx +msgid "Next code" +msgstr "" + +#: src/Panel.tsx +msgid "Preview unavailable" +msgstr "" + +#: src/Panel.tsx +msgid "Overwrite the existing batch code" +msgstr "" + +#: src/Panel.tsx +msgid "Refresh" +msgstr "" + +#: src/Panel.tsx +msgid "Generate and save" +msgstr "" + +#: src/Panel.tsx +msgid "Read only" +msgstr "" + +#: src/Panel.tsx +msgid "You do not have permission to generate batch codes." +msgstr "" + +#: src/Panel.tsx +msgid "Configuration" +msgstr "" diff --git a/frontend/src/locales/zh_Hant/messages.ts b/frontend/src/locales/zh_Hant/messages.ts new file mode 100644 index 0000000..a53f44b --- /dev/null +++ b/frontend/src/locales/zh_Hant/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"4tMAUR\":[\"Overwrite the existing batch code\"],\"B4m81Y\":[\"You do not have permission to generate batch codes.\"],\"DKa9ch\":[\"Generate and save\"],\"DerUtL\":[\"Batch code generation is disabled\"],\"H2Sfhg\":[\"Trigger\"],\"IF5r8v\":[\"Preview unavailable\"],\"MTqQMG\":[\"Not set\"],\"NEgaRI\":[\"Could not generate a batch code\"],\"NKnPpU\":[\"Counter\"],\"O/ICOy\":[\"per part\"],\"O8n/gF\":[\"Batch code not generated\"],\"SLbeKO\":[\"global\"],\"T0z5Hw\":[\"Batch code generated\"],\"hPL4I9\":[\"Could not load a batch code preview\"],\"hsSgoQ\":[\"Enable the plugin setting 'Enabled' to generate batch codes.\"],\"iHaxSq\":[\"reset daily\"],\"j1yeuR\":[\"from location field {0}\"],\"kI1qVD\":[\"Format\"],\"lCF0wC\":[\"Refresh\"],\"nyqfpO\":[\"Current batch code\"],\"qt+UdX\":[\"per location\"],\"rNqTKZ\":[\"Prefix\"],\"ss5emH\":[\"Next code\"],\"uNQ6eB\":[\"Read only\"],\"ywFj2D\":[\"Configuration\"]}")as Messages; \ No newline at end of file diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..e249ed9 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2023", + "useDefineForClassFields": true, + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..e9182f2 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,10 @@ +{ + "files": [], + "compilerOptions": { + "jsx": "react-jsx" + }, + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..cc4b779 --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,78 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { viteExternalsPlugin } from 'vite-plugin-externals' +import { lingui } from "@lingui/vite-plugin"; + + +/** + * The following libraries are externalized to avoid bundling them with the plugin. + * These libraries are expected to be provided by the InvenTree core application. + */ +export const externalLibs : Record = { + react: 'React', + 'react-dom': 'ReactDOM', + 'ReactDom': 'ReactDOM', + '@lingui/core': 'LinguiCore', + '@lingui/react': 'LinguiReact', + '@mantine/core': 'MantineCore', + "@mantine/notifications": 'MantineNotifications', +}; + +// Just the keys of the externalLibs object +const externalKeys = Object.keys(externalLibs); + +/** + * Vite config to build the frontend plugin as an exported module. + * This will be distributed in the 'static' directory of the plugin. + */ +export default defineConfig({ + plugins: [ + lingui(), + react({ + jsxRuntime: 'classic', + babel: { + plugins: ['macros'], // Required for @lingui macros + }, + }), + viteExternalsPlugin(externalLibs), + ], + esbuild: { + jsx: 'preserve', + }, + build: { + // minify: false, + target: 'esnext', + cssCodeSplit: false, + manifest: true, + sourcemap: true, + rollupOptions: { + preserveEntrySignatures: "exports-only", + input: [ + './src/Panel.tsx', + + './src/Settings.tsx', + ], + output: [ + // Generate two sets of output files: + // One without hashes - for backwards compatibility + { + dir: '../batchcode_plugin/static', + entryFileNames: '[name].js', + assetFileNames: 'assets/[name].[ext]', + globals: externalLibs, + }, + // And one with hashes for cache busting + { + dir: '../batchcode_plugin/static', + entryFileNames: '[name]-[hash].js', + assetFileNames: 'assets/[name].[ext]', + globals: externalLibs, + } + ], + external: externalKeys, + } + }, + optimizeDeps: { + exclude: externalKeys, + } +}) diff --git a/frontend/vite.dev.config.ts b/frontend/vite.dev.config.ts new file mode 100644 index 0000000..339fada --- /dev/null +++ b/frontend/vite.dev.config.ts @@ -0,0 +1,50 @@ +// Primary vite config - we extend this for dev mode +import { defineConfig } from 'vite' +import { viteExternalsPlugin } from 'vite-plugin-externals' +import viteConfig, { externalLibs } from './vite.config' +import InventreeHmrPlugin from '@inventreedb/ui/vite'; + +import react from "@vitejs/plugin-react-swc" +import { lingui } from "@lingui/vite-plugin" + + +/** + * Vite config to run the frontend plugin in development mode. + * + * This allows the plugin developer to "live reload" their plugin code, + * without having to rebuild and reinstall the plugin each time. + * + * This is a very minimal config, and is not meant to be used for production builds. + * Refer to vite.config.ts for the production build config. + */ +export default defineConfig((cfg) => { + + const config = { + ...viteConfig, + resolve: {}, + server: { + port: 5174, // Default port for plugins + strictPort: true, + cors: { + preflightContinue: true, + origin: '*', // Allow all origins for development + } + }, + }; + + // Override specific options for development + delete config.esbuild; + delete config.optimizeDeps; + + config.plugins = [ + lingui(), + react({ + plugins: [["@lingui/swc-plugin", {}]], + reactRefreshHost: 'http://localhost:5173', + }), + viteExternalsPlugin(externalLibs), + InventreeHmrPlugin(), + ]; + + return config; +}); diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..4628b0e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,99 @@ +#This file is used to package the BatchCodePlugin plugin. +# +#- It was generated by the InvenTree Plugin Creator tool - version 1.20.0 +#- Ref: https://github.com/inventree/plugin_creator + +[build-system] +requires = ["setuptools", "twine", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "inventree-batchcode-plugin" +description = "Generate progressive batch codes for StockItems, with a configurable format and persistent per-part / per-location counters." +dynamic = ["version"] +authors = [ + { name = "Simone Amadori",email = "simone@amadori.bs.it" }, +] +readme = "README.md" +license = "MIT" +keywords = ["inventree", "plugin"] +# Matches the Python requirement of InvenTree 1.x +requires-python = ">=3.9" +dependencies = [ + # Everything this plugin imports (Django, DRF, InvenTree itself) is + # provided by the InvenTree instance it is installed into. +] +classifiers = [ + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", + "Framework :: InvenTree", +] + +# Tooling only - the plugin has no runtime dependencies of its own. +# Installed into .venv by `uv sync`. +# +# Django is a *test* dependency here: at runtime it is provided by the InvenTree +# instance, but the test suite needs it importable to exercise core.py. +[dependency-groups] +dev = [ + "ruff>=0.12", + "pre-commit>=4.0", + "build>=1.2", + "pytest>=8.3", + # Marker required because the distribution supports 3.9 (as InvenTree still + # claims) while Django 5.2 needs 3.10+. Development targets .python-version. + "django>=5.2,<6.0; python_version >= '3.10'", + "djangorestframework>=3.15; python_version >= '3.10'", +] + +[project.urls] +Homepage = "https://github.com/Kamaar/inventree-batchcode-plugin" + +[project.entry-points."inventree_plugins"] +BatchCodePlugin = "batchcode_plugin.core:BatchCodePlugin" + +[tool.setuptools.packages.find] +include = ["batchcode_plugin*"] + +[tool.setuptools.dynamic] +version = {attr = "batchcode_plugin.PLUGIN_VERSION"} + +[tool.pytest.ini_options] +testpaths = ["tests"] + +[tool.ruff] +exclude = [ + ".git", + "__pycache__", + "build", + "dist", + "node_modules", + "venv", + "env", + ".venv", + ".env", +] + +src = ["batchcode_plugin"] + +[tool.ruff.format] +quote-style = "single" + +[tool.ruff.lint] +select = ["E", "F", "I", "N", "D", "UP", "B", "DJ"] +ignore = [ + # Line length is handled by the formatter + "E501", + # Django model __str__ is defined; the checker misses the classmethods + "DJ012", +] + +[tool.ruff.lint.per-file-ignores] +# Generated migrations are not documented +"batchcode_plugin/migrations/*" = ["D"] +# Tests: docstrings on every test function add noise, and the stub classes in +# conftest deliberately mirror InvenTree's naming rather than PEP8's. +"tests/*" = ["D103", "N801", "N802"] + +[tool.ruff.lint.pydocstyle] +convention = "google" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..3597d84 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,16 @@ +[flake8] +ignore = + # - W293 - blank lines contain whitespace + W293, + # - E501 - line too long (82 characters) + E501 + N802 +exclude = + .git, + __pycache__, + dist, + build, + src/static, + frontend/node_modules, + test.py +max-complexity = 20 diff --git a/setup.py b/setup.py deleted file mode 100644 index 2aa23a7..0000000 --- a/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name="inventree-batchcode-plugin", - version="1.0", - author="Simone Amadori", - author_email="simone@amadori.bs.it", - url="https://github.com/Kamaar/inventree-batchcode-plugin.git", - description="Plugin InvenTree per generare codici batch progressivi.", - packages=find_packages(), - install_requires=["inventree"], - entry_points={ - "inventree_plugins": ["BatchCodePlugin = batchcode_plugin.plugin:BatchCodePlugin"], - }, - classifiers=[ - "Programming Language :: Python :: 3", - "Operating System :: OS Independent", - "Framework :: InvenTree", - ], -) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..fd27fd3 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,278 @@ +"""Load the plugin outside a running InvenTree instance. + +`batchcode_plugin.core` imports `plugin`, `plugin.mixins`, `InvenTree.helpers` +and `stock.models`, none of which exist without a configured InvenTree/Django +process. Those are stubbed here, so the real `core.py` can be imported and its +code construction, scoping and trigger logic driven directly. + +Persistence is the only part that is faked: `BatchCounter.peek` / `.advance` +are replaced with an in-memory store, while `build_key` is delegated to the +real implementation so the tests cannot drift from the production scope key. +""" + +import datetime +import importlib.util +import pathlib +import sys +import types +from types import SimpleNamespace + +import django +import pytest +from django.conf import settings + +ROOT = pathlib.Path(__file__).resolve().parent.parent + +# Fixed clock, so generated codes are deterministic +NOW = datetime.datetime(2026, 9, 2, 14, 35) + + +def _configure_django() -> None: + """Minimal Django setup, enough to import models that reference User.""" + if settings.configured: + return + + settings.configure( + INSTALLED_APPS=['django.contrib.contenttypes', 'django.contrib.auth'], + DATABASES={}, + USE_TZ=True, + ) + django.setup() + + +def _install_inventree_stubs() -> None: + """Register fake `plugin`, `InvenTree` and `stock` modules.""" + plugin_mod = types.ModuleType('plugin') + + class InvenTreePlugin: + """Stand-in for the InvenTree plugin base class.""" + + def plugin_static_file(self, *args, **kwargs): + """Mirror the real helper: build a URL from path components.""" + return '/static/plugins/batchcode/' + '/'.join(str(a) for a in args) + + plugin_mod.InvenTreePlugin = InvenTreePlugin + + mixins_mod = types.ModuleType('plugin.mixins') + for name in ( + 'AppMixin', + 'UrlsMixin', + 'UserInterfaceMixin', + 'ValidationMixin', + ): + setattr(mixins_mod, name, type(name, (), {})) + + class SettingsMixin: + """Stand-in exposing the settings helpers the plugin relies on.""" + + def get_settings_dict(self) -> dict: + """Return {key: value} for every declared setting.""" + return {key: self.get_setting(key) for key in self.SETTINGS} + + mixins_mod.SettingsMixin = SettingsMixin + + sys.modules['plugin'] = plugin_mod + sys.modules['plugin.mixins'] = mixins_mod + + # InvenTree.helpers.current_time is the fallback clock in extract_targets + inventree_mod = types.ModuleType('InvenTree') + helpers_mod = types.ModuleType('InvenTree.helpers') + helpers_mod.current_time = lambda: NOW + inventree_mod.helpers = helpers_mod + sys.modules['InvenTree'] = inventree_mod + sys.modules['InvenTree.helpers'] = helpers_mod + + # stock.models.StockItem is only reached by seed_value, which the tests + # either bypass (SEED_FROM_EXISTING off) or override; this queryset stub + # simply yields no existing codes. + class _EmptyQuerySet: + def all(self): + return self + + def exclude(self, **kwargs): + return self + + def filter(self, **kwargs): + return self + + def order_by(self, *args): + return self + + def values_list(self, *args, **kwargs): + return self + + def __getitem__(self, item): + return [] + + stock_mod = types.ModuleType('stock') + stock_models = types.ModuleType('stock.models') + stock_models.StockItem = SimpleNamespace(objects=_EmptyQuerySet()) + stock_models.StockLocation = SimpleNamespace(objects=_EmptyQuerySet()) + stock_mod.models = stock_models + sys.modules['stock'] = stock_mod + sys.modules['stock.models'] = stock_models + + # part.models is imported by serializers.py, not by core.py + part_mod = types.ModuleType('part') + part_models = types.ModuleType('part.models') + part_models.Part = SimpleNamespace(objects=_EmptyQuerySet()) + part_mod.models = part_models + sys.modules['part'] = part_mod + sys.modules['part.models'] = part_models + + +def _load_module(name: str, relative_path: str): + """Import a plugin module from its file, bypassing the package import.""" + spec = importlib.util.spec_from_file_location(name, ROOT / relative_path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +class InMemoryCounter: + """Counter with the BatchCounter contract, held in a dict. + + `build_key` is bound to the real model's implementation (assigned in + `_bootstrap`), so the scope key under test is the production one. + """ + + store: dict = {} + + @classmethod + def reset(cls) -> None: + """Empty the store between tests.""" + cls.store = {} + + @classmethod + def peek(cls, key, seed=0): + """Return the value advance() would issue, without consuming it.""" + return max(cls.store.get(key, 0), seed) + 1 + + @classmethod + def advance(cls, key, seed=0, **scope): + """Issue and record the next value for this scope.""" + value = max(cls.store.get(key, 0), seed) + 1 + cls.store[key] = value + return value + + +def _bootstrap(): + """Load the real models and core modules, with persistence faked.""" + _configure_django() + _install_inventree_stubs() + + # A package placeholder, so 'from . import PLUGIN_VERSION' resolves + package = types.ModuleType('batchcode_plugin') + package.__path__ = [str(ROOT / 'batchcode_plugin')] + package.PLUGIN_VERSION = '2.0.0' + sys.modules['batchcode_plugin'] = package + + real_models = _load_module( + 'batchcode_plugin._real_models', 'batchcode_plugin/models.py' + ) + + # Reuse the real scope key, fake only the storage + InMemoryCounter.build_key = real_models.BatchCounter.build_key + + stub_models = types.ModuleType('batchcode_plugin.models') + stub_models.BATCH_CODE_MAX_LENGTH = real_models.BATCH_CODE_MAX_LENGTH + stub_models.BatchCounter = InMemoryCounter + sys.modules['batchcode_plugin.models'] = stub_models + + core = _load_module('batchcode_plugin.core', 'batchcode_plugin/core.py') + + return core, real_models + + +CORE, REAL_MODELS = _bootstrap() + + +class PluginUnderTest(CORE.BatchCodePlugin): + """The real plugin class, with settings backed by a plain dict. + + InvenTree resolves settings against the database; here they come from + SETTINGS defaults plus any per-test overrides. + """ + + def __init__(self, **overrides): + """Seed the settings from SETTINGS defaults, then apply overrides.""" + self._values = { + key: config.get('default') for key, config in self.SETTINGS.items() + } + self._values.update(overrides) + + def get_setting(self, key, cache=False, backup_value=None): + """Mirror SettingsMixin.get_setting's signature - note 'cache'.""" + return self._values.get(key, backup_value) + + +@pytest.fixture(autouse=True) +def _clear_counters(): + """Give every test an empty counter store.""" + InMemoryCounter.reset() + yield + InMemoryCounter.reset() + + +@pytest.fixture +def core(): + """The loaded batchcode_plugin.core module.""" + return CORE + + +@pytest.fixture +def models(): + """The real batchcode_plugin.models module.""" + return REAL_MODELS + + +@pytest.fixture +def counters(): + """The in-memory counter store standing in for BatchCounter.""" + return InMemoryCounter + + +@pytest.fixture +def plugin(): + """Factory building a plugin instance with the given setting overrides.""" + + def _build(**overrides): + return PluginUnderTest(**overrides) + + return _build + + +@pytest.fixture +def now(): + """The fixed generation timestamp used across the tests.""" + return NOW + + +@pytest.fixture +def part(): + """A stand-in Part.""" + return SimpleNamespace(pk=12, name='Resistor 10k', IPN='RES-10K') + + +@pytest.fixture +def other_part(): + """A second Part, for per-part counter scoping.""" + return SimpleNamespace(pk=99, name='Capacitor 100n', IPN='CAP-100N') + + +@pytest.fixture +def location(): + """A stand-in StockLocation.""" + return SimpleNamespace( + pk=3, + name='Shelf A', + pathstring='Warehouse/Shelf A', + description='Main shelf', + ) + + +@pytest.fixture +def other_location(): + """A second StockLocation, for per-location counter scoping.""" + return SimpleNamespace(pk=7, name='Shelf B', pathstring='Warehouse/Shelf B') diff --git a/tests/test_api_surface.py b/tests/test_api_surface.py new file mode 100644 index 0000000..44aeb2e --- /dev/null +++ b/tests/test_api_surface.py @@ -0,0 +1,86 @@ +"""The REST surface: URL wiring and serializer construction. + +These are import-time regression guards. `setup_urls` pulls in `views.py`, +which pulls in `serializers.py`, so anything that raises while those class +bodies are evaluated stops the plugin's URLs from loading at all. +""" + +import pytest +from rest_framework import serializers as drf + + +def test_url_endpoints_are_registered(plugin): + """The frontend calls these two paths by name.""" + routes = plugin().setup_urls() + names = {route.name for route in routes} + + assert names == {'batchcode-preview', 'batchcode-generate'} + + +def test_url_paths(plugin): + patterns = {str(route.pattern) for route in plugin().setup_urls()} + assert patterns == {'preview/', 'generate/'} + + +def test_serializers_import_cleanly(): + """Importing the serializers must not raise. + + DRF validates 'queryset' inside the field constructor, which runs when the + class body is evaluated. Declaring a related field with queryset=None and + filling it in from Serializer.__init__ therefore raises at import. + """ + from batchcode_plugin import serializers + + assert serializers.PreviewBatchCodeSerializer is not None + + +@pytest.mark.parametrize( + ('serializer_name', 'expected_fields'), + [ + ('PreviewBatchCodeSerializer', {'item', 'part', 'location'}), + ('GenerateBatchCodeSerializer', {'item', 'overwrite'}), + ('BatchCodeResponseSerializer', {'batch_code'}), + ], +) +def test_serializers_instantiate(serializer_name, expected_fields): + from batchcode_plugin import serializers + + instance = getattr(serializers, serializer_name)() + assert set(instance.fields) == expected_fields + + +def test_related_fields_resolve_their_queryset(): + """get_queryset must not be reached before the models are importable.""" + from batchcode_plugin import serializers + + fields = serializers.PreviewBatchCodeSerializer().fields + + for name in ('item', 'part', 'location'): + assert isinstance(fields[name], drf.PrimaryKeyRelatedField) + assert fields[name].get_queryset() is not None + + +def test_preview_fields_are_all_optional(): + """A preview with no context at all is valid - the settings page uses it.""" + from batchcode_plugin import serializers + + for field in serializers.PreviewBatchCodeSerializer().fields.values(): + assert field.required is False + + +def test_generate_requires_an_item(): + from batchcode_plugin import serializers + + fields = serializers.GenerateBatchCodeSerializer().fields + + assert fields['item'].required is True + assert fields['overwrite'].required is False + + +def test_response_carries_the_code(): + """The response serializer must not drop batch_code (it is not read_only).""" + from batchcode_plugin import serializers + + data = serializers.BatchCodeResponseSerializer({'batch_code': 'B-0001'}).data + + assert data == {'batch_code': 'B-0001'} diff --git a/tests/test_code_format.py b/tests/test_code_format.py new file mode 100644 index 0000000..71f92d2 --- /dev/null +++ b/tests/test_code_format.py @@ -0,0 +1,84 @@ +"""How CODE_FORMAT, PREFIX, SEPARATOR and MIN_DIGITS shape a generated code.""" + +import pytest + + +def test_default_format(plugin, part, location, now): + p = plugin() + assert p.build_code(part=part, location=location, date=now) == 'B20260902-0001' + + +def test_counter_increments(plugin, now): + p = plugin() + assert p.build_code(date=now) == 'B20260902-0001' + assert p.build_code(date=now) == 'B20260902-0002' + assert p.build_code(date=now) == 'B20260902-0003' + + +def test_bare_num_takes_min_digits(plugin, now): + p = plugin(CODE_FORMAT='{prefix}{sep}{num}', MIN_DIGITS=6) + assert p.build_code(date=now) == 'B-000001' + + +def test_explicit_spec_beats_min_digits(plugin, now): + """A format supplying its own padding wins; MIN_DIGITS is ignored.""" + p = plugin(CODE_FORMAT='{prefix}{num:03d}', MIN_DIGITS=8) + assert p.build_code(date=now) == 'B001' + + +def test_part_and_date_placeholders(plugin, part, location, now): + p = plugin( + CODE_FORMAT='{ipn}{sep}{year}{month:02d}{sep}W{week}{sep}{num}', + MIN_DIGITS=3, + ) + code = p.build_code( + part=part, location=location, date=now, year=2026, month=9, week=36 + ) + assert code == 'RES-10K-202609-W36-001' + + +def test_part_and_location_names(plugin, part, location, now): + p = plugin(CODE_FORMAT='{part}{sep}{loc}{sep}{num}', MIN_DIGITS=2) + code = p.build_code(part=part, location=location, date=now) + assert code == 'Resistor 10k-Shelf A-01' + + +def test_missing_part_renders_empty_placeholder(plugin, now): + """Placeholders for absent objects render empty, they do not raise.""" + p = plugin(CODE_FORMAT='{prefix}{part}{ipn}{loc}{sep}{num}', MIN_DIGITS=2) + assert p.build_code(date=now) == 'B-01' + + +def test_custom_separator(plugin, now): + p = plugin(CODE_FORMAT='{prefix}{sep}{num}', SEPARATOR='/', MIN_DIGITS=2) + assert p.build_code(date=now) == 'B/01' + + +@pytest.mark.parametrize( + 'bad_format', + [ + '{nope}{num}', # unknown placeholder + '{prefix}{num:03d', # unbalanced brace + '{prefix}{num:qqq}', # invalid format spec + ], +) +def test_invalid_format_falls_back(plugin, now, bad_format): + """A bad format must not fail the stock operation it was called from. + + InvenTree swallows exceptions raised by the hook, which would mean no + batch code at all; a fallback code is more useful. + """ + p = plugin(CODE_FORMAT=bad_format, MIN_DIGITS=4) + assert p.build_code(date=now) == 'B-0001' + + +def test_code_is_truncated_to_field_length(plugin, models, now): + """StockItem.batch is a CharField(max_length=100).""" + p = plugin(PREFIX='X' * 150, CODE_FORMAT='{prefix}{num}') + code = p.build_code(date=now) + assert len(code) == models.BATCH_CODE_MAX_LENGTH == 100 + + +def test_code_is_stripped(plugin, now): + p = plugin(CODE_FORMAT=' {prefix}{num} ', MIN_DIGITS=2) + assert p.build_code(date=now) == 'B01' diff --git a/tests/test_counter_scope.py b/tests/test_counter_scope.py new file mode 100644 index 0000000..4c62a51 --- /dev/null +++ b/tests/test_counter_scope.py @@ -0,0 +1,99 @@ +"""Counter scoping: PER_PART, PER_LOCATION, DAILY_RESET and the scope key.""" + +import datetime + +NEXT_DAY = datetime.datetime(2026, 9, 3, 9, 0) + +SIMPLE = {'CODE_FORMAT': '{prefix}{sep}{num}'} + + +def test_single_global_counter_by_default(plugin, part, other_part, now): + p = plugin(**SIMPLE) + assert p.build_code(part=part, date=now) == 'B-0001' + assert p.build_code(part=other_part, date=now) == 'B-0002' + + +def test_per_part_counters_are_independent(plugin, part, other_part, now): + p = plugin(PER_PART=True, **SIMPLE) + assert p.build_code(part=part, date=now) == 'B-0001' + assert p.build_code(part=other_part, date=now) == 'B-0001' + assert p.build_code(part=part, date=now) == 'B-0002' + assert p.build_code(part=other_part, date=now) == 'B-0002' + + +def test_per_location_counters_are_independent(plugin, location, other_location, now): + p = plugin(PER_LOCATION=True, **SIMPLE) + assert p.build_code(location=location, date=now) == 'B-0001' + assert p.build_code(location=other_location, date=now) == 'B-0001' + assert p.build_code(location=location, date=now) == 'B-0002' + + +def test_daily_reset(plugin, now): + p = plugin(DAILY_RESET=True, **SIMPLE) + assert p.build_code(date=now) == 'B-0001' + assert p.build_code(date=now) == 'B-0002' + assert p.build_code(date=NEXT_DAY) == 'B-0001' + + +def test_daily_reset_does_not_need_the_date_in_the_code(plugin, now): + """DAILY_RESET works without {date} in the format. + + 1.x filtered existing codes for today's date, so it silently did nothing + unless CODE_FORMAT embedded the date. The counter now carries the period. + """ + p = plugin(DAILY_RESET=True, CODE_FORMAT='{prefix}{sep}{num}') + assert p.build_code(date=now) == 'B-0001' + assert p.build_code(date=NEXT_DAY) == 'B-0001' + + +def test_scope_key_is_empty_when_unscoped(plugin, models, part, location, now): + p = plugin() + scope = p.counter_scope(part=part, location=location, date=now) + assert models.BatchCounter.build_key(**scope) == 'part=|loc=|period=' + + +def test_scope_key_carries_every_dimension(plugin, models, part, location, now): + p = plugin(PER_PART=True, PER_LOCATION=True, DAILY_RESET=True) + scope = p.counter_scope(part=part, location=location, date=now) + assert models.BatchCounter.build_key(**scope) == 'part=12|loc=3|period=20260902' + + +def test_scope_keys_are_distinct_per_dimension(models, part, other_part, location): + """Distinct scopes must not collide onto one counter row.""" + keys = { + models.BatchCounter.build_key(), + models.BatchCounter.build_key(part=part), + models.BatchCounter.build_key(part=other_part), + models.BatchCounter.build_key(location=location), + models.BatchCounter.build_key(part=part, location=location), + models.BatchCounter.build_key(part=part, period='20260902'), + } + assert len(keys) == 6 + + +def test_preview_does_not_consume_a_value(plugin, now): + p = plugin(**SIMPLE) + assert p.build_code(date=now) == 'B-0001' + assert p.preview_code(date=now) == 'B-0002' + assert p.preview_code(date=now) == 'B-0002' + assert p.build_code(date=now) == 'B-0002' + + +def test_seed_carries_over_existing_sequences(plugin, now): + """The counter starts above numbers already in use. + + SEED_FROM_EXISTING must stop the first post-upgrade code reissuing a number + already present in the stock table. + """ + p = plugin(**SIMPLE) + p.seed_value = lambda scope: 41 + + assert p.build_code(date=now) == 'B-0042' + assert p.build_code(date=now) == 'B-0043' + + +def test_seed_is_ignored_when_disabled(plugin, counters, now): + p = plugin(SEED_FROM_EXISTING=False, **SIMPLE) + assert p.seed_value({}) == 0 + assert p.build_code(date=now) == 'B-0001' + assert counters.store == {'part=|loc=|period=': 1} diff --git a/tests/test_hook_contract.py b/tests/test_hook_contract.py new file mode 100644 index 0000000..c60328f --- /dev/null +++ b/tests/test_hook_contract.py @@ -0,0 +1,220 @@ +"""The generate_batch_code hook contract, and the 1.x bugs it hid. + +InvenTree calls the hook from stock/generators.py with: date, year, month, day, +hour, minute, week, plus the caller's kwargs - item, part, location, quantity, +build_order, purchase_order (see GenerateBatchCodeSerializer). +""" + +from types import SimpleNamespace + +import pytest + + +@pytest.fixture +def item(part, location): + """A stock item, as InvenTree passes it under the 'item' keyword.""" + return SimpleNamespace(pk=5, part=part, location=location, batch='') + + +# --- kwargs resolution --------------------------------------------------- + + +def test_part_and_location_come_from_item(plugin, item, part, location): + """Part and location resolve from the 'item' keyword. + + 1.x read kwargs['stock_item'], which InvenTree never sends, so part and + location were always None and the per-part / per-location settings were + silently inert. + """ + p = plugin() + resolved_part, resolved_location, _ = p.extract_targets(item=item) + + assert resolved_part is part + assert resolved_location is location + + +def test_stock_item_keyword_is_not_used(plugin, item): + """Guard against reintroducing the 1.x keyword.""" + p = plugin() + resolved_part, resolved_location, _ = p.extract_targets(stock_item=item) + + assert resolved_part is None + assert resolved_location is None + + +def test_explicit_kwargs_win_over_item(plugin, item, other_part, other_location): + p = plugin() + resolved_part, resolved_location, _ = p.extract_targets( + item=item, part=other_part, location=other_location + ) + + assert resolved_part is other_part + assert resolved_location is other_location + + +def test_date_defaults_to_current_time(plugin, now): + p = plugin() + _, _, date = p.extract_targets() + assert date == now + + +def test_supplied_date_is_used(plugin): + import datetime + + supplied = datetime.datetime(2030, 1, 1, 0, 0) + p = plugin() + _, _, date = p.extract_targets(date=supplied) + assert date == supplied + + +def test_per_part_counter_works_through_item(plugin, item, part, other_part, now): + """End-to-end consequence of the kwargs fix. + + Passing the item must land on the *same* counter as passing its part + explicitly, and on a different one from another part. Reading the wrong + keyword collapses everything onto the global counter instead. + """ + p = plugin(PER_PART=True, CODE_FORMAT='{prefix}{sep}{num}') + + assert p.build_code(item=item, date=now) == 'B-0001' + # Same scope as the item's part, so it continues that sequence + assert p.build_code(part=part, date=now) == 'B-0002' + # A different part starts its own + assert p.build_code(part=other_part, date=now) == 'B-0001' + assert p.build_code(item=item, date=now) == 'B-0003' + + +# --- trigger modes ------------------------------------------------------- + + +def test_always_responds(plugin): + assert plugin(TRIGGER_MODE='always').wants_to_generate() is True + + +def test_manual_ignores_the_hook(plugin): + assert plugin(TRIGGER_MODE='manual').wants_to_generate() is False + + +def test_manual_still_answers_an_explicit_request(plugin): + """The plugin's own generate/ endpoint passes force=True.""" + assert plugin(TRIGGER_MODE='manual').wants_to_generate(force=True) is True + + +def test_on_receive_requires_a_purchase_order(plugin): + p = plugin(TRIGGER_MODE='on_receive') + + assert p.wants_to_generate() is False + assert p.wants_to_generate(purchase_order=SimpleNamespace(pk=1)) is True + + +def test_on_receive_ignores_a_build_order(plugin): + p = plugin(TRIGGER_MODE='on_receive') + assert p.wants_to_generate(build_order=SimpleNamespace(pk=1)) is False + + +def test_disabled_overrides_everything(plugin): + p = plugin(ENABLED=False) + + assert p.wants_to_generate() is False + assert p.wants_to_generate(force=True) is False + + +# --- the hook itself ----------------------------------------------------- + + +def test_hook_returns_a_code(plugin, item, now): + p = plugin() + assert p.generate_batch_code(item=item, date=now) == 'B20260902-0001' + + +def test_hook_returns_none_when_it_should_not_act(plugin, item, now): + """The hook opts out by returning None. + + That hands the request to the next plugin, and finally to InvenTree's own + STOCK_BATCH_CODE_TEMPLATE. + """ + assert plugin(TRIGGER_MODE='manual').generate_batch_code(item=item) is None + assert plugin(ENABLED=False).generate_batch_code(item=item) is None + + +def test_hook_accepts_the_full_inventree_context(plugin, item, part, location, now): + """The real call site passes every one of these at once.""" + p = plugin() + + code = p.generate_batch_code( + date=now, + year=now.year, + month=now.month, + day=now.day, + hour=now.hour, + minute=now.minute, + week=now.isocalendar()[1], + item=item, + part=part, + location=location, + quantity=5, + build_order=None, + purchase_order=None, + ) + + assert code == 'B20260902-0001' + + +def test_hook_signature_exposes_kwargs(core): + """The hook must accept **kwargs. + + stock/generators.py inspects the signature and only passes the context if + 'kwargs' is a parameter; otherwise it calls the hook with no arguments. + """ + from inspect import signature + + sig = signature(core.BatchCodePlugin.generate_batch_code) + assert 'kwargs' in sig.parameters + + +# --- prefix resolution --------------------------------------------------- + + +def test_static_prefix(plugin, location): + assert plugin().resolve_prefix(location) == 'B' + + +@pytest.mark.parametrize( + ('field', 'expected'), + [ + ('name', 'Shelf A'), + ('pathstring', 'Warehouse/Shelf A'), + ('description', 'Main shelf'), + ], +) +def test_location_prefix_fields(plugin, location, field, expected): + p = plugin(USE_LOCATION_PREFIX=True, LOCATION_FIELD=field) + assert p.resolve_prefix(location) == expected + + +def test_location_prefix_falls_back_without_a_location(plugin): + p = plugin(USE_LOCATION_PREFIX=True, LOCATION_FIELD='name') + assert p.resolve_prefix(None) == 'B' + + +def test_location_prefix_falls_back_on_an_empty_field(plugin): + p = plugin(USE_LOCATION_PREFIX=True, LOCATION_FIELD='name') + assert p.resolve_prefix(SimpleNamespace(pk=1, name='')) == 'B' + + +# --- settings access ----------------------------------------------------- + + +def test_get_setting_is_never_called_with_a_positional_default(core): + """No call site passes a default positionally to get_setting. + + Its signature is get_setting(key, cache=False, backup_value=None), so the + second positional argument is the cache flag, not a default. 1.x passed + defaults there throughout. + """ + import re + + source = (core.__file__ and open(core.__file__, encoding='utf-8').read()) or '' + offenders = re.findall(r"get_setting\(\s*'[A-Z_]+'\s*,[^)]", source) + + assert offenders == [] diff --git a/tests/test_permissions.py b/tests/test_permissions.py new file mode 100644 index 0000000..21ba8e1 --- /dev/null +++ b/tests/test_permissions.py @@ -0,0 +1,122 @@ +"""MANUAL_BUTTON_ROLE gating, and the panel context handed to the frontend.""" + +from types import SimpleNamespace + +import pytest + +STAFF = SimpleNamespace(is_authenticated=True, is_staff=True, is_superuser=False) +PLAIN = SimpleNamespace(is_authenticated=True, is_staff=False, is_superuser=False) +ROOT = SimpleNamespace(is_authenticated=True, is_staff=True, is_superuser=True) +ANON = SimpleNamespace(is_authenticated=False, is_staff=False, is_superuser=False) + + +@pytest.mark.parametrize( + ('role', 'user', 'allowed'), + [ + ('all', PLAIN, True), + ('all', STAFF, True), + ('all', ANON, False), + ('staff', PLAIN, False), + ('staff', STAFF, True), + ('staff', ROOT, True), + ('superuser', PLAIN, False), + ('superuser', STAFF, False), + ('superuser', ROOT, True), + ], +) +def test_role_gating(plugin, role, user, allowed): + p = plugin(MANUAL_BUTTON_ROLE=role) + assert p.user_can_generate(user) is allowed + + +def test_no_user_is_denied(plugin): + assert plugin(MANUAL_BUTTON_ROLE='all').user_can_generate(None) is False + + +def test_disabled_button_denies_everyone(plugin): + p = plugin(MANUAL_BUTTON=False, MANUAL_BUTTON_ROLE='all') + assert p.user_can_generate(ROOT) is False + + +# --- UI panel ------------------------------------------------------------ + + +def _panels(p, target_model, user=STAFF): + request = SimpleNamespace(user=user) + return p.get_ui_panels(request, {'target_model': target_model}) + + +def test_panel_only_on_stock_items(plugin): + p = plugin() + + assert _panels(p, 'part') == [] + assert _panels(p, 'stocklocation') == [] + assert len(_panels(p, 'stockitem')) == 1 + + +def test_panel_context(plugin): + """The dict under 'context' reaches the React component as context.context.""" + panel = _panels(plugin(PREFIX='Q'), 'stockitem')[0] + + assert panel['key'] == 'batchcode-panel' + assert panel['context']['settings']['PREFIX'] == 'Q' + assert panel['context']['can_generate'] is True + + +def test_panel_settings_cover_what_the_frontend_reads(plugin): + """Panel.tsx reads these keys off context.context.settings.""" + settings = _panels(plugin(), 'stockitem')[0]['context']['settings'] + + for key in ( + 'ENABLED', + 'CODE_FORMAT', + 'PREFIX', + 'USE_LOCATION_PREFIX', + 'LOCATION_FIELD', + 'PER_PART', + 'PER_LOCATION', + 'DAILY_RESET', + 'TRIGGER_MODE', + ): + assert key in settings + + +def test_panel_reports_permission_per_user(plugin): + p = plugin(MANUAL_BUTTON_ROLE='superuser') + + assert _panels(p, 'stockitem', user=STAFF)[0]['context']['can_generate'] is False + assert _panels(p, 'stockitem', user=ROOT)[0]['context']['can_generate'] is True + + +def test_panel_source_matches_the_exported_component(plugin): + """The source string is wired by name to frontend/src/Panel.tsx.""" + panel = _panels(plugin(), 'stockitem')[0] + assert panel['source'].endswith('Panel.js:RenderBatchCodePluginPanel') + + +def test_admin_source_matches_the_exported_component(core): + assert core.BatchCodePlugin.ADMIN_SOURCE == 'Settings.js:RenderPluginSettings' + + +# --- plugin metadata ----------------------------------------------------- + + +def test_slug_is_stable(core): + """The slug must not change. + + It keys every stored setting value and the plugin API URLs, so changing it + orphans existing installations' configuration. + """ + assert core.BatchCodePlugin.SLUG == 'batchcode' + + +def test_version_comes_from_a_single_source(core): + import pathlib + import re + + init = pathlib.Path(core.__file__).parent / '__init__.py' + declared = re.search( + r"PLUGIN_VERSION\s*=\s*'([^']+)'", init.read_text(encoding='utf-8') + ).group(1) + + assert core.BatchCodePlugin.VERSION == declared diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..76cada2 --- /dev/null +++ b/uv.lock @@ -0,0 +1,662 @@ +version = 1 +revision = 3 +requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] + +[[package]] +name = "asgiref" +version = "3.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, +] + +[[package]] +name = "build" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/ec/bf5ae0a7e5ab57abe8aabdd0759c971883895d1a20c49ae99f8146840c3c/build-1.4.4.tar.gz", hash = "sha256:f832ae053061f3fb524af812dc94b8b84bac6880cd587630e3b5d91a6a9c1703", size = 89220, upload-time = "2026-04-22T20:53:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/88/6764e7a109dd84294850741501145da90d13cdeac9d4e614929464a37420/build-1.4.4-py3-none-any.whl", hash = "sha256:8c3f48a6090b39edec1a273d2d57949aaf13723b01e02f9d518396887519f64d", size = 25921, upload-time = "2026-04-22T20:53:43.251Z" }, +] + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.10.2'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, +] + +[[package]] +name = "django" +version = "5.2.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref", marker = "python_full_version >= '3.10'" }, + { name = "sqlparse", marker = "python_full_version >= '3.10'" }, + { name = "tzdata", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/d8/43e9d000519adceb189620b6869ff88031e046df91c2e9da72f8f6918399/django-5.2.17.tar.gz", hash = "sha256:9d4d93be539a18ab80d058eb515900e10951e04c537c5a6b394fc49528d3251f", size = 10889740, upload-time = "2026-08-04T15:04:03.173Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/f8/ce120525ca78f12b07daf65786679c5d0b54a75285a8958d3ae55e39da35/django-5.2.17-py3-none-any.whl", hash = "sha256:f04fb3b36ee119e1af4fa1d397d5fd6cf12700f49321e84d4f4c642c5b1973db", size = 8315563, upload-time = "2026-08-04T15:03:59.1Z" }, +] + +[[package]] +name = "djangorestframework" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/bc/de04e3d4dc65e8b926700956ee70d4f084f2005603d21122d4d0683006fd/djangorestframework-3.18.0.tar.gz", hash = "sha256:2323a5111837e0b784dcb8323abc78ecc54fa2a5af7aff2677cf50cdd849477f", size = 913667, upload-time = "2026-08-07T14:53:33.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/d7/7461738e819b853275b35fd35712a85806c09a327e1fd5f8ff766bdd317e/djangorestframework-3.18.0-py3-none-any.whl", hash = "sha256:381fc44d3249c9565c5f723850855b734e99030eb30957a49f506d3fe11d7dcb", size = 900032, upload-time = "2026-08-07T14:53:31.881Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "filelock" +version = "3.19.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, +] + +[[package]] +name = "filelock" +version = "3.32.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/a0/50c2c0ce5e74d7721bbb1b19a26ebd339aac5878553a6e35308c2f31f935/filelock-3.32.5.tar.gz", hash = "sha256:f6a6a28f743f9b95ce19db5abe0f376f75eb56517dff21e1a4751e2657d3e83d", size = 222838, upload-time = "2026-08-31T18:56:34.729Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/d2/b70a31e13d04456d28493f31d2aa087e99eeb2767ef0293b2625727ccb8c/filelock-3.32.5-py3-none-any.whl", hash = "sha256:142cd9fa77a872c5e78c62329a0d15278fadc686eb89e760017968961a4fd6b2", size = 100003, upload-time = "2026-08-31T18:56:33.078Z" }, +] + +[[package]] +name = "identify" +version = "2.6.15" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, +] + +[[package]] +name = "identify" +version = "2.6.19" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "9.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "zipp", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/7e/1e7e8dc30634b93ebb3d58a3dea569ad146e656218d3960ab04f62047b29/importlib_metadata-9.0.1.tar.gz", hash = "sha256:ab830580bc0ef3db61ce8fae716389e5462b67e033018bab6d8f80ef17172f99", size = 59124, upload-time = "2026-08-28T15:30:34.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/55/ecca97ae19075f1fac62def77731e7f535e6c1fb8f92ff08160c5e6dade8/importlib_metadata-9.0.1-py3-none-any.whl", hash = "sha256:bba5600596a7e21f3eef53281cf28d6a5195634d2f2b78ff9501a3272c6eaab0", size = 27920, upload-time = "2026-08-28T15:30:33.433Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "inventree-batchcode-plugin" +source = { editable = "." } + +[package.dev-dependencies] +dev = [ + { name = "build", version = "1.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "build", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "django", marker = "python_full_version >= '3.10'" }, + { name = "djangorestframework", marker = "python_full_version >= '3.10'" }, + { name = "pre-commit", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pre-commit", version = "4.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ruff" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "build", specifier = ">=1.2" }, + { name = "django", marker = "python_full_version >= '3.10'", specifier = ">=5.2,<6.0" }, + { name = "djangorestframework", marker = "python_full_version >= '3.10'", specifier = ">=3.15" }, + { name = "pre-commit", specifier = ">=4.0" }, + { name = "pytest", specifier = ">=8.3" }, + { name = "ruff", specifier = ">=0.12" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.11.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/69/b7/802a56eca9f2fac455b8bab5375a2647b0f0e14a2cd63ef077de3c4a7658/platformdirs-4.11.7.tar.gz", hash = "sha256:4f41487eeeeeb07f3a6625e61d9bc0ae6809f92d3386dbd74392fbb76108104d", size = 35127, upload-time = "2026-09-01T13:35:10.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/6e/80993e10a0482f630cef528635789233224f36b1ffd11592aa15d13ff9ce/platformdirs-4.11.7-py3-none-any.whl", hash = "sha256:8a02cb259042c79d1cd0450facc2fe6dc9d303ae7901afbe33bf8ea0b188cef6", size = 23938, upload-time = "2026-09-01T13:35:09.02Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "cfgv", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "identify", version = "2.6.15", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "nodeenv", marker = "python_full_version < '3.10'" }, + { name = "pyyaml", marker = "python_full_version < '3.10'" }, + { name = "virtualenv", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.6.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "cfgv", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "identify", version = "2.6.19", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "nodeenv", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "virtualenv", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/89/1f3e8e1fc3e97de0fa963495832f581f025f29471602a309e48808244292/pre_commit-4.6.2.tar.gz", hash = "sha256:8f5d7bfb021ecdbcd9d49d89847082dd24172ccde534390081a679ad046e2441", size = 198670, upload-time = "2026-08-10T22:07:18.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/e2/bbb7129c9e7999a6b8ee9cca3b66486c25c423ab5a75f34071798b74ce94/pre_commit-4.6.2-py2.py3-none-any.whl", hash = "sha256:e2dde9a75d3bce11bd3831c26d134df00a2803c1d818be6a0383c3dcda25dc4e", size = 226202, upload-time = "2026-08-10T22:07:16.942Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pluggy", marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pluggy", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "filelock", version = "3.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/96/0f93e27c9f60a650838f2118159aa115fd5732c0716247917b7ba7ede665/python_discovery-1.6.0.tar.gz", hash = "sha256:6393b4eae1be8b2182670635e7baff89ac21cb9f8e86fd1ff40c7b1144febb4c", size = 82849, upload-time = "2026-08-28T17:30:02.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/5e/21abf578182fb15006a57faf3711a1e659e29d600d19b6e557eae908c81d/python_discovery-1.6.0-py3-none-any.whl", hash = "sha256:d4e244cf17b8b29819ed78003d55fbacf86eda23425b075454fff9271b79377a", size = 38451, upload-time = "2026-08-28T17:30:01.236Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + +[[package]] +name = "ruff" +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/85/c8e12473c93018f92d19dd988a294202e1c27426c47ec4de53ffb847b8d8/ruff-0.16.5.tar.gz", hash = "sha256:1b88500f9ffbcab3dedb0082c9f9492e91ec3d618aac1236a3e0189938f7040b", size = 4912003, upload-time = "2026-08-27T16:34:18.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/b6/77c90a970fe2dae17a723acbd011043ea97c98d7deacccefdc4ba74ec512/ruff-0.16.5-py3-none-linux_armv6l.whl", hash = "sha256:12e5f673e774c35fbb62f288809c7653b73445f8ecec6b6063fd6ea3521aa14b", size = 10011941, upload-time = "2026-08-27T16:33:41.287Z" }, + { url = "https://files.pythonhosted.org/packages/4b/46/6cf67cf6411885a1d6f7f6d801682f155536a85176d10b605e2ceffed8bd/ruff-0.16.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eda58a5802de40e7ed5b32b64e0b32539338cc6fcd2c78f61e3ad6a0d79f51c3", size = 10204049, upload-time = "2026-08-27T16:33:44.056Z" }, + { url = "https://files.pythonhosted.org/packages/46/fd/c8720ca7a090abf0c2fef4abe8a5ef6e5127ed15196d8886ff75a2b370e2/ruff-0.16.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5ae9a7b9a8875131f40f8fe967cc86abf899779efd663cb7ce3d572d01da7eb", size = 9809037, upload-time = "2026-08-27T16:33:46.257Z" }, + { url = "https://files.pythonhosted.org/packages/43/45/a684caacdedaca180f52bacccc40bf0789d2c5a7c75f25324853e9eaedb5/ruff-0.16.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b719b0a1f4d59710d283ab2965f621684a108a9e41da622e3b23f0326cd0025", size = 9964129, upload-time = "2026-08-27T16:33:48.352Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/5d2bcdaca6b5b93d1b4dfc166cd2aebf7680143a1b38a28759df13a94d31/ruff-0.16.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2298f2780ed1be0c5cb1361e32ab7b1467f3cce7dabe101d2210a314f2fe42e9", size = 9821518, upload-time = "2026-08-27T16:33:50.57Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ff/011cce29accf9257d5974145b733fc653a37985ed6825413a3987cefbfe0/ruff-0.16.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:258f29035a2dd021e7861e631b227a5b3f14e50c1184c9a6a122c5f4576154d7", size = 10534835, upload-time = "2026-08-27T16:33:52.522Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5a/f0cf109bada9bba0e96c90c21c9f9251803f57225c32d293327a03c710d6/ruff-0.16.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a4f0432966834019c74d1b7e5c51224305d7713f3d7faf3e7451f1a3be3cde", size = 11252550, upload-time = "2026-08-27T16:33:54.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/4d/1d481aaea2046c6a7ed7c291f9004c669cce3c087b6b376ed5b08271e3fe/ruff-0.16.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5eb3a8c3d0ade9cea42b591fd530368e8798380e30e0a308b85a5cf718f09ea", size = 10777949, upload-time = "2026-08-27T16:33:56.88Z" }, + { url = "https://files.pythonhosted.org/packages/ee/34/ee245ca55f64443233034b3d02b03236b19242004281247c079390b7facd/ruff-0.16.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0f69e191a13a3c9816f63163c88790cb12cd157bbbb384e9c44745702ab105", size = 10311656, upload-time = "2026-08-27T16:33:59.12Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/c33a333e341c0a2b96c715b52d89a606f5a34cd4ac493cd9b8d0187186b8/ruff-0.16.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0eeab41fbea2c42f98dfb9822cdccda9d24ba38d49f6dc945b5c236d48f0ef29", size = 10532125, upload-time = "2026-08-27T16:34:01.166Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/a64cef78b40192497bb98a27a8aa8f2c98ee9ee15bc97f7712d94ef32937/ruff-0.16.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f0768e9df4300713fff30733c87575f68b6f1d8de41184e505b7fdd9c0c95eaf", size = 10097648, upload-time = "2026-08-27T16:34:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4e/4cdc9ed3c3e109d2f71e62572a37457298d7bc7501ec3138babb7ed32bbd/ruff-0.16.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:95cc70cdc7aa80c338de356279d2adbeb2de0f520b9ecd8aba75b94e95e02f91", size = 9829344, upload-time = "2026-08-27T16:34:05.134Z" }, + { url = "https://files.pythonhosted.org/packages/39/4a/31ed35ce31729955fc583ee0d176d6e784c1290cb0b0a75cb2134c1ab72a/ruff-0.16.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d185c8398ded1bfd91c0c2cb258346307571eccc473a8490af8c3977399c384a", size = 10277117, upload-time = "2026-08-27T16:34:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a0/60356d86687b4b666d593df213f4dc3041750d024cb7bf2cfa81cfd65c2e/ruff-0.16.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fb8e3a3c4c6a784150a7ced53b015f4b253fc2bf97a610886419ead64b4756ef", size = 10711653, upload-time = "2026-08-27T16:34:09.712Z" }, + { url = "https://files.pythonhosted.org/packages/ed/20/656d67f5b25ca9bda4e02b1de25867b2954e1d19e03648060f167ad0f4cc/ruff-0.16.5-py3-none-win32.whl", hash = "sha256:288b0a5f080492fe5635db849f9e2e84aa3cce7b7f0e955997d416c507c76a26", size = 10034250, upload-time = "2026-08-27T16:34:11.8Z" }, + { url = "https://files.pythonhosted.org/packages/5b/42/ee8e68a207b9127fcde6c3d7e197def432f346cb1af159e1fa14ca0d1cdc/ruff-0.16.5-py3-none-win_amd64.whl", hash = "sha256:ddc6385fb2137f616357ca03d6c74f4be987f80fed4008566b754f6032b8546f", size = 10516714, upload-time = "2026-08-27T16:34:13.963Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/7df5a396e445b9ba49ce9a9437439a4d80042c61c0ade199abf8d16de1ac/ruff-0.16.5-py3-none-win_arm64.whl", hash = "sha256:a64abe90968719b851bb7cedffaa8753fbdbdadab483089682db623f3edc587e", size = 10391564, upload-time = "2026-08-27T16:34:16.064Z" }, +] + +[[package]] +name = "sqlparse" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/d3/3f06a1006f2261d1342aefb3c71eed02f5d4ca5bdbecd86ebc12ad38306e/sqlparse-0.6.0.tar.gz", hash = "sha256:113c35c75365ab9cc9c7231d68c6428fb11c085fc8e9eb1ad659b7ddbf6cd2b9", size = 178477, upload-time = "2026-08-13T19:16:06.396Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/50/f00935da0ec7cbf325f8dc4f772ae46fbc7b672dd62876e73f0a94adda57/sqlparse-0.6.0-py3-none-any.whl", hash = "sha256:b861c0288ce2fa56209a9a6412d2e066ac664b3873b89c26c9d8415e8e32996f", size = 50070, upload-time = "2026-08-13T19:16:04.062Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.7.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "filelock", version = "3.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "platformdirs", version = "4.11.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "python-discovery" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/1c/69faa2e6a83484e2a8227bce5cfaa183941c5720f99c48f204931d286b07/virtualenv-21.7.8.tar.gz", hash = "sha256:1dc49c790072a9072cb1803f9bd62aa69cd583077cada32390f75505cdc64c9b", size = 5347580, upload-time = "2026-09-01T13:36:13.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/34/88d507d4a4030fa559788de9c690a214f9a4053aa1d91cfb60e9b36127c2/virtualenv-21.7.8-py3-none-any.whl", hash = "sha256:3040eb3cbf5d32b10ffd57d167e6a162237ad82ba7d8cf1400a1efed593d85ac", size = 5324617, upload-time = "2026-09-01T13:36:11.248Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.9' and python_full_version < '3.10'", + "python_full_version <= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +]