Comments 15
Как "спортивный" проект для уменьшения размера — выглядит очень неплохо. Жалко только, что достигается это ухудшением developer experience:
Хорошие библиотеки валидации возвращают ошибки с приятным сообщением(...). От этой чудесной фичи я сразу же отказался.
Зачем нужен тип
literal(42)
, еслиenums([42])
делает то же самое?
Зачем делать
throw new TypeError('Invalid Banditype')
, если можно просто вызвать строку,'bad banditype'()
, и ошибка всё равно вылетит?
И, потенциально, за счет ухудшения возможностей для оптимизатора:
Трюк, которым я горжусь: вместо серии
raw => typeof raw === 'string' ? raw : fail()
я придумал типlike = tag => raw => typeof raw === typeof tag ? raw : fail()
.
А я честно скажу, что сделал проект вдогонку к BanditStash — библиотеке для работы с localStorage. Для кейса "проверить, не битые ли данные в сторадже" детальной ошибки не нужно, просто игнорируй битые данные. Для валидации форм или (тем более) параметров АПИ, конечно, нужна библиотека с нормальным фидбеком. Каждой проблеме — своё решение.
Тип literal удалил из двух соображений — во-первых, на практике редко подходит только одно значение (зачем его вообще хранить)? Во-вторых, всегда можно создать пользовательский тип literal = <T extends string>(v: T) => enums([v]);
На бенчмарках banditypes — одна из самых быстрых библиотек без кодогенерации, так что аргумент про оптимизатор не принимается) К тому же валидация — вряд ли невероятно горячий код, так что по перформансу я не заморачивался.
Вы недооцениваете оптимизатор ;) В like()
уйдет константа, а значит typeof tag
тоже станет константой. Оптимизатор легко с таким справляется.
Круто! Мне нравятся маленькие библиотеки. Но map
это плохое название для метода. Не то, что в js под map
подразумевается.
Заодно придумал оригинальный способ измерения размера библиотеки на основе тестового приложения
Спасибо!
Мне второй раз предъявляют за map
, но мне нравится это название — отображение же! (возможно, конформные отображения сломали мне мозг) В голом JS под map подразумевается не только то, что вы подумали, но еще и ассоциативный массив Map
. В TS есть mapped types, который совсем не про массивы. В rx есть map, и ничего, как-то живут. В общем, если подойти достаточно абстрактно, всё есть map)
size-limit конечно лучше чем жать голый UMD, но мы всё ещё измеряем один бандл, а не разницу с пустым приложением, так что EOCD и непрогретый gzip остаются. К тому же завязка на вебпак, который инжектит свой рантайм — я что-то уже не хочу к нему приближаться вообще
Все же Map и mapped types это совсем другое, чем вызов метода. Сmap
в rxjs как раз все хорошо: это обработка элемента последовательности. А вот по примеру из readme библиотеки array(number()).map(...
я бы никогда не подумал, что в аргумет map уйдет массив, а не элемент. Это плохой UX, будет сбивать тех, кто не знаком с библиотекой. Прям очень плохой.
Советую поменять до 1.0.0 версии.
К тому же завязка на вебпак,
Там в `preset-small-lib` используется esbuild
При чём здесь какая-то схема? Вот любят нынче понапихать умных слов в самые обыденные вещи. Смотрю заголовок, думаю: что ещё за валидация схем такая? А это оказывается просто валидация данных... или я что-то не понимаю? )
Чтобы прокачать маленькость в js можно посмотреть трюки, которые авторы https://js1024.fun/ используют. Или самому поучаствовать и в дискорде ихнем пообщаться.
Эло это ваш con fn = () =>. Понимаю использовать в как временную функцию, но не как название экспортируемой функции. Потом весь код в стактоейсе состоит из anonymous…
Я, пожалуй, предпочту библиотеку где функции создают правильно.
В спецификации со времён ES6 есть специальное поручение (12.14.4.1.e.iii) в такой ситуации доставать name
функции из имени переменной (и из многих других мест, ищется по SetFunctionName
).
И это легко проверить
А в минифицированном коде имена и функций, и переменных, обфусцируются и ориентироваться в любом случае придется по line:column
Предпочитать любые библиотеки по любому критерию, разумеется, базовое право каждого человека.
Почему Banditypes — самая маленькая TS-библиотека для валидации схем