Sprint 17 — onboarding-контур: 4-шаг wizard, контекстный help, in-app
feedback, admin self-diagnostic, /whats-new из CHANGELOG.md.
Ключевые цифры:
- Wizard: 4 шага + skip каждого, 7 e2e тестов ✓ за 20 секунд.
- Diagnostic: 7 параллельных проверок, ~80ms на stage.
- Bundle impact: initial +4 KB gzip (только FeedbackWidget +
HelpTooltip + EmptyStateWithDemo в основном bundle; страницы lazy).
- Regression-suite: 35 → 42 flows + 60 → 66 visual snapshots.
Backend (новые endpoint'ы):
- /api/admin/diagnostic/run — 7 параллельных проверок (DB, SMTP,
MinIO, Hangfire, диск, сертификаты, бэкап). Task.WhenAll, ~80ms.
- /api/feedback — POST {category, message}, email на FromEmail +
Telegram (если SupportTelegram:* настроены). Rate-limit 5/час.
- /api/whats-new — парсер CHANGELOG.md, возвращает {buildVersion,
items}. Dockerfile.api копирует CHANGELOG.md в content-root +
пишет VERSION из GIT_SHA build-arg.
Frontend:
- /onboarding-wizard — 4-step builder, состояние в useState,
localStorage.fm.wizardCompleted после завершения.
- <HelpTooltip topic="key"/> — popover на каждой странице, mapping
src/lib/help-topics.ts (13 keys).
- /help — knowledge base, 7 markdown topics через import.meta.glob,
mini-renderer без heavy deps, fuzzy search.
- /whats-new — список из /api/whats-new, иконки по типу (feat/fix).
- /admin/diagnostic — Admin/SuperAdmin only, 🟢/🟡/🔴 индикаторы.
- <FeedbackWidget> в sidebar footer + ссылки на /help и /whats-new.
- <EmptyStateWithDemo> placeholder для будущих видео-демо.
scripts/generate-changelog.sh — git log feat:/fix: за 90 дней
→ CHANGELOG.md (307 строк сгенерировано).
Wizard UX-screenshots в docs/sprint17-screenshots/ (6 PNG: 4 шага +
help + diagnostic).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
308 lines
22 KiB
Markdown
308 lines
22 KiB
Markdown
# CHANGELOG
|
||
|
||
Auto-generated from git log feat:/fix: (last 90 days).
|
||
|
||
## 2026-06-07
|
||
|
||
- **feat**: security headers + rate-limits + sensitive-ops audit + session revoke + Grafana (s13)
|
||
- **feat**: ОФД-scaffolding — IFiscalProvider + 4 провайдера + UI/тесты (s11)
|
||
|
||
## 2026-06-06
|
||
|
||
- **feat**: dark mode полировка + Cmd+K палитра + аудит-spec (s10-4)
|
||
- **feat**: глобальная Cmd+K палитра + GET /api/search/global (s10-3)
|
||
- **feat**: year-demo seeder + 4 dashboard виджета + week-stats (s10)
|
||
|
||
## 2026-06-04
|
||
|
||
- **fix**: IP-limit 60/min, locale ru-RU в playwright, исправлены payload'ы verify-spec'ов (stage-tests)
|
||
- **fix**: per-username 5/мин + per-IP 30/мин — brute-force на конкретный аккаунт ловится, CI/NAT не страдают (rate-limit)
|
||
- **fix**: rate-limit 5/min на /connect/token, nginx route /metrics+/swagger, Swagger в Production через IncludeSwagger (stage)
|
||
|
||
## 2026-05-31
|
||
|
||
- **fix**: bump cache version + filter SignalR-race errors in PWA test (pwa)
|
||
- **fix**: SW не вмешивается в /hubs/* — SignalR negotiate сломался (pwa)
|
||
- **feat**: PWA owner read-only + mobile tweaks + S9 stage specs (pwa+mobile+s9)
|
||
- **fix**: убрать unused imports (TS6133) (loyalty)
|
||
- **feat**: P2-12 + P2-13 — лояльность и промокоды (Sprint 9 п.1-2) (loyalty+promotions)
|
||
- **feat**: IObjectStorage abstraction (Local + MinIO) — P2-15 (storage)
|
||
- **feat**: react-i18next ru/en + language switcher (P2-6a — базовая) (i18n)
|
||
- **feat**: OwnerDailySummaryJob + bot binding (P2-14) (telegram)
|
||
- **feat**: SignalR hub /hubs/notifications per-org + dashboard live (realtime)
|
||
|
||
## 2026-05-30
|
||
|
||
- **fix**: после create — invalidate list query (не показывался сразу) (employees)
|
||
- **fix**: error display через humanizeError, не «Request failed» (employees)
|
||
- **fix**: уберём cache-touch после Delete — просто navigate (catalog)
|
||
- **fix**: после Delete не refetch'аем удалённый товар (catalog)
|
||
- **fix**: ProductEditPage — race на currencies.data + читаемая ошибка (catalog)
|
||
- **fix**: Modal — role=dialog + aria-modal + aria-label на крестике (a11y)
|
||
- **fix**: useShortcuts — бэр-клавиши не зависят от Shift (web)
|
||
- **feat**: keyboard shortcuts на edit + list страницах + «?» overlay (web)
|
||
- **feat**: Breadcrumbs на edit-страницах (Каталог / Товары / Молоко 3.2%) (web)
|
||
- **feat**: Empty states с CTA на list-страницах (web)
|
||
- **feat**: loading skeletons вместо «Загрузка…» в DataTable + edit-pages (web)
|
||
- **feat**: toast-система — error на 4xx/5xx + success на мутации (через meta) (web)
|
||
- **feat**: ConfirmDialog компонент + useConfirm hook вместо window.confirm() (web)
|
||
- **feat**: demo-data seeder для test.admin.food-market.kz (stage)
|
||
|
||
## 2026-05-29
|
||
|
||
- **fix**: operationId + schemaId — генерация OpenAPI работает (swagger)
|
||
- **fix**: 3 фикса по итогам stage-тестирования (reports)
|
||
- **fix**: EF8 nav-collection bug в Enters/Losses/Transfers/SupplierReturns/Inventories.Update (docs)
|
||
- **fix**: EF8 nav-collection bug в Products.Update + unique IX на Article (catalog)
|
||
|
||
## 2026-05-28
|
||
|
||
- **feat**: TOTP 2FA для админов через AuthenticatorTokenProvider (P2-4) (auth)
|
||
- **feat**: MediatR partial — 3 handler-образца (TD-1) (cqrs)
|
||
- **feat**: структурные log-fields в Serilog (TD-4) (logging)
|
||
- **feat**: FluentValidation + ValidationFilter для DTO (TD-2) (validation)
|
||
- **feat**: RowVersion на документах через Postgres xmin (TD-6) (concurrency)
|
||
- **feat**: persisted ImportJobRegistry в БД (TD-5) (import-jobs)
|
||
- **feat**: HTML-шаблоны MailKit + invite/weekly/low-stock джобы (P1-22) (email)
|
||
- **feat**: per-tenant журнал мутаций OrgAuditLog (P1-18) (audit)
|
||
- **feat**: оптовая отгрузка контрагенту-юрлицу (P1-5) (demands)
|
||
- **feat**: Prometheus метрики /metrics + бизнес-счётчики (P1-17) (observability)
|
||
- **feat**: GET /sync и POST /sales с двойной идемпотентностью (P1-12b) (pos-api)
|
||
- **feat**: контракты POS v1 в food-market.shared (P1-12a) (pos-shared)
|
||
- **feat**: улучшенный Swagger + TS-клиент через openapi-typescript (P1-19) (openapi)
|
||
- **feat**: ABC-анализ по Парето (P1-11) (reports)
|
||
- **feat**: отчёт «Прибыль» (выручка − COGS) (P1-10) (reports)
|
||
- **feat**: отчёт «Остатки на дату» с реконструкцией (P1-9) (reports)
|
||
- **feat**: отчёт «Продажи» с группировками и экспортом (P1-8) (reports)
|
||
- **feat**: dashboard + scheduled cleanup джобы (P1-16) (hangfire)
|
||
- **feat**: возврат поставщику (P1-7) (supplier-returns)
|
||
- **feat**: возврат от покупателя (CustomerReturn) (P1-6) (returns)
|
||
- **feat**: инвентаризация с CSV-импортом факта (P1-4) (inventories)
|
||
- **feat**: атомарное перемещение между складами (P1-3) (transfers)
|
||
- **feat**: списание со склада с указанием причины (P1-2) (losses)
|
||
- **feat**: оприходование товара без поставщика (P1-1) (enters)
|
||
|
||
## 2026-05-27
|
||
|
||
- **feat**: авто-бэкап БД+uploads — systemd timer/service + скрипт (P0-6) (deploy)
|
||
- **feat**: prod X509-ключи OpenIddict с persistent self-signed (P0-1) (auth)
|
||
- **feat**: permission-based авторизация по флагам роли (P0-5) (authz)
|
||
- **feat**: health-пробы /health/live и /health/ready (P0-4) (api)
|
||
- **feat**: rate-limit /connect/token и /api/auth/signup (P0-3) (api)
|
||
|
||
## 2026-05-26
|
||
|
||
- **fix**: change-owner требует reason ≥ 10 символов (superadmin)
|
||
- **fix**: увольнение/деактивация гасит логин связанного User (employees)
|
||
- **fix**: сериализуемое проведение приёмки против lost update остатков (supplies)
|
||
- **fix**: FK-guard удаления контрагента + валидация полей товара (catalog)
|
||
- **fix**: refresh-token rotation немедленно инвалидирует старый токен (auth)
|
||
|
||
## 2026-05-23
|
||
|
||
- **fix**: защита денег и инварианта остатков на posting-операциях (documents)
|
||
- **fix**: SuperAdmin edit-mode override обходит [Authorize(Roles=Admin)] (security)
|
||
- **fix**: чиним P0-блокеры разворачивания на чистой БД (migrations)
|
||
|
||
## 2026-05-18
|
||
|
||
- **fix**: обновить node:20-alpine → 22-alpine (pnpm 11 требует Node ≥22) (docker)
|
||
- **fix**: validatePassword проверяет заглавную и цифру (соответствует хинту) (validation)
|
||
- **fix**: onBlur валидация через e.target.value, ре-валидация вместо сброса ошибки в onChange (signup)
|
||
|
||
## 2026-05-17
|
||
|
||
- **feat**: onBlur валидация полей во всех формах (ux)
|
||
|
||
## 2026-05-08
|
||
|
||
- **fix**: блок пустого Draft на UI + бэк уже отказывает (retail-sale)
|
||
- **feat**: системная ProductGroup «Все товары» при создании org (bootstrap)
|
||
- **fix**: обязательные FK-Guid проверяются на 400 + DbUpdateException → 400 (validation)
|
||
- **fix**: блок overselling в Post — 409 если qty>остатка (retail-sale)
|
||
- **fix**: добавить [Migration] атрибут для Phase5c — без него Migrate() не находит миграцию (migrations)
|
||
- **fix**: серверная KZ-ФЛК на всех endpoint'ах принимающих phone (phone)
|
||
- **fix**: Cashier/Storekeeper больше не видят /api/organization/employees + Identity-роль маппится из orgRole (auth)
|
||
- **feat**: infrastructure + first full-cycle scenario + baseline report (e2e)
|
||
|
||
## 2026-05-06
|
||
|
||
- **feat**: forgot/reset password — endpoints + UI + IP rate-limit (auth)
|
||
- **feat**: UI /super-admin/platform-settings + тестовая отправка (platform)
|
||
- **feat**: IEmailSender + MailKit + PlatformSettingsController (platform)
|
||
- **feat**: PlatformSettings entity + миграция (singleton SMTP-конфиг) (platform)
|
||
- **feat**: фильтр sidebar и route-guard по ролям пользователя (roles)
|
||
- **feat**: двухступенчатое удаление — «уволить» → «удалить» (employees)
|
||
- **feat**: TextInput с type=email — авто-pattern для TLD-проверки (forms)
|
||
- **feat**: MoneyInput для поля «Оклад» в карточке сотрудника (forms)
|
||
- **feat**: убрать «ИНН» из UI — РК использует ИИН/БИН (localization)
|
||
- **feat**: системная роль — read-only форма прав вместо alert (roles)
|
||
- **feat**: три системные роли — Admin/Cashier/Storekeeper (roles)
|
||
|
||
## 2026-05-03
|
||
|
||
- **fix**: сохранять позицию курсора после нормализации (phone)
|
||
- **fix**: нативное редактирование, фильтр не-цифр через onBeforeInput (phone)
|
||
- **fix**: редактирование на месте курсора, как в обычном поле (phone)
|
||
- **fix**: полностью переписать на простую модель — цифры как single source of truth (phone)
|
||
- **fix**: блокировать ввод не-цифр на уровне keyDown (phone)
|
||
- **fix**: не считать «7» из префикса как введённую цифру (phone)
|
||
- **feat**: единый PhoneInput с зашитым «+7» и ФЛК Казахстана (phone)
|
||
- **feat**: телефон обязателен + ФЛК Казахстана (77XXXXXXXXX) (signup)
|
||
- **fix**: убрать «моргание» при клике на орг — переход теперь по double-click (super-admin)
|
||
|
||
## 2026-05-02
|
||
|
||
- **fix**: docker-public — актуализировать PUBLIC_*_URL под новые домены (ci)
|
||
- **fix**: кнопка «Войти» вела на 410-Gone zat.kz (public)
|
||
- **feat**: новый логотип food-market wordmark + apple mark (brand)
|
||
|
||
## 2026-04-30
|
||
|
||
- **feat**: миграция на food-market.kz / admin.food-market.kz (domains)
|
||
|
||
## 2026-04-28
|
||
|
||
- **feat**: полное управление сотрудниками любой орги (super-admin)
|
||
- **feat**: AsyncSelect — серверный поиск в дропдаунах вместо pageSize=500 (ui)
|
||
- **fix**: SuperAdmin платформы без OrganizationId + отдельный Admin для Demo Market (auth)
|
||
|
||
## 2026-04-27
|
||
|
||
- **feat**: главный администратор — терминология + защита роли/активности (employees)
|
||
- **feat**: бейдж «Владелец» + блокировка удаления с объяснением (employees)
|
||
- **fix**: пароль/orphan signup/tenant-guard toast/dashboard счётчик
|
||
- **fix**: нейтральный placeholder в поле названия организации (public)
|
||
- **fix**: закрыть критические дыры — orphan login, self-delete, owner-delete, override-баннер (auth)
|
||
- **feat**: русская локализация и строгий email с TLD (validation)
|
||
- **fix**: убрать русские имена/ИП из placeholder регистрации (public)
|
||
|
||
## 2026-04-26
|
||
|
||
- **feat**: Phase 6 — публичный сайт на food-market.zat.kz, админка на app. (deploy)
|
||
- **feat**: Phase 6 — публичный маркетинговый сайт food-market.public на Astro (public)
|
||
- **feat**: настраиваемый retention period для архивных орг (super-admin)
|
||
- **fix**: убрать цикл редиректа, регресс override после пакета задач (super-admin)
|
||
- **fix**: Phase4d таблица называется units_of_measure, не units (migration)
|
||
- **feat**: двухуровневые справочники Группы и Ед.измерения (системные + tenant) (directories)
|
||
- **feat**: системные роли read-only + русские имена + чистка дубликата у admin (roles)
|
||
- **feat**: перенести справочник Стран в системную консоль (super-admin)
|
||
- **fix**: SuperAdmin override должен применять tenant filter выбранной орги (tenancy)
|
||
- **feat**: рабочий quick-switch + UI-блокировка мутаций в read-only (super-admin)
|
||
- **feat**: Phase 2b — отдельный SuperAdminLayout и разделение от tenant-админки (super-admin)
|
||
- **feat**: Phase 3 — edit-mode с reason + audit-trail (super-admin)
|
||
- **feat**: Phase 2 — read-only «открыть как…» context switch (super-admin)
|
||
- **feat**: /quiet и /loud команды для управления PreToolUse прогресс-лентой (bridge)
|
||
- **fix**: новая org через UI получает полный bootstrap (как Demo) (super-admin)
|
||
- **feat**: PreToolUse hook for Telegram progress feed + rate-limited batching (infra)
|
||
- **fix**: grant SuperAdmin role to admin@food-market.local (seed)
|
||
- **feat**: super-admin section + setup wizard + auto-redirect (web)
|
||
- **feat**: super-admin endpoints (orgs CRUD + setup-status + audit-log + dashboard) (api)
|
||
- **feat**: Organization.IsArchived/AccountOwner + SuperAdminAuditLog + migration (domain)
|
||
- **feat**: add Salary, TaxNumber, Description, ImageUrl + radio role picker (employee)
|
||
- **feat**: permissions matrix grouped by section + clone-from-template flow (roles)
|
||
- **fix**: keep only Admin + Cashier as system, demote others to custom + migration (roles)
|
||
- **feat**: event-driven Telegram bridge — webhook + Stop hook (infra)
|
||
- **fix**: drop Employee.Navigation(RetailPointAssignments) to fix snapshot order (migrations)
|
||
- **feat**: welcome dashboard with first-steps cards (onboarding)
|
||
- **feat**: Employees + Roles pages with permissions matrix (web)
|
||
- **feat**: EmployeesController + EmployeeRolesController + invite-with-temp-password (api)
|
||
- **feat**: system roles per organization + map admin → Employee (seed)
|
||
- **feat**: Employee, EmployeeRole, RolePermissions entities + migration (domain)
|
||
- **fix**: dropdown opens as floating overlay (Portal + absolute) (searchable-select)
|
||
- **fix**: theme styles + default to today for new docs (date-field)
|
||
- **feat**: replace native input with react-datepicker — polished UX (date-field)
|
||
- **fix**: polish calendar UX — dropdown nav, today/clear footer, ru weekdays (date-field)
|
||
- **fix**: compact calendar popup — shadcn-style sizing (date-field)
|
||
- **fix**: cap width + ru locale + DD.MM.YYYY format (date-fields)
|
||
- **fix**: show both article and barcode in line subtitle (supply-lines)
|
||
- **fix**: sticky input at viewport bottom + auto-scroll on add (supply-quick-add)
|
||
- **fix**: dropdown opens upward + show only N results + create-new at bottom (supply-quick-add)
|
||
- **feat**: drop supplier field, reorder sections, add cost column (product-card+list)
|
||
- **fix**: keep input focused after scan / clear on add (supply-quick-add)
|
||
- **fix**: dropdown not rendering — Portal + fixed position (supply-quick-add)
|
||
- **feat**: inline line quick-add — scanner + autocomplete + create-on-fly (supply)
|
||
- **feat**: products quick-search + by-barcode endpoints (api)
|
||
- **fix**: колонка «Розничная» использует имя системного PriceType (supply)
|
||
- **feat**: «Проведено» внутри формы + обязательная дата и ≥1 позиция (supply)
|
||
- **fix**: catch-up Phase3b_AddShowDescriptionOnProduct (migrations)
|
||
- **feat**: inline-create option in searchable Select (ui)
|
||
- **feat**: searchable Select component (drop-in) (ui)
|
||
- **feat**: drop ShelfLifeDays + recompose classification + auto-article + barcode trash hide (product-card)
|
||
- **fix**: IsRequired применяется сразу, без перезагрузки страницы (price-types)
|
||
|
||
## 2026-04-25
|
||
|
||
- **fix**: человечная ошибка 400 + блок Save при незаполненных IsRequired ценах (product-edit)
|
||
- **fix**: correct is-system seeder + require value > 0 + system-price filter/sort (price-types)
|
||
- **feat**: inputs по справочнику PriceType — без dropdown'a (product-prices)
|
||
- **feat**: компонент + inline-наценка в таблице групп (percent-input)
|
||
- **feat**: срок годности (shelfLifeDays) + фильтр от/до (product+filters)
|
||
- **feat**: чекбокс «Проведено» с confirm + системная розничная в списке (supply+products-list)
|
||
- **feat**: drop IsActive, add ShelfLifeDays, restore PriceType IsSystem/IsRequired (phase3b)
|
||
- **feat**: supply line retail override column (web)
|
||
- **feat**: price types CRUD visibility + group markup table (web)
|
||
- **feat**: product card pricing UI + settings toggles (web)
|
||
- **feat**: recalc-retail endpoint + 30-day reference price refresh job (api)
|
||
- **feat**: supply posting hook for cost & markup (api)
|
||
- **feat**: pricing model rename and new fields (Phase3a) (domain)
|
||
- **fix**: merge barcodes/prices по ключу + 409 на concurrency (products/update)
|
||
- **fix**: toFixed(2) при allowFractional=true для правильного отображения (money-input)
|
||
- **fix**: сохранять промежуточный ввод точки в draft (money-input)
|
||
- **fix**: корректное обновление allowFractionalPrices без перелогина (money-input)
|
||
- **fix**: уважать AllowFractionalPrices в формах редактирования (money-input)
|
||
- **feat**: pre-check на Create/Update + warnings импорта + admin endpoint (barcode-uniqueness)
|
||
- **feat**: AllowFractionalPrices — переключатель дробных цен (org-settings)
|
||
- **feat**: группа обязательна, ≥1 штрихкод, умные дефолты на новом (product)
|
||
- **feat**: MoneyInput/NumberInput + select-пагинация + Range на бэкенде (forms)
|
||
|
||
## 2026-04-24
|
||
|
||
- **feat**: авто-генерация числового артикула при создании (products)
|
||
- **feat**: настройка ShowMinMaxStock для мин/макс остатков (org-settings)
|
||
- **feat**: галки «Услуга»/«Маркируемый» скрываются по умолчанию (org-settings)
|
||
- **feat**: авто-генерация EAN-13 при добавлении штрихкода (barcode)
|
||
- **feat**: server-side sort by column header click (tables)
|
||
- **feat**: валюта read-only, тянется из страны (как НДС) (org-settings)
|
||
- **feat**: ставка в стране + опц. переопределение на товаре (vat)
|
||
- **feat**: загрузка на диск сервера + галерея с лайтбоксом (product-images)
|
||
- **feat**: enum Packaging (штучный/весовой/разливной) вместо IsWeighed (product)
|
||
- **feat**: Country↔Currency, Organization.DefaultCurrency/MultiCurrency/DefaultVat + UI настроек (org-settings)
|
||
- **fix**: сделать Token опциональным (other-system/test)
|
||
|
||
## 2026-04-23
|
||
|
||
- **feat**: async jobs с прогрессом + токен в настройках (other-system-import)
|
||
- **fix**: per-page retry + чаще SaveChanges (other-system/import)
|
||
- **feat**: tree-of-groups + фильтры как в OtherSystem (catalog/products)
|
||
- **feat**: import archived entities too (as IsActive=false) (other-system)
|
||
- **fix**: reconcile stage schema — drop TrackingType, add IsMarked (db)
|
||
- **feat**: temp cleanup buttons + fix OtherSystem import duplicates (admin)
|
||
- **feat**: strict OtherSystem schema — реплика потерянного f7087e9
|
||
- **fix**: убираем выдумку Kind полностью — у OtherSystem этого поля нет (other-system)
|
||
- **fix**: не выдумывать Kind=Both для импортированных контрагентов (other-system)
|
||
- **feat**: Telegram <-> tmux bridge + local docker-registry unit (ops)
|
||
- **feat**: sales chart + KPIs (как «Показатели» в сторонняя система) (dashboard)
|
||
|
||
## 2026-04-22
|
||
|
||
- **fix**: bootstrap admin + demo org on stage/prod too, not just Dev (seeder)
|
||
- **fix**: always apply EF migrations on startup, not only in Development (api)
|
||
- **fix**: widen Article + Barcode.Code to 500 chars for real-world catalogs (catalog)
|
||
|
||
## 2026-04-21
|
||
|
||
- **fix**: accept fractional prices (decimal, not long) in DTOs (other-system)
|
||
- **fix**: add User-Agent header + enable HTTP auto-decompression (other-system)
|
||
- **fix**: drop Accept-Encoding: gzip to avoid JSON parse failure (other-system)
|
||
- **fix**: set Accept header as raw string to bypass .NET normalization (other-system)
|
||
- **fix**: exact Accept header value per OtherSystem requirement (code 1062) (other-system)
|
||
- **fix**: trailing slash on BaseUrl so HttpClient keeps /1.2/ in path (other-system)
|
||
- **fix**: OtherSystem admin endpoint uses policy-based auth on role claim directly (auth)
|
||
- **fix**: return 401 instead of 302 for API challenges; persist dev signing key across restarts (auth)
|
||
- **fix**: drop FM square badge from Logo; better 404 diagnostics on OtherSystem page (web)
|
||
- **feat**: rebrand to FOOD MARKET green (#00B207) per mobile app logo (web)
|
||
- **fix**: remove TanStack devtools palm icon; restore user profile on dashboard (web)
|
||
- **fix**: pin API dev port to 5081 (match Vite proxy config)
|
||
|