From 4ffdce3ed16b6a0213a39437354763824857b426 Mon Sep 17 00:00:00 2001 From: Dmitry Shirokov Date: Fri, 6 Jan 2023 11:51:31 +1100 Subject: [PATCH 1/3] tidy up all changes --- package-lock.json | 445 +++++++++++++++++--- package.json | 8 +- src/data/index.ts | 11 +- src/data/jpeg2000.ts | 57 +++ src/data/{simple-unpacking.ts => simple.ts} | 0 src/foo.ts | 18 + src/index.ts | 24 +- src/section.ts | 2 +- src/sections/section-2.ts | 13 +- src/sections/section-3.ts | 6 + src/sections/section-5.ts | 4 +- src/sections/section-6.ts | 16 +- src/sections/section-7.ts | 5 +- src/tables/table-5.ts | 19 + src/tables/table.ts | 2 + src/templates/template-3.ts | 8 +- src/templates/template-5.ts | 43 +- tsconfig.json | 3 +- 18 files changed, 604 insertions(+), 80 deletions(-) create mode 100644 src/data/jpeg2000.ts rename src/data/{simple-unpacking.ts => simple.ts} (100%) create mode 100644 src/foo.ts diff --git a/package-lock.json b/package-lock.json index d0aa854..cc800f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,14 +10,18 @@ "license": "MIT", "dependencies": { "base64-js": "^1.3.1", + "bmp-js": "^0.1.0", "buffer": "^6.0.3", - "ieee754": "^1.2.1" + "ieee754": "^1.2.1", + "jpeg2000": "^1.1.0" }, "devDependencies": { + "@ericandrewlewis/bitmap": "^1.0.0", "@types/buffer-from": "^1.1.0", + "ts-node": "^10.9.1", "tsdx": "^0.14.1", "tslib": "^2.3.0", - "typescript": "^3.9.10" + "typescript": "^4.9.4" }, "engines": { "node": ">=10" @@ -1715,6 +1719,27 @@ "node": ">=0.1.95" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ericandrewlewis/bitmap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ericandrewlewis/bitmap/-/bitmap-1.0.0.tgz", + "integrity": "sha512-7dNAuxd0mJ0nDHFLC0tRBLTARNezyHzqJ6KIE2e7ay6wpO79oG+MqDBSY9sB6Q96kv86d79Fg9ful925jA+j9A==", + "dev": true, + "engines": { + "node": ">=9" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2171,6 +2196,31 @@ "node": ">=8" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -2286,6 +2336,30 @@ "type-detect": "4.0.8" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.1.15", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", @@ -2691,6 +2765,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3222,6 +3302,11 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3806,6 +3891,12 @@ "node": ">=8" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3986,6 +4077,15 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -7372,6 +7472,11 @@ "node": ">= 8.3" } }, + "node_modules/jpeg2000": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jpeg2000/-/jpeg2000-1.1.0.tgz", + "integrity": "sha512-3zV+uTrwA1Z6erXENIWUnS140JjL1iRWbGiLfUi7rETYDV9NWmMl+gx5DHz+58pT8LiGXuXwiM4RpWGyotomxA==" + }, "node_modules/jpjs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jpjs/-/jpjs-1.2.1.tgz", @@ -7677,7 +7782,7 @@ "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "node_modules/lodash.merge": { @@ -10891,41 +10996,68 @@ "punycode": "^2.1.0" } }, - "node_modules/ts-jest": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.5.1.tgz", - "integrity": "sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw==", + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "micromatch": "4.x", - "mkdirp": "0.x", - "semver": "6.x", - "yargs-parser": "18.x" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": ">= 8" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { - "jest": ">=25 <26", - "typescript": ">=3.4 <4.0" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/ts-jest/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/ts-node/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { - "semver": "bin/semver.js" + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" } }, "node_modules/tsconfig-paths": { @@ -11018,12 +11150,62 @@ "node": ">=10" } }, + "node_modules/tsdx/node_modules/ts-jest": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.5.1.tgz", + "integrity": "sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "micromatch": "4.x", + "mkdirp": "0.x", + "semver": "6.x", + "yargs-parser": "18.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 8" + }, + "peerDependencies": { + "jest": ">=25 <26", + "typescript": ">=3.4 <4.0" + } + }, + "node_modules/tsdx/node_modules/ts-jest/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/tsdx/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/tsdx/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", @@ -11112,9 +11294,9 @@ } }, "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11301,6 +11483,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -11714,6 +11902,15 @@ "engines": { "node": ">=8" } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } } }, "dependencies": { @@ -12911,6 +13108,21 @@ "minimist": "^1.2.0" } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@ericandrewlewis/bitmap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ericandrewlewis/bitmap/-/bitmap-1.0.0.tgz", + "integrity": "sha512-7dNAuxd0mJ0nDHFLC0tRBLTARNezyHzqJ6KIE2e7ay6wpO79oG+MqDBSY9sB6Q96kv86d79Fg9ful925jA+j9A==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -13280,6 +13492,28 @@ } } }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -13358,6 +13592,30 @@ "type-detect": "4.0.8" } }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "@types/babel__core": { "version": "7.1.15", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", @@ -13670,6 +13928,12 @@ "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -14079,6 +14343,11 @@ "tweetnacl": "^0.14.3" } }, + "bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -14535,6 +14804,12 @@ "yaml": "^1.7.2" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -14678,6 +14953,12 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -17295,6 +17576,11 @@ "supports-color": "^7.0.0" } }, + "jpeg2000": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jpeg2000/-/jpeg2000-1.1.0.tgz", + "integrity": "sha512-3zV+uTrwA1Z6erXENIWUnS140JjL1iRWbGiLfUi7rETYDV9NWmMl+gx5DHz+58pT8LiGXuXwiM4RpWGyotomxA==" + }, "jpjs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jpjs/-/jpjs-1.2.1.tgz", @@ -17544,7 +17830,7 @@ "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "lodash.merge": { @@ -20120,28 +20406,37 @@ "punycode": "^2.1.0" } }, - "ts-jest": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.5.1.tgz", - "integrity": "sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw==", + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "micromatch": "4.x", - "mkdirp": "0.x", - "semver": "6.x", - "yargs-parser": "18.x" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true } } @@ -20229,11 +20524,43 @@ "typescript": "^3.7.3" }, "dependencies": { + "ts-jest": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.5.1.tgz", + "integrity": "sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "micromatch": "4.x", + "mkdirp": "0.x", + "semver": "6.x", + "yargs-parser": "18.x" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true } } }, @@ -20306,9 +20633,9 @@ } }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true }, "unbox-primitive": { @@ -20450,6 +20777,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -20788,6 +21121,12 @@ "dev": true } } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } diff --git a/package.json b/package.json index 5d4003e..b91a581 100644 --- a/package.json +++ b/package.json @@ -29,14 +29,18 @@ "author": "Alessandro Vecchi", "module": "dist/vgrib2.esm.js", "devDependencies": { + "@ericandrewlewis/bitmap": "^1.0.0", "@types/buffer-from": "^1.1.0", + "ts-node": "^10.9.1", "tsdx": "^0.14.1", "tslib": "^2.3.0", - "typescript": "^3.9.10" + "typescript": "^4.9.4" }, "dependencies": { "base64-js": "^1.3.1", + "bmp-js": "^0.1.0", "buffer": "^6.0.3", - "ieee754": "^1.2.1" + "ieee754": "^1.2.1", + "jpeg2000": "^1.1.0" } } diff --git a/src/data/index.ts b/src/data/index.ts index 1badd99..969ab18 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -2,7 +2,9 @@ import { Buffer } from 'buffer/' import { DataRepresentationSectionValues } from '../sections/section-5' -import { simpleUnpacking } from './simple-unpacking' +import { simpleUnpacking } from './simple' +import { jpeg2000Unpacking } from './jpeg2000' +import { BitMapSectionValues } from '../sections' /** * Converts data Buffer according to data representation section @@ -10,14 +12,15 @@ import { simpleUnpacking } from './simple-unpacking' * @param data Data to be converted * @returns Converted data */ -export const convertData = (drs: DataRepresentationSectionValues, data: Buffer) => { +export const convertData = (drs: DataRepresentationSectionValues, bms:BitMapSectionValues, data: Buffer) => { const { dataRepresentationTemplate } = drs.contents switch (dataRepresentationTemplate) { case 0: return simpleUnpacking(drs, data) - + case 40: + return jpeg2000Unpacking(drs, bms, data) default: throw new Error(`Template 7.${dataRepresentationTemplate} not defined`) } -} +} \ No newline at end of file diff --git a/src/data/jpeg2000.ts b/src/data/jpeg2000.ts new file mode 100644 index 0000000..55ced35 --- /dev/null +++ b/src/data/jpeg2000.ts @@ -0,0 +1,57 @@ +import { Buffer } from 'buffer/' +import { DataRepresentationSectionValues } from '../sections/section-5' +import { JpxImage } from 'jpeg2000' +import { BitMapSectionValues } from '../sections' + +/** + * Data Template 7.0 + * + * [Read more...](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_temp7-40.shtml) + */ +export const jpeg2000Unpacking = (drs: DataRepresentationSectionValues, bms: BitMapSectionValues, data: Buffer) => { + const jpx = new JpxImage() + jpx.parse(data) + + if (jpx.componentsCount !== 1) throw new Error('JPEG Decoder: Only single component is supported') + if (jpx.tiles.length !== 1) throw new Error('JPEG Decoder: Only single tile is supported') + if (jpx.tiles[0].height !== 1) throw new Error('JPEG Decoder: Only single row (1xN) is supported') + + const { dataRepresentation } = drs.contents + + const D = dataRepresentation.decimalScaleFactor + const R = dataRepresentation.referenceValue + const E = dataRepresentation.binaryScaleFactor + + const DD = Math.pow(10, D) + const EE = Math.pow(2, E) + + const result: (number | null)[] = [] + + // A bit map applies to this product + // [See more](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table6-0.shtml) + if (bms.contents.bitMapIndicator === 0) { + if (!bms.contents.bitMap) { + throw new Error('Bit map is not defined') + } + + let k = 0; + for (const byte of bms.contents.bitMap) { + // Apply bit map to the data. + // Length of data values is often smaller than the bit map itself. Bitmap is used to + // indicate which data values are present, 1 bit meaning is present, 0 bit meaning is missing. + // [Read more](https://confluence.ecmwf.int/display/UDOC/What+is+the+GRIB+bitmap+-+ecCodes+GRIB+FAQ) + for (let i = 0; i < 8; i++) { + if (byte & (1 << i)) { + result.push((R + jpx.tiles[0].items[k++] * EE) / DD) + } else { + result.push(null) + } + } + } + } else { + // Do not use `.map` on Uint8Array, as it clamps the values to 0-255 + for (const byte of jpx.tiles[0].items) result.push((R + byte * EE) / DD) + } + + return result +} diff --git a/src/data/simple-unpacking.ts b/src/data/simple.ts similarity index 100% rename from src/data/simple-unpacking.ts rename to src/data/simple.ts diff --git a/src/foo.ts b/src/foo.ts new file mode 100644 index 0000000..a2ef8a4 --- /dev/null +++ b/src/foo.ts @@ -0,0 +1,18 @@ +import fs from 'fs' +import { GRIB } from '.' + +const filepath = '/Users/dmitry/projects/glowing-fork/mirror/ftp.bom.gov.au/anon/sample/catalogue/ADFD/Victoria/IDV71000_VIC_T_SFC.grb' + +const gribFile = fs.readFileSync(filepath) + +console.time('vgrib parse') +const grib = GRIB.parse(gribFile) +// let i = 0 +// for (const packet of grib) console.log(i++, packet) + +console.timeEnd('vgrib parse') + +console.log(GRIB.lookupDataPoint(grib[0], -39.75, 146.15), 'should be 285.86') +console.log(GRIB.lookupDataPoint(grib[0], -39.75, 146.12), 'should be null') +console.log(GRIB.lookupDataPoint(grib[0], -39.72, 146.12), 'should be 285.96') +console.log(GRIB.lookupDataPoint(grib[0], -39.42, 145.1065), 'should be 286.06') diff --git a/src/index.ts b/src/index.ts index fd8ddc6..a267c00 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ const parse = (data: ArrayBuffer): Array => { const buffer = Buffer.from(data) const gribChunks = splitGribChunks(buffer) + gribChunks.length = 3 const packets = gribChunks.map((gribChunk: Buffer) => { const sectionChunks = splitSectionChunks(gribChunk) const sectionValues = parseSections(sectionChunks) @@ -41,6 +42,27 @@ const parseNoLookup = (data: ArrayBuffer): Array => { return packets } -export const GRIB = { parse, parseNoLookup } +/** + * Lookup data point from GRIB packet based on lat/lon coordinates. + * + * @param packet GRIB packet + * @param lat Latitude + * @param lon Longitude + */ +const lookupDataPoint = (packet: GRIBPacket, lat: number, lon: number): number | null => { + const { la1, lo1, la2, lo2, dx, dy, ny } = packet.gridDefinition + if (lat < la1 || lat > la2 || lon < lo1 || lon > lo2) return null + + // lon (W-E) is x + // lat (N-S) is y + const x = Math.abs(Math.round((lo1 - lon) / dx)) + const y = Math.abs(Math.round((la1 - lat) / dy)) + + const idx = y * ny + x + const val = packet.data[idx] + return val +} + +export const GRIB = { parse, parseNoLookup, lookupDataPoint } export * from './types/grib' diff --git a/src/section.ts b/src/section.ts index c8d5163..1f1c8cd 100644 --- a/src/section.ts +++ b/src/section.ts @@ -84,7 +84,7 @@ const parseSection = (section: Buffer | null) => { export const lookupSections = (parsedSections: SectionValues) => { const [ins, ids, lus, gds, pds, drs, bms, ds, es] = parsedSections - return [lookupSection0(ins), lookupSection1(ids), lus, lookupSection3(gds), lookupSection4(pds, ins, ids), lookupSection5(drs), bms, lookupSection7(ds, drs), es] as Sections + return [lookupSection0(ins), lookupSection1(ids), lus, lookupSection3(gds), lookupSection4(pds, ins, ids), lookupSection5(drs), bms, lookupSection7(ds, drs, bms), es] as Sections } /** diff --git a/src/sections/section-2.ts b/src/sections/section-2.ts index 196c6b2..b45a815 100644 --- a/src/sections/section-2.ts +++ b/src/sections/section-2.ts @@ -8,6 +8,15 @@ export type LocalUseSection = ReturnType * * [Read more...](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect2.shtml) */ -export const parseSection2 = (_section: Buffer) => { - throw new Error('Section 2 is not supported') +export const parseSection2 = (section: Buffer) => { + return { + /** Number of GRIB section */ + sectionNumber: section.readUInt8(4), + /** Name of Grib section */ + sectionName: 'Local Use Section', + /** Length of GRIB section */ + length: section.readUInt32BE(0), + /** Section 2 Contents */ + contents: { data: section.slice(5) } + } } diff --git a/src/sections/section-3.ts b/src/sections/section-3.ts index 1cfd47f..126734b 100644 --- a/src/sections/section-3.ts +++ b/src/sections/section-3.ts @@ -24,8 +24,14 @@ export const parseSection3 = (section: Buffer) => { length: section.readUInt32BE(0), /** Section 3 Contents */ contents: { + // Source of grid definition + definitionSource: section.readUInt8(5), /** Number of data points */ numberOfPoints: section.readUInt32BE(6), + // Number of octets for optional list of numbers defining number of points + numberOfOctets: section.readUInt8(10), + // Interpetation of list of numbers defining number of points [Table 3.11](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table3-11.shtml) + interpretation: section.readUInt8(11), /** Grid definition template number [Table 3.1](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table3-1.shtml) */ gridDefinitionTemplate, /** Grid definition values */ diff --git a/src/sections/section-5.ts b/src/sections/section-5.ts index 151c94b..53a752f 100644 --- a/src/sections/section-5.ts +++ b/src/sections/section-5.ts @@ -13,7 +13,8 @@ export type DataRepresentationSection = ReturnType */ export const parseSection5 = (section: Buffer) => { const dataRepresentationTemplate = section.readUInt16BE(9) - const dataRepresentation = getTemplate5(dataRepresentationTemplate)(section) + const template = getTemplate5(dataRepresentationTemplate) + const dataRepresentation = template(section) return { /** Number of GRIB section */ @@ -49,6 +50,7 @@ export const lookupSection5 = (drs: DataRepresentationSectionValues) => { /** Data representation template */ dataRepresentationTemplate: lookupTable50(dataRepresentationTemplate), /** Data representation */ + // @ts-ignore dataRepresentation: lookupTemplate5(dataRepresentationTemplate)(dataRepresentation) } } diff --git a/src/sections/section-6.ts b/src/sections/section-6.ts index db13a2a..335db76 100644 --- a/src/sections/section-6.ts +++ b/src/sections/section-6.ts @@ -1,18 +1,20 @@ import { Buffer } from 'buffer/' - export type BitMapSectionValues = ReturnType export type BitMapSection = ReturnType /** - * Bit-Map Section + * Bit-Map Section * - * [Read more...](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect6.shtml) + * Consult with [this page](https://confluence.ecmwf.int/display/UDOC/What+is+the+GRIB+bitmap+-+ecCodes+GRIB+FAQ) to understand their purpose. + * [Read more...](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect6.shtml). */ export const parseSection6 = (section: Buffer) => { const bitMapIndicator = section.readUInt8(5) - if (bitMapIndicator !== 255) throw new Error('BitMap Indicator not supported') - + if (![0, 255].includes(bitMapIndicator)) { + throw new Error('BitMap Indicator not supported: ' + String(bitMapIndicator)) + } + return { /** Number of GRIB section */ sectionNumber: section.readUInt8(4), @@ -23,7 +25,9 @@ export const parseSection6 = (section: Buffer) => { /** Section 6 Contents */ contents: { /** Bit-map indicator (See [Table 6.0](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table6-0.shtml)) */ - bitMapIndicator + bitMapIndicator, + // Bit-map + bitMap: bitMapIndicator === 0 ? section.slice(6) : null } } } diff --git a/src/sections/section-7.ts b/src/sections/section-7.ts index d2f075c..9555351 100644 --- a/src/sections/section-7.ts +++ b/src/sections/section-7.ts @@ -3,6 +3,7 @@ import { Buffer } from 'buffer/' import { DataRepresentationSectionValues } from './section-5' import { convertData } from '../data' +import { BitMapSectionValues } from './section-6' export type DataSectionValues = ReturnType export type DataSection = ReturnType @@ -31,11 +32,11 @@ export const parseSection7 = (section: Buffer) => { * @param drs Data Representation Section * @returns Data Section with corresponding string values */ -export const lookupSection7 = (ds: DataSectionValues, drs: DataRepresentationSectionValues) => { +export const lookupSection7 = (ds: DataSectionValues, drs: DataRepresentationSectionValues, bms: BitMapSectionValues) => { return { ...ds, contents: { - data: convertData(drs, ds.contents.data) + data: convertData(drs, bms, ds.contents.data), } } } diff --git a/src/tables/table-5.ts b/src/tables/table-5.ts index 8385566..f5d8df4 100644 --- a/src/tables/table-5.ts +++ b/src/tables/table-5.ts @@ -53,3 +53,22 @@ export const lookupTable51 = (code: number) => { throw new Error(`Table 5.1 missing code value ${code}`) } } + +/** + * Table 5.40 - TYPE OF COMPRESSION USED + * [Read more](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table5-40.shtml) + */ +export const lookupTable540 = (code: number) => { + switch (code) { + case 0: + return 'Lossless' + case 1: + return 'Lossy' + // Range 2-254 is Reserved + case 255: + return 'Missing' + + default: + throw new Error(`Table 5.40 missing code value ${code}`) + } +} diff --git a/src/tables/table.ts b/src/tables/table.ts index e5ad107..ff95ea1 100644 --- a/src/tables/table.ts +++ b/src/tables/table.ts @@ -468,6 +468,8 @@ export const lookupTable0 = (code: number) => { */ export const lookupTableA = (code: number) => { switch (code) { + case 0: + return 'Unknown' case 2: return 'Ultra Violet Index Model' case 3: diff --git a/src/templates/template-3.ts b/src/templates/template-3.ts index 01db02b..46cd567 100644 --- a/src/templates/template-3.ts +++ b/src/templates/template-3.ts @@ -45,10 +45,10 @@ const template30 = (section: Buffer) => { return { /** Shape of Earth [Table 3.2](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table3-2.shtml) */ shape: section.readUInt8(14), - /** Number of points along a parallel */ - nx: section.readUInt32BE(30), - /** Number of points along a meridian */ - ny: section.readUInt32BE(34), + /** Number of points along a parallel (W-E) */ + ny: section.readUInt32BE(30), + /** Number of points along a meridian (N-S) */ + nx: section.readUInt32BE(34), /** Basic angle of the initial production domain */ basicAngle, /** Subdivisions of basic angle used to define extreme longitudes and latitudes, and direction increments */ diff --git a/src/templates/template-5.ts b/src/templates/template-5.ts index ca990fc..5817fd7 100644 --- a/src/templates/template-5.ts +++ b/src/templates/template-5.ts @@ -1,16 +1,19 @@ import { Buffer } from 'buffer/' -import { lookupTable51 } from '../tables/table-5' +import { lookupTable51, lookupTable540 } from '../tables/table-5' /** * @description Returns a template generator for the given template number * @param template Template number * @returns Template generator */ -export const getTemplate5 = (template: number) => { +export const getTemplate5 = (template: number): typeof template50 | typeof template540 => { switch (template) { + case 40: + return template540 case 0: return template50 + default: throw new Error(`Template 5.${template} not defined`) } @@ -25,7 +28,8 @@ export const lookupTemplate5 = (template: number) => { switch (template) { case 0: return lookupTemplate50 - + case 40: + return lookupTemplate540 default: throw new Error(`Template 5.${template} lookup table not defined`) } @@ -58,3 +62,36 @@ const lookupTemplate50 = (templateValues: ReturnType) => { originalType: lookupTable51(templateValues.originalType) } } + +/** + * Data Representation Template 5.40 + * + * [Read more...](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_temp5-40.shtml) + */ +const template540 = (section: Buffer) => { + return { + /** Reference value (R) (IEEE 32-bit floating-point value) */ + referenceValue: section.readFloatBE(11), + /** Binary scale factor (E) */ + binaryScaleFactor: section.readInt16BE(15), + /** Decimal scale factor (D) */ + decimalScaleFactor: section.readInt16BE(17), + /** Number of bits used for each packed value for simple packing, or for each group reference value for complex packing or spatial differencing */ + numberOfBits: section.readUInt8(19), + /** Type of original field values (see Code [Table 5.1](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table5-1.shtml)) */ + originalType: section.readUInt8(20), + // Type of Compression used. (see [Code Table 5.40](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table5-40.shtml)) + compressionType: section.readUInt8(21), + // Target compression ratio, M:1 (with respect to the bit-depth specified in octet 20), + // when octet 22 indicates Lossy Compression. Otherwise, set to missing. + compressionRatio: section.readUInt8(22) + } +} + +const lookupTemplate540 = (templateValues: ReturnType) => { + return { + ...lookupTemplate50(templateValues), + // Type of Compression used + compressionType: lookupTable540(templateValues.compressionType) + } +} diff --git a/tsconfig.json b/tsconfig.json index 2c85b2d..171bf1a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,8 @@ // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs "include": ["src", "types"], "compilerOptions": { - "module": "esnext", + "target": "ES2020", + "module": "CommonJS", "lib": ["dom", "esnext"], "importHelpers": true, // output .d.ts declaration files for consumers From c748b89d7a33b46350aa9eb6d24d8e0fe28103d4 Mon Sep 17 00:00:00 2001 From: Dmitry Shirokov Date: Fri, 6 Jan 2023 12:01:06 +1100 Subject: [PATCH 2/3] Revert unnecessary changes --- README.md | 2 + package-lock.json | 363 +--------------------------------------------- package.json | 16 +- src/foo.ts | 18 --- src/index.ts | 4 +- tsconfig.json | 3 +- 6 files changed, 20 insertions(+), 386 deletions(-) delete mode 100644 src/foo.ts diff --git a/README.md b/README.md index 651c416..f72fe20 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ import { GRIB } from 'vgrib2' const gribFile = fs.readFileSync('./path/to/file.grib2') const grib = GRIB.parse(gribFile) +// Lookup grid data point from the first packet +const point = GRIB.lookupDataPoint(grib[0], -39.75, 146.15) // No Table Lookup (useful for adding new tables) const gribNoLookup = GRIB.parseNoLookup(gribFile) ``` diff --git a/package-lock.json b/package-lock.json index cc800f2..49cee52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,19 +9,13 @@ "version": "0.1.13", "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "bmp-js": "^0.1.0", "buffer": "^6.0.3", - "ieee754": "^1.2.1", "jpeg2000": "^1.1.0" }, "devDependencies": { - "@ericandrewlewis/bitmap": "^1.0.0", - "@types/buffer-from": "^1.1.0", - "ts-node": "^10.9.1", "tsdx": "^0.14.1", "tslib": "^2.3.0", - "typescript": "^4.9.4" + "typescript": "^3.9.10" }, "engines": { "node": ">=10" @@ -1719,27 +1713,6 @@ "node": ">=0.1.95" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@ericandrewlewis/bitmap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ericandrewlewis/bitmap/-/bitmap-1.0.0.tgz", - "integrity": "sha512-7dNAuxd0mJ0nDHFLC0tRBLTARNezyHzqJ6KIE2e7ay6wpO79oG+MqDBSY9sB6Q96kv86d79Fg9ful925jA+j9A==", - "dev": true, - "engines": { - "node": ">=9" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2196,31 +2169,6 @@ "node": ">=8" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -2336,30 +2284,6 @@ "type-detect": "4.0.8" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, "node_modules/@types/babel__core": { "version": "7.1.15", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", @@ -2401,15 +2325,6 @@ "@babel/types": "^7.3.0" } }, - "node_modules/@types/buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-BLFpLBcN+RPKUsFxqRkMiwqTOOdi+TrKr5OpLJ9qCnUdSxS6S80+QRX/mIhfR66u0Ykc4QTkReaejOM2ILh+9Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -2765,12 +2680,6 @@ "node": ">= 8" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3302,11 +3211,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3891,12 +3795,6 @@ "node": ">=8" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4077,15 +3975,6 @@ "node": ">=8" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -10996,70 +10885,6 @@ "punycode": "^2.1.0" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/tsconfig-paths": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", @@ -11193,19 +11018,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tsdx/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", @@ -11294,9 +11106,9 @@ } }, "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11483,12 +11295,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "node_modules/v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -11902,15 +11708,6 @@ "engines": { "node": ">=8" } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } } }, "dependencies": { @@ -13108,21 +12905,6 @@ "minimist": "^1.2.0" } }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@ericandrewlewis/bitmap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ericandrewlewis/bitmap/-/bitmap-1.0.0.tgz", - "integrity": "sha512-7dNAuxd0mJ0nDHFLC0tRBLTARNezyHzqJ6KIE2e7ay6wpO79oG+MqDBSY9sB6Q96kv86d79Fg9ful925jA+j9A==", - "dev": true - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -13492,28 +13274,6 @@ } } }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -13592,30 +13352,6 @@ "type-detect": "4.0.8" } }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, "@types/babel__core": { "version": "7.1.15", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", @@ -13657,15 +13393,6 @@ "@babel/types": "^7.3.0" } }, - "@types/buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-BLFpLBcN+RPKUsFxqRkMiwqTOOdi+TrKr5OpLJ9qCnUdSxS6S80+QRX/mIhfR66u0Ykc4QTkReaejOM2ILh+9Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -13928,12 +13655,6 @@ "picomatch": "^2.0.4" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -14343,11 +14064,6 @@ "tweetnacl": "^0.14.3" } }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -14804,12 +14520,6 @@ "yaml": "^1.7.2" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -14953,12 +14663,6 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, "diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -20406,41 +20110,6 @@ "punycode": "^2.1.0" } }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, "tsconfig-paths": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", @@ -20555,12 +20224,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true } } }, @@ -20633,9 +20296,9 @@ } }, "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, "unbox-primitive": { @@ -20777,12 +20440,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -21121,12 +20778,6 @@ "dev": true } } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true } } } diff --git a/package.json b/package.json index b91a581..d4c7ee6 100644 --- a/package.json +++ b/package.json @@ -27,20 +27,22 @@ ], "name": "vgrib2", "author": "Alessandro Vecchi", + "contributors": [ + "Dmitry Shirokov @runk" + ], "module": "dist/vgrib2.esm.js", "devDependencies": { - "@ericandrewlewis/bitmap": "^1.0.0", - "@types/buffer-from": "^1.1.0", - "ts-node": "^10.9.1", "tsdx": "^0.14.1", "tslib": "^2.3.0", - "typescript": "^4.9.4" + "typescript": "^3.9.10" }, "dependencies": { - "base64-js": "^1.3.1", - "bmp-js": "^0.1.0", "buffer": "^6.0.3", - "ieee754": "^1.2.1", "jpeg2000": "^1.1.0" + }, + "homepage": "https://github.com/veech/vgrib2", + "repository": { + "type": "git", + "url": "https://github.com/veech/vgrib2.git" } } diff --git a/src/foo.ts b/src/foo.ts deleted file mode 100644 index a2ef8a4..0000000 --- a/src/foo.ts +++ /dev/null @@ -1,18 +0,0 @@ -import fs from 'fs' -import { GRIB } from '.' - -const filepath = '/Users/dmitry/projects/glowing-fork/mirror/ftp.bom.gov.au/anon/sample/catalogue/ADFD/Victoria/IDV71000_VIC_T_SFC.grb' - -const gribFile = fs.readFileSync(filepath) - -console.time('vgrib parse') -const grib = GRIB.parse(gribFile) -// let i = 0 -// for (const packet of grib) console.log(i++, packet) - -console.timeEnd('vgrib parse') - -console.log(GRIB.lookupDataPoint(grib[0], -39.75, 146.15), 'should be 285.86') -console.log(GRIB.lookupDataPoint(grib[0], -39.75, 146.12), 'should be null') -console.log(GRIB.lookupDataPoint(grib[0], -39.72, 146.12), 'should be 285.96') -console.log(GRIB.lookupDataPoint(grib[0], -39.42, 145.1065), 'should be 286.06') diff --git a/src/index.ts b/src/index.ts index a267c00..27666ab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,6 @@ const parse = (data: ArrayBuffer): Array => { const buffer = Buffer.from(data) const gribChunks = splitGribChunks(buffer) - gribChunks.length = 3 const packets = gribChunks.map((gribChunk: Buffer) => { const sectionChunks = splitSectionChunks(gribChunk) const sectionValues = parseSections(sectionChunks) @@ -59,8 +58,7 @@ const lookupDataPoint = (packet: GRIBPacket, lat: number, lon: number): number | const y = Math.abs(Math.round((la1 - lat) / dy)) const idx = y * ny + x - const val = packet.data[idx] - return val + return packet.data[idx] } export const GRIB = { parse, parseNoLookup, lookupDataPoint } diff --git a/tsconfig.json b/tsconfig.json index 171bf1a..2c85b2d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,8 +2,7 @@ // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs "include": ["src", "types"], "compilerOptions": { - "target": "ES2020", - "module": "CommonJS", + "module": "esnext", "lib": ["dom", "esnext"], "importHelpers": true, // output .d.ts declaration files for consumers From a3d01e8e636fdaa95fb1110262c529a9158f8264 Mon Sep 17 00:00:00 2001 From: Dmitry Shirokov Date: Fri, 6 Jan 2023 14:38:16 +1100 Subject: [PATCH 3/3] Use any trick - same as in section 4 --- src/sections/section-5.ts | 3 +-- src/templates/template-5.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sections/section-5.ts b/src/sections/section-5.ts index 53a752f..b1fa30f 100644 --- a/src/sections/section-5.ts +++ b/src/sections/section-5.ts @@ -50,8 +50,7 @@ export const lookupSection5 = (drs: DataRepresentationSectionValues) => { /** Data representation template */ dataRepresentationTemplate: lookupTable50(dataRepresentationTemplate), /** Data representation */ - // @ts-ignore - dataRepresentation: lookupTemplate5(dataRepresentationTemplate)(dataRepresentation) + dataRepresentation: lookupTemplate5(dataRepresentationTemplate)(dataRepresentation as any) } } } diff --git a/src/templates/template-5.ts b/src/templates/template-5.ts index 5817fd7..38769ff 100644 --- a/src/templates/template-5.ts +++ b/src/templates/template-5.ts @@ -10,10 +10,10 @@ import { lookupTable51, lookupTable540 } from '../tables/table-5' export const getTemplate5 = (template: number): typeof template50 | typeof template540 => { switch (template) { case 40: - return template540 + return template540 case 0: return template50 - + default: throw new Error(`Template 5.${template} not defined`) }