Библиотека не решает, как долго пользователю доступно undo. Хранение явно включается и полностью контролируется приложением.
Сохранить удалённый узел
const operation = effects.remove(element, {
retain: true,
});
await operation.finished;
const id = operation.removalId;
При retain: true отсоединённый оригинал хранится во внутреннем Map под непрозрачным RemovalId. Библиотека не перемещает его в скрытый контейнер или DocumentFragment.
Забрать и восстановить
take(id) одновременно возвращает узел и удаляет сильную ссылку из хранилища.
if (id) {
const retained = effects.take(id);
if (retained) {
destination.append(retained);
effects.restore(retained);
}
}
Приложение выбирает append, prepend, before или метод фреймворка. Библиотека работает уже с получившейся геометрией.
Освободить без восстановления
effects.discard(removalId); // boolean
effects.discardAll(); // количество освобождённых записей
destroy() также очищает всё хранилище.
Контроль памяти
TTL и лимита записей намеренно нет: библиотека не удаляет контент за пользователя. Поэтому каждый неиспользованный ID нужно забрать через take(), освободить через discard() либо очистить вместе с остальными через discardAll().
Условие задаёт приложение: закрытие undo-toast, смена маршрута, фиксация истории или любое другое бизнес-событие.
Удалить навсегда
effects.remove(element); // retain: false по умолчанию
После завершения ни объект операции, ни хранилище библиотеки не удерживают элемент.