From 5274d25199ce100f082daa3f07ea2c9669422a0b Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Fri, 10 Jan 2025 16:17:19 +0100 Subject: [PATCH] fixes gpx import/export errors on Safari --- web/src/lib/models/gpx/gpx.ts | 15 ++++++++++----- web/src/routes/+page.svelte | 4 ++-- web/src/routes/api/v1/trail/upload/+server.ts | 5 +++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/web/src/lib/models/gpx/gpx.ts b/web/src/lib/models/gpx/gpx.ts index fdad174f..d318768b 100644 --- a/web/src/lib/models/gpx/gpx.ts +++ b/web/src/lib/models/gpx/gpx.ts @@ -119,11 +119,13 @@ export default class GPX { } static parse(gpxString: string): Promise { - return new Promise((resolve, reject) => xml2js.parseString(gpxString, { + const sanitizedGPX = gpxString.replace(/\sxmlns=""/g, ''); + + return new Promise((resolve, reject) => xml2js.parseString(sanitizedGPX, { explicitArray: false, - attrValueProcessors: [(str: string | number) => { - if (!isNaN(Number(str))) { - str = Number.isInteger(Number(str)) ? parseInt(String(str), 10) : parseFloat(String(str)); + attrValueProcessors: [(str: string) => { + if (str.length && !isNaN(Number(str))) { + return Number.isInteger(Number(str)) ? parseInt(String(str), 10) : parseFloat(String(str)); } return str; } @@ -157,7 +159,10 @@ export default class GPX { if (!xmlString.includes(`xmlns="${defaultAttributes["xmlns"]}"`)) { xmlString = xmlString.replace(' {:else} {#each data.trails as trail} - - + {/each} {/if} diff --git a/web/src/routes/api/v1/trail/upload/+server.ts b/web/src/routes/api/v1/trail/upload/+server.ts index 4966c850..a9ad6fea 100644 --- a/web/src/routes/api/v1/trail/upload/+server.ts +++ b/web/src/routes/api/v1/trail/upload/+server.ts @@ -2,8 +2,8 @@ import { SummitLog } from "$lib/models/summit_log"; import type { Trail } from "$lib/models/trail"; import { trails_create } from "$lib/stores/trail_store"; import { handleError } from "$lib/util/api_util"; -import { fromFile, fromFIT, fromKML, fromTCX, gpx2trail, isFITFile } from "$lib/util/gpx_util"; -import { error, json, type RequestEvent } from "@sveltejs/kit"; +import { fromFile, gpx2trail } from "$lib/util/gpx_util"; +import { json, type RequestEvent } from "@sveltejs/kit"; import { ClientResponseError } from "pocketbase"; export async function PUT(event: RequestEvent) { @@ -30,6 +30,7 @@ export async function PUT(event: RequestEvent) { trail.expand!.summit_logs.push(log); } catch (e: any) { + console.error(e) throw new ClientResponseError({ status: 400, response: { message: "Invalid file" } }) }