forked from MapComplete/MapComplete
		
	Merge develop
This commit is contained in:
		
						commit
						5904142402
					
				
					 13 changed files with 80 additions and 40 deletions
				
			
		| 
						 | 
					@ -243,7 +243,9 @@ export class And extends TagsFilter {
 | 
				
			||||||
                    properties[opt.key] = opt.value
 | 
					                    properties[opt.key] = opt.value
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            for (const opt of optimized) {
 | 
					
 | 
				
			||||||
 | 
					            for (let i = 0; i < optimized.length; i++){
 | 
				
			||||||
 | 
					                const opt = optimized[i];
 | 
				
			||||||
                if (opt instanceof Tag) {
 | 
					                if (opt instanceof Tag) {
 | 
				
			||||||
                    const k = opt.key
 | 
					                    const k = opt.key
 | 
				
			||||||
                    const v = properties[k]
 | 
					                    const v = properties[k]
 | 
				
			||||||
| 
						 | 
					@ -264,7 +266,23 @@ export class And extends TagsFilter {
 | 
				
			||||||
                    if (v === undefined) {
 | 
					                    if (v === undefined) {
 | 
				
			||||||
                        continue
 | 
					                        continue
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (v !== opt.value) {
 | 
					                    if(opt.invert){
 | 
				
			||||||
 | 
					                        // We should _not_ match this value
 | 
				
			||||||
 | 
					                        // If 'v' is given, we already know what value it should be
 | 
				
			||||||
 | 
					                        // If 'v' is the not-expected value, we have a conflict and return false
 | 
				
			||||||
 | 
					                        // Otherwise, we can safely drop this value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        const doesMatch = (typeof opt.value === "string" && v === opt.value) ||
 | 
				
			||||||
 | 
					                            (v.match(<RegExp> opt.value) !== null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if(doesMatch){
 | 
				
			||||||
 | 
					                            // We have a conflict as 'opt' is inverted
 | 
				
			||||||
 | 
					                            return false
 | 
				
			||||||
 | 
					                        }else{
 | 
				
			||||||
 | 
					                            optimized.splice(i, 1)
 | 
				
			||||||
 | 
					                            i--
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }else if (v !== opt.value) {
 | 
				
			||||||
                        // detected an internal conflict
 | 
					                        // detected an internal conflict
 | 
				
			||||||
                        return false
 | 
					                        return false
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,9 @@ export default class SourceConfig {
 | 
				
			||||||
                throw (
 | 
					                throw (
 | 
				
			||||||
                    "Error at " +
 | 
					                    "Error at " +
 | 
				
			||||||
                    context +
 | 
					                    context +
 | 
				
			||||||
                    ": the specified tags are conflicting with each other: they will never match anything at all"
 | 
					                    ": the specified tags are conflicting with each other: they will never match anything at all.\n" +
 | 
				
			||||||
 | 
					                    "\tThe offending tags are: "+params.osmTags.asHumanString(false, false, {})+
 | 
				
			||||||
 | 
					                        "\tThey optmize into 'false' "
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (optimized === true) {
 | 
					            if (optimized === true) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,7 +233,7 @@
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": "amenity=cafe",
 | 
					          "if": "amenity=cafe",
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "en": "A <b>cafe</b> to drink tea, coffee or an alcoholical bevarage in a quiet environment",
 | 
					            "en": "A <b>cafe</b> to drink tea, coffee or an alcoholic beverage in a quiet environment",
 | 
				
			||||||
            "nl": "Dit is een <b>cafe</b> - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.",
 | 
					            "nl": "Dit is een <b>cafe</b> - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.",
 | 
				
			||||||
            "de": "Ein <b>Café</b>, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken",
 | 
					            "de": "Ein <b>Café</b>, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken",
 | 
				
			||||||
            "da": "En <b>café</b> til at drikke te, kaffe eller en alkoholisk drik i rolige omgivelser",
 | 
					            "da": "En <b>café</b> til at drikke te, kaffe eller en alkoholisk drik i rolige omgivelser",
 | 
				
			||||||
| 
						 | 
					@ -245,7 +245,7 @@
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": "amenity=restaurant",
 | 
					          "if": "amenity=restaurant",
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "en": "A <b>restuarant</b> where one can get a proper meal",
 | 
					            "en": "A <b>restaurant</b> where one can get a proper meal",
 | 
				
			||||||
            "nl": "Dit is een <b>restaurant</b> waar men een maaltijd geserveerd krijgt",
 | 
					            "nl": "Dit is een <b>restaurant</b> waar men een maaltijd geserveerd krijgt",
 | 
				
			||||||
            "de": "Ein <b>Restaurant</b>, in dem man ordentlich essen kann",
 | 
					            "de": "Ein <b>Restaurant</b>, in dem man ordentlich essen kann",
 | 
				
			||||||
            "da": "En <b>restaurant</b>, hvor man kan få et ordentligt måltid",
 | 
					            "da": "En <b>restaurant</b>, hvor man kan få et ordentligt måltid",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4699,12 +4699,12 @@
 | 
				
			||||||
        "socket:typee=1"
 | 
					        "socket:typee=1"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "title": {
 | 
					      "title": {
 | 
				
			||||||
        "en": "a charging station for electrical bikes with a normal european wall plug <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (meant to charge electrical bikes)",
 | 
					        "en": "a charging station for electrical bikes with a normal european wall plug  <img src='./assets/layers/charging_station/TypeE.svg' class=\"w-6 h-6 mx-1 bg-white rounded-full \" style='display: inline-block'/>",
 | 
				
			||||||
        "nl": "een oplaadpunt voor elektrische fietsen met een gewoon Europees stopcontact <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (speciaal bedoeld voor fietsen)",
 | 
					        "nl": "een oplaadpunt voor elektrische fietsen met een gewoon Europees stopcontact  <img src='./assets/layers/charging_station/TypeE.svg' class=\"w-6 h-6  mx-1 bg-white rounded-full\" style='display: inline-block'/>",
 | 
				
			||||||
        "ca": "una estació de càrrega per a bicicletes elèctriques amb un endoll de paret europeu normal<img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (destinat a carregar bicicletes elèctriques)",
 | 
					        "ca": "una estació de càrrega per a bicicletes elèctriques amb un endoll de paret europeu normal  <img src='./assets/layers/charging_station/TypeE.svg' class=\"w-6 h-6  mx-1 bg-white rounded-full\" style='display: inline-block'/>",
 | 
				
			||||||
        "da": "en ladestation til elektriske cykler med et normalt europæisk vægstik <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (beregnet til opladning af elektriske cykler)",
 | 
					        "da": "en ladestation til elektriske cykler med et normalt europæisk vægstik  <img src='./assets/layers/charging_station/TypeE.svg' class=\"w-6 h-6  mx-1 bg-white rounded-full\" style='display: inline-block'/>",
 | 
				
			||||||
        "de": "eine Ladestation für Elektrofahrräder mit einer normalen europäischen Steckdose <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (zum Laden von Elektrofahrrädern)",
 | 
					        "de": "eine Ladestation für Elektrofahrräder mit einer normalen europäischen Steckdose  <img src='./assets/layers/charging_station/TypeE.svg' class=\"w-6 h-6  mx-1 bg-white rounded-full\" style='display: inline-block'/>",
 | 
				
			||||||
        "es": "una estación de carga para bicicletas eléctricas con un enchufe de pared europeo normal <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (pensado para cargar bicicletas eléctricas)"
 | 
					        "es": "una estación de carga para bicicletas eléctricas con un enchufe de pared europeo normal  <img src='./assets/layers/charging_station/TypeE.svg' class=\"w-6 h-6  mx-1 bg-white rounded-full\" style='display: inline-block'/>"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "preciseInput": {
 | 
					      "preciseInput": {
 | 
				
			||||||
        "preferredBackground": "map"
 | 
					        "preferredBackground": "map"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -800,8 +800,8 @@
 | 
				
			||||||
        "socket:typee=1"
 | 
					        "socket:typee=1"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "title": {
 | 
					      "title": {
 | 
				
			||||||
        "en": "charging station for electrical bikes with a normal european wall plug <img src='./assets/layers/charging_station/TypeE.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (meant to charge electrical bikes)",
 | 
					        "en": "charging station for electrical bikes with a normal european wall plug <img src='./assets/layers/charging_station/TypeE.svg' class="w-4 h-4 mx-1 bg-white rounded-full"/>",
 | 
				
			||||||
        "nl": "oplaadpunt voor elektrische fietsen"
 | 
					        "nl": "oplaadpunt voor elektrische fietsen met een gewone, europese stekker <img src='./assets/layers/charging_station/TypeE.svg' class="w-4 h-4 mx-1 bg-white rounded-full"/>"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "preciseInput": {
 | 
					      "preciseInput": {
 | 
				
			||||||
        "preferredBackground": "map"
 | 
					        "preferredBackground": "map"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,8 @@
 | 
				
			||||||
  "source": {
 | 
					  "source": {
 | 
				
			||||||
    "osmTags": {
 | 
					    "osmTags": {
 | 
				
			||||||
      "and": [
 | 
					      "and": [
 | 
				
			||||||
        "shop~*"
 | 
					        "shop~*",
 | 
				
			||||||
 | 
					        "shop!=mall"
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -460,7 +460,8 @@
 | 
				
			||||||
        "fr": "Méthode de montage : {camera:mount}",
 | 
					        "fr": "Méthode de montage : {camera:mount}",
 | 
				
			||||||
        "it": "Metodo di montaggio: {camera:mount}",
 | 
					        "it": "Metodo di montaggio: {camera:mount}",
 | 
				
			||||||
        "de": "Montageart: {camera:mount}",
 | 
					        "de": "Montageart: {camera:mount}",
 | 
				
			||||||
        "da": "Monteringsmetode: {camera:mount}"
 | 
					        "da": "Monteringsmetode: {camera:mount}",
 | 
				
			||||||
 | 
					        "ca": "Mètode de muntatge: {camera:mount}"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "freeform": {
 | 
					      "freeform": {
 | 
				
			||||||
        "key": "camera:mount"
 | 
					        "key": "camera:mount"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4964,7 +4964,8 @@
 | 
				
			||||||
                        "then": "Aquesta càmera està posicionada a un arbre"
 | 
					                        "then": "Aquesta càmera està posicionada a un arbre"
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                "question": "Com està posicionada aquesta càmera?"
 | 
					                "question": "Com està posicionada aquesta càmera?",
 | 
				
			||||||
 | 
					                "render": "Mètode de muntatge: {camera:mount}"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "camera_direction": {
 | 
					            "camera_direction": {
 | 
				
			||||||
                "question": "En quina direcció geogràfica apunta aquesta càmera?",
 | 
					                "question": "En quina direcció geogràfica apunta aquesta càmera?",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  "name": "mapcomplete",
 | 
					  "name": "mapcomplete",
 | 
				
			||||||
  "version": "0.30.5",
 | 
					  "version": "0.30.6",
 | 
				
			||||||
  "repository": "https://github.com/pietervdvn/MapComplete",
 | 
					  "repository": "https://github.com/pietervdvn/MapComplete",
 | 
				
			||||||
  "description": "A small website to edit OSM easily",
 | 
					  "description": "A small website to edit OSM easily",
 | 
				
			||||||
  "bugs": "https://github.com/pietervdvn/MapComplete/issues",
 | 
					  "bugs": "https://github.com/pietervdvn/MapComplete/issues",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1117,10 +1117,6 @@ video {
 | 
				
			||||||
  width: 2.75rem;
 | 
					  width: 2.75rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.w-24 {
 | 
					 | 
				
			||||||
  width: 6rem;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.w-1\/2 {
 | 
					.w-1\/2 {
 | 
				
			||||||
  width: 50%;
 | 
					  width: 50%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1134,6 +1130,10 @@ video {
 | 
				
			||||||
  width: 24rem;
 | 
					  width: 24rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.w-24 {
 | 
				
			||||||
 | 
					  width: 6rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.w-10 {
 | 
					.w-10 {
 | 
				
			||||||
  width: 2.5rem;
 | 
					  width: 2.5rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,8 +7,8 @@ import { describe, it } from "vitest"
 | 
				
			||||||
 * @param reason
 | 
					 * @param reason
 | 
				
			||||||
 * @private
 | 
					 * @private
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function detectInCode(forbidden: string, reason: string): (done: () => void) => void {
 | 
					function detectInCode(forbidden: string, reason: string): Promise<void> {
 | 
				
			||||||
    return (done: () => void) => {
 | 
					    return new Promise<void>((done) => {
 | 
				
			||||||
        const excludedDirs = [
 | 
					        const excludedDirs = [
 | 
				
			||||||
            ".git",
 | 
					            ".git",
 | 
				
			||||||
            "node_modules",
 | 
					            "node_modules",
 | 
				
			||||||
| 
						 | 
					@ -49,14 +49,23 @@ function detectInCode(forbidden: string, reason: string): (done: () => void) =>
 | 
				
			||||||
                    console.error(found.length, "issues found")
 | 
					                    console.error(found.length, "issues found")
 | 
				
			||||||
                    throw msg
 | 
					                    throw msg
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                done()
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function wrap(promise: Promise<void>): ((done: () => void) => void) {
 | 
				
			||||||
 | 
					    return (done => {
 | 
				
			||||||
 | 
					        promise.then(done)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function itAsync(name: string, promise: Promise<void>){
 | 
				
			||||||
 | 
					    it(name, wrap(promise))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe("Code quality", () => {
 | 
					describe("Code quality", () => {
 | 
				
			||||||
    it(
 | 
					    itAsync(
 | 
				
			||||||
        "should not contain reverse",
 | 
					        "should not contain reverse",
 | 
				
			||||||
        detectInCode(
 | 
					        detectInCode(
 | 
				
			||||||
            "reverse()",
 | 
					            "reverse()",
 | 
				
			||||||
| 
						 | 
					@ -64,12 +73,12 @@ describe("Code quality", () => {
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it(
 | 
					    itAsync(
 | 
				
			||||||
        "should not contain 'constructor.name'",
 | 
					        "should not contain 'constructor.name'",
 | 
				
			||||||
        detectInCode("constructor\\.name", "This is not allowed, as minification does erase names.")
 | 
					        detectInCode("constructor\\.name", "This is not allowed, as minification does erase names.")
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it(
 | 
					    itAsync(
 | 
				
			||||||
        "should not contain 'innerText'",
 | 
					        "should not contain 'innerText'",
 | 
				
			||||||
        detectInCode(
 | 
					        detectInCode(
 | 
				
			||||||
            "innerText",
 | 
					            "innerText",
 | 
				
			||||||
| 
						 | 
					@ -77,7 +86,7 @@ describe("Code quality", () => {
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it(
 | 
					    itAsync(
 | 
				
			||||||
        "should not contain 'import * as name from \"xyz.json\"'",
 | 
					        "should not contain 'import * as name from \"xyz.json\"'",
 | 
				
			||||||
        detectInCode(
 | 
					        detectInCode(
 | 
				
			||||||
            'import \\* as [a-zA-Z0-9_]\\+ from \\"[.-_/a-zA-Z0-9]\\+\\.json\\"',
 | 
					            'import \\* as [a-zA-Z0-9_]\\+ from \\"[.-_/a-zA-Z0-9]\\+\\.json\\"',
 | 
				
			||||||
| 
						 | 
					@ -85,7 +94,7 @@ describe("Code quality", () => {
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it(
 | 
					    itAsync(
 | 
				
			||||||
        "should not contain '[\"default\"]'",
 | 
					        "should not contain '[\"default\"]'",
 | 
				
			||||||
        detectInCode('\\[\\"default\\"\\]', "Possible leftover of faulty default import")
 | 
					        detectInCode('\\[\\"default\\"\\]', "Possible leftover of faulty default import")
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,10 @@
 | 
				
			||||||
import { TagsFilter } from "../../../Logic/Tags/TagsFilter"
 | 
					import {TagsFilter} from "../../../Logic/Tags/TagsFilter"
 | 
				
			||||||
import { And } from "../../../Logic/Tags/And"
 | 
					import {And} from "../../../Logic/Tags/And"
 | 
				
			||||||
import { Tag } from "../../../Logic/Tags/Tag"
 | 
					import {Tag} from "../../../Logic/Tags/Tag"
 | 
				
			||||||
import { TagUtils } from "../../../Logic/Tags/TagUtils"
 | 
					import {TagUtils} from "../../../Logic/Tags/TagUtils"
 | 
				
			||||||
import { Or } from "../../../Logic/Tags/Or"
 | 
					import {Or} from "../../../Logic/Tags/Or"
 | 
				
			||||||
import { RegexTag } from "../../../Logic/Tags/RegexTag"
 | 
					import {RegexTag} from "../../../Logic/Tags/RegexTag"
 | 
				
			||||||
import { describe, expect, it } from "vitest"
 | 
					import {describe, expect, it} from "vitest"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe("Tag optimalization", () => {
 | 
					describe("Tag optimalization", () => {
 | 
				
			||||||
    describe("And", () => {
 | 
					    describe("And", () => {
 | 
				
			||||||
| 
						 | 
					@ -71,6 +71,14 @@ describe("Tag optimalization", () => {
 | 
				
			||||||
            expect(TagUtils.toString(opt)).toBe("amenity=binoculars&bicycle=yes")
 | 
					            expect(TagUtils.toString(opt)).toBe("amenity=binoculars&bicycle=yes")
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it("should correctly optimize key=A&key!=B into key=A", () => {
 | 
				
			||||||
 | 
					            const t = new And([new Tag("shop", "sports"), new RegexTag("shop", "mall", true)])
 | 
				
			||||||
 | 
					            const opt = t.optimize()
 | 
				
			||||||
 | 
					            expect(typeof opt !== "boolean").true
 | 
				
			||||||
 | 
					            expect(TagUtils.toString(<TagsFilter>opt)).toBe("shop=sports")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it("should optimize nested ORs", () => {
 | 
					        it("should optimize nested ORs", () => {
 | 
				
			||||||
            const filter = TagUtils.Tag({
 | 
					            const filter = TagUtils.Tag({
 | 
				
			||||||
                or: [
 | 
					                or: [
 | 
				
			||||||
| 
						 | 
					@ -263,7 +271,7 @@ describe("Tag optimalization", () => {
 | 
				
			||||||
                or: [
 | 
					                or: [
 | 
				
			||||||
                    "club=climbing",
 | 
					                    "club=climbing",
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        and: ["sport=climbing", { or: ["club~*", "office~*"] }],
 | 
					                        and: ["sport=climbing", {or: ["club~*", "office~*"]}],
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        and: [
 | 
					                        and: [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,6 @@ export default defineConfig({
 | 
				
			||||||
    test: {
 | 
					    test: {
 | 
				
			||||||
        globals: true,
 | 
					        globals: true,
 | 
				
			||||||
        setupFiles: ["./test/testhooks.ts"],
 | 
					        setupFiles: ["./test/testhooks.ts"],
 | 
				
			||||||
        include: ["./test", "./*.doctest.ts", "./**/*.doctest.ts"],
 | 
					        include: ["./test/*.spec.ts","./test/**/*.spec.ts", "./*.doctest.ts", "./**/*.doctest.ts"],
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue