@pond-ts/react 0.17.1 → 0.18.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 +106 -1
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,10 +7,115 @@ 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.17.1...HEAD
10
+ [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.18.0...HEAD
11
+ [0.18.0]: https://github.com/pjm17971/pond-ts/compare/v0.17.1...v0.18.0
11
12
 
12
13
  ## [Unreleased]
13
14
 
15
+ ## [0.18.0] — 2026-05-30
16
+
17
+ This release graduates the **Phase 4.7 columnar substrate** from
18
+ framework-internal (shipped piecemeal to `main` since v0.17.1) to a
19
+ user-visible **public column API**, plus a column-native live buffer that
20
+ fixes a high-partition-count OOM. Everything is additive except one
21
+ documented breaking change (interval label kinds) and one documented
22
+ behavior change (chunked-backed `pushMany` commit semantics). Pre-1.0: the
23
+ column API is expected to keep moving toward its eventual shape.
24
+
25
+ ### Added
26
+
27
+ - **Public column API (Phase 4.7 step 8).** A column-centric extraction
28
+ surface on `TimeSeries`, for high-throughput and charting consumers that
29
+ want typed-array access instead of per-`Event` iteration. Additive — every
30
+ existing row / `Event` API is unchanged.
31
+ - `series.column(name)` returns a schema-narrowed typed column view, with
32
+ public re-exports of the `Float64Column` / `BooleanColumn` /
33
+ `StringColumn` / `KeyColumn` (time / timeRange / interval) variants
34
+ ([#154](https://github.com/pjm17971/pond-ts/pull/154),
35
+ [#155](https://github.com/pjm17971/pond-ts/pull/155)).
36
+ - `Float64Column`: scalar reductions (`min` / `max` / `sum` / `mean` /
37
+ `count` / …) and `scan`
38
+ ([#155](https://github.com/pjm17971/pond-ts/pull/155)); `bin(...)` for
39
+ histogram / downsample bucketing
40
+ ([#156](https://github.com/pjm17971/pond-ts/pull/156)); and
41
+ `toFloat64Array()` for a storage-agnostic gather into a dense array
42
+ ([#165](https://github.com/pjm17971/pond-ts/pull/165)).
43
+ - `KeyColumn.at(i)` and `.slice(start, end)`
44
+ ([#159](https://github.com/pjm17971/pond-ts/pull/159)).
45
+ - **Columnar substrate (Phase 4.7 step 1, framework layer).** All
46
+ eight sub-steps (1a–1h) shipped to main as PRs #132 / #133 /
47
+ #134 / #135 / #136 / #147 / #148 / #149. See `PLAN.md` and
48
+ [`packages/core/src/columnar/README.md`](packages/core/src/columnar/README.md)
49
+ for the full inventory. Framework-internal — surfaced behind the existing
50
+ `TimeSeries` API at step 2 (below) and the public column API at step 8
51
+ (above).
52
+
53
+ ### Changed
54
+
55
+ - **Chunked columnar live backing for strict time-keyed `LiveSeries`**
56
+ ([#170](https://github.com/pjm17971/pond-ts/pull/170)). A top-level
57
+ `LiveSeries` with `ordering: 'strict'` and a time key now backs its
58
+ retained window with batch-granular columnar chunks instead of an
59
+ `Event[]` window — each `pushMany` validates straight into typed columns,
60
+ retaining **zero `Event` objects** (~4.7× less retained heap in-pond; the
61
+ high-partition-count OOM fix). Two consequences:
62
+ - **`pushMany` commit semantics** on the chunked path: the batch is
63
+ appended atomically _before_ any `'event'` fires, so a listener observes
64
+ the full post-batch `length` (not a row-by-row `1, 2, 3`), and a listener
65
+ that throws mid-batch leaves the whole batch committed. The per-row
66
+ `Event[]` backing (`reorder` / `drop` / interval-keyed /
67
+ internally-created series) keeps per-row commit. Listener _values_ and
68
+ `event → batch → evict` ordering are unchanged.
69
+ - **`LiveReduce` eviction** resolves by event identity (primary) with a
70
+ FIFO-frontier fallback for the chunked backing's materialized evictions —
71
+ correct for both `reorder` and the chunked backing. `min` / `max` /
72
+ `first` / `last` / `samples` over a `reorder` source **with retention**
73
+ remain a documented limitation (see `LiveReduce` JSDoc and PLAN
74
+ "Deferred") — pre-existing, not introduced here.
75
+ - **Internal, behavior-preserving performance work.** Column-native intake
76
+ bypasses per-row `Event` allocation at `TimeSeries` construction
77
+ ([#151](https://github.com/pjm17971/pond-ts/pull/151)); numeric reducers
78
+ (`min` / `max` / `sum` / `avg` / …) compute over typed-array columns where
79
+ available, with NaN parity preserved
80
+ ([#153](https://github.com/pjm17971/pond-ts/pull/153)); the live storage
81
+ strategy was extracted behind an internal interface
82
+ ([#168](https://github.com/pjm17971/pond-ts/pull/168)).
83
+
84
+ ### Changed (BREAKING)
85
+
86
+ - **Interval-keyed series must use one label type throughout**
87
+ ([#150](https://github.com/pjm17971/pond-ts/pull/150)). Pre-2a,
88
+ TimeSeries silently tolerated mixed-kind interval labels —
89
+ rows with `value: 'row-1'` (string) and `value: 2` (number) could
90
+ coexist in a single series because events were stored as a raw
91
+ array with no per-column type alignment. The columnar substrate
92
+ introduced at Phase 4.7 enforces one label kind per column via
93
+ `IntervalKeyColumn`, so mixed-kind labels now throw at series
94
+ construction with a row-pointed error message.
95
+ - **Affected:** Any series built via `new TimeSeries(...)`,
96
+ `TimeSeries.fromJSON(...)`, `TimeSeries.fromEvents(...)`, or
97
+ any transform that produces interval-keyed events, where the
98
+ `value` field of `IntervalInput` rows or `Interval` keys
99
+ mixes `string` and `number` types.
100
+ - **Migration:** Choose one label kind for the whole series.
101
+ Numeric labels can be stringified at intake (`String(label)`)
102
+ if the downstream consumer accepts string equality; string
103
+ labels parseable as integers can be converted to numbers at
104
+ intake. The error message names the first offending row so
105
+ the offending data is easy to find.
106
+ - **Rationale:** Aligns the row-API contract with the columnar
107
+ substrate's per-column kind discipline (matching Polars /
108
+ Arrow / Parquet). The previous behavior produced type-broken
109
+ events that worked only because TimeSeries didn't enforce
110
+ per-column alignment; downstream columnar operators (the
111
+ upcoming reducer adaptation in steps 3+) require it.
112
+ - **Affected types:** `IntervalValue` remains `string | number`
113
+ per the `Interval` class contract. The runtime restriction
114
+ is at the **series** level (all intervals within one series
115
+ must share a kind), not the per-interval level. Type-level
116
+ narrowing of `IntervalKeyedSchema<S>` over label kind is a
117
+ follow-up deferred to a later sub-step.
118
+
14
119
  ## [0.17.1] — 2026-05-11
15
120
 
16
121
  Bug fix: `live.partitionBy()` now default-inherits `ordering`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pond-ts/react",
3
- "version": "0.17.1",
3
+ "version": "0.18.0",
4
4
  "description": "React hooks for pond-ts live time series",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -31,7 +31,7 @@
31
31
  "test:runtime": "vitest run"
32
32
  },
33
33
  "peerDependencies": {
34
- "pond-ts": "^0.17.0",
34
+ "pond-ts": "^0.18.0",
35
35
  "react": "^18.0.0 || ^19.0.0"
36
36
  },
37
37
  "devDependencies": {