Adjust European short trip heuristic from >3 days to >1 day to correctly detect when user has returned home from European trips. This fixes the April 29-30, 2023 case where the location incorrectly showed "Sankt Georg, Hamburg" instead of "Bristol" when the user was free (no events scheduled) after the foss-north trip ended on April 27. The previous logic required more than 3 days to pass before assuming return home from European countries, but for short European trips by rail/ferry, users typically return within 1-2 days. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			192 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @fileoverview The instance of Ajv validator.
 | 
						|
 * @author Evgeny Poberezkin
 | 
						|
 */
 | 
						|
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
// Requirements
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
 | 
						|
import Ajv from "ajv";
 | 
						|
 | 
						|
//-----------------------------------------------------------------------------
 | 
						|
// Helpers
 | 
						|
//-----------------------------------------------------------------------------
 | 
						|
 | 
						|
/*
 | 
						|
 * Copied from ajv/lib/refs/json-schema-draft-04.json
 | 
						|
 * The MIT License (MIT)
 | 
						|
 * Copyright (c) 2015-2017 Evgeny Poberezkin
 | 
						|
 */
 | 
						|
const metaSchema = {
 | 
						|
    id: "http://json-schema.org/draft-04/schema#",
 | 
						|
    $schema: "http://json-schema.org/draft-04/schema#",
 | 
						|
    description: "Core schema meta-schema",
 | 
						|
    definitions: {
 | 
						|
        schemaArray: {
 | 
						|
            type: "array",
 | 
						|
            minItems: 1,
 | 
						|
            items: { $ref: "#" }
 | 
						|
        },
 | 
						|
        positiveInteger: {
 | 
						|
            type: "integer",
 | 
						|
            minimum: 0
 | 
						|
        },
 | 
						|
        positiveIntegerDefault0: {
 | 
						|
            allOf: [{ $ref: "#/definitions/positiveInteger" }, { default: 0 }]
 | 
						|
        },
 | 
						|
        simpleTypes: {
 | 
						|
            enum: ["array", "boolean", "integer", "null", "number", "object", "string"]
 | 
						|
        },
 | 
						|
        stringArray: {
 | 
						|
            type: "array",
 | 
						|
            items: { type: "string" },
 | 
						|
            minItems: 1,
 | 
						|
            uniqueItems: true
 | 
						|
        }
 | 
						|
    },
 | 
						|
    type: "object",
 | 
						|
    properties: {
 | 
						|
        id: {
 | 
						|
            type: "string"
 | 
						|
        },
 | 
						|
        $schema: {
 | 
						|
            type: "string"
 | 
						|
        },
 | 
						|
        title: {
 | 
						|
            type: "string"
 | 
						|
        },
 | 
						|
        description: {
 | 
						|
            type: "string"
 | 
						|
        },
 | 
						|
        default: { },
 | 
						|
        multipleOf: {
 | 
						|
            type: "number",
 | 
						|
            minimum: 0,
 | 
						|
            exclusiveMinimum: true
 | 
						|
        },
 | 
						|
        maximum: {
 | 
						|
            type: "number"
 | 
						|
        },
 | 
						|
        exclusiveMaximum: {
 | 
						|
            type: "boolean",
 | 
						|
            default: false
 | 
						|
        },
 | 
						|
        minimum: {
 | 
						|
            type: "number"
 | 
						|
        },
 | 
						|
        exclusiveMinimum: {
 | 
						|
            type: "boolean",
 | 
						|
            default: false
 | 
						|
        },
 | 
						|
        maxLength: { $ref: "#/definitions/positiveInteger" },
 | 
						|
        minLength: { $ref: "#/definitions/positiveIntegerDefault0" },
 | 
						|
        pattern: {
 | 
						|
            type: "string",
 | 
						|
            format: "regex"
 | 
						|
        },
 | 
						|
        additionalItems: {
 | 
						|
            anyOf: [
 | 
						|
                { type: "boolean" },
 | 
						|
                { $ref: "#" }
 | 
						|
            ],
 | 
						|
            default: { }
 | 
						|
        },
 | 
						|
        items: {
 | 
						|
            anyOf: [
 | 
						|
                { $ref: "#" },
 | 
						|
                { $ref: "#/definitions/schemaArray" }
 | 
						|
            ],
 | 
						|
            default: { }
 | 
						|
        },
 | 
						|
        maxItems: { $ref: "#/definitions/positiveInteger" },
 | 
						|
        minItems: { $ref: "#/definitions/positiveIntegerDefault0" },
 | 
						|
        uniqueItems: {
 | 
						|
            type: "boolean",
 | 
						|
            default: false
 | 
						|
        },
 | 
						|
        maxProperties: { $ref: "#/definitions/positiveInteger" },
 | 
						|
        minProperties: { $ref: "#/definitions/positiveIntegerDefault0" },
 | 
						|
        required: { $ref: "#/definitions/stringArray" },
 | 
						|
        additionalProperties: {
 | 
						|
            anyOf: [
 | 
						|
                { type: "boolean" },
 | 
						|
                { $ref: "#" }
 | 
						|
            ],
 | 
						|
            default: { }
 | 
						|
        },
 | 
						|
        definitions: {
 | 
						|
            type: "object",
 | 
						|
            additionalProperties: { $ref: "#" },
 | 
						|
            default: { }
 | 
						|
        },
 | 
						|
        properties: {
 | 
						|
            type: "object",
 | 
						|
            additionalProperties: { $ref: "#" },
 | 
						|
            default: { }
 | 
						|
        },
 | 
						|
        patternProperties: {
 | 
						|
            type: "object",
 | 
						|
            additionalProperties: { $ref: "#" },
 | 
						|
            default: { }
 | 
						|
        },
 | 
						|
        dependencies: {
 | 
						|
            type: "object",
 | 
						|
            additionalProperties: {
 | 
						|
                anyOf: [
 | 
						|
                    { $ref: "#" },
 | 
						|
                    { $ref: "#/definitions/stringArray" }
 | 
						|
                ]
 | 
						|
            }
 | 
						|
        },
 | 
						|
        enum: {
 | 
						|
            type: "array",
 | 
						|
            minItems: 1,
 | 
						|
            uniqueItems: true
 | 
						|
        },
 | 
						|
        type: {
 | 
						|
            anyOf: [
 | 
						|
                { $ref: "#/definitions/simpleTypes" },
 | 
						|
                {
 | 
						|
                    type: "array",
 | 
						|
                    items: { $ref: "#/definitions/simpleTypes" },
 | 
						|
                    minItems: 1,
 | 
						|
                    uniqueItems: true
 | 
						|
                }
 | 
						|
            ]
 | 
						|
        },
 | 
						|
        format: { type: "string" },
 | 
						|
        allOf: { $ref: "#/definitions/schemaArray" },
 | 
						|
        anyOf: { $ref: "#/definitions/schemaArray" },
 | 
						|
        oneOf: { $ref: "#/definitions/schemaArray" },
 | 
						|
        not: { $ref: "#" }
 | 
						|
    },
 | 
						|
    dependencies: {
 | 
						|
        exclusiveMaximum: ["maximum"],
 | 
						|
        exclusiveMinimum: ["minimum"]
 | 
						|
    },
 | 
						|
    default: { }
 | 
						|
};
 | 
						|
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
// Public Interface
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
 | 
						|
export default (additionalOptions = {}) => {
 | 
						|
    const ajv = new Ajv({
 | 
						|
        meta: false,
 | 
						|
        useDefaults: true,
 | 
						|
        validateSchema: false,
 | 
						|
        missingRefs: "ignore",
 | 
						|
        verbose: true,
 | 
						|
        schemaId: "auto",
 | 
						|
        ...additionalOptions
 | 
						|
    });
 | 
						|
 | 
						|
    ajv.addMetaSchema(metaSchema);
 | 
						|
    // eslint-disable-next-line no-underscore-dangle
 | 
						|
    ajv._opts.defaultMeta = metaSchema.id;
 | 
						|
 | 
						|
    return ajv;
 | 
						|
};
 |