@voltro/sql-mysql 0.59.0 → 0.61.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.
package/CHANGELOG.md CHANGED
@@ -39,6 +39,89 @@ _Changes staged for the next release accumulate here (rolled up from
39
39
 
40
40
  ---
41
41
 
42
+ ## [0.61.0] — 2026-08-31
43
+
44
+ ### ⚠ BREAKING
45
+
46
+ - **@voltro/client, @voltro/web, @voltro/cli** — `RpcError.kind` now distinguishes transport, handler, client, and unknown failures; manually emitted events must add the field, while `useConnectionStatus` now degrades only for transport failures and clears on the next rpc success.
47
+
48
+ **`voltro update` carries you across this** — codemod `0.61.0/01_rpc_errors_have_kinds`. If you pin versions by hand and never run it, print the notes without changing anything: `voltro update --codemods-only --from <your current version> --dry-run` (this one ships in 0.61.0).
49
+ - **@voltro/plugin-sentry, @voltro/cli** — Browser RPC spans now join the active page/navigation transaction and link to the Effect/server trace instead of creating one root transaction per call; `tracesSampleRate`, `browserTracing`, and the new `rpcSpans` switch control the resulting browser trace volume.
50
+
51
+ **`voltro update` carries you across this** — codemod `0.61.0/02_sentry_rpc_spans_join_page`. If you pin versions by hand and never run it, print the notes without changing anything: `voltro update --codemods-only --from <your current version> --dry-run` (this one ships in 0.61.0).
52
+
53
+ ### Fixed
54
+
55
+ - **@voltro/cli** — **Six SSR failure sites report to Sentry, not three.**
56
+
57
+ 0.60.0 gave the web server its own Sentry and wired the three loud sites: the SSR shell throw, the SPA layout shell throw, and the general render error (which covers a loader throw). The docs said "shell throw, loader throw, PPR/SWR refresh" — and an enumeration in a claim is read as exhaustive.
58
+
59
+ The other three were `warn`-level and reported to nobody: a failed PPR hole pass, a failed background SWR refresh, and a `not-found.tsx` that throws while rendering. They are quieter because the request still serves something — stale HTML, an unfilled hole, a plain 404 — which says something about the REQUEST and nothing about who else could find out. The answer to that is nobody: none of them reaches a browser boundary, so the pod's stdout was the only record.
60
+
61
+ They carry their own `voltro.stage` (`not-found-render`, `ppr-holes`, `swr-refresh`), so a quota-conscious project can drop them by stage without losing the three that fail the request.
62
+
63
+ `webSentry.test.ts` now fails if a render-path `log.error`/`log.warn` gains no reporter beside it — the property, rather than the six call sites.
64
+
65
+ ---
66
+
67
+ ## [0.60.0] — 2026-08-31
68
+
69
+ ### ⚠ BREAKING
70
+
71
+ - **@voltro/plugin-sentry** — **A declared failure no longer reaches Sentry by default, and the source-map upload now injects debug ids.** Two separate defects, both found by the same deployment on its first day of real server-side events.
72
+
73
+ **1. The contract was being reported as an incident.** The rpc interceptor skipped only clean interrupts; everything else went to `captureException`. So a failure declared in a procedure's `error:` union — the thing the client gets typed and branches on — arrived as `level: error`, `handled: yes`. The first server-side issue a deployment ever received was a person clicking a team they are not a member of.
74
+
75
+ Effect separates a failure from a defect, this framework leans on that split deliberately (a store refusal was made typed so an app could branch on it; an unlookupable conflict key was deliberately left a defect, because it is a broken call rather than a condition in the data), and a descriptor carries it in `error:`. Reporting both as an incident discarded that one layer up.
76
+
77
+ `shouldCapture` now skips a cause that is failures-ONLY. A defect is reported as before, including a defect that travelled beside a failure — the rule is failures-only rather than "any failure present" precisely so one cannot hide the other. `captureFailures: true` restores the old behaviour; a predicate keeps the ones that are signal.
78
+
79
+ **The browser half moved with it**, or the option would have been half-wired: a rejected call is an rpc error on the client too, published to the client error bus and captured by the browser bridge. `initSentryBrowser` takes the same option and applies it to `rpc.*` events carrying a `_tag`. Route render failures and `reportClientError` calls are never filtered — nobody declared those.
80
+
81
+ **2. `sentry-cli sourcemaps upload` does NOT write debug ids.** `inject` is a separate subcommand; `upload` only uses ids that are already present, and falls back to matching on the artifact NAME when they are not. That fallback cannot work for a server bundle: the artifact is named from `--url-prefix` (`~/chunk- ABC.js`) while the frame carries the absolute path the node process loaded, and nothing rewrites either side.
82
+
83
+ Measured downstream: 4300 artifacts uploaded, release finalised, every frame still minified. Nothing was red — the exact shape this code's own header warns about, an upload that matched nothing looking like one that worked. The comment above the uploader asserted the injection happened, which made it a description standing where a check belonged.
84
+
85
+ `inject` now runs first, over the same directories, and `sourcemapDebugIds.test.ts` drives the real binary to assert an id lands in both the JS and the map. `--url-prefix` stays as the fallback for the browser bundle, whose frames really are URLs.
86
+
87
+ The boot line names the new setting (`sentry active … captureFailures=false`), because a default the framework picks for you is one nobody finds again.
88
+
89
+ **`voltro update` carries you across this** — codemod `0.60.0/01_declared_failures_are_not_incidents`. If you pin versions by hand and never run it, print the notes without changing anything: `voltro update --codemods-only --from <your current version> --dry-run` (this one ships in 0.60.0).
90
+
91
+ ### Added
92
+
93
+ - **@voltro/cli, @voltro/plugin-sentry** — **The web server process now initialises Sentry and reports its own errors.**
94
+
95
+ A framework app runs two server processes. `voltro serve` is the api, where `sentryPlugin()` initialises the SDK through the plugin lifecycle. `voltro start` is the web server — SSR, loaders, ISR, the revalidation legs — and it has no plugin lifecycle, so it had none.
96
+
97
+ That was not a cosmetic difference in boot output. A web pod legitimately logs less than an api pod, because it has no store, no rpc, no scheduler, no workflows and no plugins. What it also had was **no error reporting**: an SSR shell throw is caught, logged and answered with a 500, so no browser ever renders it and the client-side ErrorBoundary bridge cannot see it either. Both ends of the integration worked and the middle was dark — while the docs' "React render error ✅ auto" row, true of the client path, read as covering all of them.
98
+
99
+ Set `SENTRY_DSN` on the web deployment and the boot says `sentry active` with the same message and the same field names as the api half, from the same function — `initSentryServer` in `@voltro/plugin-sentry/server`, which the api plugin now calls too. One init, because a copy of `skipOpenTelemetrySetup`, the traces default, the overrides-first spread and the degrade-on-missing-SDK path would have drifted the moment either half gained a case.
100
+
101
+ Three deliberate asymmetries, each because the two processes are not the same thing:
102
+
103
+ - **`traces: false` on the web side.** The api contributes a span processor to the framework's tracer; the web server has no tracer at all, so tracing on would put `traces: true` in a boot line while nothing produces a span. - **No DSN is SILENT here.** On the api side `sentryPlugin()` is a declaration and an inert one contradicts it. There is no declaration here. - **`@voltro/plugin-sentry` must be installed in the WEB app.** With a DSN set and the package missing, the boot names the command rather than failing — monitoring must never be what stops a deploy.
104
+
105
+ Measured against a real production `voltro start`, both branches. Note that production `voltro start` loads the app's precompiled start bundle, so a web deployment picks this up when that bundle is rebuilt — the framework version alone is not enough.
106
+
107
+ ### Fixed
108
+
109
+ - **@voltro/workflow, @voltro/runtime, @voltro/database, @voltro/cli, @voltro/plugin-sentry** — **Six raw writes removed from production log streams — and the guard that was supposed to catch them rewritten, because it was green for two independent reasons.**
110
+
111
+ A pod tail showed `[voltro:workflow] shard-lock coordination: row-based (dialect=mariadb, mode=row)` sitting between JSON records. `@voltro/logger` is what makes a line JSON in a pod and pretty on a TTY; a `process.stderr.write` bypasses that decision at exactly the place nobody looks, because a dev terminal renders both the same.
112
+
113
+ Fixed at the source: the workflow cluster layer (2), `rpcServer`'s computed-cache warning, the subscription outbox's and the RYW store's `warn`/`onError` defaults — those two are not fallbacks, the callers pass nothing, so the default IS the production path — and the migration file discovery's skip notice, which lands in the migrate job's stream.
114
+
115
+ **The guard is the part worth reading.** `prodLogDiscipline.test.ts` existed for this exact class and reported clean, for two reasons that had to be fixed separately:
116
+
117
+ - Its file set was a hand-written list of five. A guard that opts files IN says nothing about any file added after it was written. - Its matcher was LINE-LOCAL, so `process.stderr.write(` on one line and the `` `[tag] `` on the next never matched — 4 of the 9 call sites in the repo are written that way, including one in a file that WAS on the list. The guard had been pointed straight at an offender and called it clean.
118
+
119
+ It is opt-OUT now: every server-side package's source is scanned, exceptions carry a reason, and a second test fails if an exception's call site disappears — an allowlist entry for code that is gone reads as a rule with a hole in it.
120
+
121
+ Verified against a real `voltro serve` under `NODE_ENV=production`: 35 records, zero framework lines that are not JSON.
122
+
123
+ ---
124
+
42
125
  ## [0.59.0] — 2026-08-30
43
126
 
44
127
  ### ⚠ BREAKING
@@ -5,7 +5,7 @@ property of its respective copyright holders and is used under the terms of
5
5
  its license. This file is provided for attribution; it grants no rights in
6
6
  @voltro/sql-mysql itself, which is proprietary (see LICENSE).
7
7
 
8
- Generated from the resolved runtime dependency closure (18 packages).
8
+ Generated from the resolved runtime dependency closure (17 packages).
9
9
 
10
10
  ---
11
11
 
@@ -143,214 +143,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
143
143
  THE SOFTWARE.
144
144
  ```
145
145
 
146
- ## denque@2.1.0
147
-
148
- License: Apache-2.0
149
-
150
- ```
151
- Apache License
152
- Version 2.0, January 2004
153
- http://www.apache.org/licenses/
154
-
155
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
156
-
157
- 1. Definitions.
158
-
159
- "License" shall mean the terms and conditions for use, reproduction,
160
- and distribution as defined by Sections 1 through 9 of this document.
161
-
162
- "Licensor" shall mean the copyright owner or entity authorized by
163
- the copyright owner that is granting the License.
164
-
165
- "Legal Entity" shall mean the union of the acting entity and all
166
- other entities that control, are controlled by, or are under common
167
- control with that entity. For the purposes of this definition,
168
- "control" means (i) the power, direct or indirect, to cause the
169
- direction or management of such entity, whether by contract or
170
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
171
- outstanding shares, or (iii) beneficial ownership of such entity.
172
-
173
- "You" (or "Your") shall mean an individual or Legal Entity
174
- exercising permissions granted by this License.
175
-
176
- "Source" form shall mean the preferred form for making modifications,
177
- including but not limited to software source code, documentation
178
- source, and configuration files.
179
-
180
- "Object" form shall mean any form resulting from mechanical
181
- transformation or translation of a Source form, including but
182
- not limited to compiled object code, generated documentation,
183
- and conversions to other media types.
184
-
185
- "Work" shall mean the work of authorship, whether in Source or
186
- Object form, made available under the License, as indicated by a
187
- copyright notice that is included in or attached to the work
188
- (an example is provided in the Appendix below).
189
-
190
- "Derivative Works" shall mean any work, whether in Source or Object
191
- form, that is based on (or derived from) the Work and for which the
192
- editorial revisions, annotations, elaborations, or other modifications
193
- represent, as a whole, an original work of authorship. For the purposes
194
- of this License, Derivative Works shall not include works that remain
195
- separable from, or merely link (or bind by name) to the interfaces of,
196
- the Work and Derivative Works thereof.
197
-
198
- "Contribution" shall mean any work of authorship, including
199
- the original version of the Work and any modifications or additions
200
- to that Work or Derivative Works thereof, that is intentionally
201
- submitted to Licensor for inclusion in the Work by the copyright owner
202
- or by an individual or Legal Entity authorized to submit on behalf of
203
- the copyright owner. For the purposes of this definition, "submitted"
204
- means any form of electronic, verbal, or written communication sent
205
- to the Licensor or its representatives, including but not limited to
206
- communication on electronic mailing lists, source code control systems,
207
- and issue tracking systems that are managed by, or on behalf of, the
208
- Licensor for the purpose of discussing and improving the Work, but
209
- excluding communication that is conspicuously marked or otherwise
210
- designated in writing by the copyright owner as "Not a Contribution."
211
-
212
- "Contributor" shall mean Licensor and any individual or Legal Entity
213
- on behalf of whom a Contribution has been received by Licensor and
214
- subsequently incorporated within the Work.
215
-
216
- 2. Grant of Copyright License. Subject to the terms and conditions of
217
- this License, each Contributor hereby grants to You a perpetual,
218
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
219
- copyright license to reproduce, prepare Derivative Works of,
220
- publicly display, publicly perform, sublicense, and distribute the
221
- Work and such Derivative Works in Source or Object form.
222
-
223
- 3. Grant of Patent License. Subject to the terms and conditions of
224
- this License, each Contributor hereby grants to You a perpetual,
225
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
226
- (except as stated in this section) patent license to make, have made,
227
- use, offer to sell, sell, import, and otherwise transfer the Work,
228
- where such license applies only to those patent claims licensable
229
- by such Contributor that are necessarily infringed by their
230
- Contribution(s) alone or by combination of their Contribution(s)
231
- with the Work to which such Contribution(s) was submitted. If You
232
- institute patent litigation against any entity (including a
233
- cross-claim or counterclaim in a lawsuit) alleging that the Work
234
- or a Contribution incorporated within the Work constitutes direct
235
- or contributory patent infringement, then any patent licenses
236
- granted to You under this License for that Work shall terminate
237
- as of the date such litigation is filed.
238
-
239
- 4. Redistribution. You may reproduce and distribute copies of the
240
- Work or Derivative Works thereof in any medium, with or without
241
- modifications, and in Source or Object form, provided that You
242
- meet the following conditions:
243
-
244
- (a) You must give any other recipients of the Work or
245
- Derivative Works a copy of this License; and
246
-
247
- (b) You must cause any modified files to carry prominent notices
248
- stating that You changed the files; and
249
-
250
- (c) You must retain, in the Source form of any Derivative Works
251
- that You distribute, all copyright, patent, trademark, and
252
- attribution notices from the Source form of the Work,
253
- excluding those notices that do not pertain to any part of
254
- the Derivative Works; and
255
-
256
- (d) If the Work includes a "NOTICE" text file as part of its
257
- distribution, then any Derivative Works that You distribute must
258
- include a readable copy of the attribution notices contained
259
- within such NOTICE file, excluding those notices that do not
260
- pertain to any part of the Derivative Works, in at least one
261
- of the following places: within a NOTICE text file distributed
262
- as part of the Derivative Works; within the Source form or
263
- documentation, if provided along with the Derivative Works; or,
264
- within a display generated by the Derivative Works, if and
265
- wherever such third-party notices normally appear. The contents
266
- of the NOTICE file are for informational purposes only and
267
- do not modify the License. You may add Your own attribution
268
- notices within Derivative Works that You distribute, alongside
269
- or as an addendum to the NOTICE text from the Work, provided
270
- that such additional attribution notices cannot be construed
271
- as modifying the License.
272
-
273
- You may add Your own copyright statement to Your modifications and
274
- may provide additional or different license terms and conditions
275
- for use, reproduction, or distribution of Your modifications, or
276
- for any such Derivative Works as a whole, provided Your use,
277
- reproduction, and distribution of the Work otherwise complies with
278
- the conditions stated in this License.
279
-
280
- 5. Submission of Contributions. Unless You explicitly state otherwise,
281
- any Contribution intentionally submitted for inclusion in the Work
282
- by You to the Licensor shall be under the terms and conditions of
283
- this License, without any additional terms or conditions.
284
- Notwithstanding the above, nothing herein shall supersede or modify
285
- the terms of any separate license agreement you may have executed
286
- with Licensor regarding such Contributions.
287
-
288
- 6. Trademarks. This License does not grant permission to use the trade
289
- names, trademarks, service marks, or product names of the Licensor,
290
- except as required for reasonable and customary use in describing the
291
- origin of the Work and reproducing the content of the NOTICE file.
292
-
293
- 7. Disclaimer of Warranty. Unless required by applicable law or
294
- agreed to in writing, Licensor provides the Work (and each
295
- Contributor provides its Contributions) on an "AS IS" BASIS,
296
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
297
- implied, including, without limitation, any warranties or conditions
298
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
299
- PARTICULAR PURPOSE. You are solely responsible for determining the
300
- appropriateness of using or redistributing the Work and assume any
301
- risks associated with Your exercise of permissions under this License.
302
-
303
- 8. Limitation of Liability. In no event and under no legal theory,
304
- whether in tort (including negligence), contract, or otherwise,
305
- unless required by applicable law (such as deliberate and grossly
306
- negligent acts) or agreed to in writing, shall any Contributor be
307
- liable to You for damages, including any direct, indirect, special,
308
- incidental, or consequential damages of any character arising as a
309
- result of this License or out of the use or inability to use the
310
- Work (including but not limited to damages for loss of goodwill,
311
- work stoppage, computer failure or malfunction, or any and all
312
- other commercial damages or losses), even if such Contributor
313
- has been advised of the possibility of such damages.
314
-
315
- 9. Accepting Warranty or Additional Liability. While redistributing
316
- the Work or Derivative Works thereof, You may choose to offer,
317
- and charge a fee for, acceptance of support, warranty, indemnity,
318
- or other liability obligations and/or rights consistent with this
319
- License. However, in accepting such obligations, You may act only
320
- on Your own behalf and on Your sole responsibility, not on behalf
321
- of any other Contributor, and only if You agree to indemnify,
322
- defend, and hold each Contributor harmless for any liability
323
- incurred by, or claims asserted against, such Contributor by reason
324
- of your accepting any such warranty or additional liability.
325
-
326
- END OF TERMS AND CONDITIONS
327
-
328
- APPENDIX: How to apply the Apache License to your work.
329
-
330
- To apply the Apache License to your work, attach the following
331
- boilerplate notice, with the fields enclosed by brackets "[]"
332
- replaced with your own identifying information. (Don't include
333
- the brackets!) The text should be enclosed in the appropriate
334
- comment syntax for the file format. We also recommend that a
335
- file or class name and description of purpose be included on the
336
- same "printed page" as the copyright notice for easier
337
- identification within third-party archives.
338
-
339
- Copyright 2018-present Invertase Limited
340
-
341
- Licensed under the Apache License, Version 2.0 (the "License");
342
- you may not use this file except in compliance with the License.
343
- You may obtain a copy of the License at
344
-
345
- http://www.apache.org/licenses/LICENSE-2.0
346
-
347
- Unless required by applicable law or agreed to in writing, software
348
- distributed under the License is distributed on an "AS IS" BASIS,
349
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
350
- See the License for the specific language governing permissions and
351
- limitations under the License.
352
- ```
353
-
354
146
  ## generate-function@2.3.1
355
147
 
356
148
  License: MIT
@@ -379,7 +171,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
379
171
  THE SOFTWARE.
380
172
  ```
381
173
 
382
- ## iconv-lite@0.7.2
174
+ ## iconv-lite@0.7.3
383
175
 
384
176
  License: MIT
385
177
 
@@ -698,7 +490,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
698
490
  SOFTWARE.
699
491
  ```
700
492
 
701
- ## mysql2@3.22.6
493
+ ## mysql2@3.23.3
702
494
 
703
495
  License: MIT
704
496
 
@@ -780,7 +572,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
780
572
  SOFTWARE.
781
573
  ```
782
574
 
783
- ## sql-escaper@1.4.0
575
+ ## sql-escaper@1.5.1
784
576
 
785
577
  License: MIT
786
578
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/sql-mysql",
3
- "version": "0.59.0",
3
+ "version": "0.61.0",
4
4
  "description": "MySQL/MariaDB dialect adapter for Voltro's cross-dialect DataStore (mariadb binlog CDC; mysql inline reactivity).",
5
5
  "keywords": [
6
6
  "voltro",
@@ -35,8 +35,8 @@
35
35
  "dependencies": {
36
36
  "@effect/sql": "^0.52.0",
37
37
  "@effect/sql-mysql2": "^0.53.0",
38
- "@voltro/database": "0.59.0",
39
- "@voltro/logger": "0.59.0"
38
+ "@voltro/database": "0.61.0",
39
+ "@voltro/logger": "0.61.0"
40
40
  },
41
41
  "optionalDependencies": {
42
42
  "@vlasky/zongji": "^0.9.0"