diff --git a/app/src/App.tsx b/app/src/App.tsx
index c0589b77..099476eb 100644
--- a/app/src/App.tsx
+++ b/app/src/App.tsx
@@ -84,7 +84,7 @@ function App() {
// maintaining URL state
useEffect(() => {
const url = new URL(window.location.href);
- if (file && file.source.getKey().startsWith("http")) {
+ if (file?.source.getKey().startsWith("http")) {
url.searchParams.set("url", file.source.getKey());
history.pushState(null, "", url.toString());
} else {
diff --git a/app/src/Inspector.tsx b/app/src/Inspector.tsx
index bf0ebd4b..cfdeb393 100644
--- a/app/src/Inspector.tsx
+++ b/app/src/Inspector.tsx
@@ -58,7 +58,7 @@ const TileRow = (props: {
{props.entry.offset} |
{props.entry.length} |
- {props.entry.runLength == 0
+ {props.entry.runLength === 0
? "directory"
: `tile(${props.entry.runLength})`}
|
@@ -124,7 +124,7 @@ const FeatureSvg = (props: {
onMouseOver={mouseOver}
onMouseOut={mouseOut}
onMouseDown={mouseDown}
- >
+ />
);
};
@@ -138,7 +138,7 @@ const LayerSvg = (props: {
key={i}
feature={f}
setSelectedFeature={props.setSelectedFeature}
- >
+ />
));
return {elems};
};
@@ -153,7 +153,7 @@ const StyledFeatureProperties = styled("div", {
const FeatureProperties = (props: { feature: Feature }) => {
const tmp: [string, string][] = [];
- for (var key in props.feature.properties) {
+ for (const key in props.feature.properties) {
tmp.push([key, props.feature.properties[key]]);
}
@@ -186,7 +186,7 @@ const VectorPreview = (props: {
const [ref, { width, height }] = useMeasure();
useEffect(() => {
- viewer.current!.zoomOnViewerCenter(0.1);
+ viewer.current?.zoomOnViewerCenter(0.1);
}, []);
useEffect(() => {
@@ -196,13 +196,13 @@ const VectorPreview = (props: {
const tile = new VectorTile(new Protobuf(new Uint8Array(resp!.data)));
const newLayers = [];
- let max_extent = 0;
+ let maxExtent = 0;
for (const [name, layer] of Object.entries(tile.layers)) {
- if (layer.extent > max_extent) {
- max_extent = layer.extent;
+ if (layer.extent > maxExtent) {
+ maxExtent = layer.extent;
}
const features: Feature[] = [];
- for (var i = 0; i < layer.length; i++) {
+ for (let i = 0; i < layer.length; i++) {
const feature = layer.feature(i);
const p = path();
const geom = feature.loadGeometry();
@@ -216,7 +216,7 @@ const VectorPreview = (props: {
} else {
for (const ring of geom) {
p.moveTo(ring[0].x, ring[0].y);
- for (var j = 1; j < ring.length; j++) {
+ for (let j = 1; j < ring.length; j++) {
p.lineTo(ring[j].x, ring[j].y);
}
if (feature.type === 3) {
@@ -234,7 +234,7 @@ const VectorPreview = (props: {
}
newLayers.push({ features: features, name: name });
}
- setMaxExtent(max_extent);
+ setMaxExtent(maxExtent);
newLayers.sort(smartCompare);
setLayers(newLayers);
};
@@ -250,7 +250,7 @@ const VectorPreview = (props: {
layer={l}
color={schemeSet3[i % 12]}
setSelectedFeature={setSelectedFeature}
- >
+ />
));
return (
@@ -280,7 +280,7 @@ const RasterPreview = (props: { file: PMTiles; entry: Entry }) => {
const [z, x, y] = tileIdToZxy(entry.tileId);
const resp = await props.file.getZxy(z, x, y);
const blob = new Blob([resp!.data]);
- var imageUrl = window.URL.createObjectURL(blob);
+ const imageUrl = window.URL.createObjectURL(blob);
setImageSrc(imageUrl);
};
@@ -289,7 +289,7 @@ const RasterPreview = (props: { file: PMTiles; entry: Entry }) => {
}
}, [props.entry]);
- return ;
+ return ;
};
function getHashString(entry: Entry) {
@@ -357,10 +357,10 @@ function Inspector(props: { file: PMTiles }) {
}, [props.file, selectedEntry]);
const rows = entryRows.map((e, i) => (
-
+
));
- let tilePreview = ;
+ let tilePreview = ;
if (selectedEntry && header?.tileType) {
if (selectedEntry.runLength === 0) {
// do nothing
diff --git a/app/src/Loader.tsx b/app/src/Loader.tsx
index 264bbedc..9cb3b9f7 100644
--- a/app/src/Loader.tsx
+++ b/app/src/Loader.tsx
@@ -28,7 +28,7 @@ const itemStyles = {
fontSize: "$2",
alignItems: "center",
"&:hover": { backgroundColor: "$hover", color: "$white" },
- "&:focus": { position: "relative", boxShadow: `0 0 0 2px blue` },
+ "&:focus": { position: "relative", boxShadow: "0 0 0 2px blue" },
};
const StyledLink = styled(
@@ -73,7 +73,7 @@ const ToolbarToggleItem = StyledToggleItem;
function Loader(props: { file: PMTiles; mapHashPassed: boolean }) {
const [tab, setTab] = useState("maplibre");
- let view;
+ let view: any;
if (tab === "maplibre") {
view = (
diff --git a/app/src/MaplibreMap.tsx b/app/src/MaplibreMap.tsx
index c1c44103..58c6e566 100644
--- a/app/src/MaplibreMap.tsx
+++ b/app/src/MaplibreMap.tsx
@@ -102,7 +102,7 @@ interface LayerVisibility {
visible: boolean;
}
-interface PmTilesMetadata {
+interface Metadata {
name?: string;
type?: string;
tilestats?: unknown;
@@ -188,7 +188,7 @@ const LayersVisibilityController = (props: {
const rasterStyle = async (file: PMTiles): Promise => {
const header = await file.getHeader();
- const metadata = (await file.getMetadata()) as PmTilesMetadata;
+ const metadata = (await file.getMetadata()) as Metadata;
let layers: LayerSpecification[] = [];
if (metadata.type !== "baselayer") {
@@ -206,7 +206,7 @@ const rasterStyle = async (file: PMTiles): Promise => {
sources: {
source: {
type: "raster",
- tiles: ["pmtiles://" + file.source.getKey() + "/{z}/{x}/{y}"],
+ tiles: [`pmtiles://${file.source.getKey()}/{z}/{x}/{y}`],
minzoom: header.minZoom,
maxzoom: header.maxZoom,
},
@@ -229,7 +229,7 @@ const vectorStyle = async (
layersVisibility: LayerVisibility[];
}> => {
const header = await file.getHeader();
- const metadata = (await file.getMetadata()) as PmTilesMetadata;
+ const metadata = (await file.getMetadata()) as Metadata;
let layers: LayerSpecification[] = [];
let baseOpacity = 0.35;
@@ -238,15 +238,13 @@ const vectorStyle = async (
baseOpacity = 0.9;
}
- var tilestats: any;
- var vectorLayers: LayerSpecification[];
- tilestats = metadata.tilestats;
- vectorLayers = metadata.vector_layers;
+ const tilestats = metadata.tilestats;
+ const vectorLayers = metadata.vector_layers;
if (vectorLayers) {
for (const [i, layer] of vectorLayers.entries()) {
layers.push({
- id: layer.id + "_fill",
+ id: `${layer.id}_fill`,
type: "fill",
source: "source",
"source-layer": layer.id,
@@ -268,7 +266,7 @@ const vectorStyle = async (
filter: ["==", ["geometry-type"], "Polygon"],
});
layers.push({
- id: layer.id + "_stroke",
+ id: `${layer.id}_stroke`,
type: "line",
source: "source",
"source-layer": layer.id,
@@ -284,7 +282,7 @@ const vectorStyle = async (
filter: ["==", ["geometry-type"], "LineString"],
});
layers.push({
- id: layer.id + "_point",
+ id: `${layer.id}_point`,
type: "circle",
source: "source",
"source-layer": layer.id,
@@ -315,7 +313,7 @@ const vectorStyle = async (
sources: {
source: {
type: "vector",
- tiles: ["pmtiles://" + file.source.getKey() + "/{z}/{x}/{y}"],
+ tiles: [`pmtiles://${file.source.getKey()}/{z}/{x}/{y}`],
minzoom: header.minZoom,
maxzoom: header.maxZoom,
bounds: bounds,
@@ -425,7 +423,7 @@ function MaplibreMap(props: { file: PMTiles; mapHashPassed: boolean }) {
const { x, y } = e.point;
const r = 2; // radius around the point
- var features = map.queryRenderedFeatures([
+ let features = map.queryRenderedFeatures([
[x - r, y - r],
[x + r, y + r],
]);
@@ -475,7 +473,7 @@ function MaplibreMap(props: { file: PMTiles; mapHashPassed: boolean }) {
if (
header.tileType === TileType.Png ||
header.tileType === TileType.Webp ||
- header.tileType == TileType.Jpeg
+ header.tileType === TileType.Jpeg
) {
const style = await rasterStyle(props.file);
map.setStyle(style);
@@ -492,7 +490,7 @@ function MaplibreMap(props: { file: PMTiles; mapHashPassed: boolean }) {
return (
-
+
menu
{hamburgerOpen ? (
diff --git a/app/src/Metadata.tsx b/app/src/Metadata.tsx
index be065a44..6eec3e68 100644
--- a/app/src/Metadata.tsx
+++ b/app/src/Metadata.tsx
@@ -13,7 +13,7 @@ const Heading = styled("div", {
});
function Metadata(props: { file: PMTiles }) {
- const [metadata, setMetadata] = useState();
+ const [metadata, setMetadata] = useState();
const [header, setHeader] = useState(null);
useEffect(() => {
diff --git a/app/src/Start.tsx b/app/src/Start.tsx
index 79540131..d19e700c 100644
--- a/app/src/Start.tsx
+++ b/app/src/Start.tsx
@@ -12,7 +12,7 @@ const Input = styled("input", {
justifyContent: "center",
fontSize: "$3",
fontFamily: "$sans",
- "&:focus": { boxShadow: `0 0 0 1px black` },
+ "&:focus": { boxShadow: "0 0 0 1px black" },
width: "100%",
border: "1px solid $white",
padding: "$1",
@@ -141,7 +141,7 @@ function Start(props: {
id="remoteUrl"
placeholder="https://example.com/my_archive.pmtiles"
onChange={onRemoteUrlChangeHandler}
- >
+ />
diff --git a/app/src/main.tsx b/app/src/main.tsx
index ee827bfb..920fd77b 100644
--- a/app/src/main.tsx
+++ b/app/src/main.tsx
@@ -2,8 +2,11 @@ import React from "react";
import reactDom from "react-dom/client";
import App from "./App";
-reactDom.createRoot(document.getElementById("root")!).render(
-
-
-
-);
+const root = document.getElementById("root");
+if (root) {
+ reactDom.createRoot(root).render(
+
+
+
+ );
+}