Миграция на 1.0
1.0 убирает все deprecated-алиасы, накопленные тремя переименованиями и раундами полировки API. Одно имя на понятие — больше ничего не меняется: семантика, транзакционные гарантии и производительность ровно те же, что в 0.19.
Codemod
Почти вся миграция механическая. Из корня проекта:
node node_modules/@continuum-js/frp/../../scripts/codemod-1.0.mjs src
# или скопируйте scripts/codemod-1.0.mjs из репозитория ContinuumСкрипт переписывает все механические переименования на месте и печатает предупреждения с инструкциями для немногих мест, где нужен человек (меняется порядок аргументов). Закоммитьтесь до запуска; просмотрите дифф после.
Переименовано — механика
| До 1.0 | 1.0 |
|---|---|
Wire<A> / Behavior<A> | State<A> |
wire(init) | state(init) |
WireSource<A> | StateSource<A> |
Event<A> | Stream<A> |
newEvent() | newStream() |
e.gate(b) | e.when(b) |
ea.orElse(eb) | ea.or(eb) |
Wire.switchB(w) | flatten(w) |
Wire.switchE(w) | flatten(w) |
distinctB(b, eq?) (std) | dedupe(b, eq?) |
Сменилась форма — нужен человек
| До 1.0 | 1.0 |
|---|---|
const [b, set] = newBehavior(x) | const b = state(x) — одно значение; запись через b.set |
e.snapshot(b, f) | b.at(e, (value, event) => f(event, value)) — данные первыми |
Wire.lift2(f, a, b) | combine(a, b, f) |
Wire.lift3(f, a, b, c) | combine(a, b, c, f) |
Wire.apply(bf, ba) | combine(bf, ba, (f, a) => f(a)) |
Однострочную деструктуризацию newBehavior codemod конвертирует сам, остальное — флагует.
Почему такие имена
История имён — и мотивы каждого переименования — рассказаны в Истории. Коротко: Event читался как одно происшествие и конфликтовал с DOM Event; Behavior — теоретический жаргон; метафору Wire никто не узнавал. state — слово, которым вы уже думаете.