@aeroswarm/weather 0.4.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 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.test.d.ts.map
@@ -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.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
- "publishConfig": {
20
- "access": "public",
21
- "registry": "https://registry.npmjs.org/"
22
- },
23
- "scripts": {
24
- "build": "tsup src/index.ts --format esm --clean && tsc --emitDeclarationOnly",
25
- "dev": "tsup src/index.ts --format esm --dts --watch",
26
- "test": "vitest run --passWithNoTests",
27
- "typecheck": "tsc --noEmit",
28
- "clean": "rm -rf dist",
29
- "prepublishOnly": "pnpm run typecheck && pnpm run test && pnpm run build",
30
- "release": "release-it",
31
- "release:dry": "release-it --dry-run",
32
- "release:patch": "release-it patch --no-git.requireCleanWorkingDir",
33
- "release:minor": "release-it minor --no-git.requireCleanWorkingDir",
34
- "release:major": "release-it major --no-git.requireCleanWorkingDir"
35
- },
36
- "devDependencies": {
37
- "release-it": "^18.1.2",
38
- "tsup": "^8.5.1",
39
- "vitest": "^4.1.6"
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
+ }