@pond-ts/react 0.28.0 → 0.30.0

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.
Files changed (2) hide show
  1. package/CHANGELOG.md +62 -2
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,7 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
7
7
  file covers both packages. Pre-1.0: minor bumps may include new features and
8
8
  type-level changes; patch bumps are strictly additive.
9
9
 
10
- [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.28.0...HEAD
10
+ [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.30.0...HEAD
11
+ [0.30.0]: https://github.com/pjm17971/pond-ts/compare/v0.29.0...v0.30.0
12
+ [0.29.0]: https://github.com/pjm17971/pond-ts/compare/v0.28.0...v0.29.0
11
13
  [0.28.0]: https://github.com/pjm17971/pond-ts/compare/v0.27.0...v0.28.0
12
14
  [0.27.0]: https://github.com/pjm17971/pond-ts/compare/v0.26.0...v0.27.0
13
15
  [0.26.0]: https://github.com/pjm17971/pond-ts/compare/v0.25.0...v0.26.0
@@ -20,7 +22,65 @@ type-level changes; patch bumps are strictly additive.
20
22
  [0.19.0]: https://github.com/pjm17971/pond-ts/compare/v0.18.0...v0.19.0
21
23
  [0.18.0]: https://github.com/pjm17971/pond-ts/compare/v0.17.1...v0.18.0
22
24
 
23
- ## [Unreleased]
25
+ ## [0.30.0] — 2026-06-17
26
+
27
+ ### Added
28
+
29
+ - **`rollingByColumn(col, { radius, at }, mapping)` — evaluate at explicit
30
+ centers.** `at` takes a **non-decreasing** array of center values (e.g. a chart's
31
+ coarse display grid) and returns **one record per center**, instead of the
32
+ default one-per-row. A center with no rows within `±radius` yields each
33
+ reducer's empty value. Same O(n + centers) two-pointer. Closes the
34
+ evaluate-at-grid gap surfaced adopting `rollingByColumn` for a chart variance
35
+ band. (estela F-rolling-by-row.)
36
+ - **`smooth(col, 'movingAverage' | 'loess', { …, missing: 'skip' })` —
37
+ validity-respecting smoothing.** By default (`missing: 'bridge'`) a cell whose
38
+ own value is missing is still assigned a smoothed value from its present
39
+ neighbours — the line is drawn _across_ the hole. `missing: 'skip'` keeps a
40
+ missing cell **missing** in the output, so a sustained dropout (a coast, a
41
+ sensor gap) is preserved as a break rather than fabricated through. Present
42
+ cells smooth over only the present values in their window either way. `ema`
43
+ takes no `missing` option (it is causal and never fabricates across a gap). A
44
+ `maxGap` hard segment boundary is a deferred follow-on. (estela
45
+ F-smooth-interactive.)
46
+
47
+ ### Changed
48
+
49
+ - **`byColumn(…, { inclusive: '(]' })` floor edge is now inclusive.** Under
50
+ `'(]'`, interior bins stay upper-inclusive (`(eᵢ, eᵢ₊₁]`) but the **floor `e₀`
51
+ is inclusive** (bin 0 is `[e₀, e₁]`), so a value at exactly the minimum edge —
52
+ e.g. a `0` W coast/stop sample at a zone floor of 0 — lands in bin 0 instead of
53
+ being dropped (the `include_lowest` convention). Previously the floor was
54
+ exclusive. (estela F-inclusive-floor.)
55
+
56
+ ## [0.29.0] — 2026-06-17
57
+
58
+ ### Added
59
+
60
+ - **`byColumn({ edges, inclusive })`** — `inclusive: '(]'` makes edge bins
61
+ upper-inclusive (`(eᵢ, eᵢ₊₁]`), for Coggan power / HR zones where a sample on a
62
+ zone's top edge belongs to the lower zone (the first edge becomes an exclusive
63
+ floor). Defaults to `'[)'` (unchanged — lower-inclusive `[eᵢ, eᵢ₊₁)`). (estela
64
+ F-geo-2 zone inclusivity.)
65
+ - **`'mean'` reducer alias for `'avg'`** — `'mean'` is now an accepted built-in
66
+ reducer name across `aggregate` / `rolling` / `byColumn` / `rollingByColumn` /
67
+ `reduce` (and the live equivalents), at **both runtime and the type level**: it
68
+ resolves to the `avg` kernel and classifies as numeric output
69
+ (`number | undefined`), exactly like `'avg'`. Matches the column API's
70
+ `Float64Column.mean()`. (estela F-reducer-naming.)
71
+
72
+ ### Fixed
73
+
74
+ - **`RowForSchema` honors `required: false`** — a **value** column declared
75
+ `required: false` now accepts `undefined` in its tuple-row cell at the type
76
+ level (matching the runtime, which records it as missing), so optional cells no
77
+ longer need an `as never` cast. The **key (first) column stays required** even
78
+ if marked `required: false` (the constructor always requires it). `null` is
79
+ still not admitted for tuple rows (only the JSON object-row path takes `null`).
80
+ Correspondingly, **`.rows` / `toRows()` now type an optional cell as
81
+ `… | undefined`** (`NormalizedRowForSchema`), so reading a possibly-missing
82
+ cell is no longer unsoundly typed as present — a type tightening on output for
83
+ schemas that use `required: false`. (estela F-geo-row-optional; Codex-hardened.)
24
84
 
25
85
  ## [0.28.0] — 2026-06-17
26
86
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pond-ts/react",
3
- "version": "0.28.0",
3
+ "version": "0.30.0",
4
4
  "description": "React hooks for pond-ts live time series",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,7 +33,7 @@
33
33
  "test:runtime": "vitest run"
34
34
  },
35
35
  "peerDependencies": {
36
- "pond-ts": "^0.28.0",
36
+ "pond-ts": "^0.30.0",
37
37
  "react": "^18.0.0 || ^19.0.0"
38
38
  },
39
39
  "devDependencies": {