forked from MapComplete/MapComplete
Merge master
This commit is contained in:
commit
89a0be8903
150 changed files with 4201 additions and 9581 deletions
|
|
@ -92,7 +92,6 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
|
|||
this._includeClosedNotesDays +
|
||||
"&bbox={x_min},{y_min},{x_max},{y_max}",
|
||||
geoJsonZoomLevel: 10,
|
||||
maxCacheAge: 0,
|
||||
},
|
||||
/* We need to set 'pass_all_features'
|
||||
There are probably many note_import-layers, and we don't want the first one to gobble up all notes and then discard them...
|
||||
|
|
|
|||
|
|
@ -135,6 +135,10 @@ export class UpdateLegacyLayer extends DesugaringStep<
|
|||
delete config["rotation"]
|
||||
delete config["wayHandling"]
|
||||
delete config["hideUnderlayingFeaturesMinPercentage"]
|
||||
const src = config.source
|
||||
delete src["isOsmCache"]
|
||||
delete src["maxCacheAge"]
|
||||
delete src["widenFactor"]
|
||||
|
||||
for (const mapRenderingElement of config["mapRendering"] ?? []) {
|
||||
if (mapRenderingElement["iconOverlays"] !== undefined) {
|
||||
|
|
@ -269,6 +273,7 @@ class UpdateLegacyTheme extends DesugaringStep<LayoutConfigJson> {
|
|||
oldThemeConfig.layers = Utils.NoNull(oldThemeConfig.layers)
|
||||
delete oldThemeConfig["language"]
|
||||
delete oldThemeConfig["version"]
|
||||
delete oldThemeConfig["clustering"]
|
||||
|
||||
if (oldThemeConfig.startLat === 0) {
|
||||
delete oldThemeConfig.startLat
|
||||
|
|
|
|||
|
|
@ -194,7 +194,6 @@ class AddDefaultLayers extends DesugaringStep<LayoutConfigJson> {
|
|||
if (v === undefined) {
|
||||
const msg = `Default layer ${layerName} not found. ${state.sharedLayers.size} layers are available`
|
||||
if (layerName === "favourite") {
|
||||
// context.warn(msg)
|
||||
continue
|
||||
}
|
||||
context.err(msg)
|
||||
|
|
|
|||
|
|
@ -283,6 +283,15 @@ export class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
|
|||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < theme.layers.length; i++) {
|
||||
const layer = theme.layers[i]
|
||||
if (!layer.id.match("[a-z][a-z0-9_]*")) {
|
||||
context
|
||||
.enters("layers", i, "id")
|
||||
.err("Invalid ID:" + layer.id + "should match [a-z][a-z0-9_]*")
|
||||
}
|
||||
}
|
||||
|
||||
return json
|
||||
}
|
||||
}
|
||||
|
|
@ -364,6 +373,34 @@ class MiscThemeChecks extends DesugaringStep<LayoutConfigJson> {
|
|||
if (json.socialImage === "") {
|
||||
context.warn("Social image for theme " + json.id + " is the emtpy string")
|
||||
}
|
||||
if (json["clustering"]) {
|
||||
context.warn("Obsolete field `clustering` is still around")
|
||||
}
|
||||
{
|
||||
for (let i = 0; i < json.layers.length; i++) {
|
||||
const l = json.layers[i]
|
||||
if (l["override"]?.["source"] === undefined) {
|
||||
continue
|
||||
}
|
||||
if (l["override"]?.["source"]?.["geoJson"]) {
|
||||
continue // We don't care about external data as we won't cache it anyway
|
||||
}
|
||||
if (l["override"]["id"] !== undefined) {
|
||||
continue
|
||||
}
|
||||
context
|
||||
.enters("layers", i)
|
||||
.err("A layer which changes the source-tags must also change the ID")
|
||||
}
|
||||
}
|
||||
|
||||
if (json["overideAll"]) {
|
||||
context
|
||||
.enter("overideAll")
|
||||
.err(
|
||||
"'overrideAll' is spelled with _two_ `r`s. You only wrote a single one of them."
|
||||
)
|
||||
}
|
||||
return json
|
||||
}
|
||||
}
|
||||
|
|
@ -1035,7 +1072,8 @@ export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
|
|||
new On("render", new ValidatePossibleLinks()),
|
||||
new On("question", new ValidatePossibleLinks()),
|
||||
new On("questionHint", new ValidatePossibleLinks()),
|
||||
new On("mappings", new Each(new On("then", new ValidatePossibleLinks())))
|
||||
new On("mappings", new Each(new On("then", new ValidatePossibleLinks()))),
|
||||
new MiscTagRenderingChecks()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1070,8 +1108,9 @@ export class PrevalidateLayer extends DesugaringStep<LayerConfigJson> {
|
|||
if (json.id?.toLowerCase() !== json.id) {
|
||||
context.enter("id").err(`The id of a layer should be lowercase: ${json.id}`)
|
||||
}
|
||||
if (json.id?.match(/[a-z0-9-_]/) == null) {
|
||||
context.enter("id").err(`The id of a layer should match [a-z0-9-_]*: ${json.id}`)
|
||||
const layerRegex = /[a-zA-Z][a-zA-Z_0-9]+/
|
||||
if (json.id.match(layerRegex) === null) {
|
||||
context.enter("id").err("Invalid ID. A layer ID should match " + layerRegex.source)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1572,6 +1611,22 @@ export class ValidateLayer extends Conversion<
|
|||
}
|
||||
}
|
||||
|
||||
if (json["doCount"]) {
|
||||
context.enters("doCount").err("Use `isCounted` instead of `doCount`")
|
||||
}
|
||||
|
||||
if (json.source) {
|
||||
const src = json.source
|
||||
if (src["isOsmCache"] !== undefined) {
|
||||
context.enters("source").err("isOsmCache is deprecated")
|
||||
}
|
||||
if (src["maxCacheAge"] !== undefined) {
|
||||
context
|
||||
.enters("source")
|
||||
.err("maxCacheAge is deprecated; it is " + src["maxCacheAge"])
|
||||
}
|
||||
}
|
||||
|
||||
return { raw: json, parsed: layerConfig }
|
||||
}
|
||||
}
|
||||
|
|
@ -1774,3 +1829,79 @@ export class DetectDuplicatePresets extends DesugaringStep<LayoutConfig> {
|
|||
return json
|
||||
}
|
||||
}
|
||||
|
||||
export class ValidateThemeEnsemble extends Conversion<
|
||||
LayoutConfig[],
|
||||
Map<
|
||||
string,
|
||||
{
|
||||
tags: TagsFilter
|
||||
foundInTheme: string[]
|
||||
}
|
||||
>
|
||||
> {
|
||||
constructor() {
|
||||
super(
|
||||
"Validates that all themes together are logical, i.e. no duplicate ids exists within (overriden) themes",
|
||||
[],
|
||||
"ValidateThemeEnsemble"
|
||||
)
|
||||
}
|
||||
|
||||
convert(
|
||||
json: LayoutConfig[],
|
||||
context: ConversionContext
|
||||
): Map<
|
||||
string,
|
||||
{
|
||||
tags: TagsFilter
|
||||
foundInTheme: string[]
|
||||
}
|
||||
> {
|
||||
const idToSource = new Map<string, { tags: TagsFilter; foundInTheme: string[] }>()
|
||||
|
||||
for (const theme of json) {
|
||||
for (const layer of theme.layers) {
|
||||
if (typeof layer.source === "string") {
|
||||
continue
|
||||
}
|
||||
if (Constants.priviliged_layers.indexOf(<any>layer.id) >= 0) {
|
||||
continue
|
||||
}
|
||||
if (!layer.source) {
|
||||
console.log(theme, layer, layer.source)
|
||||
context.enters(theme.id, "layers", "source", layer.id).err("No source defined")
|
||||
continue
|
||||
}
|
||||
if (layer.source.geojsonSource) {
|
||||
continue
|
||||
}
|
||||
const id = layer.id
|
||||
const tags = layer.source.osmTags
|
||||
if (!idToSource.has(id)) {
|
||||
idToSource.set(id, { tags, foundInTheme: [theme.id] })
|
||||
continue
|
||||
}
|
||||
|
||||
const oldTags = idToSource.get(id).tags
|
||||
const oldTheme = idToSource.get(id).foundInTheme
|
||||
if (oldTags.shadows(tags) && tags.shadows(oldTags)) {
|
||||
// All is good, all is well
|
||||
oldTheme.push(theme.id)
|
||||
continue
|
||||
}
|
||||
context.err(
|
||||
[
|
||||
"The layer with id '" +
|
||||
id +
|
||||
"' is found in multiple themes with different tag definitions:",
|
||||
"\t In theme " + oldTheme + ":\t" + oldTags.asHumanString(false, false, {}),
|
||||
"\tIn theme " + theme.id + ":\t" + tags.asHumanString(false, false, {}),
|
||||
].join("\n")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return idToSource
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue