export default function stringifyValidator(validator, nodePrefix) { if (validator === undefined) { return "any"; } if (validator.each) { return `Array<${stringifyValidator(validator.each, nodePrefix)}>`; } if (validator.chainOf) { return stringifyValidator(validator.chainOf[1], nodePrefix); } if (validator.oneOf) { return validator.oneOf.map(JSON.stringify).join(" | "); } if (validator.oneOfNodeTypes) { return validator.oneOfNodeTypes.map(_ => nodePrefix + _).join(" | "); } if (validator.oneOfNodeOrValueTypes) { return validator.oneOfNodeOrValueTypes .map(_ => { return isValueType(_) ? _ : nodePrefix + _; }) .join(" | "); } if (validator.type) { return validator.type; } if (validator.shapeOf) { return ( "{ " + Object.keys(validator.shapeOf) .map(shapeKey => { const propertyDefinition = validator.shapeOf[shapeKey]; if (propertyDefinition.validate) { const isOptional = propertyDefinition.optional || propertyDefinition.default != null; return ( shapeKey + (isOptional ? "?: " : ": ") + stringifyValidator(propertyDefinition.validate) ); } return null; }) .filter(Boolean) .join(", ") + " }" ); } return ["any"]; } /** * Heuristic to decide whether or not the given type is a value type (eg. "null") * or a Node type (eg. "Expression"). */ function isValueType(type) { return type.charAt(0).toLowerCase() === type.charAt(0); }