@zerotal/arch 1.15.1 → 1.15.2

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/docs/changelog.md +58 -0
  2. package/package.json +3 -3
package/docs/changelog.md CHANGED
@@ -27,6 +27,64 @@ the section for every version you cross and apply its migration notes, not only
27
27
  majors. [Releases and versioning](/docs/support-policy#releases-and-versioning) explains
28
28
  when that carve-out ends.
29
29
 
30
+ ## 1.15.2 — 2026-10-23
31
+
32
+ A patch, and if you run Bun 1.4.4 or later it is the one to take: that Bun stopped accepting the
33
+ way the ORM hands it SQL, so most of what the ORM sent to the database failed. Three smaller
34
+ faults ride with it, found running a live app on Zerotal, each of which that app had been
35
+ working round in its own code.
36
+
37
+ Nothing here breaks. Safe to take directly.
38
+
39
+ ### Fixed
40
+
41
+ - **The ORM runs on Bun 1.4.4** (`@zerotal/orm`, with `@zerotal/notifications` and
42
+ `@zerotal/testing`). Bun's `sql` function refuses a template object whose `raw` property
43
+ is enumerable — "so it is not a template object" — and the ORM built every statement it
44
+ assembled from a string that way: the string form of `DB.raw()`, the query builder,
45
+ schema and migration DDL, the `SAVEPOINT` a nested transaction issues, the validator's
46
+ `unique` and `exists` rules. 1.4.4 is the first Bun known to refuse it, and on that version
47
+ and later none of those statements ran. They now come from one helper that builds the
48
+ object the way the language does. An app on Bun 1.4.2 or earlier was never affected, and
49
+ nothing about its behaviour changes.
50
+
51
+ - **A production build ships React's production build** (`@zerotal/core`). The browser
52
+ build's defines stated `import.meta.env` but not `process.env.NODE_ENV`, which is the
53
+ switch React and most of npm read — and the bundler left that expression to whatever the
54
+ shell happened to have. An app that ran `inertia:build --production` without `NODE_ENV`
55
+ in its environment shipped React's development build: a 522 KB vendor chunk where 322 KB
56
+ would do, the DevTools notice in every visitor's console, and full hydration diffs. The
57
+ define now states `NODE_ENV` from the same flag, so the build no longer depends on the
58
+ shell it ran in.
59
+
60
+ - **`back()` works behind a proxy that terminates TLS** (`@zerotal/core`). A redirect back
61
+ to the previous page accepted a `Referer` only from the request's own origin. Behind a
62
+ reverse proxy the request reaches the app as `http://…` while every browser sends
63
+ `https://…`, so every `Referer` was refused and "back" was always `/`. That is not only
64
+ `ctx.back()`: `validate()`'s redirect on failure, `FormRequest`, the intended-URL helpers
65
+ and Flow all use the same check, so a form with one mistake in it sent the user to the
66
+ home page with its errors flashed to a page that never shows them. The origin of the
67
+ configured `app.url` now counts as the app's own as well. Every other site is still
68
+ refused, and with no `app.url` set the behaviour is exactly what it was.
69
+
70
+ - **`SmtpDriver` transfer-encodes text and HTML parts** (`@zerotal/notifications`). Both
71
+ went on the wire raw, with no `Content-Transfer-Encoding`. A body line over the 998-octet
72
+ limit of RFC 5322 was cut by a relay wherever the limit fell — a single-line HTML email
73
+ reached a customer reading "sup pliers" — and a non-ASCII body was sent as undeclared
74
+ 8-bit on a connection that never negotiates `8BITMIME`. A part that is plain ASCII with
75
+ lines of 78 characters or fewer is still sent as written, now declared `7bit`; anything
76
+ else is quoted-printable, which keeps ASCII readable where base64 would not. A test that
77
+ asserts on the raw bytes the driver sent will see the new header, and for a long or
78
+ non-ASCII body, encoded text to decode before comparing.
79
+
80
+ ### Changed
81
+
82
+ - **Three runtime dependencies move to newer minimums.** `alpinejs` and its seven plugins
83
+ (`@zerotal/flow`) are now `^3.17.4`, `@simplewebauthn/server` (`@zerotal/auth`) is now
84
+ `^13.3.3`, and `tailwind-merge` (`@zerotal/flow-ui`) is now `^3.7.0`. Each stays within
85
+ the major it was already on, and nothing in Zerotal's own API moves. The rest of the
86
+ weekly dependency update is development tooling and does not reach an installed app.
87
+
30
88
  ## 1.15.1 — 2026-09-13
31
89
 
32
90
  A patch, and its headline is an ORM bug as old as the option it breaks: a model keyed on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerotal/arch",
3
- "version": "1.15.1",
3
+ "version": "1.15.2",
4
4
  "license": "MIT",
5
5
  "maturity": "stable",
6
6
  "private": false,
@@ -35,11 +35,11 @@
35
35
  "typecheck": "tsc --noEmit"
36
36
  },
37
37
  "dependencies": {
38
- "@zerotal/core": "1.15.1"
38
+ "@zerotal/core": "1.15.2"
39
39
  },
40
40
  "devDependencies": {
41
41
  "typescript": "^5.8.0",
42
- "@zerotal/orm": "1.15.1"
42
+ "@zerotal/orm": "1.15.2"
43
43
  },
44
44
  "description": "The Zerotal agent surface — an MCP server that hands coding agents the framework's machine-readable truth: exact API signatures, live routes and schema, version-matched docs, and `zt doctor`.",
45
45
  "keywords": [