Насколько я помню, у cloudflare свой рантаим для js, он отличается от годы(хотя апи такое же). Проверьте, точно ли у вас года запускается, или это косяк cloudflare
из-за того, что там очень много работы с типами, то мы ожидаем именно числа как константы(конкретные числа). Если привести тип как число(as number) - то будет ошибка валидации. Пока не нашел решения как это побороть.
Наверное пример не самый удачный подобрал. Имелось ввиду что если кастить к числу, то поплывет валидация. Несмотря на то, что числа будут правильны.
const after2 = s.string.minLength(3).maxLength(5 as number) // RangeError: MinLength = 3, maxLength = number
// ^ inline cast to number
Затем, что после валидации у нас должен возвращаться в тип, который мы описали. Например объект, который мы можем назвать "myObjSchema", должен будет сказать какой тип у этой переменной. Как минимум - это удобно, тк не нужно дублировать тип и схему, достаточно описать схему, тип уже будет валидным.
const myObjSchema = s.object({
a: s.number(),
b: s.string()
})
const parsed = myObjSchema.parse(data)
type P = typeof parsed // {a: number, b: string}
function doSmth(obj: P) {
// работа с уже валидным объектом тк до этого был вызван parse
}
doSmth(parsed)
для чего вы делали тогда SchemaBuilder, который строит json схему в рантайме?
Для того, чтобы создавать схемы простыми функциями, просто и декларативно. Думал, что это очевидно. ?
Плюс, мы не валидируем схему, это делает ajv. Мы же строим ее для того, чтобы отдать схему потом самому ajv.
Не натыкались на это решение, в любом случае она не подходила, тк у нас уже есть json-schema написанные в обычном объекте. Повторюсь, у нас уже использовался ajv для валидации до того как мы написали данное решение. Плюс мы работаем с реальной схемой, в любой момент можно вызвать свойство schema и работать с полученным объектом напямую, и никаких кастомных компиляторов не надо :)
Все так. По поводу openAPI. у нас не так чтобы прям advanced схемы. тип int32, nullable и что-то еще(не помню что) поддерживается самим ajv и нареканий нет (хотя после вашего коментария уже начал сомневаться).
P.S. можно у нас также создать билдер со своим ajv инстансом, в случае если стандартный не подходит, потому-что не мы валидируем схему, а ajv
import {create} from 'ajv-ts'
import customAjv from 'ajv-from-somePackage'
const s = create(customAjv(/** opts */))
// ваши схемы
как уже было написано в статье, у нас уже был ajv и тянуть еще один пакет для деклараций одного и того же быть бы слишком, к тому же у зода есть типы которые не поддерживаются в JSON-Schema (function, symbol, Map, Set) Аналоги валидации(и построения) схем кроме зода есть:
Потому что как правило трейдинговые терминалы под капотом используют другие немного технологии например протокол фикс. Который используется для передачи финансовых данных между биржами. Поэтому узким местом является именно скорость работы биржи с которой ведутся торги, а не сам http2 протокол.
Интересная статья. Хотелось бы еще узнать как у вас обстоят дела с автоматизацией? Как именно TMS реагирует на то что сценарий автоматизирован(руками или по скрипту)?
Интересная статья показывающая варианты использования отмены промисов. Единственное замечание - это то что если промис отменить то node.js(предполагаю что в браузере анологичное поведение) удалит промис из call stack и еще и удалит ссылку на выполнение. Это значит, что мы экономим память приложению тк явно показываем GC что данный блок кода уже неактуален
1) работа с предусловиями скорее всего будет реализована как система “компонентов”. Т.е. пользователь 1 раз проходит по, например логину. А затем будет возможность объеденить в “компонент логин”. Тут много пограничных случаев надо продумывать, поэтому только мысли.
2) Работает условно - page.screenshot() . Возможности сравнивать скриншоты пока что нет между собой.
3) Репо не пуст. Поскольку участники данного проекта не готовы выставить код на всеобщее обозрение в опен сорс, то ссылка ведет на публичный issue tracker.
позвольте придраться к ответу. Все еще не понятно что по вашему "SearchModal". т.к. данный класс не наследует ни component ни page. хотя сигнатура конструктора там от page, но по здравой логике это должен быть component
Спасибо за статью, хотелось бы оставить несколько замечаний:
Обратите внимание, что все автотесты будут писаться через async, await, т.к. это единственный возможный способ для playwright. В других фреймворках может быть иначе.
Не единственный, ведь можно писать тесты с использованием чепочки промисов(Promise chaining), хоть это и не очень удобно. Или если не нравится использовать async/await можно использовать c++ библиотеки которые изменяют логику работы async/await в синхронный режим. Этим страдал webdriverio ver.6, когда разработчики выпустили синхронный режим через враппер библиотеки fibers.
В примере модального окна "SearchModal" - данный класс не наследует ни компонент ни страницу, хотя входные параметры такие же как у страницы. Что по вашему Page а что Component?
Не раскрыты понятия что такое Page, PageFactory и Component. Как, зачем и как их использовать и почему, в чем их преимущества и недостатки. Особенно это касается PageFactory которая только вначале присутствует а что это и зачем не понятно.
TS позволяет инициализировать поля вне конструктора, что уменьшит кол-во строк, но для этого надо сделать добавить параметру page модификатор доступа
import {Page} from 'playwright'; // или из @playwright/test
import {BasePage} from './base.page';
// остальная пачка импортов
class MyPage extends BasePage {
readonly myTitle = new Title({page: this.page, locator: '#qwe'});
constructor(public readonly page: Page){} // конструктор пуст
}
зачем у абстрактного класса поле "typeOf" которое всегда переопределяется у других компонентов? может лучше было оставить поле typeOf абстрактным?
"typeOfUpper" -используется только для test.step. как по мне - не стоит раздувать кол-во функции и свойств лишний раз, это касается и "сomponentName". Зачем лишняя проверка если вы и так не сможете создать ваш компонент без поля name(таипскрипт об этом позаботится и выкинет ошибку)
Ваш ответ отличается от того, что будет в реальности. Если внимательно посмотреть на документацию к node.js в раздел про то как резолвятся зависимости из node_modules можно понять, что будет взят фаил исполняемый из "main" или "exports" package.json файла. Это значит, что если проект фронтедовский - там уже наверняка есть сборщик, который сминифицирует код как надо(например вебпак). Если проект на ноде, то с вероятностью 90% код не надо минифицировать, а если и надо, то скорее всего что-то не так и проблема в другом.
Получается Ваша статья лишена смысла, поскольку заниматься минифицированием это:
1) себе дороже, неблагодарный труд, особенно если библиотека и для node.js и для браузера
2) сборщик и так сминифицирует код (зачем дважды делать одно и тоже)
Тогда вопрос на засыпку. Вы написали библиотеку, сделали 2 сборки. dev и prod. Я как разработчик нашел вашу либу, по функционалу все круто, то что я искал. Пишу `<пакертный менеджер установи либу>`. А затем импортирую в свой проект.
получится как-то так:
// src/index.ts
import something from 'yourlib';
/// rest code
Как разработчик на Node.JS, иногда во время дебага приходится лазить в исходники других npm пакетов, чтобы понять что условно результат устраивает меня(да, гипотечески это решается тестированием, но от багов никто не застрахован). В таком случае достаточно будет перейти в github и там создать issue на функционал либы. Плюс если пользуетесь yarn,pnpm пакетными менеджерами у них есть функционал по патчингу пакетов что позволяет не ждать фикса вашего любимого\критически важного пакета. Минификация в этом случае будет наоборот мешать вам инспектировать проблему другой либы.
Сейчас нынче модный playwright. Которой кстати портирован(с переменным успехом) на puthon, java, .net https://playwright.dev/ те же яйца только в профиль, ИМХО
Насколько я помню, у cloudflare свой рантаим для js, он отличается от годы(хотя апи такое же). Проверьте, точно ли у вас года запускается, или это косяк cloudflare
из-за того, что там очень много работы с типами, то мы ожидаем именно числа как константы(конкретные числа). Если привести тип как число(
as number
) - то будет ошибка валидации. Пока не нашел решения как это побороть.Наверное пример не самый удачный подобрал.
Имелось ввиду что если кастить к числу, то поплывет валидация. Несмотря на то, что числа будут правильны.
Затем, что после валидации у нас должен возвращаться в тип, который мы описали. Например объект, который мы можем назвать "myObjSchema", должен будет сказать какой тип у этой переменной. Как минимум - это удобно, тк не нужно дублировать тип и схему, достаточно описать схему, тип уже будет валидным.
Для того, чтобы создавать схемы простыми функциями, просто и декларативно. Думал, что это очевидно. ?
Плюс, мы не валидируем схему, это делает ajv. Мы же строим ее для того, чтобы отдать схему потом самому ajv.
Не натыкались на это решение, в любом случае она не подходила, тк у нас уже есть json-schema написанные в обычном объекте. Повторюсь, у нас уже использовался ajv для валидации до того как мы написали данное решение. Плюс мы работаем с реальной схемой, в любой момент можно вызвать свойство schema и работать с полученным объектом напямую, и никаких кастомных компиляторов не надо :)
Смотрели, не выбрали тк нам надо из имеющейся схемы создавать типы для ts а не наоборот
Все так. По поводу openAPI. у нас не так чтобы прям advanced схемы. тип int32, nullable и что-то еще(не помню что) поддерживается самим ajv и нареканий нет (хотя после вашего коментария уже начал сомневаться).
P.S. можно у нас также создать билдер со своим ajv инстансом, в случае если стандартный не подходит, потому-что не мы валидируем схему, а ajv
как уже было написано в статье, у нас уже был ajv и тянуть еще один пакет для деклараций одного и того же быть бы слишком, к тому же у зода есть типы которые не поддерживаются в JSON-Schema (function, symbol, Map, Set)
Аналоги валидации(и построения) схем кроме зода есть:
joi
yup
runtypes
io-ts
можете посмотреть тренды этих валидаций, ajv несомненный лидер https://npmtrends.com/ajv-vs-joi-vs-yup-vs-zod
Потому что как правило трейдинговые терминалы под капотом используют другие немного технологии например протокол фикс. Который используется для передачи финансовых данных между биржами. Поэтому узким местом является именно скорость работы биржи с которой ведутся торги, а не сам http2 протокол.
Интересная статья. Хотелось бы еще узнать как у вас обстоят дела с автоматизацией? Как именно TMS реагирует на то что сценарий автоматизирован(руками или по скрипту)?
Интересная статья показывающая варианты использования отмены промисов. Единственное замечание - это то что если промис отменить то node.js(предполагаю что в браузере анологичное поведение) удалит промис из call stack и еще и удалит ссылку на выполнение. Это значит, что мы экономим память приложению тк явно показываем GC что данный блок кода уже неактуален
извиняюсь что ввел в заблуждение, исправил это в статье
Спасибо за комментарий.
1) работа с предусловиями скорее всего будет реализована как система “компонентов”. Т.е. пользователь 1 раз проходит по, например логину. А затем будет возможность объеденить в “компонент логин”. Тут много пограничных случаев надо продумывать, поэтому только мысли.
2) Работает условно -
page.screenshot()
. Возможности сравнивать скриншоты пока что нет между собой.3) Репо не пуст. Поскольку участники данного проекта не готовы выставить код на всеобщее обозрение в опен сорс, то ссылка ведет на публичный issue tracker.
позвольте придраться к ответу. Все еще не понятно что по вашему "SearchModal". т.к. данный класс не наследует ни component ни page. хотя сигнатура конструктора там от page, но по здравой логике это должен быть component
Спасибо за статью, хотелось бы оставить несколько замечаний:
Не единственный, ведь можно писать тесты с использованием чепочки промисов(Promise chaining), хоть это и не очень удобно. Или если не нравится использовать async/await можно использовать c++ библиотеки которые изменяют логику работы async/await в синхронный режим. Этим страдал webdriverio ver.6, когда разработчики выпустили синхронный режим через враппер библиотеки fibers.
В примере модального окна "SearchModal" - данный класс не наследует ни компонент ни страницу, хотя входные параметры такие же как у страницы. Что по вашему Page а что Component?
Не раскрыты понятия что такое Page, PageFactory и Component. Как, зачем и как их использовать и почему, в чем их преимущества и недостатки. Особенно это касается PageFactory которая только вначале присутствует а что это и зачем не понятно.
TS позволяет инициализировать поля вне конструктора, что уменьшит кол-во строк, но для этого надо сделать добавить параметру page модификатор доступа
зачем у абстрактного класса поле "typeOf" которое всегда переопределяется у других компонентов? может лучше было оставить поле typeOf абстрактным?
"typeOfUpper" - используется только для test.step. как по мне - не стоит раздувать кол-во функции и свойств лишний раз, это касается и "сomponentName". Зачем лишняя проверка если вы и так не сможете создать ваш компонент без поля name(таипскрипт об этом позаботится и выкинет ошибку)
Ваш ответ отличается от того, что будет в реальности. Если внимательно посмотреть на документацию к node.js в раздел про то как резолвятся зависимости из node_modules можно понять, что будет взят фаил исполняемый из "main" или "exports" package.json файла. Это значит, что если проект фронтедовский - там уже наверняка есть сборщик, который сминифицирует код как надо(например вебпак). Если проект на ноде, то с вероятностью 90% код не надо минифицировать, а если и надо, то скорее всего что-то не так и проблема в другом.
Получается Ваша статья лишена смысла, поскольку заниматься минифицированием это:
1) себе дороже, неблагодарный труд, особенно если библиотека и для node.js и для браузера
2) сборщик и так сминифицирует код (зачем дважды делать одно и тоже)
Тогда вопрос на засыпку. Вы написали библиотеку, сделали 2 сборки. dev и prod.
Я как разработчик нашел вашу либу, по функционалу все круто, то что я искал. Пишу `<пакертный менеджер установи либу>`. А затем импортирую в свой проект.
получится как-то так:
Вопрос. Какая тут сборка будет: dev или prod?
Согласен, вставлю свои 5 копеек.
Как разработчик на Node.JS, иногда во время дебага приходится лазить в исходники других npm пакетов, чтобы понять что условно результат устраивает меня(да, гипотечески это решается тестированием, но от багов никто не застрахован). В таком случае достаточно будет перейти в github и там создать issue на функционал либы. Плюс если пользуетесь yarn,pnpm пакетными менеджерами у них есть функционал по патчингу пакетов что позволяет не ждать фикса вашего любимого\критически важного пакета. Минификация в этом случае будет наоборот мешать вам инспектировать проблему другой либы.
странно, что никто не пришел и не показал mermaid-js. Eго умеет рендерить сам github, и тем самым дизайн документ сервисов оформлять и ложить под гит.
по поводу улучшения второго пункта, наверное не знали о такой вещи как mermaid. просто сам github использует его для отображения подобного рода диаграмм https://mermaid-js.github.io/mermaid/#/sequenceDiagram
Сейчас нынче модный playwright. Которой кстати портирован(с переменным успехом) на puthon, java, .net
https://playwright.dev/
те же яйца только в профиль, ИМХО