@aeroswarm/weather 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/LIMITS.md +51 -0
- package/README.md +7 -0
- package/STABILITY.md +62 -0
- package/dist/api.test.d.ts +2 -0
- package/dist/api.test.d.ts.map +1 -0
- package/package.json +44 -41
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Changelog: @aeroswarm/weather
|
|
2
|
+
|
|
3
|
+
Format: [Keep a Changelog](https://keepachangelog.com/). Versioning: see [STABILITY.md](./STABILITY.md). Entries for
|
|
4
|
+
0.1.1 to 0.4.0 were written afterwards from the git history; every one of them was released on 2026-11-02.
|
|
5
|
+
|
|
6
|
+
## 0.4.0 (2026-11-02)
|
|
7
|
+
|
|
8
|
+
- Release only: no source change since 0.3.0.
|
|
9
|
+
|
|
10
|
+
## 0.3.0 (2026-11-02)
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Operational functions: `flightCategory` (FAA thresholds), `windComponents`, `runwayAdvice`, `evaluateMinima`,
|
|
14
|
+
`upcomingChanges`, `qnhTrend`, `stationOperations`, and runway helpers (`runwayFromHeading`, `runwayFromPolygon`).
|
|
15
|
+
- Parsers for SIGMET, AIRMET, volcanic ash advisories (VAA), SNOWTAM and NIL reports.
|
|
16
|
+
- Real-data test corpus (METAR/SPECI, 200+ TAF, SIGMET, VAA) and the fixtures README.
|
|
17
|
+
|
|
18
|
+
### Behaviour
|
|
19
|
+
- A TAF change group with a malformed period (for example `TEMPO 0214/02014`) is no longer merged silently into
|
|
20
|
+
the base conditions: it is dropped and reported in `Taf.unparsed`.
|
|
21
|
+
- Several tokens that were silently ignored are now decoded or reported in `unparsed` (found by the real-data corpus).
|
|
22
|
+
|
|
23
|
+
## 0.2.0 (2026-11-02)
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- Real-data corpus and the first versions of the NIL, SIGMET, AIRMET, VAA and SNOWTAM parsers.
|
|
27
|
+
|
|
28
|
+
## 0.1.5 (2026-11-02)
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
- Blend a model series with station reports (`WeatherStore.blendInto`).
|
|
32
|
+
|
|
33
|
+
## 0.1.4 (2026-11-02)
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- The `aeroswarm.weather-grid` v1 standard (`parseWeatherGridSeries`, `seriesFieldsAt`, `GRID_STANDARD.md`) and the
|
|
37
|
+
Open-Meteo adapter (`weatherGridFromOpenMeteo`, `latticePoints`).
|
|
38
|
+
|
|
39
|
+
## 0.1.3 (2026-11-02)
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
- `WeatherStore`: ingest raw messages (including AFTN), manual override, `snapshotAt`, `timeline`.
|
|
43
|
+
|
|
44
|
+
## 0.1.2 (2026-11-02)
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
- Gridded wind and scalar fields (`WindGrid`, `ScalarGrid`, sampling and interpolation).
|
|
48
|
+
|
|
49
|
+
## 0.1.1 (2026-11-02)
|
|
50
|
+
|
|
51
|
+
- First release: METAR/SPECI/TAF parsers, AFTN message extraction, animation parameters.
|
package/LIMITS.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Limits of use
|
|
2
|
+
|
|
3
|
+
Read this before putting weather data in front of operators.
|
|
4
|
+
|
|
5
|
+
## Not an official source
|
|
6
|
+
|
|
7
|
+
The packages decode and display weather messages. They are not a meteorological authority. METAR, SPECI, TAF and
|
|
8
|
+
other messages issued by the responsible meteorological service are the official information, and a displayed
|
|
9
|
+
value is only as good as the message it came from and the parser that read it.
|
|
10
|
+
|
|
11
|
+
**Do not use output of these packages as the only basis for a safety decision** (take-off, landing, runway choice,
|
|
12
|
+
diversion, closing an aerodrome). Verify against the official message. Operational helpers (flight category, runway
|
|
13
|
+
advice, minima checks, alerts) are decision aids, and they assume the thresholds you configured are correct.
|
|
14
|
+
|
|
15
|
+
## What the display shows
|
|
16
|
+
|
|
17
|
+
- METAR and TAF describe one point (the aerodrome). Wind, cloud and rain drawn around an airport are a
|
|
18
|
+
representation of those reports, not the real position of clouds or rain.
|
|
19
|
+
- A grid built from several stations is an interpolation between points; between stations it is an estimate.
|
|
20
|
+
- A model forecast (Open-Meteo and others) is a model, with its own resolution and errors. Blending with reports
|
|
21
|
+
adjusts it near airports only.
|
|
22
|
+
- With a tilted or 3D map the direction of wind on screen is an approximation.
|
|
23
|
+
- There is no terrain or land mask: wind over mountains is not corrected.
|
|
24
|
+
|
|
25
|
+
## What is read, and what is not verified
|
|
26
|
+
|
|
27
|
+
Decoding is tested on real messages for METAR, SPECI, TAF (200+), international SIGMET and Tokyo VAAC
|
|
28
|
+
advisories. These are supported but have **not** been checked against real messages, only against the ICAO
|
|
29
|
+
description: AIRMET, NIL reports and SNOWTAM. Not covered by any test: Darwin VAAC, raw AFTN envelopes from a
|
|
30
|
+
live circuit, raw BMKG messages. Tokens a parser does not understand are kept in the `unparsed` field of the
|
|
31
|
+
result instead of being dropped; check it.
|
|
32
|
+
|
|
33
|
+
Known simplifications:
|
|
34
|
+
|
|
35
|
+
- METAR wind is in degrees true; runway headings are usually magnetic. Pass the magnetic variation, or the
|
|
36
|
+
crosswind is off by that angle.
|
|
37
|
+
- Flight category follows the FAA definition (ICAO does not define one).
|
|
38
|
+
- Runway headings taken from a polygon are the long axis of the shape, so they are only as accurate as the polygon.
|
|
39
|
+
- Report time has no month or year; they are taken from the time you give as "received".
|
|
40
|
+
|
|
41
|
+
## Data sources
|
|
42
|
+
|
|
43
|
+
Each source has its own licence and limits; see `SOURCES.md` in `@aeroswarm/weather-sources`. In short: the free
|
|
44
|
+
Open-Meteo endpoint is for non-commercial use only; BMKG access follows your agreement and the token is personal;
|
|
45
|
+
aviationweather.gov data is public but limited to 100 requests a minute. Respect the limits, credit the source,
|
|
46
|
+
and do not redistribute data you are not allowed to.
|
|
47
|
+
|
|
48
|
+
## No warranty
|
|
49
|
+
|
|
50
|
+
The software is provided as is, without warranty of any kind. (No licence file is included in the packages yet; the
|
|
51
|
+
licence terms are set by the package owner.)
|
package/README.md
CHANGED
|
@@ -26,6 +26,13 @@ const snapshot = animationSnapshot({ observation: metar, forecast: taf, at: new
|
|
|
26
26
|
METAR/TAF describe one point (the aerodrome), not a weather field, so the animation is a
|
|
27
27
|
representation around the airport, not the real position of clouds or rain.
|
|
28
28
|
|
|
29
|
+
## Documentation
|
|
30
|
+
|
|
31
|
+
- [STABILITY.md](./STABILITY.md): what is public, semver policy, deprecation, the weather-grid standard.
|
|
32
|
+
- [LIMITS.md](./LIMITS.md): **read before operational use**: not an official source, not for safety decisions
|
|
33
|
+
without verification, what is and is not verified.
|
|
34
|
+
- [CHANGELOG.md](./CHANGELOG.md), [GRID_STANDARD.md](./GRID_STANDARD.md).
|
|
35
|
+
|
|
29
36
|
## Gridded fields
|
|
30
37
|
|
|
31
38
|
`grid.ts` turns wind and scalar data into grids, whatever the source:
|
package/STABILITY.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Stability and versioning
|
|
2
|
+
|
|
3
|
+
Applies to `@aeroswarm/weather`, `@aeroswarm/weather-layer` and `@aeroswarm/weather-sources`.
|
|
4
|
+
|
|
5
|
+
## What is public
|
|
6
|
+
|
|
7
|
+
Public means exported from a documented entry point:
|
|
8
|
+
|
|
9
|
+
| Package | Entry points |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `@aeroswarm/weather` | `@aeroswarm/weather` |
|
|
12
|
+
| `@aeroswarm/weather-layer` | `@aeroswarm/weather-layer`, `/react`, `/react-ui`, `/maplibre`, `/leaflet`, `/cesium`, `/ria`, and the stylesheet `/react-ui/weather-ui.css` (class names `aw-*` and variables `--aw-*`) |
|
|
13
|
+
| `@aeroswarm/weather-sources` | `@aeroswarm/weather-sources` |
|
|
14
|
+
|
|
15
|
+
Not public, may change in any release: anything you reach by importing a file inside `dist/`, anything not exported
|
|
16
|
+
from an entry point, internal CSS selectors other than the documented `aw-*` classes, the exact wording of default
|
|
17
|
+
UI texts, and the text of error messages.
|
|
18
|
+
|
|
19
|
+
The runtime export names of every entry point are pinned by a test in each package (`src/api.test.ts` with a
|
|
20
|
+
snapshot in `src/__snapshots__/`). Adding, removing or renaming an export fails the test until the snapshot is
|
|
21
|
+
updated on purpose, so an API change cannot slip in unnoticed. The test covers exported names, not type shapes.
|
|
22
|
+
|
|
23
|
+
## Versioning (semver)
|
|
24
|
+
|
|
25
|
+
We follow [semver](https://semver.org/). All three packages are currently `0.x`, which semver treats as unstable;
|
|
26
|
+
we hold ourselves to this stricter rule anyway:
|
|
27
|
+
|
|
28
|
+
| Change | Release while `0.x` | Release from `1.0` |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Bug fix, no API change | patch | patch |
|
|
31
|
+
| New export, new option, new report type understood | minor | minor |
|
|
32
|
+
| Removed or renamed export, changed signature, changed default | minor, listed under **Breaking** in the changelog | major |
|
|
33
|
+
| Decoded values change because a parser bug was fixed | minor, listed under **Behaviour** in the changelog | minor |
|
|
34
|
+
| Dependency range change, new peer dependency | minor, listed in the changelog | major if it forces consumers to upgrade |
|
|
35
|
+
|
|
36
|
+
Every release has an entry in the package's `CHANGELOG.md`. A change that can break a consumer must say so there.
|
|
37
|
+
Parser fixes can change what a message decodes to; that is intended, and is why it is called out separately.
|
|
38
|
+
|
|
39
|
+
## Deprecation
|
|
40
|
+
|
|
41
|
+
- A public export is deprecated before it is removed: it keeps working, is marked `@deprecated` in its type
|
|
42
|
+
declaration with the replacement, and is listed in the changelog.
|
|
43
|
+
- While `0.x`: removed no earlier than the next minor release.
|
|
44
|
+
- From `1.0`: removed no earlier than the next major release, and not within 90 days of the deprecation.
|
|
45
|
+
|
|
46
|
+
## Peer dependencies
|
|
47
|
+
|
|
48
|
+
`@aeroswarm/weather-layer` and `@aeroswarm/weather-sources` declare `@aeroswarm/weather` as a peer dependency
|
|
49
|
+
(`>=0.4.0 <1.0.0`), so your app has one copy of it. Install it yourself next to them. React (18 or newer) is an
|
|
50
|
+
optional peer of `@aeroswarm/weather-layer`, needed only for `/react` and `/react-ui`.
|
|
51
|
+
|
|
52
|
+
## The weather-grid standard
|
|
53
|
+
|
|
54
|
+
`aeroswarm.weather-grid` version 1 (see `GRID_STANDARD.md`) is frozen: the meaning of existing fields does not
|
|
55
|
+
change, and a document valid today stays valid. Optional fields may be added in version 1. Anything that would
|
|
56
|
+
invalidate an existing document is a new standard version (2), supported alongside 1 for at least one minor
|
|
57
|
+
release of the packages. The parser rejects documents with an unknown version instead of guessing.
|
|
58
|
+
|
|
59
|
+
## Migration
|
|
60
|
+
|
|
61
|
+
Breaking changes are described in the changelog entry of the release that introduces them, with what to change.
|
|
62
|
+
When a release needs more than a few lines, a `MIGRATION.md` section is added to the same package.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../src/api.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,41 +1,44 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@aeroswarm/weather",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Decode raw AFTN/METAR/SPECI/TAF messages and turn them into animation parameters.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"import": "./dist/index.js",
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"main": "./dist/index.js"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist",
|
|
17
|
-
"GRID_STANDARD.md"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"release
|
|
34
|
-
"release:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"release
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@aeroswarm/weather",
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "Decode raw AFTN/METAR/SPECI/TAF messages and turn them into animation parameters.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"main": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"GRID_STANDARD.md",
|
|
18
|
+
"CHANGELOG.md",
|
|
19
|
+
"STABILITY.md",
|
|
20
|
+
"LIMITS.md"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public",
|
|
24
|
+
"registry": "https://registry.npmjs.org/"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup src/index.ts --format esm --clean && tsc --emitDeclarationOnly",
|
|
28
|
+
"dev": "tsup src/index.ts --format esm --dts --watch",
|
|
29
|
+
"test": "vitest run --passWithNoTests",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"clean": "rm -rf dist",
|
|
32
|
+
"prepublishOnly": "pnpm run typecheck && pnpm run test && pnpm run build",
|
|
33
|
+
"release": "release-it",
|
|
34
|
+
"release:dry": "release-it --dry-run",
|
|
35
|
+
"release:patch": "release-it patch --no-git.requireCleanWorkingDir",
|
|
36
|
+
"release:minor": "release-it minor --no-git.requireCleanWorkingDir",
|
|
37
|
+
"release:major": "release-it major --no-git.requireCleanWorkingDir"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"release-it": "^18.1.2",
|
|
41
|
+
"tsup": "^8.5.1",
|
|
42
|
+
"vitest": "^4.1.6"
|
|
43
|
+
}
|
|
44
|
+
}
|