@maplibre/maplibre-gl-style-spec
Version:
a specification for maplibre styles
83 lines (74 loc) • 2.46 kB
text/typescript
import {ValidationError} from '../error/validation_error';
import {getType} from '../util/get_type';
import {isFunction} from '../function';
import {unbundle, deepUnbundle} from '../util/unbundle_jsonlint';
import {supportsPropertyExpression} from '../util/properties';
export function validateProperty(options, propertyType) {
const key = options.key;
const validateSpec = options.validateSpec;
const style = options.style;
const styleSpec = options.styleSpec;
const value = options.value;
const propertyKey = options.objectKey;
const layerSpec = styleSpec[`${propertyType}_${options.layerType}`];
if (!layerSpec) return [];
const transitionMatch = propertyKey.match(/^(.*)-transition$/);
if (
propertyType === 'paint' &&
transitionMatch &&
layerSpec[transitionMatch[1]] &&
layerSpec[transitionMatch[1]].transition
) {
return validateSpec({
key,
value,
valueSpec: styleSpec.transition,
style,
styleSpec
});
}
const valueSpec = options.valueSpec || layerSpec[propertyKey];
if (!valueSpec) {
return [new ValidationError(key, value, `unknown property "${propertyKey}"`)];
}
let tokenMatch;
if (
getType(value) === 'string' &&
supportsPropertyExpression(valueSpec) &&
!valueSpec.tokens &&
(tokenMatch = /^{([^}]+)}$/.exec(value))
) {
return [
new ValidationError(
key,
value,
`"${propertyKey}" does not support interpolation syntax\n` +
`Use an identity property function instead: \`{ "type": "identity", "property": ${JSON.stringify(tokenMatch[1])} }\`.`
)
];
}
const errors = [];
if (options.layerType === 'symbol') {
if (
propertyKey === 'text-font' &&
isFunction(deepUnbundle(value)) &&
unbundle(value.type) === 'identity'
) {
errors.push(
new ValidationError(key, value, '"text-font" does not support identity functions')
);
}
}
return errors.concat(
validateSpec({
key: options.key,
value,
valueSpec,
style,
styleSpec,
expressionContext: 'property',
propertyType,
propertyKey
})
);
}