From 298d09845db63630d1173069883c40272098a0d3 Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Tue, 7 Jan 2020 17:00:08 +0100 Subject: [PATCH] Add style validation and skip invalid styles --- package.json | 2 ++ src/main.js | 2 ++ src/serve_style.js | 18 +++++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b1a4274..5e6cd4f 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@mapbox/mapbox-gl-native": "5.0.2", + "@mapbox/mapbox-gl-style-spec": "13.9.1", "@mapbox/mbtiles": "0.11.0", "@mapbox/sphericalmercator": "1.1.0", "@mapbox/vector-tile": "1.3.1", @@ -27,6 +28,7 @@ "color": "3.1.2", "commander": "4.0.1", "cors": "2.8.5", + "esm": "3.2.25", "express": "4.17.1", "glyph-pbf-composite": "0.0.2", "handlebars": "4.5.3", diff --git a/src/main.js b/src/main.js index 3dacd97..98c8a86 100644 --- a/src/main.js +++ b/src/main.js @@ -2,6 +2,8 @@ 'use strict'; +require = require('esm')(module); + const fs = require('fs'); const path = require('path'); const request = require('request'); diff --git a/src/serve_style.js b/src/serve_style.js index cbe1138..ca441db 100644 --- a/src/serve_style.js +++ b/src/serve_style.js @@ -5,6 +5,7 @@ const fs = require('fs'); const clone = require('clone'); const express = require('express'); +import {validate} from '@mapbox/mapbox-gl-style-spec'; const utils = require('./utils'); @@ -77,14 +78,25 @@ module.exports = { }, add: (options, repo, params, id, publicUrl, reportTiles, reportFont) => { const styleFile = path.resolve(options.paths.styles, params.style); - let styleJSON; + + let styleFileData; try { - styleJSON = JSON.parse(fs.readFileSync(styleFile)); + styleFileData = fs.readFileSync(styleFile); } catch (e) { - console.log('Error parsing style file'); + console.log('Error reading style file'); return false; } + let validationErrors = validate(styleFileData); + if (validationErrors.length > 0) { + console.log(`The file "${params.style}" is not valid a valid style file:`); + for (const err of validationErrors) { + console.log(`${err.line}: ${err.message}`); + } + return false; + } + let styleJSON = JSON.parse(styleFileData); + for (const name of Object.keys(styleJSON.sources)) { const source = styleJSON.sources[name]; const url = source.url;