From 3b61cc8b49a1729404c55f7ba688306c775050c6 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Mon, 29 Jan 2024 16:04:41 +0800 Subject: [PATCH] apply automated linting fixes (#331) --- js/adapters.ts | 24 ++-- js/biome.json | 20 +++ js/index.ts | 96 +++++++------ js/package-lock.json | 314 +++++++++++++++++++++++++++++++------------ js/package.json | 1 + js/test/v2.test.ts | 26 ++-- js/test/v3.test.ts | 21 ++- js/v2.ts | 166 +++++++++++------------ 8 files changed, 413 insertions(+), 255 deletions(-) create mode 100644 js/biome.json diff --git a/js/adapters.ts b/js/adapters.ts index 51a8035..352cfa9 100644 --- a/js/adapters.ts +++ b/js/adapters.ts @@ -2,13 +2,13 @@ declare const L: any; declare const window: any; declare const document: any; -import { PMTiles, Source, TileType } from "./index"; +import { PMTiles, TileType } from "./index"; export const leafletRasterLayer = (source: PMTiles, options: any) => { let loaded = false; - let mimeType: string = ""; + let mimeType = ""; const cls = L.GridLayer.extend({ - createTile: function (coord: any, done: any) { + createTile: (coord: any, done: any) => { const el: any = document.createElement("img"); const controller = new AbortController(); const signal = controller.signal; @@ -116,11 +116,11 @@ export class Protocol { callback: ResponseCallback ): Cancelable => { if (params.type == "json") { - const pmtiles_url = params.url.substr(10); - let instance = this.tiles.get(pmtiles_url); + const pmtilesUrl = params.url.substr(10); + let instance = this.tiles.get(pmtilesUrl); if (!instance) { - instance = new PMTiles(pmtiles_url); - this.tiles.set(pmtiles_url, instance); + instance = new PMTiles(pmtilesUrl); + this.tiles.set(pmtilesUrl, instance); } instance @@ -150,12 +150,12 @@ export class Protocol { cancel: () => {}, }; } - const pmtiles_url = result[1]; + const pmtilesUrl = result[1]; - let instance = this.tiles.get(pmtiles_url); + let instance = this.tiles.get(pmtilesUrl); if (!instance) { - instance = new PMTiles(pmtiles_url); - this.tiles.set(pmtiles_url, instance); + instance = new PMTiles(pmtilesUrl); + this.tiles.set(pmtilesUrl, instance); } const z = result[2]; const x = result[3]; @@ -163,7 +163,7 @@ export class Protocol { const controller = new AbortController(); const signal = controller.signal; - let cancel = () => { + const cancel = () => { controller.abort(); }; diff --git a/js/biome.json b/js/biome.json new file mode 100644 index 0000000..a3c305d --- /dev/null +++ b/js/biome.json @@ -0,0 +1,20 @@ +{ + "javascript": { + "formatter": { + "trailingComma": "es5" + } + }, + "formatter": { + "indentStyle": "space" + }, + "linter": { + "rules": { + "style": { + "useNamingConvention": {} + }, + "nursery": { + "noUnusedImports": {} + } + } + } +} diff --git a/js/index.ts b/js/index.ts index d781e40..7901f0b 100644 --- a/js/index.ts +++ b/js/index.ts @@ -122,14 +122,14 @@ export function zxyToTileId(z: number, x: number, y: number): number { export function tileIdToZxy(i: number): [number, number, number] { let acc = 0; - let z = 0; + const z = 0; for (let z = 0; z < 27; z++) { - const num_tiles = (0x1 << z) * (0x1 << z); - if (acc + num_tiles > i) { + const numTiles = (0x1 << z) * (0x1 << z); + if (acc + numTiles > i) { return idOnLevel(z, i - acc); } - acc += num_tiles; + acc += numTiles; } throw Error("Tile zoom level exceeds max safe number limit (26)"); @@ -165,8 +165,8 @@ async function defaultDecompress( if (typeof (globalThis as any).DecompressionStream == "undefined") { return decompressSync(new Uint8Array(buf)); } else { - let stream = new Response(buf).body!; - let result: ReadableStream = stream.pipeThrough( + const stream = new Response(buf).body!; + const result: ReadableStream = stream.pipeThrough( new (globalThis as any).DecompressionStream("gzip") ); return new Response(result).arrayBuffer(); @@ -326,14 +326,14 @@ export class FetchSource implements Source { if (resp.status === 416 && offset === 0) { // some HTTP servers don't accept ranges beyond the end of the resource. // Retry with the exact length - const content_range = resp.headers.get("Content-Range"); - if (!content_range || !content_range.startsWith("bytes */")) { + const contentRange = resp.headers.get("Content-Range"); + if (!contentRange || !contentRange.startsWith("bytes */")) { throw Error("Missing content-length on 416 response"); } - const actual_length = +content_range.substr(8); + const actualLength = +contentRange.substr(8); resp = await fetch(this.url, { signal: signal, - headers: { Range: "bytes=0-" + (actual_length - 1) }, + headers: { Range: "bytes=0-" + (actualLength - 1) }, }); } @@ -341,11 +341,11 @@ export class FetchSource implements Source { throw Error("Bad response code: " + resp.status); } - const content_length = resp.headers.get("Content-Length"); + const contentLength = resp.headers.get("Content-Length"); // some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206 // but we also need to detect no support for Byte Serving which is returning the whole file - if (resp.status === 200 && (!content_length || +content_length > length)) { + if (resp.status === 200 && (!contentLength || +contentLength > length)) { if (controller) controller.abort(); throw Error( "Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving." @@ -370,15 +370,15 @@ export function getUint64(v: DataView, offset: number): number { export function bytesToHeader(bytes: ArrayBuffer, etag?: string): Header { const v = new DataView(bytes); - const spec_version = v.getUint8(7); - if (spec_version > 3) { + const specVersion = v.getUint8(7); + if (specVersion > 3) { throw Error( - `Archive is spec version ${spec_version} but this library supports up to spec version 3` + `Archive is spec version ${specVersion} but this library supports up to spec version 3` ); } return { - specVersion: spec_version, + specVersion: specVersion, rootDirectoryOffset: getUint64(v, 8), rootDirectoryLength: getUint64(v, 16), jsonMetadataOffset: getUint64(v, 24), @@ -459,7 +459,7 @@ function detectVersion(a: ArrayBuffer): number { export class EtagMismatch extends Error {} export interface Cache { - getHeader: (source: Source, current_etag?: string) => Promise
; + getHeader: (source: Source, currentEtag?: string) => Promise
; getDirectory: ( source: Source, offset: number, @@ -472,14 +472,14 @@ export interface Cache { length: number, header: Header ) => Promise; - invalidate: (source: Source, current_etag: string) => Promise; + invalidate: (source: Source, currentEtag: string) => Promise; } async function getHeaderAndRoot( source: Source, decompress: DecompressFunc, prefetch: boolean, - current_etag?: string + currentEtag?: string ): Promise<[Header, [string, number, Entry[] | ArrayBuffer]?]> { const resp = await source.getBytes(0, 16384); @@ -495,16 +495,16 @@ async function getHeaderAndRoot( const headerData = resp.data.slice(0, HEADER_SIZE_BYTES); - let resp_etag = resp.etag; - if (current_etag && resp.etag != current_etag) { + let respEtag = resp.etag; + if (currentEtag && resp.etag != currentEtag) { console.warn( "ETag conflict detected; your HTTP server might not support content-based ETag headers. ETags disabled for " + source.getKey() ); - resp_etag = undefined; + respEtag = undefined; } - const header = bytesToHeader(headerData, resp_etag); + const header = bytesToHeader(headerData, respEtag); // optimistically set the root directory // TODO check root bounds @@ -577,7 +577,7 @@ export class ResolvedValueCache { this.decompress = decompress; } - async getHeader(source: Source, current_etag?: string): Promise
{ + async getHeader(source: Source, currentEtag?: string): Promise
{ const cacheKey = source.getKey(); if (this.cache.has(cacheKey)) { this.cache.get(cacheKey)!.lastUsed = this.counter++; @@ -589,7 +589,7 @@ export class ResolvedValueCache { source, this.decompress, this.prefetch, - current_etag + currentEtag ); if (res[1]) { this.cache.set(res[1][0], { @@ -666,9 +666,9 @@ export class ResolvedValueCache { if (this.cache.size > this.maxCacheEntries) { let minUsed = Infinity; let minKey = undefined; - this.cache.forEach((cache_value: ResolvedValue, key: string) => { - if (cache_value.lastUsed < minUsed) { - minUsed = cache_value.lastUsed; + this.cache.forEach((cacheValue: ResolvedValue, key: string) => { + if (cacheValue.lastUsed < minUsed) { + minUsed = cacheValue.lastUsed; minKey = key; } }); @@ -678,9 +678,9 @@ export class ResolvedValueCache { } } - async invalidate(source: Source, current_etag: string) { + async invalidate(source: Source, currentEtag: string) { this.cache.delete(source.getKey()); - await this.getHeader(source, current_etag); + await this.getHeader(source, currentEtag); } } @@ -712,7 +712,7 @@ export class SharedPromiseCache { this.decompress = decompress; } - async getHeader(source: Source, current_etag?: string): Promise
{ + async getHeader(source: Source, currentEtag?: string): Promise
{ const cacheKey = source.getKey(); if (this.cache.has(cacheKey)) { this.cache.get(cacheKey)!.lastUsed = this.counter++; @@ -721,7 +721,7 @@ export class SharedPromiseCache { } const p = new Promise
((resolve, reject) => { - getHeaderAndRoot(source, this.decompress, this.prefetch, current_etag) + getHeaderAndRoot(source, this.decompress, this.prefetch, currentEtag) .then((res) => { if (res[1]) { this.cache.set(res[1][0], { @@ -807,23 +807,21 @@ export class SharedPromiseCache { if (this.cache.size >= this.maxCacheEntries) { let minUsed = Infinity; let minKey = undefined; - this.cache.forEach( - (cache_value: SharedPromiseCacheValue, key: string) => { - if (cache_value.lastUsed < minUsed) { - minUsed = cache_value.lastUsed; - minKey = key; - } + this.cache.forEach((cacheValue: SharedPromiseCacheValue, key: string) => { + if (cacheValue.lastUsed < minUsed) { + minUsed = cacheValue.lastUsed; + minKey = key; } - ); + }); if (minKey) { this.cache.delete(minKey); } } } - async invalidate(source: Source, current_etag: string) { + async invalidate(source: Source, currentEtag: string) { this.cache.delete(source.getKey()); - await this.getHeader(source, current_etag); + await this.getHeader(source, currentEtag); } } @@ -864,7 +862,7 @@ export class PMTiles { y: number, signal?: AbortSignal ): Promise { - const tile_id = zxyToTileId(z, x, y); + const tileId = zxyToTileId(z, x, y); const header = await this.cache.getHeader(this.source); // V2 COMPATIBILITY @@ -876,16 +874,16 @@ export class PMTiles { return undefined; } - let d_o = header.rootDirectoryOffset; - let d_l = header.rootDirectoryLength; + let dO = header.rootDirectoryOffset; + let dL = header.rootDirectoryLength; for (let depth = 0; depth <= 3; depth++) { const directory = await this.cache.getDirectory( this.source, - d_o, - d_l, + dO, + dL, header ); - const entry = findTile(directory, tile_id); + const entry = findTile(directory, tileId); if (entry) { if (entry.runLength > 0) { const resp = await this.source.getBytes( @@ -902,8 +900,8 @@ export class PMTiles { expires: resp.expires, }; } else { - d_o = header.leafDirectoryOffset + entry.offset; - d_l = entry.length; + dO = header.leafDirectoryOffset + entry.offset; + dL = entry.length; } } else { // TODO: We should in fact return a valid RangeResponse diff --git a/js/package-lock.json b/js/package-lock.json index 83b2f57..9a1ba9d 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -12,14 +12,169 @@ "fflate": "^0.8.0" }, "devDependencies": { + "@biomejs/biome": "^1.5.3", "@types/node": "^18.11.9", "esbuild": "^0.15.11", - "esbuild-runner": "^2.2.1", "prettier": "^2.8.4", "tsx": "^4.7.0", "typescript": "^4.5.5" } }, + "node_modules/@biomejs/biome": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.5.3.tgz", + "integrity": "sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.5.3", + "@biomejs/cli-darwin-x64": "1.5.3", + "@biomejs/cli-linux-arm64": "1.5.3", + "@biomejs/cli-linux-arm64-musl": "1.5.3", + "@biomejs/cli-linux-x64": "1.5.3", + "@biomejs/cli-linux-x64-musl": "1.5.3", + "@biomejs/cli-win32-arm64": "1.5.3", + "@biomejs/cli-win32-x64": "1.5.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.3.tgz", + "integrity": "sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz", + "integrity": "sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz", + "integrity": "sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz", + "integrity": "sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz", + "integrity": "sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz", + "integrity": "sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz", + "integrity": "sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.3.tgz", + "integrity": "sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -394,12 +549,6 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/esbuild": { "version": "0.15.15", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz", @@ -693,22 +842,6 @@ "node": ">=12" } }, - "node_modules/esbuild-runner": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/esbuild-runner/-/esbuild-runner-2.2.1.tgz", - "integrity": "sha512-VP0VfJJZiZ3cKzdOH59ZceDxx/GzBKra7tiGM8MfFMLv6CR1/cpsvtQ3IsJI3pz7HyeYxtbPyecj3fHwR+3XcQ==", - "dev": true, - "dependencies": { - "source-map-support": "0.5.19", - "tslib": "2.3.1" - }, - "bin": { - "esr": "bin/esr.js" - }, - "peerDependencies": { - "esbuild": "*" - } - }, "node_modules/esbuild-sunos-64": { "version": "0.15.15", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz", @@ -828,31 +961,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "node_modules/tsx": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", @@ -957,6 +1065,78 @@ } }, "dependencies": { + "@biomejs/biome": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.5.3.tgz", + "integrity": "sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==", + "dev": true, + "requires": { + "@biomejs/cli-darwin-arm64": "1.5.3", + "@biomejs/cli-darwin-x64": "1.5.3", + "@biomejs/cli-linux-arm64": "1.5.3", + "@biomejs/cli-linux-arm64-musl": "1.5.3", + "@biomejs/cli-linux-x64": "1.5.3", + "@biomejs/cli-linux-x64-musl": "1.5.3", + "@biomejs/cli-win32-arm64": "1.5.3", + "@biomejs/cli-win32-x64": "1.5.3" + } + }, + "@biomejs/cli-darwin-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.3.tgz", + "integrity": "sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-darwin-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz", + "integrity": "sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz", + "integrity": "sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-arm64-musl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz", + "integrity": "sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz", + "integrity": "sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-x64-musl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz", + "integrity": "sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-win32-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz", + "integrity": "sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==", + "dev": true, + "optional": true + }, + "@biomejs/cli-win32-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.3.tgz", + "integrity": "sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==", + "dev": true, + "optional": true + }, "@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -1124,12 +1304,6 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "esbuild": { "version": "0.15.15", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz", @@ -1272,16 +1446,6 @@ "dev": true, "optional": true }, - "esbuild-runner": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/esbuild-runner/-/esbuild-runner-2.2.1.tgz", - "integrity": "sha512-VP0VfJJZiZ3cKzdOH59ZceDxx/GzBKra7tiGM8MfFMLv6CR1/cpsvtQ3IsJI3pz7HyeYxtbPyecj3fHwR+3XcQ==", - "dev": true, - "requires": { - "source-map-support": "0.5.19", - "tslib": "2.3.1" - } - }, "esbuild-sunos-64": { "version": "0.15.15", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz", @@ -1343,28 +1507,6 @@ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "tsx": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", diff --git a/js/package.json b/js/package.json index 6d6ccf2..db98239 100644 --- a/js/package.json +++ b/js/package.json @@ -28,6 +28,7 @@ "author": "Brandon Liu", "license": "BSD-3-Clause", "devDependencies": { + "@biomejs/biome": "^1.5.3", "@types/node": "^18.11.9", "esbuild": "^0.15.11", "prettier": "^2.8.4", diff --git a/js/test/v2.test.ts b/js/test/v2.test.ts index 111ca74..c33e1c9 100644 --- a/js/test/v2.test.ts +++ b/js/test/v2.test.ts @@ -1,20 +1,18 @@ -import { test } from "node:test"; import assert from "node:assert"; +import { test } from "node:test"; import { - unshift, + createDirectory, + deriveLeaf, getUint24, getUint48, - deriveLeaf, + parseEntry, queryLeafdir, queryTile, - parseEntry, - EntryV2, - createDirectory, } from "../v2"; test("stub data", () => { - let dataview = new DataView( + const dataview = new DataView( createDirectory([ { z: 5, x: 1000, y: 2000, offset: 1000, length: 2000, is_dir: false }, { @@ -27,18 +25,18 @@ test("stub data", () => { }, ]) ); - var z_raw = dataview.getUint8(17 + 0); + var zRaw = dataview.getUint8(17 + 0); var x = getUint24(dataview, 17 + 1); var y = getUint24(dataview, 17 + 4); var offset = getUint48(dataview, 17 + 7); var length = dataview.getUint32(17 + 13, true); - assert.strictEqual(z_raw, 14); + assert.strictEqual(zRaw, 14); assert.strictEqual(x, 16383); assert.strictEqual(y, 16383); }); test("get entry", () => { - let view = new DataView( + const view = new DataView( createDirectory([ { z: 5, x: 1000, y: 2000, offset: 1000, length: 2000, is_dir: false }, { @@ -51,7 +49,7 @@ test("get entry", () => { }, ]) ); - let entry = queryTile(view, 14, 16383, 16383); + const entry = queryTile(view, 14, 16383, 16383); assert.strictEqual(entry!.z, 14); assert.strictEqual(entry!.x, 16383); assert.strictEqual(entry!.y, 16383); @@ -62,7 +60,7 @@ test("get entry", () => { }); test("get leafdir", () => { - let view = new DataView( + const view = new DataView( createDirectory([ { z: 14, @@ -74,7 +72,7 @@ test("get leafdir", () => { }, ]) ); - let entry = queryLeafdir(view, 14, 16383, 16383); + const entry = queryLeafdir(view, 14, 16383, 16383); assert.strictEqual(entry!.z, 14); assert.strictEqual(entry!.x, 16383); assert.strictEqual(entry!.y, 16383); @@ -118,7 +116,7 @@ test("derive the leaf level", () => { }); test("convert spec v1 directory to spec v2 directory", () => { - let view = new DataView( + const view = new DataView( createDirectory([ { z: 7, diff --git a/js/test/v3.test.ts b/js/test/v3.test.ts index b63e804..51592e6 100644 --- a/js/test/v3.test.ts +++ b/js/test/v3.test.ts @@ -1,20 +1,19 @@ -import { test } from "node:test"; -import assert from "node:assert"; import fs from "fs"; +import assert from "node:assert"; +import { test } from "node:test"; import { - Entry, - zxyToTileId, - tileIdToZxy, - findTile, - readVarint, - SharedPromiseCache, BufferPosition, - Source, - RangeResponse, - EtagMismatch, + Entry, PMTiles, + RangeResponse, + SharedPromiseCache, + Source, + findTile, getUint64, + readVarint, + tileIdToZxy, + zxyToTileId, } from "../index"; test("varint", () => { diff --git a/js/v2.ts b/js/v2.ts index ea5a959..bc66720 100644 --- a/js/v2.ts +++ b/js/v2.ts @@ -1,12 +1,12 @@ +import { decompressSync } from "fflate"; import { - Source, - Header, Cache, - RangeResponse, Compression, + Header, + RangeResponse, + Source, TileType, } from "./index"; -import { decompressSync } from "fflate"; export const shift = (n: number, shift: number) => { return n * Math.pow(2, shift); @@ -60,14 +60,14 @@ export const queryLeafdir = ( x: number, y: number ): EntryV2 | null => { - const offset_len = queryView(view, z | 0x80, x, y); - if (offset_len) { + const offsetLen = queryView(view, z | 0x80, x, y); + if (offsetLen) { return { z: z, x: x, y: y, - offset: offset_len[0], - length: offset_len[1], + offset: offsetLen[0], + length: offsetLen[1], is_dir: true, }; } @@ -75,14 +75,14 @@ export const queryLeafdir = ( }; export const queryTile = (view: DataView, z: number, x: number, y: number) => { - const offset_len = queryView(view, z, x, y); - if (offset_len) { + const offsetLen = queryView(view, z, x, y); + if (offsetLen) { return { z: z, x: x, y: y, - offset: offset_len[0], - length: offset_len[1], + offset: offsetLen[0], + length: offsetLen[1], is_dir: false, }; } @@ -128,15 +128,15 @@ const entrySort = (a: EntryV2, b: EntryV2): number => { }; export const parseEntry = (dataview: DataView, i: number): EntryV2 => { - const z_raw = dataview.getUint8(i * 17); - const z = z_raw & 127; + const zRaw = dataview.getUint8(i * 17); + const z = zRaw & 127; return { z: z, x: getUint24(dataview, i * 17 + 1), y: getUint24(dataview, i * 17 + 4), offset: getUint48(dataview, i * 17 + 7), length: dataview.getUint32(i * 17 + 13, true), - is_dir: z_raw >> 7 === 1, + is_dir: zRaw >> 7 === 1, }; }; @@ -188,11 +188,11 @@ export const deriveLeaf = (view: DataView, tile: Zxy): Zxy | null => { const numEntries = view.byteLength / 17; const entry = parseEntry(view, numEntries - 1); if (entry.is_dir) { - const leaf_level = entry.z; - const level_diff = tile.z - leaf_level; - const leaf_x = Math.trunc(tile.x / (1 << level_diff)); - const leaf_y = Math.trunc(tile.y / (1 << level_diff)); - return { z: leaf_level, x: leaf_x, y: leaf_y }; + const leafLevel = entry.z; + const levelDiff = tile.z - leafLevel; + const leafX = Math.trunc(tile.x / (1 << levelDiff)); + const leafY = Math.trunc(tile.y / (1 << levelDiff)); + return { z: leafLevel, x: leafX, y: leafY }; } return null; }; @@ -202,57 +202,57 @@ async function getHeader(source: Source): Promise
{ const dataview = new DataView(resp.data); - const json_size = dataview.getUint32(4, true); - const root_entries = dataview.getUint16(8, true); + const jsonSize = dataview.getUint32(4, true); + const rootEntries = dataview.getUint16(8, true); const dec = new TextDecoder("utf-8"); - const json_metadata = JSON.parse( - dec.decode(new DataView(resp.data, 10, json_size)) + const jsonMetadata = JSON.parse( + dec.decode(new DataView(resp.data, 10, jsonSize)) ); - let tile_compression = Compression.Unknown; - if (json_metadata.compression === "gzip") { - tile_compression = Compression.Gzip; + let tileCompression = Compression.Unknown; + if (jsonMetadata.compression === "gzip") { + tileCompression = Compression.Gzip; } let minzoom = 0; - if ("minzoom" in json_metadata) { - minzoom = +json_metadata.minzoom; + if ("minzoom" in jsonMetadata) { + minzoom = +jsonMetadata.minzoom; } let maxzoom = 0; - if ("maxzoom" in json_metadata) { - maxzoom = +json_metadata.maxzoom; + if ("maxzoom" in jsonMetadata) { + maxzoom = +jsonMetadata.maxzoom; } - let center_lon = 0; - let center_lat = 0; - let center_zoom = 0; - let min_lon = -180.0; - let min_lat = -85.0; - let max_lon = 180.0; - let max_lat = 85.0; + let centerLon = 0; + let centerLat = 0; + let centerZoom = 0; + let minLon = -180.0; + let minLat = -85.0; + let maxLon = 180.0; + let maxLat = 85.0; - if (json_metadata.bounds) { - const split = json_metadata.bounds.split(","); - min_lon = +split[0]; - min_lat = +split[1]; - max_lon = +split[2]; - max_lat = +split[3]; + if (jsonMetadata.bounds) { + const split = jsonMetadata.bounds.split(","); + minLon = +split[0]; + minLat = +split[1]; + maxLon = +split[2]; + maxLat = +split[3]; } - if (json_metadata.center) { - const split = json_metadata.center.split(","); - center_lon = +split[0]; - center_lat = +split[1]; - center_zoom = +split[2]; + if (jsonMetadata.center) { + const split = jsonMetadata.center.split(","); + centerLon = +split[0]; + centerLat = +split[1]; + centerZoom = +split[2]; } const header = { specVersion: dataview.getUint16(2, true), - rootDirectoryOffset: 10 + json_size, - rootDirectoryLength: root_entries * 17, + rootDirectoryOffset: 10 + jsonSize, + rootDirectoryLength: rootEntries * 17, jsonMetadataOffset: 10, - jsonMetadataLength: json_size, + jsonMetadataLength: jsonSize, leafDirectoryOffset: 0, leafDirectoryLength: undefined, tileDataOffset: 0, @@ -262,17 +262,17 @@ async function getHeader(source: Source): Promise
{ numTileContents: 0, clustered: false, internalCompression: Compression.None, - tileCompression: tile_compression, + tileCompression: tileCompression, tileType: TileType.Mvt, minZoom: minzoom, maxZoom: maxzoom, - minLon: min_lon, - minLat: min_lat, - maxLon: max_lon, - maxLat: max_lat, - centerZoom: center_zoom, - centerLon: center_lon, - centerLat: center_lat, + minLon: minLon, + minLat: minLat, + maxLon: maxLon, + maxLat: maxLat, + centerZoom: centerZoom, + centerLon: centerLon, + centerLat: centerLat, etag: resp.etag, }; return header; @@ -287,65 +287,65 @@ async function getZxy( y: number, signal?: AbortSignal ): Promise { - let root_dir = await cache.getArrayBuffer( + let rootDir = await cache.getArrayBuffer( source, header.rootDirectoryOffset, header.rootDirectoryLength, header ); if (header.specVersion === 1) { - root_dir = sortDir(root_dir); + rootDir = sortDir(rootDir); } - const entry = queryTile(new DataView(root_dir), z, x, y); + const entry = queryTile(new DataView(rootDir), z, x, y); if (entry) { const resp = await source.getBytes(entry.offset, entry.length, signal); - let tile_data = resp.data; + let tileData = resp.data; - const view = new DataView(tile_data); + const view = new DataView(tileData); if (view.getUint8(0) == 0x1f && view.getUint8(1) == 0x8b) { - tile_data = decompressSync(new Uint8Array(tile_data)); + tileData = decompressSync(new Uint8Array(tileData)); } return { - data: tile_data, + data: tileData, }; } - const leafcoords = deriveLeaf(new DataView(root_dir), { z: z, x: x, y: y }); + const leafcoords = deriveLeaf(new DataView(rootDir), { z: z, x: x, y: y }); if (leafcoords) { - const leafdir_entry = queryLeafdir( - new DataView(root_dir), + const leafdirEntry = queryLeafdir( + new DataView(rootDir), leafcoords.z, leafcoords.x, leafcoords.y ); - if (leafdir_entry) { - let leaf_dir = await cache.getArrayBuffer( + if (leafdirEntry) { + let leafDir = await cache.getArrayBuffer( source, - leafdir_entry.offset, - leafdir_entry.length, + leafdirEntry.offset, + leafdirEntry.length, header ); if (header.specVersion === 1) { - leaf_dir = sortDir(leaf_dir); + leafDir = sortDir(leafDir); } - const tile_entry = queryTile(new DataView(leaf_dir), z, x, y); - if (tile_entry) { + const tileEntry = queryTile(new DataView(leafDir), z, x, y); + if (tileEntry) { const resp = await source.getBytes( - tile_entry.offset, - tile_entry.length, + tileEntry.offset, + tileEntry.length, signal ); - let tile_data = resp.data; + let tileData = resp.data; - const view = new DataView(tile_data); + const view = new DataView(tileData); if (view.getUint8(0) == 0x1f && view.getUint8(1) == 0x8b) { - tile_data = decompressSync(new Uint8Array(tile_data)); + tileData = decompressSync(new Uint8Array(tileData)); } return { - data: tile_data, + data: tileData, }; } }