(null);
-
- const timeout = (ms: number) => {
- return new Promise((resolve) => setTimeout(resolve, ms));
- };
- // console.log(`Rendering tile: ${JSON.stringify(props)}`);
- useEffect(() => {
- const loadImage = async () => {
- // console.log(`Pre loading: ${props.href}`);
- const href = getTileUrl(props.keyObject);
- const image = new Image(1, 1);
- image.loading = 'eager';
- // @ts-ignore
- image.setAttribute('href', href);
- if (!image.complete) {
- await image.decode();
- }
- if (props.delay !== undefined) {
- await timeout(props.delay);
- }
- const svgImage = document.createElementNS(
- 'http://www.w3.org/2000/svg',
- 'image'
- ) as unknown as SVGImageElement;
- svgImage.setAttribute('width', '1');
- svgImage.setAttribute('height', '1');
- // @ts-ignore
- svgImage.setAttribute('href', href);
- g.current?.replaceChildren(svgImage);
- };
- loadImage();
- }, [props.keyObject]);
-
- return (
-
- );
-}, isEqual);
-
-export default Tile;
diff --git a/src/components/map/TileSet.test.tsx b/src/components/map/TileSet.test.tsx
deleted file mode 100644
index fba1240..0000000
--- a/src/components/map/TileSet.test.tsx
+++ /dev/null
@@ -1,309 +0,0 @@
-import { render } from '@testing-library/react';
-import TileSet from './TileSet';
-
-describe('The TiledLayer component ', () => {
- beforeEach(() => {
- globalThis.cacheForTileSet = new Map();
- });
-
- test('exposes the tiles needed per its viewport', () => {
- const { baseElement } = render(
-
- );
- // screen.debug();
- expect(baseElement).toMatchInlineSnapshot(`
-
-
-
-
-
-`);
- });
-
- test('adds more tiles when its viewport is updated without removing the previous ones', () => {
- const { baseElement, rerender } = render(
-
- );
- rerender(
-
- );
- // screen.debug();
- expect(baseElement).toMatchInlineSnapshot(`
-
-
-
-
-
-`);
- });
- test('is not reinitialized if its key isObject updated', () => {
- const { baseElement, rerender } = render(
-
- );
- rerender(
-
- );
- // screen.debug();
- expect(baseElement).toMatchInlineSnapshot(`
-
-
-
-
-
-`);
- });
- test('Also works with negative coordinates', () => {
- const { baseElement } = render(
-
- );
- // screen.debug();
- expect(baseElement).toMatchInlineSnapshot(`
-
-
-
-
-
-`);
- });
-});
diff --git a/src/components/map/TileSet.tsx b/src/components/map/TileSet.tsx
deleted file mode 100644
index 37eface..0000000
--- a/src/components/map/TileSet.tsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import react, { memo } from 'react';
-import { isEqual, range } from 'lodash';
-
-import { Rectangle, TileKeyObject } from './types';
-import tileUri from './uris';
-import Tile from './Tile';
-import { tileSetConfig } from './config';
-
-/**
- * @hidden
- */
-export const thisIsAModule = true;
-
-/**
- *
- */
-
-declare global {
- var cacheForTileSet: any;
-}
-
-//export {};
-
-globalThis.cacheForTileSet = new Map();
-
-export interface TileSetProperties {
- /** A partial Tile key object specifying the provider and zoom level */
- keyObject: TileKeyObject;
- /** The current viewport expressed in tiles coordinates */
- viewPort?: Rectangle;
-}
-
-/**
- * A lazily loaded set of tiles.
- *
- * This component is rather dumb and is mainly a sparse array of tiles.
- *
- * New tiles are added to the array when the viewport is updated and they stay in the array until
- * the component is destroyed.
- *
- * This component has no need to know the number nor the size of its tiles: tiles can be added when needed and
- * its unit is the tile size (the parent component needs to transform its enclosing SVG group to adapt its units)
- *
- * The `globalThis.cacheForTiledLayer` global variable is used as a cache to store tiles without being subject
- * to re-initialization when components are unmounted/remounted.
- *
- * This cache is a map of map, the first key identifying the ``s.
- *
- * Idea stolen [on the web](https://dev.to/tiagof/react-re-mounting-vs-re-rendering-lnh)
- *
- *
- */
-export const TileSet: react.FC = memo(
- (props: TileSetProperties) => {
- // console.log(`Rendering TiledLayer: ${JSON.stringify(props)}`);
-
- const key = tileUri({
- provider: props.keyObject.provider,
- zoomLevel: props.keyObject.zoomLevel,
- });
-
- const tiles: any = globalThis.cacheForTileSet.get(key) ?? new Map();
- if (props.viewPort !== undefined) {
- range(props.viewPort.topLeft.y, props.viewPort.bottomRight.y + 1).forEach(
- (row) => {
- range(
- props.viewPort!.topLeft.x,
- props.viewPort!.bottomRight.x + 1
- ).forEach((col) => {
- const keyObject = {
- provider: props.keyObject.provider,
- zoomLevel: props.keyObject.zoomLevel,
- x: props.keyObject.x + col,
- y: props.keyObject.y + row,
- };
- const key = tileUri(keyObject);
- if (!tiles.has(key)) {
- tiles.set(
- key,
-
- );
- } else {
- const tile = tiles.get(key);
- tiles.delete(key);
- tiles.set(key, tile);
- }
- });
- }
- );
- if (tiles.size > tileSetConfig.cacheSizePerLayer) {
- const oldestTileKeys = [...tiles.keys()];
- oldestTileKeys.splice(-tileSetConfig.cacheSizePerLayer);
- oldestTileKeys.forEach((tileKey) => {
- tiles.delete(tileKey);
- });
- }
- if (globalThis.cacheForTileSet.has(key)) {
- globalThis.cacheForTileSet.delete(key);
- }
- globalThis.cacheForTileSet.set(key, tiles);
- if (globalThis.cacheForTileSet > tileSetConfig.numberOfCachedLayers) {
- const oldestCachedLayerKeys = [...globalThis.cacheForTileSet.keys()];
- oldestCachedLayerKeys.slice(-tileSetConfig.numberOfCachedLayers);
- oldestCachedLayerKeys.forEach((cachedLayerKey) => {
- globalThis.cacheForTileSet.delete(cachedLayerKey);
- });
- }
- }
-
- return <>{Array.from(tiles.values())}>;
- },
- isEqual
-);
-
-export default TileSet;
diff --git a/src/components/map/TiledLayer.test.tsx b/src/components/map/TiledLayer.test.tsx
deleted file mode 100644
index af79eb9..0000000
--- a/src/components/map/TiledLayer.test.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import { CoordinateSystem } from './LiveMap';
-import TiledLayer from './TiledLayer';
-
-describe('The TiledLayer component', () => {
- const coordinateSystem: CoordinateSystem = {
- shift: { x: 0, y: 0 },
- zoom: 1,
- };
-
- beforeEach(() => {
- globalThis.cacheForTileSet = new Map();
- });
-
- test('generates an empty layer if inactive', () => {
- // const { result } = renderHook(() => useAtom(tiledLayersAtom));
- render(
-
- );
- const svg = screen.getByTestId('tiled-layer');
- expect(svg).toMatchInlineSnapshot(`
-
-`);
- });
- test('generates a populated layer if active', () => {
- // const { result } = renderHook(() => useAtom(tiledLayersAtom));
- render(
-
- );
- const svg = screen.getByTestId('tiled-layer');
- expect(svg).toMatchInlineSnapshot(`
-
-`);
- });
-});
diff --git a/src/components/map/TiledLayer.tsx b/src/components/map/TiledLayer.tsx
deleted file mode 100644
index 866b146..0000000
--- a/src/components/map/TiledLayer.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import react, {
- cloneElement,
- JSXElementConstructor,
- ReactElement,
- useEffect,
- useRef,
- useState,
-} from 'react';
-import TileSet from './TileSet';
-import { Point, Rectangle, TileKeyObject } from './types';
-import { CoordinateSystem } from './LiveMap';
-import useViewport from './use-viewport';
-
-export interface TiledLayerProperties {
- /**
- * A key identifying the top left tile
- */
- keyObject: TileKeyObject;
- /**
- * The translation to apply.
- */
- shift: Point;
- /**
- * The zoom to apply. If equal to 256 (the tile size), the layer is considered active and should add tiles which are in its viewport
- */
- zoom: number;
- /**
- * The coordinate system
- */
- coordinateSystem: CoordinateSystem;
- /**
- *
- */
- viewPort?: Rectangle;
-}
-
-/**
- *
- * @param props
- * @returns A layer of tiles.
- * This component wraps a `` in an SVG `` element taking care of the scale and translation.
- *
- */
-export const TiledLayer: react.FC = (
- props: TiledLayerProperties
-) => {
- console.log(
- `Rendering TiledLayer, zoom: ${props.zoom}, viewPort: ${JSON.stringify(
- props.viewPort
- )}`
- );
- return (
- <>
-
-
-
- >
- );
-};
-
-export default TiledLayer;
diff --git a/src/components/map/Trk.tsx b/src/components/map/Trk.tsx
deleted file mode 100644
index d9355d5..0000000
--- a/src/components/map/Trk.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import react, { startTransition, useEffect, useState } from 'react';
-import dispatch from '../../workers/dispatcher-main';
-import { TileKeyObject, Rectangle } from './types';
-import getUri from '../../lib/ids';
-import Trkseg from './Trkseg';
-
-export interface TrkProperties {
- id: string;
- keyObject: TileKeyObject;
- zoom: number;
- viewPort: Rectangle;
-}
-
-export const Trk: react.FC = (props: TrkProperties) => {
- const [trk, setTrk] = useState([]);
- useEffect(() => {
- const getTrk = async () => {
- const trk = await dispatch({
- action: 'getTrk',
- params: {
- id: props.id,
- },
- });
- console.log(`, gpx: ${JSON.stringify(trk)}`);
- startTransition(() => setTrk(trk));
- };
- getTrk();
- }, [props.id]);
-
- return (
-
- {trk
- .filter((row: any) => row.doc.type === 'trkseg')
- .map((row: any) => (
-
- ))}
-
- );
-};
-
-export default Trk;
diff --git a/src/components/map/Trkseg.module.css b/src/components/map/Trkseg.module.css
deleted file mode 100644
index 7f003f6..0000000
--- a/src/components/map/Trkseg.module.css
+++ /dev/null
@@ -1,15 +0,0 @@
-.track {
- fill: transparent;
- stroke-width: 2px;
- stroke-linecap: round;
- stroke-linejoin: round;
- stroke: rgba(10, 1, 51, 0.8);
- vector-effect: non-scaling-stroke;
-}
-
-.start {
- color: green;
-}
-.finish {
- color: red;
-}
diff --git a/src/components/map/Trkseg.tsx b/src/components/map/Trkseg.tsx
deleted file mode 100644
index f4125d3..0000000
--- a/src/components/map/Trkseg.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import react, { startTransition, useEffect, useState } from 'react';
-import { lon2tile, lat2tile } from '../../lib/geo';
-import dispatch from '../../workers/dispatcher-main';
-import { TileKeyObject, Rectangle, Point, geoPoint } from './types';
-
-import css from './Trkseg.module.css';
-import { ReactComponent as Start } from '../../icons/flag-start-b-svgrepo-com.svg';
-import { ReactComponent as Finish } from '../../icons/flag-finish-b-o-svgrepo-com.svg';
-import Marker from './Marker';
-
-export interface TrksegProperties {
- id: string;
- keyObject: TileKeyObject;
- zoom: number;
- viewPort: Rectangle;
-}
-
-export const Trkseg: react.FC = (props: TrksegProperties) => {
- const [trkseg, setTrkseg] = useState([]);
- useEffect(() => {
- const getTrkseg = async () => {
- const trk = await dispatch({
- action: 'getTrkseg',
- params: {
- id: props.id,
- },
- });
- console.log(`, gpx: ${JSON.stringify(trk)}`);
- startTransition(() => setTrkseg(trk));
- };
- getTrkseg();
- }, [props.id]);
-
- const d = trkseg
- .slice(1)
- .reduce((previous: string, current: any, index: number) => {
- const action = index === 0 ? 'M' : index === 1 ? 'L' : '';
- const trkpt = current.doc.doc;
- return `${previous} ${action} ${
- (lon2tile(trkpt.$.lon, props.keyObject.zoomLevel) - props.keyObject.x) *
- 256
- }, ${
- (lat2tile(trkpt.$.lat, props.keyObject.zoomLevel) - props.keyObject.y) *
- 256
- }`;
- }, '');
-
- return (
- <>
- {trkseg[1] !== undefined ? (
- <>
-
-
-
- }
- viewPort={props.viewPort}
- zoom={props.zoom}
- />
-
-
-
-
-
- }
- viewPort={props.viewPort}
- zoom={props.zoom}
- />
- >
- ) : null}
- >
- );
-};
-
-export default Trkseg;
diff --git a/src/components/map/config.ts b/src/components/map/config.ts
deleted file mode 100644
index 9fff0bf..0000000
--- a/src/components/map/config.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/**The handlers configuration */
-export const handlersConfig = {
- /**Controls the activity of the mouse mouse event */
- mouseMoveThrottleDelay: 50,
- /**Controls the activity of the wheel event */
- wheelThrottleDelay: 100,
- /** Controls the activity of the single touch move event */
- singleTouchMoveThrottleDelay: 50,
- /** Controls the activity of the double touch move event */
- doubleTouchMoveThrottleDelay: 100,
-};
-
-export const tileSetConfig = {
- cacheSizePerLayer: 1000,
- numberOfCachedLayers: 20,
-};
diff --git a/src/components/map/tile-providers.tsx b/src/components/map/tile-providers.tsx
deleted file mode 100644
index 8fb86de..0000000
--- a/src/components/map/tile-providers.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-import { TileKeyObject } from './types';
-
-export interface TileProvider {
- name: string;
- minZoom: number;
- maxZoom: number;
- tileSize: number;
- getTileUrl: { (zoom: number, x: number, y: number): string };
-}
-
-const getRandomItem = (items: any[]) => {
- const idx = Math.floor(Math.random() * items.length);
- return items[idx];
-};
-
-const abc = ['a', 'b', 'c'];
-
-export type TileProviders = {
- [key: string]: TileProvider;
-};
-
-export const tileProviders: TileProviders = {
- osm: {
- name: 'Open Street Map',
- minZoom: 0,
- maxZoom: 19,
- tileSize: 256,
- getTileUrl: (zoom: number, x: number, y: number) =>
- 'https://tile.openstreetmap.org/' + zoom + '/' + x + '/' + y + '.png',
- },
- osmfr: {
- name: 'Open Street Map France',
- minZoom: 0,
- tileSize: 256,
- maxZoom: 20,
- getTileUrl: (zoom: number, x: number, y: number) =>
- 'https://' +
- getRandomItem(abc) +
- '.tile.openstreetmap.fr/osmfr/' +
- zoom +
- '/' +
- x +
- '/' +
- y +
- '.png',
- },
- otm: {
- name: 'Open Topo Map',
- minZoom: 2,
- maxZoom: 17,
- tileSize: 256,
- getTileUrl: (zoom: number, x: number, y: number) =>
- 'https://' +
- getRandomItem(abc) +
- '.tile.opentopomap.org/' +
- zoom +
- '/' +
- x +
- '/' +
- y +
- '.png',
- },
- cyclosm: {
- name: 'CyclOSM',
- minZoom: 0,
- maxZoom: 19,
- tileSize: 256,
- getTileUrl: (zoom: number, x: number, y: number) =>
- 'https://' +
- getRandomItem(abc) +
- '.tile-cyclosm.openstreetmap.fr/cyclosm/' +
- zoom +
- '/' +
- x +
- '/' +
- y +
- '.png',
- },
- //https://b.tile.openstreetmap.fr/openriverboatmap/20/535762/382966.png
- openriverboatmap: {
- name: 'Open River Boat Map',
- minZoom: 0,
- maxZoom: 20,
- tileSize: 256,
- getTileUrl: (zoom: number, x: number, y: number) =>
- 'https://' +
- getRandomItem(abc) +
- '.tile.openstreetmap.fr/openriverboatmap/' +
- zoom +
- '/' +
- x +
- '/' +
- y +
- '.png',
- },
-
- // cyclosmlite: {
- // name: 'CyclOSM lite',
- // minZoom: 0,
- // maxZoom: 19,
- // getTileUrl: (zoom: number, x: number, y: number) =>
- // 'https://' +
- // getRandomItem(abc) +
- // '.tile-cyclosm.openstreetmap.fr/cyclosm-lite/' +
- // zoom +
- // '/' +
- // x +
- // '/' +
- // y +
- // '.png',
- // },
- // esrisat: {
- // name: 'ESRI Satellite',
- // minZoom: 0,
- // maxZoom: 19,
- // getTileUrl: (zoom: number, x: number, y: number) =>
- // 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/' +
- // zoom +
- // '/' +
- // x +
- // '/' +
- // y +
- // '.jpg',
- // },
-
- fake: {
- name: 'Fake provider',
- minZoom: 0,
- maxZoom: 20,
- tileSize: 256,
- getTileUrl: (zoom: number, x: number, y: number) =>
- 'https://fakeurl/' + zoom + '/' + x + '/' + y + '.png',
- },
-};
-
-export const { fake, ...nonFakeTileProviders } = tileProviders;
-
-const mod = (n: number, m: number) => {
- const jsMod = n % m;
- return jsMod >= 0 ? jsMod : jsMod + m;
-};
-
-/**
- *
- * @param keyObject The tile identifier
- * @returns The ``'s URL 'as a string)
- */
-export const getTileUrl = (keyObject: TileKeyObject) => {
- const nbTiles = 2 ** keyObject.zoomLevel;
- const x = mod(keyObject.x, nbTiles);
- const y = mod(keyObject.y, nbTiles);
- return tileProviders[keyObject.provider].getTileUrl(
- keyObject.zoomLevel,
- x,
- y
- );
-};
-export default getTileUrl;
diff --git a/src/components/map/types.ts b/src/components/map/types.ts
deleted file mode 100644
index 5bf0539..0000000
--- a/src/components/map/types.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import tileProviders, { TileProviders } from './tile-providers';
-
-/**
- * An identifier for tiles (can also be used for tile layers)
- */
-export interface TileKeyObject {
- /**A tile provider id ('osm', 'otm', ...) */
- provider: keyof TileProviders;
- /**The zoom level (integer) */
- zoomLevel: number;
- /**The X coordinate (integer)*/
- x: number;
- /**The Y coordinate (integer) */
- y: number;
-}
-
-/**
- * A point identified by its longitude and latitude
- */
-export interface geoPoint {
- lon: number;
- lat: number;
-}
-
-/**
- * A map scope.
- *
- * This object contains what's needed to identify the state of the map
- *
- */
-export interface MapScope {
- center: geoPoint;
- zoom: number;
- tileProvider: keyof TileProviders;
-}
-
-/**
- * A point
- */
-export interface Point {
- /**The X coordinate (integer)*/
- x: number;
- /**The Y coordinate (integer) */
- y: number;
-}
-
-/**
- * A rectangle
- */
-export interface Rectangle {
- topLeft: Point;
- bottomRight: Point;
-}
diff --git a/src/components/map/uris.test.ts b/src/components/map/uris.test.ts
deleted file mode 100644
index 2137260..0000000
--- a/src/components/map/uris.test.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import tileUri from './uris';
-describe('Test that', () => {
- test('uri generation is working', () => {
- expect(tileUri({ provider: 'osm', zoomLevel: 16, x: 25, y: 52 })).toEqual(
- 'tile/osm/16/25/52'
- );
- });
- test('uri parsing works', () => {
- expect(tileUri('tile/otm/5/28/3')).toEqual({
- provider: 'otm',
- zoomLevel: 5,
- x: 28,
- y: 3,
- });
- });
- test('x and y are optional', () => {
- expect(tileUri({ provider: 'osm', zoomLevel: 16 })).toEqual('tile/osm/16//');
- });
- test('uri parsing works', () => {
- expect(tileUri('tile/otm/5')).toEqual({
- provider: 'otm',
- zoomLevel: 5,
- });
- });
-});
diff --git a/src/components/map/uris.ts b/src/components/map/uris.ts
deleted file mode 100644
index 990a2c9..0000000
--- a/src/components/map/uris.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { route } from '../../lib/docuri';
-
-/**
- * A [docuri](https://github.com/jo/docuri) route for {@link components/map/types!TileKeyObject}
- *
- * TODO: update docuri (or write a wrapper) to support datatyping (and formats).
- */
-export const tileUri = (rte: any) => {
- const r = route('tile/:provider/:zoomLevel(/:x/:y)')(rte);
- if (typeof r === 'object') {
- return r.x === undefined
- ? {
- provider: r.provider,
- zoomLevel: parseInt(r.zoomLevel),
- }
- : {
- provider: r.provider,
- zoomLevel: parseInt(r.zoomLevel),
- x: parseInt(r.x),
- y: parseInt(r.y),
- };
- }
- return r;
-};
-
-export default tileUri;
diff --git a/src/components/map/use-viewport.ts b/src/components/map/use-viewport.ts
deleted file mode 100644
index 375ed15..0000000
--- a/src/components/map/use-viewport.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { RefObject, useEffect, useRef, useState } from 'react';
-import { CoordinateSystem } from './LiveMap';
-import { Rectangle, TileKeyObject } from './types';
-
-const useViewport = (props: {
- keyObject: TileKeyObject;
- coordinateSystem: CoordinateSystem;
- svgElement: RefObject;
-}) => {
- const { keyObject, coordinateSystem, svgElement } = props;
- const [viewPort, setViewPort] = useState();
- useEffect(() => {
- if (
- svgElement.current !== null &&
- svgElement.current.ownerSVGElement !== null &&
- svgElement.current.ownerSVGElement.parentElement !== null
- ) {
- const nearerHTMLParent = svgElement.current.ownerSVGElement.parentElement;
- setViewPort({
- topLeft: {
- x:
- keyObject.x +
- Math.floor(-coordinateSystem.shift.x / coordinateSystem.zoom / 256),
- y:
- keyObject.y +
- Math.floor(-coordinateSystem.shift.y / coordinateSystem.zoom / 256),
- },
- bottomRight: {
- x:
- keyObject.x +
- Math.ceil(
- (-coordinateSystem.shift.x + nearerHTMLParent.offsetWidth) /
- coordinateSystem.zoom /
- 256
- ) -
- 1,
- y:
- keyObject.y +
- Math.ceil(
- (-coordinateSystem.shift.y + nearerHTMLParent.offsetHeight) /
- coordinateSystem.zoom /
- 256
- ) -
- 1,
- },
- });
- }
- }, [props.keyObject, props.coordinateSystem]);
- return viewPort;
-};
-export default useViewport;
diff --git a/src/db/gpx.test.ts b/src/db/gpx.test.ts
deleted file mode 100644
index d74211d..0000000
--- a/src/db/gpx.test.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { initDb } from '.';
-import { existsGpx, putNewGpx } from './gpx';
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The gpx module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new Gpx when required', async () => {
- await putNewGpx({ gpx: 0 });
- expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/0000000000000000',
- _rev: undefined,
- doc: {
- $: {
- creator: 'dyomedea version 0.000002',
- version: '1.1',
- xmlns: 'http://www.topografix.com/GPX/1/1',
- 'xmlns:dyo': 'http://xmlns.dyomedea.com/',
- 'xmlns:gpxtpx':
- 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
- 'xmlns:gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3',
- 'xmlns:wptx1':
- 'http://www.garmin.com/xmlschemas/WaypointExtension/v1',
- 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'xsi:schemaLocation':
- 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd',
- },
- extensions: undefined,
- metadata: {
- author: undefined,
- bounds: undefined,
- copyright: undefined,
- desc: undefined,
- extensions: undefined,
- keywords: undefined,
- link: undefined,
- name: undefined,
- time: '1970-01-01T00:00:00.000Z',
- },
- rte: undefined,
- trk: undefined,
- wpt: undefined,
- },
- type: 'gpx',
- });
- });
- test('db.put() generates an id if needed', async () => {
- const id = await putNewGpx();
- expect(id).toEqual({ gpx: 4320000000000000 });
- });
-});
-
-describe('The gpx module with a real db', () => {
- beforeEach(async () => {
- await initDb({});
- globalThis.Date.now = () => 0;
- });
- afterEach(async () => {
- await db.destroy();
- db = undefined;
- globalThis.Date.now = originalDateNow;
- });
-
- test("existsGpx returns false if the GPX doesn't exist", async () => {
- const exists = await existsGpx({ gpx: 1 });
- expect(exists).toBeFalsy();
- });
- test('existsGpx returns false if the GPX exists', async () => {
- const id = { gpx: 1 };
- await putNewGpx(id);
- const exists = await existsGpx(id);
- expect(exists).toBeTruthy();
- });
-});
diff --git a/src/db/gpx.ts b/src/db/gpx.ts
deleted file mode 100644
index cd08027..0000000
--- a/src/db/gpx.ts
+++ /dev/null
@@ -1,269 +0,0 @@
-import { PureComponent } from 'react';
-import { Point, Rectangle } from '../components/map/types';
-import { lat2tile, lon2tile, rectanglesIntersect } from '../lib/geo';
-import getUri, { intToGpxId } from '../lib/ids';
-import { get, getDocsByType, getFamily, put, putAll } from './lib';
-
-const emptyGpx: Gpx = {
- $: {
- version: '1.1',
- creator: 'dyomedea version 0.000002',
- xmlns: 'http://www.topografix.com/GPX/1/1',
- 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'xsi:schemaLocation':
- 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd',
- 'xmlns:gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3',
- 'xmlns:wptx1': 'http://www.garmin.com/xmlschemas/WaypointExtension/v1',
- 'xmlns:gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
- 'xmlns:dyo': 'http://xmlns.dyomedea.com/',
- },
- metadata: {
- name: undefined,
- desc: undefined,
- author: undefined,
- copyright: undefined,
- link: undefined,
- time: undefined,
- keywords: undefined,
- bounds: undefined,
- extensions: undefined,
- },
- wpt: undefined,
- rte: undefined,
- trk: undefined,
- extensions: undefined,
-};
-
-export const putNewGpx = async (
- id: IdGpx = { gpx: intToGpxId(Date.now()) }
-) => {
- const uri = getUri('gpx', id);
- await put(
- uri,
- 'gpx',
- (gpx) => {
- (gpx.metadata ??= {}).time = new Date(Date.now()).toISOString();
- return gpx;
- },
- emptyGpx
- );
- return id;
-};
-
-export const existsGpx = async (id: IdGpx) => {
- const uri = getUri('gpx', id);
- try {
- await get(uri);
- return true;
- } catch {
- return false;
- }
-};
-
-const prune = (id: any, object: any, docs: any[]) => {
- if (typeof object === 'object') {
- for (const key in object) {
- if (
- key === 'wpt' ||
- key === 'rte' ||
- key === 'rtept' ||
- key === 'trk' ||
- key === 'trkseg' ||
- key === 'trkpt'
- ) {
- const subObjects = object[key];
- for (const index in subObjects) {
- const subId = { ...id };
- subId[key] = index;
- docs.push({
- _id: getUri(key, subId),
- type: key,
- doc: subObjects[index],
- });
- prune(subId, subObjects[index], docs);
- }
- object[key] = undefined;
- } else prune(id, object[key], docs);
- }
- }
-};
-
-const extensionsFromObject = (
- object: any,
- extensions = {
- viewport: { topLeft: {}, bottomRight: {} },
- bbox: {
- minLon: undefined,
- minLat: undefined,
- maxLon: undefined,
- maxLat: undefined,
- },
- }
-) => {
- if (typeof object === 'object') {
- if ('$' in object) {
- const attributes = object.$;
- if ('lat' in attributes) {
- const lat = +attributes.lat;
- if (
- extensions.bbox.minLat === undefined ||
- lat < extensions.bbox.minLat
- ) {
- extensions.bbox.minLat = lat;
- }
- if (
- extensions.bbox.maxLat === undefined ||
- lat > extensions.bbox.maxLat
- ) {
- extensions.bbox.maxLat = lat;
- }
- }
- if ('lon' in attributes) {
- const lon = +attributes.lon;
- if (
- extensions.bbox.minLon === undefined ||
- lon < extensions.bbox.minLon
- ) {
- extensions.bbox.minLon = lon;
- }
- if (
- extensions.bbox.maxLon === undefined ||
- lon > extensions.bbox.maxLon
- ) {
- extensions.bbox.maxLon = lon;
- }
- }
- }
- for (const key in object) {
- extensionsFromObject(object[key], extensions);
- }
- }
- return extensions;
-};
-
-const extensionsFromGpx = (gpx: Gpx) => {
- const extensions = { ...gpx.extensions, ...extensionsFromObject(gpx) };
- gpx.extensions = undefined;
- if (
- extensions.bbox.maxLat !== undefined &&
- extensions.bbox.minLon !== undefined
- ) {
- extensions.viewport.topLeft = {
- x: lon2tile(extensions.bbox.minLon, 0),
- y: lat2tile(extensions.bbox.maxLat, 0),
- };
- }
- if (
- extensions.bbox.minLat !== undefined &&
- extensions.bbox.maxLon !== undefined
- ) {
- extensions.viewport.bottomRight = {
- x: lon2tile(extensions.bbox.maxLon, 0),
- y: lat2tile(extensions.bbox.minLat, 0),
- };
- }
-
- return extensions;
-};
-
-export const pruneAndSaveImportedGpx = async (params: any) => {
- const { id, gpx, extensions } = params;
- let docs: any[] = [
- { _id: getUri('gpx', id), type: 'gpx', doc: gpx },
- {
- _id: getUri('extensions', id),
- type: 'extensions',
- doc: { ...extensions, ...extensionsFromGpx(gpx) },
- },
- ];
- prune(id, gpx, docs);
- console.log(JSON.stringify(docs));
- try {
- const result = await putAll(docs);
- console.log(JSON.stringify(result));
- } catch (err) {
- console.error(`error: ${err}`);
- }
-};
-
-export const getGpxesForViewport = async (params: any) => {
- const { viewport, zoomLevel } = params;
- const zoomedViewport: Rectangle = {
- topLeft: {
- x: viewport.topLeft.x / 2 ** zoomLevel,
- y: viewport.topLeft.y / 2 ** zoomLevel,
- },
- bottomRight: {
- x: (viewport.bottomRight.x + 1) / 2 ** zoomLevel,
- y: (viewport.bottomRight.y + 1) / 2 ** zoomLevel,
- },
- };
- const allExtensions = await getDocsByType('extensions');
- console.log(
- `getGpxesForViewport, allExtensions: ${JSON.stringify(allExtensions)}`
- );
- return allExtensions
- .filter((extensions: any) => {
- return rectanglesIntersect(zoomedViewport, extensions.doc.viewport);
- })
- .map((extensions: any) =>
- getUri('gpx', getUri('extensions', extensions._id))
- );
-};
-
-const appendToArray = (target: any, key: string, value: any) => {
- if (!(key in target)) {
- target[key] = [];
- }
- target[key].push(value);
-};
-
-export const getFullGpx = async (params: any) => {
- const { id } = params;
- const docs = await getFamily(id, { include_docs: true });
- let target: any[];
- let gpx: Gpx | undefined = undefined;
- docs.rows.forEach((row: any) => {
- // level 0
- if (row.doc.type === 'gpx') {
- target = [row.doc.doc];
- gpx = row.doc.doc;
- }
- //level 1
- if (
- row.doc.type === 'wpt' ||
- row.doc.type === 'rte' ||
- row.doc.type === 'trk' ||
- row.doc.type === 'extensions'
- ) {
- target.splice(1);
- appendToArray(target.at(-1), row.doc.type, row.doc.doc);
- target.push(row.doc.doc);
- }
- // level 2
- if (row.doc.type === 'rtept' || row.doc.type === 'trkseg') {
- target.splice(2);
- appendToArray(target.at(-1), row.doc.type, row.doc.doc);
- target.push(row.doc.doc);
- }
- // level 3
- if (row.doc.type === 'trkpt') {
- appendToArray(target.at(-1), row.doc.type, row.doc.doc);
- }
- });
- return gpx;
-};
-
-export const getGpx = async (params: any) => {
- const { id } = params;
- const docs = await getFamily(id, { include_docs: true });
- console.log(`getGpx, uri: ${id} docs: ${JSON.stringify(docs)}`);
- return docs.rows.filter(
- (row: any) =>
- row.doc.type === 'gpx' ||
- row.doc.type === 'wpt' ||
- row.doc.type === 'rte' ||
- row.doc.type === 'trk' ||
- row.doc.type === 'extensions'
- );
-};
diff --git a/src/db/index.ts b/src/db/index.ts
deleted file mode 100644
index 49536bf..0000000
--- a/src/db/index.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-import _ from 'lodash';
-import PouchDB from 'pouchdb';
-import PouchDBFind from 'pouchdb-find';
-import uri from '../lib/ids';
-
-PouchDB.plugin(PouchDBFind);
-
-const dbDefinitionId = uri('dbdef', {});
-
-const currentDbDefinition = {
- _id: dbDefinitionId,
- type: dbDefinitionId,
- def: { version: '0.000001' },
-};
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-export const initDb = async (params: any) => {
- if (globalThis.db === undefined) {
- globalThis.db = new PouchDB('dyomedea', {
- auto_compaction: true,
- revs_limit: 10,
- });
- }
- const db = globalThis.db;
- var previousDbDefinition = {
- _id: dbDefinitionId,
- type: dbDefinitionId,
- def: { version: '0' },
- };
- try {
- previousDbDefinition = await db.get(dbDefinitionId);
- } catch (error: any) {
- if (error.status !== 404) {
- console.log(
- `Unexpected error fetching db definition: ${JSON.stringify(error)}`
- );
- return;
- }
- }
-
- if (previousDbDefinition.def.version < currentDbDefinition.def.version) {
- previousDbDefinition.def = currentDbDefinition.def;
- db.put(previousDbDefinition);
- // TODO: support migrations
- }
- await await db.compact();
- await db.viewCleanup();
-
- // WARNING: defs must use the canonical form and be identical to what will be returned by db.getIndexes
- const requiredIndexes: any = [
- {
- name: 'type',
- def: {
- fields: [{ type: 'asc' }],
- },
- },
- ];
-
- const existingIndexes = (await db.getIndexes()).indexes;
-
- const pruneIndex = ({ name, def }: any) => ({ name, def });
-
- const isSameIndex = (idx1: any, idx2: any) => {
- return _.isEqual(pruneIndex(idx1), pruneIndex(idx2));
- };
-
- const findIndex = (targetIndexes: any, index: any) =>
- targetIndexes.find((targetIndex: any) => {
- return isSameIndex(targetIndex, index);
- });
-
- for (var index of existingIndexes) {
- if (index.type === 'json') {
- // Non system indexes
- // console.log(`Checking existing index :${JSON.stringify(index)}`);
- if (!findIndex(requiredIndexes, index)) {
- // console.log(`db.deleteIndex(${JSON.stringify(index)})`);
- await db.deleteIndex(index);
- }
- }
- }
-
- for (index of requiredIndexes) {
- if (!findIndex(existingIndexes, index)) {
- // console.log(`db.createIndex(${JSON.stringify(index)})`);
- await db.createIndex({ name: index.name, ...index.def });
- }
- }
-
- globalThis.dbReady = true;
-
- /* const indexes = await db.getIndexes();
- console.log(`indexes: ${JSON.stringify(indexes)}`);
-
- const explain1 = await db.explain({
- selector: {
- type: 'trkpt',
- gpx: 'xxxx',
- },
- // sort: ['trkpt.time'],
- // use_index: 'type-trkpt-gpx-time',
- });
- console.log(`explain1: ${JSON.stringify(explain1)}`);
- const explain2 = await db.explain({
- selector: {
- type: 'gpx',
- },
- // sort: ['trkpt.time'],
- // use_index: 'type-trkpt-gpx-time',
- });
- console.log(`explain2: ${JSON.stringify(explain2)}`);
- */
-};
diff --git a/src/db/lib.test.ts b/src/db/lib.test.ts
deleted file mode 100644
index 2d8d58f..0000000
--- a/src/db/lib.test.ts
+++ /dev/null
@@ -1,299 +0,0 @@
-import { initDb } from '.';
-import uri from '../lib/ids';
-import { getDocsByType, getFamily } from './lib';
-import { putNewRte } from './rte';
-import { putNewRtept } from './rtept';
-import { putNewTrk } from './trk';
-import { putNewTrkpt } from './trkpt';
-import { putNewTrkseg } from './trkseg';
-import { putNewWpt } from './wpt';
-
-declare global {
- var db: any;
-}
-
-const originalDateNow = globalThis.Date.now;
-
-describe('getFamily', () => {
- beforeEach(async () => {
- await initDb({});
- globalThis.Date.now = () => 0;
- });
- afterEach(async () => {
- await db.destroy();
- db = undefined;
- globalThis.Date.now = originalDateNow;
- });
- test('returns two rows after a gpx and a track have been inserted.', async () => {
- await putNewTrk();
- const allDocs: any = await getFamily('gpx/');
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "id": "gpx/4320000000000000/3trk/000000",
- "key": "gpx/4320000000000000/3trk/000000",
- "value": Object {
- "rev": "1-4c114f3ae0073151e4082ff1d220c2a4",
- },
- },
- ],
- "total_rows": 4,
-}
-`);
- });
- test('also returns the docs if required.', async () => {
- await putNewTrk();
- const allDocs: any = await getFamily('gpx/', {
- include_docs: true,
- });
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "doc": Object {
- "_id": "gpx/4320000000000000",
- "_rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- "doc": Object {
- "$": Object {
- "creator": "dyomedea version 0.000002",
- "version": "1.1",
- "xmlns": "http://www.topografix.com/GPX/1/1",
- "xmlns:dyo": "http://xmlns.dyomedea.com/",
- "xmlns:gpxtpx": "http://www.garmin.com/xmlschemas/TrackPointExtension/v1",
- "xmlns:gpxx": "http://www.garmin.com/xmlschemas/GpxExtensions/v3",
- "xmlns:wptx1": "http://www.garmin.com/xmlschemas/WaypointExtension/v1",
- "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
- "xsi:schemaLocation": "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd",
- },
- "metadata": Object {
- "time": "1970-01-01T00:00:00.000Z",
- },
- },
- "type": "gpx",
- },
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "doc": Object {
- "_id": "gpx/4320000000000000/3trk/000000",
- "_rev": "1-4c114f3ae0073151e4082ff1d220c2a4",
- "doc": Object {
- "number": 0,
- },
- "type": "trk",
- },
- "id": "gpx/4320000000000000/3trk/000000",
- "key": "gpx/4320000000000000/3trk/000000",
- "value": Object {
- "rev": "1-4c114f3ae0073151e4082ff1d220c2a4",
- },
- },
- ],
- "total_rows": 4,
-}
-`);
- });
- test('returns three rows after a gpx and a track segment have been inserted.', async () => {
- await putNewTrkseg();
- const allDocs: any = await getFamily('gpx/');
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "id": "gpx/4320000000000000/3trk/000000",
- "key": "gpx/4320000000000000/3trk/000000",
- "value": Object {
- "rev": "1-4c114f3ae0073151e4082ff1d220c2a4",
- },
- },
- Object {
- "id": "gpx/4320000000000000/3trk/000000/000000",
- "key": "gpx/4320000000000000/3trk/000000/000000",
- "value": Object {
- "rev": "1-68d7de0569de570229ea9f9e1a0b13cb",
- },
- },
- ],
- "total_rows": 5,
-}
-`);
- });
- test('returns four rows after a gpx and a track point have been inserted.', async () => {
- await putNewTrkpt();
- const allDocs: any = await getFamily('gpx/');
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "id": "gpx/4320000000000000/3trk/000000",
- "key": "gpx/4320000000000000/3trk/000000",
- "value": Object {
- "rev": "1-4c114f3ae0073151e4082ff1d220c2a4",
- },
- },
- Object {
- "id": "gpx/4320000000000000/3trk/000000/000000",
- "key": "gpx/4320000000000000/3trk/000000/000000",
- "value": Object {
- "rev": "1-68d7de0569de570229ea9f9e1a0b13cb",
- },
- },
- Object {
- "id": "gpx/4320000000000000/3trk/000000/000000/000000",
- "key": "gpx/4320000000000000/3trk/000000/000000/000000",
- "value": Object {
- "rev": "1-7d917d1f3505fe0e3092161694904b53",
- },
- },
- ],
- "total_rows": 6,
-}
-`);
- });
-
- test('returns two rows after a gpx and a waypoint have been inserted.', async () => {
- await putNewWpt();
- const allDocs: any = await getFamily('gpx/');
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "id": "gpx/4320000000000000/1wpt/000000",
- "key": "gpx/4320000000000000/1wpt/000000",
- "value": Object {
- "rev": "1-c6793365fd0dd56236ab8734a41c7ae7",
- },
- },
- ],
- "total_rows": 4,
-}
-`);
- });
-
- test('returns two rows after a gpx and a route have been inserted.', async () => {
- await putNewRte();
- const allDocs: any = await getFamily('gpx/');
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "id": "gpx/4320000000000000/2rte/000000",
- "key": "gpx/4320000000000000/2rte/000000",
- "value": Object {
- "rev": "1-2ca14f512a9c83f5a239389e580befce",
- },
- },
- ],
- "total_rows": 4,
-}
-`);
- });
-
- test('returns three rows after a gpx and a route point have been inserted.', async () => {
- await putNewRtept();
- const allDocs: any = await getFamily('gpx/');
- expect(allDocs).toMatchInlineSnapshot(`
-Object {
- "offset": 0,
- "rows": Array [
- Object {
- "id": "gpx/4320000000000000",
- "key": "gpx/4320000000000000",
- "value": Object {
- "rev": "1-49baa096ec0c89962f2cafd3ff50b80b",
- },
- },
- Object {
- "id": "gpx/4320000000000000/2rte/000000",
- "key": "gpx/4320000000000000/2rte/000000",
- "value": Object {
- "rev": "1-2ca14f512a9c83f5a239389e580befce",
- },
- },
- Object {
- "id": "gpx/4320000000000000/2rte/000000/000000",
- "key": "gpx/4320000000000000/2rte/000000/000000",
- "value": Object {
- "rev": "1-0f4064d20f6bfac3888a7758851fbac5",
- },
- },
- ],
- "total_rows": 5,
-}
-`);
- });
-});
-
-describe('getDocsByType', () => {
- beforeEach(async () => {
- await initDb({});
- globalThis.Date.now = () => 0;
- });
- afterEach(async () => {
- await db.destroy();
- db = undefined;
- globalThis.Date.now = originalDateNow;
- });
- test('gets the rte amongst other docs', async () => {
- await putNewRtept();
- const rtes = await getDocsByType('rte');
- expect(rtes).toMatchInlineSnapshot(`
-Array [
- Object {
- "_id": "gpx/4320000000000000/2rte/000000",
- "_rev": "1-2ca14f512a9c83f5a239389e580befce",
- "doc": Object {
- "number": 0,
- },
- "type": "rte",
- },
-]
-`);
- });
-});
diff --git a/src/db/lib.ts b/src/db/lib.ts
deleted file mode 100644
index 0b98445..0000000
--- a/src/db/lib.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { cloneDeep } from 'lodash';
-
-declare global {
- var db: any;
-}
-
-export const put = async (
- _id: string,
- type: string,
- update: (doc: any) => any,
- defaultDoc: any
-) => {
- var current;
- try {
- current = await db.get(_id);
- } catch {
- current = { _rev: undefined, doc: cloneDeep(defaultDoc) };
- }
- try {
- db.put({ _id, _rev: current._rev, type, doc: update(current.doc) });
- } catch (error: any) {
- if (error.name === 'conflict') {
- await put(_id, type, update, defaultDoc);
- } else {
- console.error(
- `put(${_id}, ${JSON.stringify(
- update(current.doc)
- )}), error: ${JSON.stringify(error)}`
- );
- }
- }
-};
-
-export const getFamily = async (key: string, options: any = {}) => {
- return await db.allDocs({
- startkey: key,
- endkey: key + '\ufff0',
- ...options,
- });
-};
-
-export const get = async (id: string) => {
- await db.get(id);
-};
-
-export const putAll = async (docs: any[]) => {
- return await db.bulkDocs(docs);
-};
-
-export const getDocsByType = async (type: string) => {
- return (await db.find({ selector: { type: type } })).docs;
-};
diff --git a/src/db/rte.test.ts b/src/db/rte.test.ts
deleted file mode 100644
index 473a6f9..0000000
--- a/src/db/rte.test.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { putNewRte } from './rte';
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The rte module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new rte when required', async () => {
- putNewRte({ gpx: 4320000000000000, rte: 25 });
- await expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/4320000000000000/2rte/000025',
- _rev: undefined,
- doc: {
- cmt: undefined,
- desc: undefined,
- extensions: undefined,
- link: undefined,
- name: undefined,
- number: 0,
- rtept: undefined,
- src: undefined,
- type: undefined,
- },
- type: 'rte',
- });
- });
- test('db.put() generates an id for the trk if needed', async () => {
- const id = await putNewRte({ gpx: 0 });
- expect(id).toEqual({ gpx: 0, rte: 0 });
- });
- test('db.put() generates ids for both gpx and trk if needed', async () => {
- const id = await putNewRte();
- expect(id).toEqual({ gpx: 4320000000000000, rte: 0 });
- });
-});
diff --git a/src/db/rte.ts b/src/db/rte.ts
deleted file mode 100644
index 8febbc9..0000000
--- a/src/db/rte.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import getUri from '../lib/ids';
-import { putNewGpx } from './gpx';
-import { put } from './lib';
-
-export const emptyRte: Rte = {
- name: undefined,
- cmt: undefined,
- desc: undefined,
- src: undefined,
- link: undefined,
- number: 0,
- type: undefined,
- extensions: undefined,
- rtept: undefined,
-};
-
-export const putNewRte = async (id?: IdRte | IdGpx) => {
- let finalId = { ...id };
- if (!('rte' in finalId)) {
- const gpxId = await putNewGpx(id);
- finalId = { ...gpxId, rte: 0 };
- }
- const uri = getUri('rte', finalId);
- await put(
- uri,
- 'rte',
- (rte) => {
- return rte;
- },
- emptyRte
- );
- return finalId as IdRte;
-};
diff --git a/src/db/rtept.test.ts b/src/db/rtept.test.ts
deleted file mode 100644
index 4e993fb..0000000
--- a/src/db/rtept.test.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { putNewRtept } from './rtept';
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The rtept module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new rtept when required', async () => {
- putNewRtept({ gpx: 0, rte: 0, rtept: 0 });
- await expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/0000000000000000/2rte/000000/000000',
- _rev: undefined,
- doc: {
- $: { lat: 0, lon: 0 },
- ageofdgpsdata: undefined,
- cmt: undefined,
- desc: undefined,
- dgpsid: undefined,
- ele: undefined,
- extensions: undefined,
- fix: undefined,
- geoidheight: undefined,
- hdop: undefined,
- link: undefined,
- magvar: undefined,
- name: undefined,
- pdop: undefined,
- sat: undefined,
- src: undefined,
- sym: undefined,
- time: undefined,
- type: undefined,
- vdop: undefined,
- },
- type: 'rtept',
- });
- });
- test('db.put() generates an id for the rtept if needed', async () => {
- const id = await putNewRtept({ gpx: 0 });
- expect(id).toEqual({ gpx: 0, rte: 0, rtept: 0 });
- });
- test('db.put() generates ids for both gpx and rte if needed', async () => {
- const id = await putNewRtept();
- expect(id).toEqual({ gpx: 4320000000000000, rte: 0, rtept: 0 });
- });
-});
diff --git a/src/db/rtept.ts b/src/db/rtept.ts
deleted file mode 100644
index cb4a8c1..0000000
--- a/src/db/rtept.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import getUri from '../lib/ids';
-import { put } from './lib';
-import { putNewRte } from './rte';
-
-export const emptyRtept: Wpt = {
- $: { lat: 0, lon: 0 },
- ele: undefined,
- time: undefined,
- magvar: undefined,
- geoidheight: undefined,
- name: undefined,
- cmt: undefined,
- desc: undefined,
- src: undefined,
- link: undefined,
- sym: undefined,
- type: undefined,
- fix: undefined,
- sat: undefined,
- hdop: undefined,
- vdop: undefined,
- pdop: undefined,
- ageofdgpsdata: undefined,
- dgpsid: undefined,
- extensions: undefined,
-};
-
-export const putNewRtept = async (id?: IdGpx | IdRte | IdRtept) => {
- let finalId = { ...id };
- if (!('rtept' in finalId)) {
- const rteId = await putNewRte(id);
- finalId = { ...rteId, rtept: 0 };
- }
- const uri = getUri('rtept', finalId);
- await put(
- uri,
- 'rtept',
- (rtept) => {
- return rtept;
- },
- emptyRtept
- );
- return finalId as IdRtept;
-};
diff --git a/src/db/trk.test.ts b/src/db/trk.test.ts
deleted file mode 100644
index 02cdc61..0000000
--- a/src/db/trk.test.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { putNewTrk } from './trk';
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The trk module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new trk when required', async () => {
- putNewTrk({ gpx: 1, trk: 2 });
- await expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/0000000000000001/3trk/000002',
- _rev: undefined,
- doc: {
- cmt: undefined,
- desc: undefined,
- extensions: undefined,
- link: undefined,
- name: undefined,
- number: 0,
- src: undefined,
- trkseg: undefined,
- type: undefined,
- },
- type: 'trk',
- });
- });
- test('db.put() generates an id for the trk if needed', async () => {
- const id = await putNewTrk({ gpx: 2 });
- expect(id).toEqual({ gpx: 2, trk: 0});
- });
- test('db.put() generates ids for both gpx and trk if needed', async () => {
- const id = await putNewTrk();
- expect(id).toEqual({ gpx: 4320000000000000, trk: 0});
- });
-});
diff --git a/src/db/trk.ts b/src/db/trk.ts
deleted file mode 100644
index 70f8f5c..0000000
--- a/src/db/trk.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import getUri from '../lib/ids';
-import { putNewGpx } from './gpx';
-import { getFamily, put } from './lib';
-
-export const emptyTrk: Trk = {
- name: undefined,
- cmt: undefined,
- desc: undefined,
- src: undefined,
- link: undefined,
- number: 0,
- type: undefined,
- extensions: undefined,
- trkseg: undefined,
-};
-
-export const putNewTrk = async (id?: IdTrk | IdGpx) => {
- let finalId = { ...id };
- if (!('trk' in finalId)) {
- const gpxId = await putNewGpx(id);
- finalId = { ...gpxId, trk: 0 };
- }
- const uri = getUri('trk', finalId);
- await put(
- uri,
- 'trk',
- (trk) => {
- return trk;
- },
- emptyTrk
- );
- return finalId as IdTrk;
-};
-
-export const getTrk = async (params: any) => {
- const { id } = params;
- const docs = await getFamily(id, { include_docs: true });
- console.log(`getTrk, uri: ${id} docs: ${JSON.stringify(docs)}`);
- return docs.rows.filter(
- (row: any) => row.doc.type === 'trk' || row.doc.type === 'trkseg'
- );
-};
diff --git a/src/db/trkpt.test.ts b/src/db/trkpt.test.ts
deleted file mode 100644
index b4cfb0f..0000000
--- a/src/db/trkpt.test.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { putNewTrkpt } from './trkpt';
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The trkpt module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new trkpt when required', async () => {
- putNewTrkpt({
- gpx: 1,
- trk: 2,
- trkseg: 3,
- trkpt: 4,
- });
- await expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/0000000000000001/3trk/000002/000003/000004',
- _rev: undefined,
- doc: {
- $: { lat: 0, lon: 0 },
- ageofdgpsdata: undefined,
- cmt: undefined,
- desc: undefined,
- dgpsid: undefined,
- ele: undefined,
- extensions: {
- 'dyo:accuracy': undefined,
- 'dyo:batterylevel': undefined,
- 'dyo:course': undefined,
- 'dyo:speed': undefined,
- 'dyo:useragent': undefined,
- },
- fix: undefined,
- geoidheight: undefined,
- hdop: undefined,
- link: undefined,
- magvar: undefined,
- name: undefined,
- pdop: undefined,
- sat: undefined,
- src: undefined,
- sym: undefined,
- time: undefined,
- type: undefined,
- vdop: undefined,
- },
- type: 'trkpt',
- });
- });
- test('db.put() generates an id for the trk if needed', async () => {
- const id = await putNewTrkpt({ gpx: 5 });
- expect(id).toEqual({
- gpx: 5,
- trk: 0,
- trkseg: 0,
- trkpt: 0,
- });
- });
- test('db.put() generates ids for both gpx and trk if needed', async () => {
- const id = await putNewTrkpt();
- expect(id).toEqual({
- gpx: 4320000000000000,
- trk: 0,
- trkseg: 0,
- trkpt: 0,
- });
- });
-});
diff --git a/src/db/trkpt.ts b/src/db/trkpt.ts
deleted file mode 100644
index 484be6a..0000000
--- a/src/db/trkpt.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import getUri from '../lib/ids';
-import { put } from './lib';
-import { putNewTrkseg } from './trkseg';
-
-const emptyTrkpt: Wpt = {
- $: { lat: 0, lon: 0 },
- ele: undefined,
- time: undefined,
- magvar: undefined,
- geoidheight: undefined,
- name: undefined,
- cmt: undefined,
- desc: undefined,
- src: undefined,
- link: undefined,
- sym: undefined,
- type: undefined,
- fix: undefined,
- sat: undefined,
- hdop: undefined,
- vdop: undefined,
- pdop: undefined,
- ageofdgpsdata: undefined,
- dgpsid: undefined,
- extensions: {
- 'dyo:speed': undefined,
- 'dyo:course': undefined,
- 'dyo:accuracy': undefined,
- 'dyo:batterylevel': undefined,
- 'dyo:useragent': undefined,
- },
-};
-
-export const putNewTrkpt = async (id?: IdTrk | IdGpx | IdTrkseg | IdTrkpt) => {
- let finalId = { ...id };
- if (!('trkpt' in finalId)) {
- const trksegId = await putNewTrkseg(id);
- finalId = { ...trksegId, trkpt: 0 };
- }
- const uri = getUri('trkpt', finalId);
- await put(
- uri,
- 'trkpt',
- (trkpt) => {
- return trkpt;
- },
- emptyTrkpt
- );
- return finalId;
-};
diff --git a/src/db/trkseg.test.ts b/src/db/trkseg.test.ts
deleted file mode 100644
index ca82725..0000000
--- a/src/db/trkseg.test.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { putNewTrkseg } from './trkseg';
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The trkseg module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new trk when required', async () => {
- putNewTrkseg({ gpx: 1234567890123456, trk: 123456, trkseg: 5 });
- await expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/1234567890123456/3trk/123456/000005',
- _rev: undefined,
- doc: {
- trkpt: undefined,
- extensions: undefined,
- },
- type: 'trkseg',
- });
- });
- test('db.put() generates an id for the trk if needed', async () => {
- const id = await putNewTrkseg({ gpx: 1 });
- expect(id).toEqual({ gpx: 1, trk: 0, trkseg: 0 });
- });
- test('db.put() generates ids for both gpx and trk if needed', async () => {
- const id = await putNewTrkseg();
- expect(id).toEqual({ gpx: 4320000000000000, trk: 0, trkseg: 0 });
- });
-});
diff --git a/src/db/trkseg.ts b/src/db/trkseg.ts
deleted file mode 100644
index b6ad518..0000000
--- a/src/db/trkseg.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import getUri from '../lib/ids';
-import { getFamily, put } from './lib';
-import { putNewTrk } from './trk';
-
-const emptyTrkseg: Trkseg = {
- trkpt: undefined,
- extensions: undefined,
-};
-
-export const putNewTrkseg = async (id?: IdTrk | IdGpx | IdTrkseg) => {
- let finalId = { ...id };
- if (!('trkseg' in finalId)) {
- const trkId = await putNewTrk(id);
- finalId = { ...trkId, trkseg: 0 };
- }
- const uri = getUri('trkseg', finalId);
- await put(
- uri,
- 'trkseg',
- (trkseg) => {
- return trkseg;
- },
- emptyTrkseg
- );
- return finalId as IdTrkseg;
-};
-
-export const getTrkseg = async (params: any) => {
- const { id } = params;
- const docs = await getFamily(id, { include_docs: true });
- console.log(`getTrkseg, uri: ${id} docs: ${JSON.stringify(docs)}`);
- return docs.rows;
-};
diff --git a/src/db/types.d.ts b/src/db/types.d.ts
deleted file mode 100644
index c730257..0000000
--- a/src/db/types.d.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-interface Gpx {
- $: Gpx_;
- metadata?: Metadata;
- wpt?: Wpt[];
- rte?: Rte[];
- trk?: Trk[];
- extensions?: Extensions;
-}
-
-interface Gpx_ {
- version: '1.1';
- creator: string;
- xmlns: 'http://www.topografix.com/GPX/1/1';
- 'xmlns:xsi'?: 'http://www.w3.org/2001/XMLSchema-instance';
- 'xsi:schemaLocation'?: string;
- 'xmlns:gpxx'?: string;
- 'xmlns:wptx1'?: string;
- 'xmlns:gpxtpx'?: string;
- 'xmlns:dyo'?: 'http://xmlns.dyomedea.com/';
-}
-
-interface Metadata {
- name?: string;
- desc?: string;
- author?: string;
- copyright?: string;
- link?: Link[];
- time?: string;
- keywords?: string;
- bounds?: Bounds;
- extensions?: Extensions;
-}
-
-interface Bounds {
- $: Bounds_;
-}
-
-interface Bounds_ {
- minlat: number;
- minlon: number;
- maxlat: number;
- maxlon: number;
-}
-
-interface Extensions {
- 'dyo:speed'?: number;
- 'dyo:course'?: number;
- 'dyo:accuracy'?: number;
- 'dyo:batterylevel'?: number;
- 'dyo:useragent'?: string;
-}
-
-interface Trk {
- name?: string;
- cmt?: string;
- desc?: string;
- src?: string;
- link?: Link[];
- number?: number;
- type?: string;
- extensions?: Extensions;
- trkseg?: Trkseg[];
-}
-
-interface Link {
- $: Link_;
- text?: string;
- type?: string;
-}
-
-interface Link_ {
- href: string;
-}
-
-interface Trkseg {
- trkpt?: Wpt[];
- extensions?: Extensions;
-}
-
-interface Wpt {
- $: Wpt_;
- ele?: number;
- time?: string;
- magvar?: number;
- geoidheight?: number;
- name?: string;
- cmt?: string;
- desc?: string;
- src?: string;
- link?: Link;
- sym?: string;
- type?: string;
- fix?: string;
- sat?: number;
- hdop?: number;
- vdop?: number;
- pdop?: number;
- ageofdgpsdata?: number;
- dgpsid?: number;
- extensions?: Extensions;
-}
-
-interface Wpt_ {
- lat: number;
- lon: number;
-}
-
-interface Rte {
- name?: string;
- cmt?: string;
- desc?: string;
- src?: string;
- link?: Link[];
- number?: number;
- type?: string;
- extensions?: Extensions;
- rtept?: Wpt[];
-}
-
diff --git a/src/db/wpt.test.ts b/src/db/wpt.test.ts
deleted file mode 100644
index 998c373..0000000
--- a/src/db/wpt.test.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { putNewWpt } from './wpt';
-
-declare global {
- var db: any;
- var dbReady: boolean;
-}
-
-const originalDb = globalThis.db;
-const originalDateNow = globalThis.Date.now;
-
-describe('The wpt module', () => {
- beforeEach(() => {
- globalThis.db = { put: jest.fn() };
- globalThis.Date.now = () => 0;
- });
- afterEach(() => {
- globalThis.db = originalDb;
- globalThis.Date.now = originalDateNow;
- });
- test('db.put() a new wpt when required', async () => {
- putNewWpt({ gpx: 1, wpt: 2 });
- await expect(globalThis.db.put).toBeCalledWith({
- _id: 'gpx/0000000000000001/1wpt/000002',
- _rev: undefined,
- doc: {
- $: { lat: 0, lon: 0 },
- ageofdgpsdata: undefined,
- cmt: undefined,
- desc: undefined,
- dgpsid: undefined,
- ele: undefined,
- extensions: undefined,
- fix: undefined,
- geoidheight: undefined,
- hdop: undefined,
- link: undefined,
- magvar: undefined,
- name: undefined,
- pdop: undefined,
- sat: undefined,
- src: undefined,
- sym: undefined,
- time: undefined,
- type: undefined,
- vdop: undefined,
- },
- type: 'wpt',
- });
- });
- test('db.put() generates an id for the wpt if needed', async () => {
- const id = await putNewWpt({ gpx: 1 });
- expect(id).toEqual({ gpx: 1, wpt: 0 });
- });
- test('db.put() generates ids for both gpx and trk if needed', async () => {
- const id = await putNewWpt();
- expect(id).toEqual({ gpx: 4320000000000000, wpt: 0 });
- });
-});
diff --git a/src/db/wpt.ts b/src/db/wpt.ts
deleted file mode 100644
index fd8c8e0..0000000
--- a/src/db/wpt.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import getUri from '../lib/ids';
-import { putNewGpx } from './gpx';
-import { put } from './lib';
-
-export const emptyWpt: Wpt = {
- $: { lat: 0, lon: 0 },
- ele: undefined,
- time: undefined,
- magvar: undefined,
- geoidheight: undefined,
- name: undefined,
- cmt: undefined,
- desc: undefined,
- src: undefined,
- link: undefined,
- sym: undefined,
- type: undefined,
- fix: undefined,
- sat: undefined,
- hdop: undefined,
- vdop: undefined,
- pdop: undefined,
- ageofdgpsdata: undefined,
- dgpsid: undefined,
- extensions: undefined,
-};
-
-export const putNewWpt = async (id?: IdGpx | IdWpt) => {
- let finalId = { ...id };
- if (!('wpt' in finalId)) {
- const gpxId = await putNewGpx(id);
- finalId = { ...gpxId, wpt: 0 };
- }
- const uri = getUri('wpt', finalId);
- await put(
- uri,
- 'wpt',
- (wpt) => {
- return wpt;
- },
- emptyWpt
- );
- return finalId as IdWpt;
-};
diff --git a/src/i18n/index.tsx b/src/i18n/index.tsx
deleted file mode 100644
index 3480a4f..0000000
--- a/src/i18n/index.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import LocalizedStrings from 'react-localization';
-
-const strings = new LocalizedStrings({
- en: {
- colonize: (input: string): any => strings.formatString('{0}:', input),
-
- common: { save: 'Save', cancel: 'Cancel', close: 'Close' },
-
- mapChooser: {
- chooseYourMap: 'Choose your map',
- },
-
- explorer: {
- nearBy: 'Nearby',
- },
- },
- fr: {
- colonize: (input: string): any => strings.formatString('{0} :', input),
-
- common: {
- save: 'Sauvegarder',
- cancel: 'Annuler',
- close: 'Fermer',
- },
-
- mapChooser: {
- chooseYourMap: 'Choisissez votre carte',
- },
-
- explorer: {
- nearBy: "Près d'ici",
- },
- },
-});
-
-export default strings;
-
-export const setI18nLanguage = (language: string) => {
- if (language === undefined || language === 'auto') {
- strings.setLanguage(strings.getInterfaceLanguage());
- } else {
- strings.setLanguage(language);
- }
-};
diff --git a/src/icons/flag-finish-b-o-svgrepo-com.svg b/src/icons/flag-finish-b-o-svgrepo-com.svg
deleted file mode 100644
index 13b4208..0000000
--- a/src/icons/flag-finish-b-o-svgrepo-com.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/flag-start-b-svgrepo-com.svg b/src/icons/flag-start-b-svgrepo-com.svg
deleted file mode 100644
index f082b9f..0000000
--- a/src/icons/flag-start-b-svgrepo-com.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/lib/cache.ts b/src/lib/cache.ts
deleted file mode 100644
index 14e3dc6..0000000
--- a/src/lib/cache.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @hidden
- */
-export const thisIsAModule = true;
-
-/**
- *
- */
-
-declare global {
- var _allCaches: any;
-}
-
-globalThis._allCaches = new Map();
-
-const cache = {
- set: (params: any) => {
- const { cacheId, key, value } = params;
- if (!_allCaches.has(cacheId)) {
- _allCaches.set(cacheId, new Map());
- }
- const k = _allCaches.get(cacheId);
- k.set(key, value);
- },
- get: (params: any) => {
- const { cacheId, key } = params;
- if (!_allCaches.has(cacheId)) {
- return null;
- }
- const k = _allCaches.get(cacheId);
- if (!k.has(key)) {
- return null;
- }
- const value = k.get(key);
- k.delete(key);
- k.set(key, value);
- return value;
- },
- delete: (params: any) => {
- const { cacheId, key } = params;
- if (!_allCaches.has(cacheId)) {
- return null;
- }
- const k = _allCaches.get(cacheId);
- if (!k.has(key)) {
- return null;
- }
- const value = k.get(key);
- k.delete(key);
- return value;
- },
- map: (params: any) => {
- const { cacheId } = params;
- if (!_allCaches.has(cacheId)) {
- return null;
- }
- return _allCaches.get(cacheId);
- },
-};
-
-export default cache;
diff --git a/src/lib/docuri/index.js b/src/lib/docuri/index.js
deleted file mode 100644
index 49c7af2..0000000
--- a/src/lib/docuri/index.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-* DocURI: Rich document ids for CouchDB.
-*
-* Copyright (c) 2014 null2 GmbH Berlin
-* Licensed under the MIT license.
-*/
-
-// type/id/subtype/index/version
-
-var docuri = module.exports = exports = {};
-
-// Cached regular expressions for matching named param parts and splatted parts
-// of route strings.
-// http://backbonejs.org/docs/backbone.html#section-158
-var optionalParam = /\((.*?)\)/g;
-var namedParam = /(\(\?)?:\w+/g;
-var splatParam = /\*\w+/g;
-var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g;
-var paramKeys = /[*:]\w+/g;
-
-// Convert a route string into a regular expression,
-// with named regular expressions for named arguments.
-// http://backbonejs.org/docs/backbone.html#section-165
-function routeToRegExp(src) {
- var keys = [], match;
-
- while ( ( match = paramKeys.exec( src ) ) !== null )
- {
- keys.push( match[0] );
- }
-
- var route = src.replace(escapeRegExp, '\\$&')
- .replace(optionalParam, '(?:$1)?')
- .replace(namedParam, function(match, optional) {
-
- return optional ? match : '([^/?]+)';
- })
- .replace(splatParam, '([^?]*?)');
-
- keys = keys.reduce(function(memo, key) {
- var value = '\\' + key;
-
- memo[key] = new RegExp(value + '(\\/|\\)|\\(|$)');
-
- return memo;
- }, {});
-
- return {
- src: src,
- exp: new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$'),
- keys: keys
- }
-}
-
-// Given a route and a DocURI return an object of extracted parameters.
-// Unmatched DocURIs will be treated as false.
-// http://backbonejs.org/docs/backbone.html#section-166
-function extractParameters(route, fragment, coding) {
- var params = route.exp.exec(fragment);
-
- if (!params) {
- return false;
- }
-
- params = params.slice(1);
-
- return Object.keys(route.keys).reduce(function(memo, key, i) {
- var param = params[i];
-
- if (param) {
-
- var k = key.substr(1);
- var decoder = (coding[k] ?? {decoder:decodeURIComponent}).decoder;
-
- if (key[0] === '*') {
- param = param.split('/').map(decoder);
- } else {
- param = decoder(param);
- }
-
-
- memo[key.substr(1)] = param;
- }
-
- return memo;
- }, {});
-}
-
-// Insert named parameters from object.
-function insertParameters(route, obj, coding) {
- var str = route.src;
-
- Object.keys(route.keys).forEach(function(key) {
- var k = key.substr(1);
- var value = (obj[k] !== undefined) ? obj[k] : '';
-
- var encoder = (coding[k] ?? {encoder:encodeURIComponent}).encoder;
-
- if (Array.isArray(value)) {
- value = value.map(encoder).join('/');
- } else {
- value = encoder(value);
- }
-
- str = str.replace(route.keys[key], value + '$1');
- });
-
- // massage optional parameter
- return str
- .replace(/\(\/\)/g, '')
- .replace(/[)(]/g, '');
-}
-
-
-docuri.route = function(route, coding={}) {
- route = routeToRegExp(route);
-
- return function(source, target) {
- source = source || {};
-
- if (target) {
- source = extractParameters(route, source, coding);
- Object.keys(target).forEach(function(key) {
- source[key] = target[key];
- });
- }
-
- if (typeof source === 'object') {
- return insertParameters(route, source, coding);
- }
-
- if (typeof source === 'string') {
- return extractParameters(route, source, coding);
- }
- };
-};
-
diff --git a/src/lib/geo.ts b/src/lib/geo.ts
deleted file mode 100644
index f4b920b..0000000
--- a/src/lib/geo.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Rectangle } from '../components/map/types';
-
-// cf https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#ECMAScript_(JavaScript/ActionScript,_etc.)
-export const lon2tile = (lon: number, zoom: number) => {
- return ((Number(lon) + 180) / 360) * Math.pow(2, zoom);
-};
-export const lat2tile = (lat: number, zoom: number) => {
- return (
- ((1 -
- Math.log(
- Math.tan((Number(lat) * Math.PI) / 180) +
- 1 / Math.cos((Number(lat) * Math.PI) / 180)
- ) /
- Math.PI) /
- 2) *
- Math.pow(2, zoom)
- );
-};
-
-export function tile2long(x: number, z: number) {
- return (x / Math.pow(2, z)) * 360 - 180;
-}
-
-export function tile2lat(y: number, z: number) {
- var n = Math.PI - (2 * Math.PI * y) / Math.pow(2, z);
- return (180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));
-}
-
-export const rectanglesIntersect = (r1: Rectangle, r2: Rectangle) =>
- !(
- r2.topLeft.x > r1.bottomRight.x ||
- r2.bottomRight.x < r1.topLeft.x ||
- r2.topLeft.y > r1.bottomRight.y ||
- r2.bottomRight.y < r1.topLeft.y
- );
diff --git a/src/lib/gpx-parser-builder/LICENSE b/src/lib/gpx-parser-builder/LICENSE
deleted file mode 100644
index f975d73..0000000
--- a/src/lib/gpx-parser-builder/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017 Zheng-Xiang Ke
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/src/lib/gpx-parser-builder/README.md b/src/lib/gpx-parser-builder/README.md
deleted file mode 100644
index 88d2602..0000000
--- a/src/lib/gpx-parser-builder/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# gpx-parser-builder
-A simple gpx parser and builder between GPX string and JavaScript object. It is dependent on [isomorphic-xml2js](https://github.com/RikkiGibson/isomorphic-xml2js).
-
-[![npm](https://img.shields.io/npm/dt/gpx-parser-builder.svg)](https://www.npmjs.com/package/gpx-parser-builder)
-[![GitHub stars](https://img.shields.io/github/stars/kf99916/gpx-parser-builder.svg)](https://github.com/kf99916/gpx-parser-builder/stargazers)
-[![GitHub forks](https://img.shields.io/github/forks/kf99916/gpx-parser-builder.svg)](https://github.com/kf99916/gpx-parser-builder/network)
-[![npm](https://img.shields.io/npm/v/gpx-parser-builder.svg)](https://www.npmjs.com/package/gpx-parser-builder)
-[![GitHub license](https://img.shields.io/github/license/kf99916/gpx-parser-builder.svg)](https://github.com/kf99916/gpx-parser-builder/blob/master/LICENSE)
-
-## Requirements
-
-gpx-parser-builder is written with ECMAScript 6. You can leverage [Babel](https://babeljs.io/) and [Webpack](https://webpack.js.org/) to make all browsers available.
-
-## Installation
-
-```bash
-npm install gpx-parser-builder --save
-```
-
-## Version
-
-v1.0.0+ is a breaking change for v0.2.2-. v1.0.0+ fully supports gpx files including waypoints, routes, and tracks. Every gpx type is 1-1 corresponding to a JavaScript class.
-
-## Usage
-
-```javascript
-import GPX from 'gpx-parser-builder';
-
-// Parse gpx
-const gpx = GPX.parse('GPX_STRING');
-
-window.console.dir(gpx.metadata);
-window.console.dir(gpx.wpt);
-window.console.dir(gpx.trk);
-
-// Build gpx
-window.console.log(gpx.toString());
-```
-
-Get more details about usage with the unit tests.
-
-### GPX
-
-The GPX JavaScript object.
-
-`constructor(object)`
-
-```javascript
-const gpx = new Gpx({$:{...}, metadat: {...}, wpt:[{...},{...}]}, trk: {...}, rte: {...})
-```
-
-#### Member Variables
-
-`$` the attributes for the gpx element. Default value:
-```javascript
-{
- 'version': '1.1',
- 'creator': 'gpx-parser-builder',
- 'xmlns': 'http://www.topografix.com/GPX/1/1',
- 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'xsi:schemaLocation': 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'
-}
-```
-
-`metadata` the metadata for the gpx.
-
-`wpt` array of waypoints. It is corresponded to ``. The type of all elements in `wpt` is `Waypoint`;
-
-`rte` array of routes. It is corresponded to ``. The type of all elements in `rte` is `Route`;
-
-`trk` array of tracks. It is corresponded to ``. The type of all elements in `trk` is `Track`;
-
-#### Static Methods
-
-`parse(gpxString)` parse gpx string to Gpx object. return `null` if parsing failed.
-
-#### Member Methods
-
-`toString(options)` GPX object to gpx string. The options is for [isomorphic-xml2js](https://github.com/RikkiGibson/isomorphic-xml2js).
-
-## Save as GPX file in the frontend
-
-You can leverage [StreamSaver.js](https://github.com/jimmywarting/StreamSaver.js) or [FileSaver.js](https://github.com/eligrey/FileSaver.js) to save as GPX file. ⚠️Not all borwsers support the above file techniques. ⚠️️️
-
-## Author
-
-Zheng-Xiang Ke, kf99916@gmail.com
-
-## License
-
-gpx-parser-builder is available under the MIT license. See the LICENSE file for more info.
diff --git a/src/lib/gpx-parser-builder/package.json b/src/lib/gpx-parser-builder/package.json
deleted file mode 100644
index 19b2cdc..0000000
--- a/src/lib/gpx-parser-builder/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "gpx-parser-builder",
- "version": "1.0.2",
- "description": "A simple gpx parser and builder between GPX string and JavaScript object",
- "main": "./src/gpx.js",
- "scripts": {
- "test": "mocha --require @babel/register test/**/*.js"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/kf99916/gpx-parser-builder.git"
- },
- "keywords": [
- "gpx",
- "parser",
- "builder"
- ],
- "author": "Zheng-Xiang Ke",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/kf99916/gpx-parser-builder/issues"
- },
- "homepage": "https://github.com/kf99916/gpx-parser-builder",
- "files": [
- "src"
- ],
- "devDependencies": {
- "@babel/core": "~7.7",
- "@babel/preset-env": "~7.7",
- "@babel/register": "~7.7",
- "mocha": "~6.2"
- },
- "dependencies": {
- "isomorphic-xml2js": "~0.1"
- }
-}
diff --git a/src/lib/gpx-parser-builder/src/bounds.js b/src/lib/gpx-parser-builder/src/bounds.js
deleted file mode 100644
index 08f45b4..0000000
--- a/src/lib/gpx-parser-builder/src/bounds.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export default class Bounds {
- constructor(object) {
- this.minlat = object.minlat;
- this.minlon = object.minlon;
- this.maxlat = object.maxlat;
- this.maxlon = object.maxlon;
- }
-}
diff --git a/src/lib/gpx-parser-builder/src/copyright.js b/src/lib/gpx-parser-builder/src/copyright.js
deleted file mode 100644
index 5a9f77e..0000000
--- a/src/lib/gpx-parser-builder/src/copyright.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default class Copyright {
- constructor(object) {
- this.author = object.author;
- this.year = object.year;
- this.license = object.license;
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/gpx-parser-builder.d.ts b/src/lib/gpx-parser-builder/src/gpx-parser-builder.d.ts
deleted file mode 100644
index 37665f0..0000000
--- a/src/lib/gpx-parser-builder/src/gpx-parser-builder.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-declare module 'gpx-parser-builder' {
- class GPX {
- static parse(gpxString: any): any;
- constructor(object: any);
- $: any;
- extensions: any;
- metadata: any;
- wpt: any;
- rte: any;
- trk: any;
- toString(options: any): string;
- }
-}
diff --git a/src/lib/gpx-parser-builder/src/gpx.js b/src/lib/gpx-parser-builder/src/gpx.js
deleted file mode 100644
index 07be870..0000000
--- a/src/lib/gpx-parser-builder/src/gpx.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import * as xml2js from 'isomorphic-xml2js';
-import Metadata from './metadata';
-import Waypoint from './waypoint';
-import Route from './route';
-import Track from './track';
-import {removeEmpty, allDatesToISOString} from './utils';
-
-const defaultAttributes = {
- version: '1.1',
- creator: 'gpx-parser-builder',
- xmlns: 'http://www.topografix.com/GPX/1/1',
- 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'xsi:schemaLocation':
- 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'
-}
-
-export default class GPX {
- constructor(object) {
- this.$ = Object.assign({}, defaultAttributes, object.$ || object.attributes || {});
- this.extensions = object.extensions;
-
- if (object.metadata) {
- this.metadata = new Metadata(object.metadata);
- }
- if (object.wpt) {
- if (!Array.isArray(object.wpt)) {
- object.wpt = [object.wpt];
- }
- this.wpt = object.wpt.map(wpt => new Waypoint(wpt));
- }
- if (object.rte) {
- if (!Array.isArray(object.rte)) {
- object.rte = [object.rte];
- }
- this.rte = object.rte.map(rte => new Route(rte));
- }
- if (object.trk) {
- if (!Array.isArray(object.trk)) {
- object.trk = [object.trk];
- }
- this.trk = object.trk.map(trk => new Track(trk));
- }
-
- removeEmpty(this);
- }
-
- static parse(gpxString) {
- let gpx;
- xml2js.parseString(gpxString, {
- explicitArray: false
- }, (err, xml) => {
- if (err) {
- return;
- }
- if (!xml.gpx) {
- return;
- }
-
- gpx = new GPX({
- attributes: xml.gpx.$,
- metadata: xml.gpx.metadata,
- wpt: xml.gpx.wpt,
- rte: xml.gpx.rte,
- trk: xml.gpx.trk
- });
- });
-
- return gpx;
- }
-
- toString(options) {
- options = options || {};
- options.rootName = 'gpx';
-
- const builder = new xml2js.Builder(options), gpx = new GPX(this);
- allDatesToISOString(gpx);
- return builder.buildObject(gpx);
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/link.js b/src/lib/gpx-parser-builder/src/link.js
deleted file mode 100644
index f7e05af..0000000
--- a/src/lib/gpx-parser-builder/src/link.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export default class Link {
- constructor(object) {
- this.$ = {};
- this.$.href = object.$.href || object.href;
- this.text = object.text;
- this.type = object.type;
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/metadata.js b/src/lib/gpx-parser-builder/src/metadata.js
deleted file mode 100644
index 293bbec..0000000
--- a/src/lib/gpx-parser-builder/src/metadata.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import Copyright from './copyright';
-import Link from './link';
-import Person from './person';
-import Bounds from './bounds';
-
-export default class Metadata {
- constructor(object) {
- this.name = object.name;
- this.desc = object.desc;
- this.time = object.time ? new Date(object.time) : new Date();
- this.keywords = object.keywords;
- this.extensions = object.extensions;
- if (object.author) {
- this.author = new Person(object.author);
- }
- if (object.link) {
- if (!Array.isArray(object.link)) {
- object.link = [object.link];
- }
- this.link = object.link.map(l => new Link(l));
- }
- if (object.bounds) {
- this.bounds = new Bounds(object.bounds);
- }
- if (object.copyright) {
- this.copyright = new Copyright(object.copyright);
- }
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/person.js b/src/lib/gpx-parser-builder/src/person.js
deleted file mode 100644
index 24b44c4..0000000
--- a/src/lib/gpx-parser-builder/src/person.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Link from './link';
-
-export default class Person {
- constructor(object) {
- this.name = object.name;
- this.email = object.email;
- if (object.link) {
- this.link = new Link(object.link);
- }
- }
-}
diff --git a/src/lib/gpx-parser-builder/src/route.js b/src/lib/gpx-parser-builder/src/route.js
deleted file mode 100644
index 842e9f8..0000000
--- a/src/lib/gpx-parser-builder/src/route.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import Waypoint from './waypoint';
-import Link from './link';
-
-export default class Route {
- constructor(object) {
- this.name = object.name;
- this.cmt = object.cmt;
- this.desc = object.desc;
- this.src = object.src;
- this.number = object.number;
- this.type = object.type;
- this.extensions = object.extensions;
- if (object.link) {
- if (!Array.isArray(object.link)) {
- this.link = [object.link];
- }
- this.link = object.link.map(l => new Link(l));
- }
-
- if (object.rtept) {
- if (!Array.isArray(object.rtept)) {
- this.rtept = [object.rtept];
- }
- this.rtept = object.rtept.map(pt => new Waypoint(pt));
- }
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/track-segment.js b/src/lib/gpx-parser-builder/src/track-segment.js
deleted file mode 100644
index 5fca2d5..0000000
--- a/src/lib/gpx-parser-builder/src/track-segment.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import Waypoint from './waypoint';
-
-export default class TrackSegment {
- constructor(object) {
- if (object.trkpt) {
- if (!Array.isArray(object.trkpt)) {
- object.trkpt = [object.trkpt];
- }
- this.trkpt = object.trkpt.map(pt => new Waypoint(pt));
- }
- this.extensions = object.extensions;
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/track.js b/src/lib/gpx-parser-builder/src/track.js
deleted file mode 100644
index 4e330aa..0000000
--- a/src/lib/gpx-parser-builder/src/track.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import TrackSegment from './track-segment';
-import Link from './link';
-
-export default class Track {
- constructor(object) {
- this.name = object.name;
- this.cmt = object.cmt;
- this.desc = object.desc;
- this.src = object.src;
- this.number = object.number;
- this.type = object.type;
- this.extensions = object.extensions;
- if (object.link) {
- if (!Array.isArray(object.link)) {
- object.link = [object.link];
- }
- this.link = object.link.map(l => new Link(l));
- }
- if (object.trkseg) {
- if (!Array.isArray(object.trkseg)) {
- object.trkseg = [object.trkseg];
- }
- this.trkseg = object.trkseg.map(seg => new TrackSegment(seg));
- }
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx-parser-builder/src/utils.js b/src/lib/gpx-parser-builder/src/utils.js
deleted file mode 100644
index d769918..0000000
--- a/src/lib/gpx-parser-builder/src/utils.js
+++ /dev/null
@@ -1,23 +0,0 @@
-function removeEmpty(obj) {
- Object.entries(obj).forEach(([key, val]) => {
- if (val && val instanceof Object) {
- removeEmpty(val);
- } else if (val == null) {
- delete obj[key];
- }
- });
-}
-
-function allDatesToISOString(obj) {
- Object.entries(obj).forEach(([key, val]) => {
- if (val) {
- if (val instanceof Date) {
- obj[key] = val.toISOString().split('.')[0] + 'Z';
- } else if (val instanceof Object) {
- allDatesToISOString(val);
- }
- }
- });
-}
-
-export { removeEmpty, allDatesToISOString };
diff --git a/src/lib/gpx-parser-builder/src/waypoint.js b/src/lib/gpx-parser-builder/src/waypoint.js
deleted file mode 100644
index 2910ff8..0000000
--- a/src/lib/gpx-parser-builder/src/waypoint.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import Link from './link';
-
-export default class Waypoint {
- constructor(object) {
- this.$ = {};
- this.$.lat = object.$.lat === 0 || object.lat === 0 ? 0 : object.$.lat || object.lat || -1;
- this.$.lon = object.$.lon === 0 || object.lon === 0 ? 0 : object.$.lon || object.lon || -1;
- this.ele = object.ele;
- this.time = object.time ? new Date(object.time) : new Date();
- this.magvar = object.magvar;
- this.geoidheight = object.geoidheight;
- this.name = object.name;
- this.cmt = object.cmt;
- this.desc = object.desc;
- this.src = object.src;
- this.sym = object.sym;
- this.type = object.type;
- this.sat = object.sat;
- this.hdop = object.hdop;
- this.vdop = object.vdop;
- this.pdop = object.pdop;
- this.ageofdgpsdata = object.ageofdgpsdata;
- this.dgpsid = object.dgpsid;
- this.extensions = object.extensions;
- if (object.link) {
- if (!Array.isArray(object.link)) {
- object.link = [object.link];
- }
- this.link = object.link.map(l => new Link(l));
- }
- }
-}
\ No newline at end of file
diff --git a/src/lib/gpx.test.ts b/src/lib/gpx.test.ts
deleted file mode 100644
index ca8ce20..0000000
--- a/src/lib/gpx.test.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { assert } from 'console';
-import { findStartTime } from './gpx';
-
-describe('findStartTime', () => {
- test('to be undefined for a string', () => {
- const start = findStartTime('');
- expect(start).toBeUndefined();
- });
- test('to be undefined for an object without time key', () => {
- const start = findStartTime({ foo: 'foo', bar: 'bar' });
- expect(start).toBeUndefined();
- });
- test('to be the time value for an object with a time key', () => {
- const start = findStartTime({ foo: 'foo', time: 'bar' });
- expect(start).toEqual('bar');
- });
- test('to be the lowest time value for an object with several time keys', () => {
- const start = findStartTime({
- foo: { time: 'foo' },
- time: 'bar',
- bar: { time: 'a' },
- });
- expect(start).toEqual('a');
- });
- test('to be the lowest time value for an array with several objects with time keys', () => {
- const start = findStartTime({
- foos: [{ time: 'foo' }, { time: '0' }],
- time: 'bar',
- bar: { time: 'a' },
- });
- expect(start).toEqual('0');
- });
-});
diff --git a/src/lib/gpx.ts b/src/lib/gpx.ts
deleted file mode 100644
index f3f32e8..0000000
--- a/src/lib/gpx.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-const min = (s1?: string, s2?: string) => {
- return s1! < s2! ? s1 : s2;
-};
-
-export const findStartTime = (x: any, startTime?: string) => {
- if (typeof x === 'object') {
- let newStartTime = startTime;
-
- for (const key in x) {
- if (key === 'time') {
- newStartTime = min(newStartTime, x[key]);
- } else {
- newStartTime = findStartTime(x[key], newStartTime);
- }
- }
- return newStartTime;
- }
- else return startTime;
-};
diff --git a/src/lib/ids.test.ts b/src/lib/ids.test.ts
deleted file mode 100644
index 785c81a..0000000
--- a/src/lib/ids.test.ts
+++ /dev/null
@@ -1,120 +0,0 @@
-import { route } from './docuri';
-import uri from './ids';
-
-describe('Checking some DocURI features', () => {
- test(', basic route', () => {
- const gpx = route('gpx/:id');
- expect(gpx({ id: 10 })).toBe('gpx/10');
- });
- test(', basic route (vice-versa', () => {
- const gpx = route('gpx/:id');
- expect(gpx('gpx/10')).toMatchObject({ id: '10' });
- });
-});
-
-describe('Checking a multilevel route', () => {
- test(', using the two levels', () => {
- const gpx = route('gpx/:gpx/3trk/:trk');
- expect(gpx({ gpx: 10, trk: 0 })).toBe('gpx/10/3trk/0');
- });
- test(', using the two levels (vive-versa)', () => {
- const gpx = route('gpx/:gpx/3trk/:trk');
- expect(gpx('gpx/10/3trk/0')).toMatchObject({ gpx: '10', trk: '0' });
- });
-});
-
-describe('Checking a multilevel route with optional part', () => {
- test(', using the two levels', () => {
- const gpx = route('gpx/:gpx(/3trk/:trk)');
- expect(gpx({ gpx: 10, trk: 0 })).toBe('gpx/10/3trk/0');
- });
- test(', using the two levels (vive-versa)', () => {
- const gpx = route('gpx/:gpx(/3trk/:trk)');
- expect(gpx('gpx/10/3trk/0')).toMatchObject({ gpx: '10', trk: '0' });
- });
- test(', using only one level', () => {
- const gpx = route('gpx/:gpx(/3trk/:trk)');
- expect(gpx({ gpx: 10 })).toBe('gpx/10/3trk/'); //Unfortunately !
- });
- test(', using only one level (vive-versa)', () => {
- const gpx = route('gpx/:gpx(/3trk/:trk)');
- expect(gpx('gpx/10')).toMatchObject({ gpx: '10' });
- });
-});
-
-describe('Checking gpx ids', () => {
- const id = {
- gpx: 1234567890123456,
- };
- const key = 'gpx/1234567890123456';
- test(', vice', () => {
- const gpx = uri('gpx', id);
- expect(gpx).toBe(key);
- });
- test(', and versa', () => {
- const gpx = uri('gpx', key);
- expect(gpx).toMatchObject(id);
- });
-});
-
-describe('Checking trk ids', () => {
- const id = {
- gpx: 1234567890123456,
- trk: 123456,
- };
- const key = 'gpx/1234567890123456/3trk/123456';
- test(', vice', () => {
- const rte = uri('trk', id);
- expect(rte).toBe(key);
- });
- test(', and versa', () => {
- const rte = uri('trk', key);
- expect(rte).toMatchObject(id);
- });
-});
-
-describe('Checking trkseg ids', () => {
- const id = {
- gpx: 111,
- trk: 0,
- trkseg: 3,
- };
- const key = 'gpx/0000000000000111/3trk/000000/000003';
- test(', vice', () => {
- const rte = uri('trkseg', id);
- expect(rte).toBe(key);
- });
- test(', and versa', () => {
- const rte = uri('trkseg', key);
- expect(rte).toMatchObject(id);
- });
-});
-
-describe('Checking trkpt ids', () => {
- const id = {
- gpx: 25,
- trk: 8,
- trkseg: 0,
- trkpt: 155,
- };
- const key = 'gpx/0000000000000025/3trk/000008/000000/000155';
- test(', vice', () => {
- const rte = uri('trkpt', id);
- expect(rte).toBe(key);
- });
- test(', and versa', () => {
- const rte = uri('trkpt', key);
- expect(rte).toMatchObject(id);
- });
-});
-
-describe('Checking settings id', () => {
- test(', vice', () => {
- const rte = uri('settings', {});
- expect(rte).toBe('settings');
- });
- test(', and versa', () => {
- const rte = uri('settings', 'settings');
- expect(rte).toMatchObject({});
- });
-});
diff --git a/src/lib/ids.ts b/src/lib/ids.ts
deleted file mode 100644
index 1d1ebd8..0000000
--- a/src/lib/ids.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { route } from './docuri';
-
-const integerType = (n: number) => {
- return {
- encoder: (v: number) => v.toString().padStart(n, '0'),
- decoder: parseInt,
- };
-};
-
-const bigIntType = (n: number) => {
- return {
- encoder: (v: number) => v.toString().padStart(n, '0'),
- decoder: BigInt,
- };
-};
-
-const coding = {
- gpx: integerType(16),
- wpt: integerType(6),
- rte: integerType(6),
- rtept: integerType(6),
- trk: integerType(6),
- trkseg: integerType(6),
- trkpt: integerType(6),
-};
-
-const routes = {
- dbdef: route('dbdef', coding),
- settings: route('settings', coding),
- gpx: route('gpx/:gpx', coding),
- wpt: route('gpx/:gpx/1wpt/:wpt', coding),
- rte: route('gpx/:gpx/2rte/:rte', coding),
- rtept: route('gpx/:gpx/2rte/:rte/:rtept', coding),
- trk: route('gpx/:gpx/3trk/:trk', coding),
- trkseg: route('gpx/:gpx/3trk/:trk/:trkseg', coding),
- trkpt: route('gpx/:gpx/3trk/:trk/:trkseg/:trkpt', coding),
- extensions: route('gpx/:gpx/4extensions', coding),
-};
-
-type RouteKey = keyof typeof routes;
-
-const uri = (type: RouteKey, param: any) => {
- return routes[type](param);
-};
-
-export default uri;
-
-const minDate = -8640000000000000;
-const halfMinDate = minDate / 2;
-
-export const intToGpxId = (i: number) => Math.round(i / 2) - halfMinDate;
diff --git a/src/lib/types.d.ts b/src/lib/types.d.ts
deleted file mode 100644
index e05ac25..0000000
--- a/src/lib/types.d.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-interface IdGpx {
- gpx: number;
-}
-
-interface IdTrk {
- gpx: number;
- trk: number;
-}
-interface IdTrkseg {
- gpx: number;
- trk: number;
- trkseg: number;
-}
-interface IdTrkpt {
- gpx: number;
- trk: number;
- trkseg: number;
- trkpt: number;
-}
-interface IdWpt {
- gpx: number;
- wpt: number;
-}
-
-interface IdRte {
- gpx: number;
- rte: number;
-}
-
-interface IdRtept {
- gpx: number;
- rte: number;
- rtept: number;
-}
diff --git a/src/missing-typedefs/docuri.d.ts b/src/missing-typedefs/docuri.d.ts
deleted file mode 100644
index d3cf061..0000000
--- a/src/missing-typedefs/docuri.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module 'docuri';
\ No newline at end of file
diff --git a/src/missing-typedefs/gpx-parser-builder.d.ts b/src/missing-typedefs/gpx-parser-builder.d.ts
deleted file mode 100644
index d50663c..0000000
--- a/src/missing-typedefs/gpx-parser-builder.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module 'gpx-parser-builder';
\ No newline at end of file
diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
index 49045e4..922267d 100644
--- a/src/pages/Home.tsx
+++ b/src/pages/Home.tsx
@@ -1,10 +1,5 @@
-import {
- IonContent,
- IonHeader,
- IonPage,
- IonTitle,
- IonToolbar,
-} from '@ionic/react';
+import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react';
+import ExploreContainer from '../components/ExploreContainer';
import './Home.css';
const Home: React.FC = () => {
@@ -16,11 +11,12 @@ const Home: React.FC = () => {
-
+
- Blank
+ Blank
+
);
diff --git a/src/theme/variables.css b/src/theme/variables.css
index 3f40381..a44fcdd 100644
--- a/src/theme/variables.css
+++ b/src/theme/variables.css
@@ -1,14 +1,8 @@
/* Ionic Variables and Theming. For more info, please see:
http://ionicframework.com/docs/theming/ */
-
/** Ionic CSS Variables **/
:root {
-
- /** Transparent background so that underlying tiles and whiteboard can be seen **/
- --ion-background-color: transparent;
-
-
/** primary **/
--ion-color-primary: #3880ff;
--ion-color-primary-rgb: 56, 128, 255;
diff --git a/src/workers/dispatcher-main.test.js b/src/workers/dispatcher-main.test.js
deleted file mode 100644
index fac3fe6..0000000
--- a/src/workers/dispatcher-main.test.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import dispatch, { init, worker } from './dispatcher-main';
-
-jest.mock('./get-worker', () => ({
- getWorker: () => ({
- port: {
- postMessage: jest.fn(),
- },
- }),
-}));
-
-describe('The dispatcher-main', () => {
- beforeEach(() => {
- init();
- });
- test('should create a new shared web worker', () => {
- expect(worker).toBeDefined();
- });
- test('should create a onmessage function', () => {
- expect(worker.port.onmessage).toBeDefined();
- });
- test('should return a promise if no callback is provided', () => {
- expect(dispatch('ping')).toBeInstanceOf(Promise);
- });
- test('should forward the message', () => {
- dispatch('ping');
- expect(worker.port.postMessage).toBeCalledWith({ id: 0, payload: 'ping' });
- });
- test('should return the response', () => {
- var response;
- const callback = (error, success) => {
- response = success;
- };
- dispatch('ping', callback);
- worker.port.onmessage({ data: { id: 0, payload: 'pong' } });
- expect(response).toEqual('pong');
- });
-});
diff --git a/src/workers/dispatcher-main.ts b/src/workers/dispatcher-main.ts
deleted file mode 100644
index 8eccf14..0000000
--- a/src/workers/dispatcher-main.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { getWorker } from './get-worker';
-
-declare global {
- var dispatcherQueue: { index: number; queue: Map };
-}
-
-export var worker: any;
-
-export const init = () => {
- globalThis.dispatcherQueue = { index: 0, queue: new Map() };
-
- worker = getWorker();
-
- console.log(`worker: ${worker}`);
-
- worker.onmessage = (event: any) => {
- const { id, payload } = event.data;
- dispatcherQueue.queue.get(id)(null, payload);
- dispatcherQueue.queue.delete(id);
- };
-};
-
-const dispatch = (
- payload: any,
- callBack?: (error: any, result: any) => void
-) => {
- if (worker === undefined) {
- init();
- }
- if (callBack === undefined) {
- /** If a callback function is not provided, return a promise */
- return new Promise((resolve, reject) => {
- dispatch(payload, (error, result) => {
- if (error) {
- reject(error);
- } else {
- resolve(result);
- }
- });
- });
- }
- /** Otherwise, use the callback function */
- dispatcherQueue.queue.set(dispatcherQueue.index, callBack);
- const message = {
- id: dispatcherQueue.index++,
- payload: payload,
- };
- worker.postMessage(message);
-};
-
-export default dispatch;
diff --git a/src/workers/dispatcher-worker.test.js b/src/workers/dispatcher-worker.test.js
deleted file mode 100644
index 7db3e71..0000000
--- a/src/workers/dispatcher-worker.test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import worker from './dispatcher-worker';
-
-jest.mock('../db', () => ({
- initDb: () => 'called initDb',
-}));
-
-describe('The dispatcher-worker ', () => {
- let port;
- beforeEach(() => {
- port = {
- postMessage: jest.fn(),
- };
- worker.onconnect({ ports: [port] });
- });
- test('creates a onmessage function', () => {
- expect(port.onmessage).toBeDefined();
- expect(port.postMessage).not.toBeCalled();
- });
- test('receives a ping and sends back an unknownAction', async () => {
- await port.onmessage({ data: { id: 5, payload: { action: 'ping' } } });
- expect(port.postMessage).toBeCalledWith({
- id: 5,
- payload: 'unknownAction',
- });
- });
- test('calls initDb when required', async () => {
- await port.onmessage({ data: { id: 5, payload: { action: 'initDb' } } });
- expect(port.postMessage).toBeCalledWith({
- id: 5,
- payload: 'called initDb',
- });
- });
-});
diff --git a/src/workers/dispatcher-worker.ts b/src/workers/dispatcher-worker.ts
deleted file mode 100644
index 1795320..0000000
--- a/src/workers/dispatcher-worker.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { initDb } from '../db';
-import {
- putNewGpx,
- existsGpx,
- pruneAndSaveImportedGpx,
- getGpxesForViewport,
- getGpx,
-} from '../db/gpx';
-import { getTrk, putNewTrk } from '../db/trk';
-import { getTrkseg } from '../db/trkseg';
-
-const self = globalThis as unknown as WorkerGlobalScope;
-
-const actions = {
- initDb,
- putNewGpx,
- putNewTrk,
- existsGpx,
- pruneAndSaveImportedGpx,
- getGpxesForViewport,
- getGpx,
- getTrk,
- getTrkseg,
-};
-
-onmessage = async function (e) {
- console.log(`Worker received ${JSON.stringify(e.data)}`);
- const { id, payload } = e.data;
- console.log(`payload.action in actions: ${payload.action in actions}`);
- var returnValue: any = 'unknownAction';
- if (payload.action in actions) {
- returnValue = await actions[payload.action](
- payload.params
- );
- }
- postMessage({ id: id, payload: returnValue });
-};
-
-export default self;
diff --git a/src/workers/get-worker.ts b/src/workers/get-worker.ts
deleted file mode 100644
index d280573..0000000
--- a/src/workers/get-worker.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const getWorker = () =>
- new Worker(new URL('./dispatcher-worker', import.meta.url));
-
-export default getWorker;
diff --git a/tsconfig.json b/tsconfig.json
index eab4d9e..a273b0c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "es2020",
+ "target": "es5",
"lib": [
"dom",
"dom.iterable",
diff --git a/typedoc.json b/typedoc.json
deleted file mode 100644
index 4923868..0000000
--- a/typedoc.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "$schema": "https://typedoc.org/schema.json",
- "entryPoints": ["./src"],
- "exclude": ["**/*.test.+(tsx|ts)"],
- "entryPointStrategy": "expand",
- "out": "doc"
-}