You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
|
|
import reference from './reference/latest.js';
|
|
import stringifyPretty from 'json-stringify-pretty-compact';
|
|
|
|
function sortKeysBy(obj, reference) {
|
|
const result = {};
|
|
for (const key in reference) {
|
|
if (obj[key] !== undefined) {
|
|
result[key] = obj[key];
|
|
}
|
|
}
|
|
for (const key in obj) {
|
|
if (result[key] === undefined) {
|
|
result[key] = obj[key];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Format a Mapbox GL Style. Returns a stringified style with its keys
|
|
* sorted in the same order as the reference style.
|
|
*
|
|
* The optional `space` argument is passed to
|
|
* [`JSON.stringify`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
|
|
* to generate formatted output.
|
|
*
|
|
* If `space` is unspecified, a default of `2` spaces will be used.
|
|
*
|
|
* @private
|
|
* @param {Object} style a Mapbox GL Style
|
|
* @param {number} [space] space argument to pass to `JSON.stringify`
|
|
* @returns {string} stringified formatted JSON
|
|
* @example
|
|
* var fs = require('fs');
|
|
* var format = require('mapbox-gl-style-spec').format;
|
|
* var style = fs.readFileSync('./source.json', 'utf8');
|
|
* fs.writeFileSync('./dest.json', format(style));
|
|
* fs.writeFileSync('./dest.min.json', format(style, 0));
|
|
*/
|
|
function format(style, space = 2) {
|
|
style = sortKeysBy(style, reference.$root);
|
|
|
|
if (style.layers) {
|
|
style.layers = style.layers.map((layer) => sortKeysBy(layer, reference.layer));
|
|
}
|
|
|
|
return stringifyPretty(style, {indent: space});
|
|
}
|
|
|
|
export default format;
|