OData Babel Plugin


Der Artikel beschreibt die Übersetzung von TypeScript-Code in OData-Abfragen während der Programmkompilierung.


Das Plugin babel-plugin-ts2odata analysiert JavaScript AST mithilfe der TsToOdata- Bibliothek , deren Beschreibung in meinem vorherigen Artikel Typed OData-Abfragen in TypeScript enthält .


Der Nachteil der ersten Version der TsToOdata-Bibliothek war das Vorhandensein von Abhängigkeiten von Paketen babel/ parser, babel/ traverse Das Parsen von JavaScript-Code zur Laufzeit war ebenfalls recht teuer. Jetzt werden diese Abhängigkeiten und das Parsen von Code in einem separaten ts2odata-babel- Paket durchgeführt . Für die Entwicklung können Sie das ts2odata-Paket verwenden, das devDependencies von ts2odata-babel aufweist und zur Laufzeit die Übersetzung von Anforderungen durchführt. Für die Freigabe können Sie die Assembly mit einem Plug-In verwenden, das die gesamte Arbeit während der Kompilierung Ihres Projekts erledigt. Aufgrund des Plugins hat Ihr Programm nur zwei Abhängigkeiten von den Paketen ts2odata und cross-fetch .


Um zu beginnen, müssen Sie die Pakete installieren:


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

Fügen Sie die Datei babel.config.js zum Projektstamm hinzu:


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

Der Schlüssel odataNamespace ist für die korrekte Übersetzung von Anforderungen erforderlich, wenn Ihr OData-Dienst keine Aufzählungen ohne Namespace (Namespace) unterstützt.


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();

OData :


http://localhost:5000/Orders?$filter=Items/all(d:d/Price+ge+2.1)&$compute=year(Date)+as+orderYear

, code.js QueryTests.ts, output.js .
vue.js.


TypeScript, , , - .


All Articles