OData babel плагин

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!


Статья описывает трансляцию кода TypeScript в OData запросы во время компиляции программы.
Плагин babel-plugin-ts2odata выполняет разбор JavaScript AST с помощью библиотеки TsToOdata описание которой в моей предыдущей статье Типизированные запросы OData в TypeScript.


Недостатком первой версии библиотеки TsToOdata являлось наличие зависимостей на пакеты babel/parser, babel/traverse, разбор JavaScript кода во время выполнения тоже было достаточно затратным. Теперь эти зависимости и разбор кода вынесены в отдельный пакет ts2odata-babel. Для разработки можно использовать пакет ts2odata который имеет devDependencies на ts2odata-babel и выполняет трансляцию запросов во время выполнения, а для релиза можно использовать сборку с подключением плагина, который выполнит всю работу во время компиляции вашего проекта. В результате работы плагина в вашей программе останутся только две зависимости на пакеты ts2odata и cross-fetch.


Для начала работы нужно установить пакеты:


npm install --save-dev @babel/core @babel/cli
npm install ts2odata
npm install --save-dev babel-plugin-ts2odata

Добавить в корень проекта файл babel.config.js:


module.exports = {
    plugins: [
        [
            'babel-plugin-ts2odata',
            {
                odataNamespace: 'OdataToEntity.Test.Model'
            }
        ]
    ]
};

ключ odataNamespace необходим для правильной трансляции запросов если ваш OData сервис не поддерживает перечисления без пространства имен (Namespace).


Добавить в секцию scripts файла package.json:


"build": "tsc --build && npx babel ./source --out-dir ./lib"

где source папка с исходным кодом TypeScript, lib папка с обработанным плагином JavaScript кодом.


Например код на TypeScript:


let price = 2.1;
let orders = context.Orders.filter(o => o.Items.every(i => i.Price >= price), { price })
    .select(i => { return { orderYear: i.Date.getFullYear() } }).toArrayAsync();

Транслируется в:


let price = 2.1;
let orders = context.Orders.filter("Items/all(d:d/Price ge {price})", {
  price
}).select("[{\"expression\":\"year(Date)\",\"alias\":\"orderYear\",\"kind\":1}]").toArrayAsync();

Другие примеры работы плагина можно посмотреть в папке с тестами, где файл code.js результат компиляции файла QueryTests.ts, а файл output.js результат работы плагина.
Работа плагина была проверена на проекте vue.js.


Это мой первый проект на TypeScript, поэтому буду признателен замечаниям и комментариям к коду, возможно, что-то можно было сделать проще или правильнее.

Источник: https://habr.com/ru/post/497928/


Интересные статьи

Интересные статьи

Одна из самых важных (на мой взгляд) функций в Битрикс24 это бизнес-процессы. Теоретически они позволяют вам полностью избавиться от бумажных служебок и перенести их в эл...
Традиционно запросы OData к данным выражаются в виде простых строк без проверки типов при компиляции или без поддержки IntelliSense, кроме того, разработчику приходится изучать синтаксис языка ...
Много всякого сыпется в мой ящик, в том числе и от Битрикса (справедливости ради стоит отметить, что я когда-то регистрировался на их сайте). Но вот мне надоели эти письма и я решил отписатьс...
Если в вашей компании хотя бы два сотрудника, отвечающих за работу со сделками в Битрикс24, рано или поздно возникает вопрос распределения лидов между ними.
«Битрикс» — кошмар на костылях. Эта популярная характеристика системы среди разработчиков и продвиженцев ныне утратила свою актуальность.