private checkPropertyTypes()

in desktop/scripts/swagger/validate-models.ts [146:209]


    private checkPropertyTypes(metadata) {
        for (const name of Object.keys(metadata)) {
            const swaggerProperty = this.definition.properties![name];
            if (!swaggerProperty) {
                // this.addPropertyError(name, `Swagger is missing property`);
                continue;
            }
            const swaggerType = swaggerProperty.type;
            const property = metadata[name];
            const type = property.type;

            if (swaggerType === "string" && swaggerProperty.format === "date-time") {
                if (type !== Date) {
                    this.addPropertyError(name, `Expected type to be a date but was ${type}`);
                }
            } else if (swaggerType === "string" && swaggerProperty.format === "duration") {
                if (type !== Duration) {
                    this.addPropertyError(name, `Expected type to be a duration but was ${type}`);
                }
            } else if (swaggerType === "string") {
                if (type !== String) {
                    this.addPropertyError(name, `Expected type to be a string but was ${type}`);
                }
            } else if (swaggerType === "integer" || swaggerType === "number") {
                if (type !== Number) {
                    this.addPropertyError(name, `Expected type to be a number but was ${type}`);
                }
            } else if (swaggerType === "boolean") {
                if (type !== Boolean) {
                    this.addPropertyError(name, `Expected type to be a boolean but was ${type}`);
                }
            } else if (swaggerType === "array") {
                if (!property.list) {
                    this.addPropertyError(name, `Expected type to be a array but wasn't defined as a list. ${property}`
                        + `Check it has the @ListProp property not @Prop`);
                }
            } else if (swaggerProperty.$ref) {
                const refTypeName = swaggerProperty.$ref.replace("#/definitions/", "");
                const nestedType = this.specs.getDefinition(refTypeName);
                if (nestedType.enum) {
                    if (type !== String) {
                        this.addPropertyError(name, `Expected type to be a enum ${refTypeName} but was ${type}`);
                    }
                } else {
                    try {
                        const modelCls = getModel(refTypeName);
                        if (modelCls !== property.type) {
                            this.addPropertyError(name,
                                `Expected type to be of type ${refTypeName} but was ${property.cls}`);
                        }
                    } catch (e) {
                        this.addPropertyError(name, e.message);
                    }
                }
            } else if (swaggerType === "object") {
                if (type !== Object) {
                    this.addPropertyError(name, `Expected type to be an object but was ${type}`);
                }
            } else {
                console.log("Property", this.modelName, name, swaggerProperty, metadata[name]);
                process.exit(1);
            }
        }
    }