@odata2ts/odata2ts
Version:
Flexible generator to produce various TypeScript artefacts (from simple model interfaces to complete odata clients) from OData metadata files
97 lines • 3.74 kB
JavaScript
import { TypeModel } from "../../TypeModel.js";
export class NameClashValidator {
constructor(options = {}) {
this.options = options;
this.entityContainer = new Map();
this.store = new Map();
this.errors = new Map();
}
addToError(name, hit, validationObject) {
var _a;
const existingErrors = this.errors.get(name);
if (existingErrors) {
if (!this.options.disableAutomaticNameClashResolution) {
validationObject.renamedTo = `${name}${existingErrors.length + 1}`;
}
existingErrors.push(validationObject);
}
else {
if (!this.options.disableAutomaticNameClashResolution) {
validationObject.renamedTo = `${name}2`;
}
this.errors.set(name, [hit, validationObject]);
}
return (_a = validationObject.renamedTo) !== null && _a !== void 0 ? _a : name;
}
addToTypes(fqName, name, type) {
const validationObject = { type, fqName };
const hit = this.store.get(name);
if (hit) {
return this.addToError(name, hit, validationObject);
}
else {
this.store.set(name, validationObject);
return name;
}
}
addToEntityContainer(fqName, name, type) {
const validationObject = { type, fqName };
const hit = this.entityContainer.get(name);
if (hit) {
return this.addToError(name, hit, validationObject);
}
else {
this.entityContainer.set(name, validationObject);
return name;
}
}
addEntityType(fqName, name) {
return this.addToTypes(fqName, name, TypeModel.EntityType);
}
addComplexType(fqName, name) {
return this.addToTypes(fqName, name, TypeModel.ComplexType);
}
addEnumType(fqName, name) {
return this.addToTypes(fqName, name, TypeModel.EnumType);
}
addUnboundOperationType(fqName, name, operationType) {
const validationObject = { type: TypeModel.OperationType, fqName };
const isAction = operationType === "Action" /* OperationTypes.Action */;
const hit = this.store.get(name);
// to support function overloads: allow multiple operation definitions with same fully qualified name
if (hit && (isAction || hit.fqName !== fqName)) {
return this.addToError(name, hit, validationObject);
}
else {
this.store.set(name, validationObject);
return name;
}
}
addBoundOperationType(bindingName, fqName, name, operationType) {
const nameWithBinding = `${bindingName}_${name}`;
const validationObject = { type: TypeModel.OperationType, fqName };
const isAction = operationType === "Action" /* OperationTypes.Action */;
const hit = this.store.get(nameWithBinding);
// to support function overloads: allow multiple operation definitions with same fully qualified name
if (hit && (isAction || hit.fqName !== fqName)) {
return this.addToError(name, hit, validationObject);
}
else {
this.store.set(nameWithBinding, validationObject);
return name;
}
}
addOperationImportType(fqName, name) {
return this.addToEntityContainer(fqName, name, TypeModel.OperationImportType);
}
addEntitySet(fqName, name) {
return this.addToEntityContainer(fqName, name, TypeModel.EntitySet);
}
addSingleton(fqName, name) {
return this.addToEntityContainer(fqName, name, TypeModel.Singleton);
}
validate() {
return this.errors;
}
}
//# sourceMappingURL=NameClashValidator.js.map