UNPKG

@odata2ts/odata2ts

Version:

Flexible generator to produce various TypeScript artefacts (from simple model interfaces to complete odata clients) from OData metadata files

91 lines 4.9 kB
import { __awaiter } from "tslib"; import { ODataVersions } from "@odata2ts/odata-core"; import { pascalCase } from "change-case"; import { digest as digestV2 } from "./data-model/DataModelDigestionV2.js"; import { digest as digestV4 } from "./data-model/DataModelDigestionV4.js"; import { NamingHelper } from "./data-model/NamingHelper.js"; import { generateModels, generateQueryObjects, generateServices } from "./generator/index.js"; import { Modes } from "./OptionModel.js"; import { createProjectManager } from "./project/ProjectManager.js"; function isQObjectGen(mode) { return [Modes.qobjects, Modes.service, Modes.all].includes(mode); } function isServiceGen(mode) { return [Modes.service, Modes.all].includes(mode); } function getServiceName(options, schemas) { if (options.serviceName) { return options.serviceName; } // auto-detection of first namespace with defined EntityTypes // NOTE: we make use of PascalCase here to enforce valid class names const detectedSchema = schemas.find((schema) => { var _a; return schema.$.Namespace && ((_a = schema.EntityType) === null || _a === void 0 ? void 0 : _a.length); }) || schemas[0]; const serviceName = detectedSchema.$.Namespace; return pascalCase(serviceName); } /** * * @param metadataJson metadata of a given OData service already parsed as JSON * @param options further options */ export function runApp(metadataJson, options) { return __awaiter(this, void 0, void 0, function* () { // determine edmx edmxVersion attribute const edmxVersion = metadataJson["edmx:Edmx"].$.Version; const version = edmxVersion === "1.0" ? ODataVersions.V2 : ODataVersions.V4; const dataService = metadataJson["edmx:Edmx"]["edmx:DataServices"][0]; const schemas = dataService.Schema; const serviceName = getServiceName(options, schemas); const namespaces = schemas.map((schema) => [schema.$.Namespace, schema.$.Alias]); // encapsulate the whole naming logic const namingHelper = new NamingHelper(options, serviceName, namespaces); // parse model information from edmx into something we can really work with // => that stuff is called dataModel! const dataModel = version === ODataVersions.V2 ? yield digestV2(dataService.Schema, options, namingHelper) : yield digestV4(dataService.Schema, options, namingHelper); // Validation of entity names: the same name might be used across different namespaces const validationErrors = dataModel.getNameValidation(); if (validationErrors.size) { console.log("---"); validationErrors.forEach((errors, name) => { console.log(`Duplicate name: ${name} - Fully Qualified Names: ${errors .map((error) => error.fqName + (error.renamedTo ? ` (renamed to: ${error.renamedTo})` : "")) .join(", ")}`); }); if (options.disableAutomaticNameClashResolution) { throw new Error("Name validation failed: Multiple entities have the same name across different namespaces!"); } } // handling the overall generation project const project = yield createProjectManager(options.output, options.emitMode, namingHelper, dataModel, { usePrettier: options.prettier, tsConfigPath: options.tsconfig, bundledFileGeneration: options.bundledFileGeneration, allowTypeChecking: options.debug, }); // const promises: Array<Promise<void>> = [ // Generate Model Interfaces // generateModels(project, dataModel, version, options, namingHelper), // ]; yield generateModels(project, dataModel, version, options, namingHelper); console.log("Successfully generated models!"); // Generate Query Objects // supported edmx types: EntityType, ComplexType // supported edmx prop types: primitive types, enum types, primitive collection (incl enum types), entity collection, entity object, complex object if (isQObjectGen(options.mode)) { // promises.push(generateQueryObjects(project, dataModel, version, options, namingHelper)); yield generateQueryObjects(project, dataModel, version, options, namingHelper); console.log("Successfully generated q-objects!"); } // Generate Individual OData-Service if (isServiceGen(options.mode)) { // promises.push(generateServices(project, dataModel, version, namingHelper, options)); yield generateServices(project, dataModel, version, namingHelper, options); console.log("Successfully generated services!"); } // await Promise.all(promises); console.log("Successfully finished!"); }); } //# sourceMappingURL=app.js.map