Add more documentation and checks to the models

This commit is contained in:
pietervdvn 2021-09-18 02:32:40 +02:00
parent 706c5e3d53
commit 47011370dd
4 changed files with 22 additions and 4 deletions

View file

@ -84,7 +84,9 @@ export interface LayerConfigJson {
/** /**
* This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view. * This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.
* This is useful to hide certain features from view. Important: hiding features does not work dynamically, but is only calculated when the data is first renders. * This is useful to hide certain features from view.
*
* Important: hiding features does not work dynamically, but is only calculated when the data is first renders.
* This implies that it is not possible to hide a feature after a tagging change * This implies that it is not possible to hide a feature after a tagging change
* *
* The default value is 'yes' * The default value is 'yes'

View file

@ -79,6 +79,10 @@ export interface TagRenderingConfigJson {
/** /**
* If this condition is met, then the text under `then` will be shown. * If this condition is met, then the text under `then` will be shown.
* If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM. * If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.
*
* For example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}
*
* This can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}
*/ */
if: AndOrTagConfigJson | string, if: AndOrTagConfigJson | string,
/** /**

View file

@ -104,6 +104,10 @@ export default class LayerConfig {
throw context + "Use 'geoJson' instead of 'geoJsonSource'"; throw context + "Use 'geoJson' instead of 'geoJsonSource'";
} }
if (json.source["geojson"] !== undefined) {
throw context + "Use 'geoJson' instead of 'geojson' (the J is a capital letter)";
}
this.source = new SourceConfig( this.source = new SourceConfig(
{ {
osmTags: osmTags, osmTags: osmTags,
@ -133,6 +137,14 @@ export default class LayerConfig {
const key = kv.substring(0, index); const key = kv.substring(0, index);
const code = kv.substring(index + 1); const code = kv.substring(index + 1);
try{
new Function("feat", "return " + code + ";");
}catch(e){
throw `Invalid function definition: code ${code} is invalid:${e} (at ${context})`
}
this.calculatedTags.push([key, code]); this.calculatedTags.push([key, code]);
} }
} }

View file

@ -53,10 +53,10 @@ export default class LayoutConfig {
public readonly cacheTimeout?: number; public readonly cacheTimeout?: number;
public readonly overpassUrl: string; public readonly overpassUrl: string;
public readonly overpassTimeout: number; public readonly overpassTimeout: number;
private readonly _official: boolean; public readonly official: boolean;
constructor(json: LayoutConfigJson, official = true, context?: string) { constructor(json: LayoutConfigJson, official = true, context?: string) {
this._official = official; this.official = official;
this.id = json.id; this.id = json.id;
context = (context ?? "") + "." + this.id; context = (context ?? "") + "." + this.id;
this.maintainer = json.maintainer; this.maintainer = json.maintainer;
@ -221,7 +221,7 @@ export default class LayoutConfig {
} }
public CustomCodeSnippets(): string[] { public CustomCodeSnippets(): string[] {
if (this._official) { if (this.official) {
return []; return [];
} }
const msg = "<br/><b>This layout uses <span class='alert'>custom javascript</span>, loaded for the wide internet. The code is printed below, please report suspicious code on the issue tracker of MapComplete:</b><br/>" const msg = "<br/><b>This layout uses <span class='alert'>custom javascript</span>, loaded for the wide internet. The code is printed below, please report suspicious code on the issue tracker of MapComplete:</b><br/>"