
Единственный нормальный детектор копипасты требовал JVM. Поэтому я написал свой
BaryshevRS 13 минут назад Единственный нормальный детектор копипасты требовал JVM. Поэтому я написал свой Простой 6 мин 190 TypeScript * JavaScript * Angular * VueJS * ReactJS * Туториал Копипаста относится к самым...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: BaryshevRS 13 минут назад Единственный нормальный детектор копипасты требовал JVM. Поэтому я написал свой Простой 6 мин 190 TypeScript * JavaScript * Angular * VueJS * ReactJS * Туториал Копипаста относится к самым незаметным и живучим видам технического долга. Стиль проверяет линтер, типы проверяет tsc, поведение проверяют тесты.
А скопированный из соседнего модуля кусок бизнес-логики, чуть подправленный и забытый, спокойно уезжает в main. С этого момента любой баг в нём приходится чинить дважды, только никто об этом не помнит. Для этого есть PMD CPD (Copy-Paste Detector).
Технические детали
Он сравнивает не строки, а поток токенов, поэтому не ломается от форматирования, переносов и прочего шума. Чтобы найти копипасту в TypeScript-проекте, нужно притащить в CI JVM и дистрибутив PMD. Во frontend-пайплайне, где всё остальное ставится одной строкой в package.
json, это чемодан без ручки. Вторая проблема серьёзнее: PMD не видит фронтенд. Vue-, Svelte- и Angular-шаблонов для него не существует, а копипасты там хватает.
А инструментов уровня PMD в npm-экосистеме не было вовсе. Так что я написал свой: clone-alert. Это детектор копипасты уровня PMD CPD для TypeScript, JavaScript, JSX/TSX, Vue, Svelte и Angular: обычный npm-пакет с одной runtime-зависимостью (typescript), без JVM, без бинарников.
Отраслевые последствия
Внутри лежит портированный алгоритм PMD, оптимизированный под JS, а не переписанный по мотивам. Что это правда порт, а не что-то похожее, проверяют тесты против собственных фикстур PMD. Скорость не была целью, но она стала приятным бонусом: на реальных репозиториях в 10-27 раз быстрее PMD и держит пик памяти в 1.
6 раза ниже (на моём железе). Как он ищетПайплайн классический для токенного CPD:Каждый файл превращается в поток лексических токенов. По окнам фиксированной длины (--minimum-tokens, по умолчанию 50) считается rolling hash Карпа-Рабина.
Окна с одинаковым хешем группируются, портированный из PMD MatchCollector расширяет совпадения, отбрасывает вложенные и самопересекающиеся и оставляет максимальные дубли. Поскольку сравниваются токены, а не текст, детектору всё равно, как код отформатирован, где стоят переносы и сколько наставлено пробелов. Ядро при этом вообще не знает, что такое TypeScript или Vue: оно получает поток токенов и ищет повторяющиеся последовательности.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





