Plugin OData babel


L'article décrit la traduction du code TypeScript en requêtes OData lors de la compilation du programme.


Le plugin babel-plugin-ts2odata analyse JavaScript AST à l'aide de la bibliothèque TsToOdata, dont la description dans mon article précédent, Requêtes OData typées dans TypeScript .


L'inconvénient de la première version de la bibliothèque TsToOdata était la présence de dépendances sur les packages babel/ parser, babel/ traverse, l'analyse du code JavaScript à l'exécution était également assez cher. Maintenant, ces dépendances et l'analyse de code sont effectuées dans un package ts2odata-babel distinct . Pour le développement, vous pouvez utiliser le package ts2odata qui a devDependencies sur ts2odata-babel et effectue la traduction des requêtes au moment de l'exécution, et pour la publication, vous pouvez utiliser l'assembly avec un plug-in qui fera tout le travail pendant la compilation de votre projet. Grâce au plugin, votre programme n'aura que deux dépendances sur les packages ts2odata et cross-fetch .


Pour commencer, vous devez installer les packages:


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

Ajoutez le fichier babel.config.js à la racine du projet:


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

la clé odataNamespace est nécessaire pour la traduction correcte des demandes si votre service OData ne prend pas en charge les énumérations sans espace de noms (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();

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