chore(release): 0.1.3 #23
Executable
+2
@@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
npx --no-install commitlint --edit "$1" --strict
|
||||
@@ -1,5 +1,20 @@
|
||||
# Changelog
|
||||
|
||||
## [0.1.3](https://git.personal.ksv741.ru/WealthLedger/specs/compare/v0.1.2...v0.1.3) (2026-10-07)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **deps:** patch release tooling advisories ([33cc4f3](https://git.personal.ksv741.ru/WealthLedger/specs/commit/33cc4f3e0c20ed3d6f5814cdc609724ffb8564ac))
|
||||
|
||||
### Specifications
|
||||
|
||||
* add reduce-screen-sync-polling change ([a1b0e99](https://git.personal.ksv741.ru/WealthLedger/specs/commit/a1b0e99bddb91f7b7ca729ddf6b7d6c688fdca41))
|
||||
* simplify runtime requirements ([d861de5](https://git.personal.ksv741.ru/WealthLedger/specs/commit/d861de5ead41b4977083b4aee08fc668c35e5b34))
|
||||
|
||||
### Maintenance
|
||||
|
||||
* run commitlint in commit-msg hook ([0fd148f](https://git.personal.ksv741.ru/WealthLedger/specs/commit/0fd148ffbb39ea883a7e7799aa1b87c93b31fa17))
|
||||
|
||||
## [0.1.2](https://git.personal.ksv741.ru/WealthLedger/specs/compare/v0.1.1...v0.1.2) (2026-09-26)
|
||||
|
||||
### Specifications
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
schema: wealth-ledger-sdd
|
||||
created: 2026-10-07
|
||||
@@ -0,0 +1,104 @@
|
||||
## Context
|
||||
|
||||
`useScreenSync` уже является общим module для экранной синхронизации. Его
|
||||
interface принимает scope и набор resource queries; реализация опрашивает
|
||||
статусы выполняющейся работы и вызывает `observe()` для ресурсов того же
|
||||
экрана. Один интервал в 1 секунду управляет обоими видами запросов, поэтому
|
||||
страницы с несколькими ресурсами умножают фоновый трафик.
|
||||
|
||||
Нужна меньшая частота обновления при сохранении текущей cache identity,
|
||||
автоматического восстановления, защиты доступа и итогового обновления сразу
|
||||
после завершения работы.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
|
||||
- Сократить периодический HTTP-трафик выполняющейся экранной синхронизации
|
||||
примерно в пять раз.
|
||||
- Сохранить небольшую и прежнюю interface `useScreenSync` для всех page VMs.
|
||||
- Сразу обновлять ресурсы после terminal state синхронизации.
|
||||
- Проверять поведение на HTTP seam, а не детали реализации TanStack Query.
|
||||
|
||||
**Non-Goals:**
|
||||
|
||||
- Изменять backend status contract, resource endpoints или модель синхронизации.
|
||||
- Вводить отдельный polling module, второй cache или push-канал.
|
||||
- Менять пользовательское представление загрузки и ошибок.
|
||||
|
||||
## Decisions
|
||||
|
||||
### Preserve one screen-sync module and lengthen its interval
|
||||
|
||||
`useScreenSync` остаётся единственным module, который владеет связью между
|
||||
статусом экранной синхронизации и observe reads. Его implementation заменяет
|
||||
интервал status polling с одной секунды на пять секунд. Поскольку effect уже
|
||||
наблюдает ресурсы после нового status response, это одним изменением
|
||||
ограничивает оба потока запросов без расширения interface для callers.
|
||||
|
||||
Alternative: добавить второй timer только для observe reads при status polling
|
||||
раз в секунду. Отклонено: status traffic останется частым, а два независимых
|
||||
ритма увеличат implementation и риск дублирующих наблюдений без требуемой
|
||||
пользы.
|
||||
|
||||
Alternative: читать ресурсы только после terminal state. Отклонено: это
|
||||
устранит промежуточную публикацию уже готовых данных и изменит существующее
|
||||
поведение сильнее, чем требуется.
|
||||
|
||||
### Keep completion observation driven by the terminal status response
|
||||
|
||||
Текущий effect уже distinguishes running и completed status: для terminal state
|
||||
он observes every resource, включая тот, который был fetching. Этот путь
|
||||
сохраняется. Terminal response не ждёт отдельного timer, поэтому итоговый
|
||||
результат появляется в обработке того же status response; максимальная
|
||||
задержка возникает только до следующей пятиисекундной проверки.
|
||||
|
||||
### Test the public HTTP outcome at the screen-sync seam
|
||||
|
||||
Colocated tests `screen-sync` будут использовать MSW и fake timers, чтобы
|
||||
проверить отсутствие повторного status/read traffic до пяти секунд, следующий
|
||||
цикл после интервала и одно итоговое observe read при terminal status. Existing
|
||||
tests продолжат доказывать, что уход с экрана останавливает polling и что
|
||||
observe reads не создают новую импортирующую работу.
|
||||
|
||||
## UI/UX Applicability and Package
|
||||
|
||||
**Applicability and scope:** N/A. Изменяется только частота невидимых фоновых
|
||||
запросов; экраны, состояния, interactions и responsive behavior не меняются.
|
||||
|
||||
## Delivery Map
|
||||
|
||||
| Area | Status | Architectural outcome or N/A reason |
|
||||
| --- | --- | --- |
|
||||
| frontend | affected | `useScreenSync` реже опрашивает статус и тем самым реже наблюдает ресурсы, сохраняя немедленное обновление после terminal state. |
|
||||
| backend | N/A | Status и resource contracts не меняются. |
|
||||
| specs | affected | Delta фиксирует пятиисекундную верхнюю частоту и итоговое наблюдение после terminal state. |
|
||||
| docs | N/A | Пользовательские и эксплуатационные инструкции не меняются. |
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- Промежуточно готовые данные могут появиться до четырёх секунд позже, чем
|
||||
раньше; пользователь явно выбрал меньший трафик в обмен на эту задержку.
|
||||
- Terminal state обнаруживается следующей status-проверкой, поэтому его
|
||||
отображение также может ждать до пяти секунд после фактического завершения
|
||||
backend work. После обнаружения дополнительной задержки нет.
|
||||
- Смена только общей константы затрагивает все экраны-потребители; тесты
|
||||
module защищают единое ожидаемое поведение.
|
||||
|
||||
## Migration Plan
|
||||
|
||||
1. Изменить policy interval у существующего screen-sync module.
|
||||
2. Адаптировать и дополнить его seam tests для пятиисекундного ритма и
|
||||
terminal refresh.
|
||||
3. Выполнить локальные frontend quality gates перед поставкой.
|
||||
|
||||
### Rollback Contract
|
||||
|
||||
| Field | Decision |
|
||||
| --- | --- |
|
||||
| Status | `N/A` |
|
||||
| Reason | Изменение локальной frontend polling policy не меняет данные, публичный contract, security или миграции; rollback состоит в возврате прежнего значения интервала. |
|
||||
| Trigger | N/A |
|
||||
| Actions | N/A |
|
||||
| Data safety | N/A |
|
||||
| Verification | N/A |
|
||||
@@ -0,0 +1,50 @@
|
||||
## Why
|
||||
|
||||
Пока экран ожидает синхронизацию T-Bank, клиент опрашивает её состояние каждую
|
||||
секунду. Каждый новый ответ запускает наблюдение всех ресурсов открытого экрана.
|
||||
На экранах с несколькими финансовыми выборками это создаёт непропорционально
|
||||
много запросов при том, что пользователь готов увидеть промежуточный результат
|
||||
с небольшой задержкой.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Во время выполняющейся экранной синхронизации приложение реже проверяет её
|
||||
состояние и обновляет наблюдаемые финансовые ресурсы не чаще одного раза за
|
||||
пять секунд.
|
||||
- После terminal state синхронизации приложение сразу наблюдает ресурсы
|
||||
открытого экрана, чтобы отобразить итоговый результат без дополнительной
|
||||
задержки.
|
||||
- Существующие состояния ожидания, доступные частичные результаты,
|
||||
автоматическое восстановление чтения и прекращение работы после ухода с
|
||||
экрана сохраняются.
|
||||
|
||||
Ожидаемый результат: длительная синхронизация создаёт существенно меньше
|
||||
фоновых HTTP-запросов, а пользователь получает промежуточные результаты с
|
||||
задержкой не более пяти секунд и итоговые данные сразу после завершения.
|
||||
|
||||
Non-goals:
|
||||
|
||||
- Изменять запуск синхронизации, её scope, доступ к данным или финансовые
|
||||
расчёты.
|
||||
- Добавлять новые пользовательские элементы, ручное управление частотой или
|
||||
отдельный канал доставки изменений.
|
||||
- Гарантировать обновления финансовых данных в реальном времени.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
<!-- None. -->
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `specs/frontend-data-resilience/spec.md`: ограниченная частота наблюдения
|
||||
ресурсов во время выполняющейся синхронизации и немедленное наблюдение после
|
||||
terminal state.
|
||||
|
||||
## Impact
|
||||
|
||||
Изменение затрагивает финансовые экраны, использующие экранную синхронизацию:
|
||||
счета, детали счёта, операции, доходы, события и страницы инструментов. Оно
|
||||
сокращает фоновый HTTP-трафик при продолжающейся синхронизации, сохраняя
|
||||
автоматическое отображение готовых данных и существующие правила устойчивости.
|
||||
@@ -0,0 +1,85 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Временные сбои чтения восстанавливаются автоматически
|
||||
|
||||
Frontend SHALL автоматически повторять временно неуспешное чтение и
|
||||
восстанавливать получение необходимых текущему экрану данных без ручного
|
||||
обновления. Повторы одной попытки MUST иметь конечный предел и паузы,
|
||||
исключающие непрерывную череду запросов. При исчерпании предела доступные данные
|
||||
SHALL сохраняться, а при их отсутствии SHALL показываться локальная
|
||||
недоступность. Возвращение сети, возвращение пользователя к открытому экрану и
|
||||
повторное открытие экрана MUST возобновлять получение отсутствующих или
|
||||
требующих обновления данных без перезагрузки страницы. Свежий полный результат
|
||||
MUST NOT требовать обращения к источнику только из-за такого события.
|
||||
|
||||
Наблюдая выполняющуюся экранную синхронизацию, frontend MUST проверять её
|
||||
состояние и повторно читать связанные ресурсы не чаще одного раза за пять
|
||||
секунд. После получения terminal state этой синхронизации frontend MUST сразу
|
||||
наблюдать ресурсы текущего экрана, не ожидая следующего пятиисекундного
|
||||
интервала.
|
||||
|
||||
Восстановление MUST учитывать сбой чтения результата и сбой самого получения
|
||||
данных из источника, даже если чтение состояния завершилось успешно. Наблюдение
|
||||
уже выполняющейся работы MUST NOT запускать её повторно. Уход с экрана MUST
|
||||
прекращать новые попытки его восстановления; это не требует отменять уже
|
||||
начатую работу источника. Автоматическое восстановление MUST NOT повторять
|
||||
запросы, требующие исправления ввода, входа или восстановления доступа, и MUST
|
||||
NOT переносить старые параметры в новую пользовательскую выборку.
|
||||
|
||||
#### Scenario: Кратковременный сбой чтения
|
||||
- **WHEN** чтение текущей выборки временно не удалось, а следующая разрешённая
|
||||
автоматическая попытка успешна
|
||||
- **THEN** экран самостоятельно показывает результат без ручного действия и без
|
||||
сообщения о сбое или восстановлении
|
||||
|
||||
#### Scenario: Экранная синхронизация продолжается
|
||||
- **WHEN** экран наблюдает синхронизацию, которая остаётся в состоянии running
|
||||
после очередной проверки
|
||||
- **THEN** frontend выполняет следующую проверку состояния и наблюдение
|
||||
связанных ресурсов не ранее чем через пять секунд
|
||||
|
||||
#### Scenario: Экранная синхронизация завершилась
|
||||
- **WHEN** очередная проверка экранной синхронизации возвращает terminal state
|
||||
- **THEN** frontend сразу наблюдает связанные ресурсы текущего экрана, чтобы
|
||||
показать итоговый результат без ожидания следующего интервала
|
||||
|
||||
#### Scenario: Источник завершил работу ошибкой
|
||||
- **WHEN** чтение сохранённых данных успешно, но получение необходимых новых
|
||||
данных из источника временно не удалось
|
||||
- **THEN** приложение применяет ограниченное автоматическое восстановление к
|
||||
неуспешной работе, а не считает успешное чтение доказательством её успеха
|
||||
|
||||
#### Scenario: Повторы исчерпаны
|
||||
- **WHEN** временная недоступность сохраняется после конечного предела
|
||||
автоматических попыток
|
||||
- **THEN** приложение прекращает серию повторов, сохраняет доступный результат
|
||||
либо локальную недоступность без бесконечной загрузки и ожидает следующего
|
||||
события восстановления
|
||||
|
||||
#### Scenario: Сеть или пользователь вернулись
|
||||
- **WHEN** после временного сбоя восстановилась сеть либо пользователь вернулся
|
||||
к экрану с отсутствующим или требующим обновления результатом
|
||||
- **THEN** получение данных возобновляется автоматически для текущей выборки и
|
||||
при успехе заменяет состояние недоступности содержимым
|
||||
|
||||
#### Scenario: Несколько событий восстановления совпали
|
||||
- **WHEN** сеть восстановилась одновременно с возвращением пользователя на экран
|
||||
- **THEN** приложение не запускает дублирующую работу получения одного набора
|
||||
данных
|
||||
|
||||
#### Scenario: Работа источника ещё выполняется
|
||||
- **WHEN** приложение восстанавливает чтение состояния уже выполняющейся работы
|
||||
- **THEN** оно продолжает получение её результата без повторного запуска той же
|
||||
работы
|
||||
|
||||
#### Scenario: Пользователь покинул экран
|
||||
- **WHEN** пользователь ушёл со страницы с ожидающим восстановлением
|
||||
- **THEN** новые попытки для покинутого экрана прекращаются, а уже начатая работа
|
||||
не изменяет содержимое другой выборки
|
||||
|
||||
#### Scenario: Ошибка требует действия пользователя
|
||||
- **WHEN** подтверждены недействительное подключение, отсутствие доступа или
|
||||
некорректный ввод
|
||||
- **THEN** автоматическая серия повторов прекращается и появляется
|
||||
соответствующее действие или локальная ошибка без технической кнопки повторной
|
||||
загрузки
|
||||
@@ -0,0 +1,30 @@
|
||||
## 1. Screen synchronization policy
|
||||
|
||||
- [x] 1.1 [frontend] Change the screen-sync status polling policy from one
|
||||
second to five seconds while keeping the existing `useScreenSync` interface
|
||||
and terminal-state resource observation.
|
||||
- **Covers:** `frontend-data-resilience` — `Временные сбои чтения восстанавливаются автоматически`
|
||||
- **Verification:** Run the colocated screen-sync test file and confirm its
|
||||
MSW assertions show no subsequent status or observe request before five
|
||||
seconds, with resources observed on a terminal status response.
|
||||
|
||||
- [x] 1.2 [frontend] Update colocated screen-sync tests with fake timers to
|
||||
cover the five-second running cadence, immediate terminal observation, and
|
||||
existing stop-on-unmount behavior.
|
||||
- **Covers:** `frontend-data-resilience` — `Временные сбои чтения восстанавливаются автоматически`
|
||||
- **Verification:** `nvm use --silent && npm test -- screen-sync.test.tsx`
|
||||
|
||||
## 2. Frontend delivery
|
||||
|
||||
- [x] 2.1 [frontend] Run the frontend's canonical verification after the
|
||||
polling-policy and regression-test changes.
|
||||
- **Covers:** `N/A` — This task verifies the affected frontend delivery; it
|
||||
introduces no separate observable behavior beyond the requirement covered
|
||||
by tasks 1.1 and 1.2.
|
||||
- **Verification:** `nvm use --silent && npm run verify`
|
||||
|
||||
- [x] 2.2 [specs] Verify the completed OpenSpec change against the
|
||||
`wealth-ledger-specs` store before implementation review.
|
||||
- **Covers:** `N/A` — This task validates the planning artifacts and their
|
||||
traceability; it does not introduce runtime behavior.
|
||||
- **Verification:** `openspec validate --change reduce-screen-sync-polling --store wealth-ledger-specs`
|
||||
@@ -156,7 +156,7 @@
|
||||
|
||||
### Requirement: Income payments remain traceable to exact Ledger Entries
|
||||
|
||||
В разделе «Выплаты» страница MUST показывать единый список карточек точных исполненных Ledger Entries применённого периода в исходном серверном порядке entries. Каждая выплата MUST иметь собственную сразу видимую карточку с описанием, датой, доступной identity Instrument и signed Money в исходной валюте. Страница MUST NOT добавлять внешние группировочные карточки или заголовки по Instrument либо валюте, subtotals инструмента или количество выплат инструмента. Список MUST сохранять отрицательные корректировки и повторяющиеся operation IDs как отдельные записи и MUST NOT включать записи вне аналитического итога. Отказ от группировочного UI MUST NOT отменять проверки принадлежности entries к instrumentKey, валюты и receipt count ответа или приводить к пересчёту денежных итогов на клиенте.
|
||||
В разделе «Выплаты» страница MUST показывать единый список карточек точных исполненных Ledger Entries применённого периода в исходном серверном порядке entries. Каждая выплата MUST иметь собственную сразу видимую карточку с описанием, датой, доступной identity Instrument и signed Money в исходной валюте. Страница MUST NOT добавлять внешние группировочные карточки или заголовки по Instrument либо валюте, subtotals инструмента или количество выплат инструмента. Список MUST сохранять отрицательные корректировки и повторяющиеся operation IDs как отдельные записи и MUST NOT включать записи вне аналитического итога. Backend MUST обеспечивать согласованность entries, instrumentKey, валюты и receipt count при формировании ответа из одного набора записей. Frontend SHALL доверять типизированному contract без второго runtime consistency validator и MUST NOT пересчитывать денежные итоги.
|
||||
|
||||
#### Scenario: Каждая выплата показана отдельной карточкой
|
||||
|
||||
|
||||
@@ -94,20 +94,29 @@ Portfolio Snapshot является результатом наблюдения
|
||||
- **THEN** система передаёт её как строку `"-0.5"`
|
||||
|
||||
### Requirement: Свежесть и fallback полного Portfolio Snapshot
|
||||
Система MUST кэшировать полный успешный Portfolio Snapshot отдельно для каждой пары User и Brokerage Account в памяти на 30 секунд. После истечения свежего кэша система MUST получить новый полный снимок; при временной upstream-недоступности она SHALL вернуть последний успешный полный снимок, если ему не более пяти минут, с `isStale: true`. Metadata инструмента MUST NOT влиять на успешность или свежесть Portfolio Snapshot, но MUST быть получено до формирования нового Snapshot, чтобы при доступном upstream-ответе вернуть отображаемое имя инструмента.
|
||||
Система MUST хранить последний полный успешный Portfolio Snapshot в SQLite
|
||||
с принадлежностью User, экземпляру подключения и Brokerage Account. Обычный
|
||||
GET MUST читать сохранённые данные без ожидания T-Bank; missing/stale источники
|
||||
обновляются в фоне по пользовательскому запросу. Portfolio source свеж 60 секунд.
|
||||
Ошибка обновления MUST сохранять прежний полный Snapshot и его время без
|
||||
пятиминутного лимита fallback. Metadata MUST NOT определять успешность или
|
||||
свежесть финансового Snapshot; при её отсутствии используется доступный fallback.
|
||||
|
||||
Система MUST очищать все Portfolio Snapshot User после успешной замены или удаления его T-Bank connection. Успешные metadata инструмента и подтверждённое отсутствие инструмента MUST кэшироваться глобально по FIGI на 24 часа; ошибка metadata lookup MUST NOT кэшироваться.
|
||||
Система MUST делать прежние личные datasets недоступными после успешной замены
|
||||
или удаления подключения. Поздняя работа прежнего подключения MUST NOT
|
||||
публиковаться в новом. Общие metadata и подтверждённое отсутствие инструмента
|
||||
сохраняются по UID/FIGI на 24 часа; ошибка lookup не подтверждает отсутствие.
|
||||
|
||||
#### Scenario: Свежий Snapshot
|
||||
- **WHEN** User повторно запрашивает тот же Portfolio в течение 30 секунд после успешного получения
|
||||
- **WHEN** User повторно запрашивает тот же Portfolio в течение 60 секунд после успешного получения
|
||||
- **THEN** система возвращает свежий Snapshot без нового обращения к T-Bank
|
||||
|
||||
#### Scenario: Медленный lookup инструмента
|
||||
- **WHEN** metadata инструмента ещё отсутствует и его lookup не завершился
|
||||
- **THEN** система ожидает lookup в пределах gRPC deadline и возвращает name при успешном ответе upstream
|
||||
- **THEN** система не задерживает локальный ответ ради lookup и показывает доступную identity; сохранённая успешная metadata используется последующим чтением
|
||||
|
||||
#### Scenario: Fallback после временной upstream-ошибки
|
||||
- **WHEN** обновление устаревшего Snapshot неуспешно из-за временной недоступности T-Bank, а последний полный успешный Snapshot получен не более пяти минут назад
|
||||
- **WHEN** обновление устаревшего Snapshot неуспешно из-за временной недоступности T-Bank, а в текущей границе подключения есть полный успешный Snapshot
|
||||
- **THEN** система отвечает `200` этим Snapshot с `isStale: true` и исходным `lastSuccessfulAt`
|
||||
|
||||
#### Scenario: Недействительный token не маскируется fallback-данными
|
||||
@@ -118,7 +127,14 @@ Portfolio Snapshot является результатом наблюдения
|
||||
|
||||
Клиент SHALL загружать Portfolio при открытии защищённого маршрута
|
||||
`/accounts/:accountId`. Он MUST использовать успешный ответ в течение
|
||||
30 секунд, без automatic retry, polling или refetch при возврате фокуса.
|
||||
30 секунд, без automatic retry или refetch при возврате фокуса.
|
||||
Polling допускается только для известной работы открытого экрана;
|
||||
data GET наблюдения использует `sync=observe` и MUST NOT запускать новый импорт.
|
||||
Status сообщает state/errorCode без hash notifications и численных progress counters.
|
||||
После ухода или завершения работы polling MUST прекращаться.
|
||||
|
||||
Предзагрузка всей истории свечей бумаг портфеля MUST NOT выполняться.
|
||||
Новый диапазон свечей загружается при его открытии; initial loading допустим.
|
||||
При загрузке без ранее полученного успешного ответа для этого же Brokerage
|
||||
Account клиент MUST показывать структурное skeleton-состояние ожидаемого
|
||||
содержимого, включая сводку, без вымышленных сумм. Область загрузки MUST
|
||||
|
||||
@@ -53,11 +53,21 @@
|
||||
|
||||
#### Scenario: Истёкшая сессия
|
||||
- **WHEN** клиент отправляет refresh-cookie Session, не обновлявшейся более 7 дней
|
||||
- **THEN** система удаляет refresh-cookie и отвечает `401` Problem Details с code `UNAUTHORIZED`
|
||||
- **THEN** система отвечает `401` Problem Details с code `UNAUTHORIZED`, не изменяя cookie неуспешным refresh
|
||||
|
||||
#### Scenario: Повторное использование refresh token
|
||||
- **WHEN** клиент отправляет refresh token, заменённый предыдущим успешным refresh
|
||||
- **THEN** система удаляет refresh-cookie и отвечает `401` Problem Details с code `UNAUTHORIZED`, не отзывая связанную Session только из-за этого запроса
|
||||
- **THEN** система отвечает `401` Problem Details с code `UNAUTHORIZED`, не изменяет cookie и не отзывает связанную Session только из-за этого запроса
|
||||
|
||||
### Requirement: Межвкладочная координация не требуется
|
||||
Frontend MUST сохранять изоляцию данных текущей identity внутри вкладки.
|
||||
Он MUST NOT требовать cross-tab synchronization для auth flow. После смены
|
||||
auth-состояния в другой вкладке допускаются reload или повторная авторизация.
|
||||
Неуспешный refresh MUST NOT удалять cookie успешного конкурентного запроса.
|
||||
|
||||
#### Scenario: Конкурентный refresh проигрывает в другой вкладке
|
||||
- **WHEN** вкладка получает `401` после ротации общей cookie другой вкладкой
|
||||
- **THEN** она может перейти на login; cookie победителя остаётся доступной для последующего восстановления
|
||||
|
||||
### Requirement: Завершение сессии
|
||||
Система SHALL позволять завершить текущую Session через logout. Logout MUST отозвать Session, если refresh-cookie соответствует активной Session, и MUST удалить refresh-cookie. Logout MUST быть идемпотентным и не раскрывать существование Session.
|
||||
|
||||
Generated
+88
-88
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "wealth-ledger-specs",
|
||||
"version": "0.1.2",
|
||||
"version": "0.1.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "wealth-ledger-specs",
|
||||
"version": "0.1.2",
|
||||
"version": "0.1.3",
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "21.2.2",
|
||||
"@commitlint/config-conventional": "21.2.2",
|
||||
@@ -81,13 +81,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/config-validator": {
|
||||
"version": "21.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.2.0.tgz",
|
||||
"integrity": "sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.2.3.tgz",
|
||||
"integrity": "sha512-JQ13v0GafSM4fBYX8UowSy++07Was20auq0NcTdnzSEq6/05Cq5GBUMIfKkqjzyBwC9sJFmPpKWgLLhH7cygkw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"ajv": "^8.11.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -95,13 +95,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/ensure": {
|
||||
"version": "21.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.2.0.tgz",
|
||||
"integrity": "sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.2.3.tgz",
|
||||
"integrity": "sha512-gEjNKgRocbODI5/sMx2Qc9XOf2/zFTNV2aEK1QZ4gKDKxDC/VR7us3QtIX1C5d5xxHxx0I/tEbYbdSP1Am2LwA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"es-toolkit": "^1.46.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -119,13 +119,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/format": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.2.2.tgz",
|
||||
"integrity": "sha512-v6fvxZSc/AvVMROlr3H34+1766bZSYApRUSCAMjWamStPjKMvZ8GdvVA5YW/VQNgbFTmcMz6OYmSTJEvIjPrfA==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.2.3.tgz",
|
||||
"integrity": "sha512-KKwCjXYqA8r295uhLnulDXL9yekdXmj2yp2Q0XsBPhxQ2iPuvRE8F43j7g7yexo69wTdmUQmFz15jpderluzUQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"picocolors": "^1.1.1"
|
||||
},
|
||||
"engines": {
|
||||
@@ -133,13 +133,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/is-ignored": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.2.2.tgz",
|
||||
"integrity": "sha512-9UoKNgfFE3LU7FrzierCvk3CdDfMDeVGC86qZiT/n0TIjfq/dmZ9MHuXd45OTNRa26ZanmJRxEtmiXk/lEJihg==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.2.3.tgz",
|
||||
"integrity": "sha512-Ng4nRj/LBAOvc+GQu7bsFW4/fL89LvZ14OOC/ERLbUpnG6QBwWRzY/1oXGwPs3C8YHWjJObin4kLYo2YeEn70w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"semver": "^7.6.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -147,32 +147,32 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/lint": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.2.2.tgz",
|
||||
"integrity": "sha512-Fy8JxEBzdmsYWFude/61GxXu5O+wEymwiRK2z9GL9R8mCsXphCoGxAFc5iHn5mjlfcSrhiiONE+ksf4KOjnaPg==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.2.3.tgz",
|
||||
"integrity": "sha512-lUZcSuVLLEDkhge9ERk8Rp+FXQtrUhCK+h328BFnzKXrTuXGdqiYMEpTlNWdZaOrjyMhMJaz354ZaWEGJxcLeg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/is-ignored": "^21.2.2",
|
||||
"@commitlint/parse": "^21.2.2",
|
||||
"@commitlint/rules": "^21.2.2",
|
||||
"@commitlint/types": "^21.2.0"
|
||||
"@commitlint/is-ignored": "^21.2.3",
|
||||
"@commitlint/parse": "^21.2.3",
|
||||
"@commitlint/rules": "^21.2.3",
|
||||
"@commitlint/types": "^21.2.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/load": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.2.2.tgz",
|
||||
"integrity": "sha512-0Tt6wDPX167cjKC5D4zhm0+20wJJG+TN/TKovMOspfSe78rOnKX+MNzlVNiu6HyQPZChPJ8QBH31MVt6Bb8fCg==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.2.3.tgz",
|
||||
"integrity": "sha512-cDrL8lOo23Lk7knGzQdjbFcq7z2JgvjwV6PhbESVvEc+Fe21MeLjPKBJi8nKjg7j+jh79CVbVSUbZc104thXRw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/config-validator": "^21.2.0",
|
||||
"@commitlint/config-validator": "^21.2.3",
|
||||
"@commitlint/execute-rule": "^21.0.1",
|
||||
"@commitlint/resolve-extends": "^21.2.2",
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/resolve-extends": "^21.2.3",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"cosmiconfig": "^9.0.1",
|
||||
"cosmiconfig-typescript-loader": "^6.1.0",
|
||||
"es-toolkit": "^1.46.0",
|
||||
@@ -194,13 +194,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/parse": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.2.2.tgz",
|
||||
"integrity": "sha512-MEkobPfvRp+z06Wro8HMG1BDGHzZmj82A1LH1nWeG3ipHpg/x4m6v3wEDvMBIKjRFUnfR3nBeFs3MVCr7UdAmg==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.2.3.tgz",
|
||||
"integrity": "sha512-Jt61QpF1xA88damCELe8I0FlDZPSpXNc8IhN7z5kZ0EcDYPjdZ+ZHPvsSXl69r2MIlLnNKeHhOn2cmVpziFE9w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"conventional-changelog-angular": "^9.0.0",
|
||||
"conventional-commits-parser": "^7.0.0"
|
||||
},
|
||||
@@ -209,14 +209,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/read": {
|
||||
"version": "21.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.2.1.tgz",
|
||||
"integrity": "sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.2.3.tgz",
|
||||
"integrity": "sha512-szAepuLA1vTTr7fuudEg7jYyVHudf+FH+vptU91bhxE1WnE8TKrfTAi44HVllz8XpI8Pvp4GjR/iP5Nshgh+og==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/top-level": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"@conventional-changelog/git-client": "^3.0.0",
|
||||
"tinyexec": "^1.0.0"
|
||||
},
|
||||
@@ -225,14 +225,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/resolve-extends": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.2.2.tgz",
|
||||
"integrity": "sha512-RPkJ/IFi7sMUUVbZLqwWFtWw/zRDcfFsmrPSiTMrt5wb7AdxOr86EGQFvmGzef5QKV5IPBWWCujqVTw1RWX44A==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.2.3.tgz",
|
||||
"integrity": "sha512-bqJdmAtXgAQel+l02uIsF7rHgKgx1AGZdGBjam7uK4XW54ZAQtB6XAIUXezYprQiCcRMpBh4fHs5JodXK4mVZA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/config-validator": "^21.2.0",
|
||||
"@commitlint/types": "^21.2.0",
|
||||
"@commitlint/config-validator": "^21.2.3",
|
||||
"@commitlint/types": "^21.2.3",
|
||||
"es-toolkit": "^1.46.0",
|
||||
"global-directory": "^5.0.0",
|
||||
"resolve-from": "^5.0.0"
|
||||
@@ -242,16 +242,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/rules": {
|
||||
"version": "21.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.2.2.tgz",
|
||||
"integrity": "sha512-eplQzyYkBjYB1HyyRj8hkcK11Y9DU9nuBz7uOKEd6NpE9NGDytLFCAnlRE+OoiK/5sHEJsaz2RGhuWBvYzIbNA==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.2.3.tgz",
|
||||
"integrity": "sha512-5+YnI/LuTx3JDl9GjqfP2z9x96M8KKDrd+4jOel/T0L1BB3oAmBlSN8xppf63QsudiVEgR8C0gRoAMrPVrms6g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@commitlint/ensure": "^21.2.0",
|
||||
"@commitlint/ensure": "^21.2.3",
|
||||
"@commitlint/message": "^21.2.0",
|
||||
"@commitlint/to-lines": "^21.0.1",
|
||||
"@commitlint/types": "^21.2.0"
|
||||
"@commitlint/types": "^21.2.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22.12.0"
|
||||
@@ -281,9 +281,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@commitlint/types": {
|
||||
"version": "21.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.2.0.tgz",
|
||||
"integrity": "sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==",
|
||||
"version": "21.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.2.3.tgz",
|
||||
"integrity": "sha512-sGEA473TlCvhCGNoTBY9OXZVWdscIXdGt0dm8EpB+2MRfmt8LNh/X56P/T3nCtEB+eH5qGEa3odphSAoUxSfSQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -972,9 +972,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "26.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.1.tgz",
|
||||
"integrity": "sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==",
|
||||
"version": "26.6.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.4.tgz",
|
||||
"integrity": "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
@@ -1377,9 +1377,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ansi-regex": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
|
||||
"integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
|
||||
"integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -1446,9 +1446,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/basic-ftp": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
|
||||
"integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
|
||||
"version": "6.2.1",
|
||||
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-6.2.1.tgz",
|
||||
"integrity": "sha512-bK67isD+lKq46AU8vNtjvMaT2ZqAOAmNCbxUHlFBRD4k15NWxyEjmaKtZPlgce58So4BNTjITGQOVTjL9y0ECA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -1470,9 +1470,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/bundle-name": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
|
||||
"integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz",
|
||||
"integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1672,9 +1672,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/content-type": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-3.1.0.tgz",
|
||||
"integrity": "sha512-z26wZR7iXahgpSK7XgnB4IbRVmUNSODvsX9qC9TAru7AcWGiqn5YKy+OH3PLRrwyAnewykKhCqnD+VV3a8uT8Q==",
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-3.1.1.tgz",
|
||||
"integrity": "sha512-GW4qUsfFo59d0HbUibDlWv5wPz+vAAcaTWbKIuKCf0JkC7wWkSyf8f13IpXn5JkeMlB2P8iTSSIjwXljorg2vA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -2093,9 +2093,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/exsolve": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
|
||||
"integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.3.tgz",
|
||||
"integrity": "sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -2124,9 +2124,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/fast-uri": {
|
||||
"version": "3.1.7",
|
||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz",
|
||||
"integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==",
|
||||
"version": "3.1.8",
|
||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
|
||||
"integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -2189,9 +2189,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/get-east-asian-width": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
|
||||
"integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz",
|
||||
"integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -2355,9 +2355,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ip-address": {
|
||||
"version": "10.7.0",
|
||||
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz",
|
||||
"integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==",
|
||||
"version": "10.7.3",
|
||||
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.3.tgz",
|
||||
"integrity": "sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -3316,9 +3316,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/string-width": {
|
||||
"version": "8.2.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
|
||||
"integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
|
||||
"version": "8.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz",
|
||||
"integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -3439,9 +3439,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "7.29.0",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
|
||||
"integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
|
||||
"version": "7.29.1",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz",
|
||||
"integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -3590,9 +3590,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/yargs": {
|
||||
"version": "18.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz",
|
||||
"integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==",
|
||||
"version": "18.2.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz",
|
||||
"integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
||||
+9
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wealth-ledger-specs",
|
||||
"version": "0.1.2",
|
||||
"version": "0.1.3",
|
||||
"private": true,
|
||||
"engines": {
|
||||
"node": "24.21.0"
|
||||
@@ -9,7 +9,8 @@
|
||||
"verify": "git diff --check",
|
||||
"release:preview": "release-it --dry-run --ci",
|
||||
"release:prepare": "release-it --ci",
|
||||
"commitlint": "commitlint"
|
||||
"commitlint": "commitlint",
|
||||
"prepare": "git config core.hooksPath .githooks"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "21.2.2",
|
||||
@@ -17,5 +18,11 @@
|
||||
"@release-it/conventional-changelog": "12.0.0",
|
||||
"conventional-changelog-conventionalcommits": "10.4.0",
|
||||
"release-it": "21.0.2"
|
||||
},
|
||||
"overrides": {
|
||||
"release-it": {
|
||||
"basic-ftp": "6.2.1",
|
||||
"undici": "7.29.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user