UNPKG

graphql-scalars

Version:

A collection of scalar types not included in base GraphQL.

224 lines (223 loc) • 7.8 kB
// Validation functions const isValidPosition = (coords) => { return (Array.isArray(coords) && (coords.length === 2 || coords.length === 3) && coords.every(c => typeof c === 'number') && coords[0] >= -180 && coords[0] <= 180 && // longitude coords[1] >= -90 && coords[1] <= 90 // latitude ); }; /*const isValidPoint = (geometry: any): boolean => { return geometry.type === 'Point' && isValidPosition(geometry.coordinates); };*/ const isValidPoint = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'Point' && 'coordinates' in geometry && isValidPosition(geometry.coordinates)); }; /*const isValidMultiPoint = (geometry: any): boolean => { return ( geometry.type === 'MultiPoint' && Array.isArray(geometry.coordinates) && geometry.coordinates.every(isValidPosition) ); };*/ const isValidMultiPoint = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'MultiPoint' && 'coordinates' in geometry && Array.isArray(geometry.coordinates) && geometry.coordinates.every(isValidPosition)); }; /*const isValidLineString = (geometry: any): boolean => { return ( geometry.type === 'LineString' && Array.isArray(geometry.coordinates) && geometry.coordinates.length >= 2 && geometry.coordinates.every(isValidPosition) ); };*/ const isValidLineString = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'LineString' && 'coordinates' in geometry && Array.isArray(geometry.coordinates) && geometry.coordinates.length >= 2 && geometry.coordinates.every((pos) => isValidPosition(pos))); }; /*const isValidMultiLineString = (geometry: { type: string; coordinates: MultiLineStringCoordinates; }): boolean => { return ( geometry.type === 'MultiLineString' && Array.isArray(geometry.coordinates) && geometry.coordinates.every( line => Array.isArray(line) && line.length >= 2 && line.every(isValidPosition), ) ); };*/ const isValidMultiLineString = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'MultiLineString' && 'coordinates' in geometry && Array.isArray(geometry.coordinates) && geometry.coordinates.every((line) => Array.isArray(line) && line.length >= 2 && line.every((pos) => isValidPosition(pos)))); }; /*const isValidPolygon = (geometry: { type: string; coordinates: PolygonCoordinates }): boolean => { return ( geometry.type === 'Polygon' && Array.isArray(geometry.coordinates) && geometry.coordinates.every( ring => Array.isArray(ring) && ring.length >= 4 && ring.every(isValidPosition) && JSON.stringify(ring[0]) === JSON.stringify(ring[ring.length - 1]), // First and last positions must be equivalent ) ); };*/ const isValidPolygon = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'Polygon' && 'coordinates' in geometry && Array.isArray(geometry.coordinates) && geometry.coordinates.every((ring) => Array.isArray(ring) && ring.length >= 4 && ring.every((pos) => isValidPosition(pos)) && JSON.stringify(ring[0]) === JSON.stringify(ring[ring.length - 1]))); }; /*const isValidMultiPolygon = (geometry: { type: string; coordinates: MultiPolygonCoordinates; }): boolean => { return ( geometry.type === 'MultiPolygon' && Array.isArray(geometry.coordinates) && geometry.coordinates.every( polygon => Array.isArray(polygon) && polygon.every( ring => Array.isArray(ring) && ring.length >= 4 && ring.every(isValidPosition) && JSON.stringify(ring[0]) === JSON.stringify(ring[ring.length - 1]), ), ) ); };*/ const isValidMultiPolygon = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'MultiPolygon' && 'coordinates' in geometry && Array.isArray(geometry.coordinates) && geometry.coordinates.every((polygon) => Array.isArray(polygon) && polygon.every((ring) => Array.isArray(ring) && ring.length >= 4 && ring.every((pos) => isValidPosition(pos)) && JSON.stringify(ring[0]) === JSON.stringify(ring[ring.length - 1])))); }; /*const isValidGeometryCollection = (geometry: any): boolean => { return ( geometry.type === 'GeometryCollection' && Array.isArray(geometry.geometries) && geometry.geometries.every(isValidGeometry) ); };*/ const isValidGeometryCollection = (geometry) => { return (typeof geometry === 'object' && geometry !== null && 'type' in geometry && geometry.type === 'GeometryCollection' && 'geometries' in geometry && Array.isArray(geometry.geometries) && geometry.geometries.every(isValidGeometry)); }; export const isValidGeometry = (geometry) => { if (!geometry || typeof geometry !== 'object') return false; if (!('type' in geometry)) return false; switch (geometry.type) { case 'Point': return isValidPoint(geometry); case 'MultiPoint': return isValidMultiPoint(geometry); case 'LineString': return isValidLineString(geometry); case 'MultiLineString': return isValidMultiLineString(geometry); case 'Polygon': return isValidPolygon(geometry); case 'MultiPolygon': return isValidMultiPolygon(geometry); case 'GeometryCollection': return isValidGeometryCollection(geometry); default: return false; } }; /*const isValidFeature = (obj: any): boolean => { return ( obj.type === 'Feature' && (obj.geometry === null || isValidGeometry(obj.geometry)) && (obj.properties === undefined || obj.properties === null || typeof obj.properties === 'object') ); };*/ export const isValidFeature = (obj) => { return (typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'Feature' && 'geometry' in obj && 'properties' in obj && (obj.geometry === null || isValidGeometry(obj.geometry)) && (obj.properties === null || (typeof obj.properties === 'object' && obj.properties !== null))); }; /*const isValidFeatureCollection = (obj: any): boolean => { return ( obj.type === 'FeatureCollection' && Array.isArray(obj.features) && obj.features.every(isValidFeature) ); };*/ export const isValidFeatureCollection = (obj) => { return (typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'FeatureCollection' && 'features' in obj && Array.isArray(obj.features) && obj.features.every(isValidFeature)); }; /*const isValidBBox = (bbox: BBox): boolean => { return ( Array.isArray(bbox) && //[4, 6].includes(bbox.length) && // should be less faster, though negligible (bbox.length === 4 || bbox.length === 6) && bbox.every(n => typeof n === 'number') ); };*/ export const isValidBBox = (bbox) => { return (Array.isArray(bbox) && (bbox.length === 4 || bbox.length === 6) && bbox.every(n => typeof n === 'number')); };