sproutboat 0.23.0 → 0.25.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 +91 -1
- package/SURFACE.md +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,95 @@ maintained going forward by the `release` skill.
|
|
|
10
10
|
|
|
11
11
|
## Unreleased
|
|
12
12
|
|
|
13
|
+
## [0.25.0] - 2026-10-22
|
|
14
|
+
|
|
15
|
+
Built on `@sproutboat/runtime` 0.26.0 and `@sproutboat/wire` 0.15.0.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- KV behaves as in Workers from compatibility date `2026-10-25`:
|
|
20
|
+
- `get`, `getWithMetadata`, `put`, `delete` and `list` return Promises, and
|
|
21
|
+
errors reject them.
|
|
22
|
+
- `get(key, type)` takes `"text"`, `"json"`, `"arrayBuffer"` and `"stream"`;
|
|
23
|
+
`get([keys])` returns a `Map`.
|
|
24
|
+
- `put()` takes strings, bytes and `ReadableStream`s, with `expiration`,
|
|
25
|
+
`expirationTtl` and `metadata`; `getWithMetadata()` returns the metadata.
|
|
26
|
+
- `list({ prefix, limit, cursor })` returns each key's `expiration` and
|
|
27
|
+
`metadata`, `list_complete` and `cursor`, and pages at up to 1,000 keys.
|
|
28
|
+
- Bad keys, values, expirations, metadata and limits fail with KV's own errors.
|
|
29
|
+
|
|
30
|
+
Apps with an earlier date keep the synchronous KV. Move `compatibility_date`
|
|
31
|
+
to `2026-10-25` to opt in.
|
|
32
|
+
- D1 behaves as in workerd from compatibility date `2026-10-24`:
|
|
33
|
+
- every call except `bind()` returns a Promise, and errors reject it;
|
|
34
|
+
- `meta` has D1's keys, `raw({ columnNames: true })` and `first("name")` work
|
|
35
|
+
as in D1, and `withSession()` returns a session;
|
|
36
|
+
- parameters, parameter counts and foreign keys are checked as in D1, and
|
|
37
|
+
errors read `D1_ERROR: <message>: SQLITE_<CODE>`;
|
|
38
|
+
- `BEGIN`, `COMMIT`, `ROLLBACK`, `SAVEPOINT` and `RELEASE` are refused, and
|
|
39
|
+
`exec()` runs line by line, all or nothing.
|
|
40
|
+
|
|
41
|
+
Apps with an earlier date keep the synchronous D1.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- A storage quota for an app's data directory (KV, D1, R2, Durable Object
|
|
46
|
+
storage, queues): `SB_STORAGE_MAX_BYTES`, 10 GiB by default. Past it, writes
|
|
47
|
+
fail with an error that says so, and reads and deletes keep working. The size
|
|
48
|
+
is measured at most once a second, so the write that crosses the limit is
|
|
49
|
+
accepted. With LTX capture on, an over-quota D1 database refuses every write
|
|
50
|
+
until the app is under its quota again.
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- These apply at every date:
|
|
55
|
+
- D1 bytes are no longer lost: a `Uint8Array`, `DataView` or `ArrayBuffer`
|
|
56
|
+
parameter stored NULL in a standalone sprout, with every parameter after it.
|
|
57
|
+
- A standalone sprout's D1 `batch()` is one transaction, as in D1.
|
|
58
|
+
- `meta.changes` is 0 for a statement that only reads.
|
|
59
|
+
- A KV `list()` prefix matches exactly. It used SQL `LIKE`, so `a_` also
|
|
60
|
+
listed `ab`, and `a` also listed `AB`.
|
|
61
|
+
- The quota counts a D1 database's WAL file. While the app is over its quota,
|
|
62
|
+
the runtime now checkpoints and truncates the WAL before measuring again, so
|
|
63
|
+
`DELETE` then `VACUUM` is enough to get back under it.
|
|
64
|
+
- LTX capture starts when a worker's filesystem sandbox allows writes only
|
|
65
|
+
under its own state directory: its scratch index file now lives in the
|
|
66
|
+
database's replication spool, not the global temporary directory.
|
|
67
|
+
|
|
68
|
+
## [0.24.0] - 2026-10-22
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
|
|
72
|
+
- `fetch(Request)`, `fetch(Request, init)` and `new Request(request, init)` behave
|
|
73
|
+
as in workerd from compatibility date `2026-10-23` (`@sproutboat/runtime` 0.23.0,
|
|
74
|
+
`@sproutboat/toolchain` 0.13.0). This covers outgoing `fetch()`, service
|
|
75
|
+
bindings and Durable Object stubs.
|
|
76
|
+
- The Request's method, headers, body, redirect mode and signal apply unless
|
|
77
|
+
`init` replaces them.
|
|
78
|
+
- A body can be used only once: sending or copying a used Request throws.
|
|
79
|
+
- GET and HEAD refuse a body, and an incoming GET has `request.body === null`.
|
|
80
|
+
- Unknown methods, `CONNECT` and `redirect: "error"` throw, as in workerd.
|
|
81
|
+
- The headers of incoming requests, fetched responses and
|
|
82
|
+
`Response.redirect()` are immutable. Copy them to change them.
|
|
83
|
+
|
|
84
|
+
Apps with an earlier date keep the old behaviour. Move `compatibility_date` to
|
|
85
|
+
`2026-10-23` to opt in.
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
|
|
89
|
+
- These apply at every date:
|
|
90
|
+
- `Request.signal` exists, and `fetch()` aborts with a Request's signal.
|
|
91
|
+
- A `ReadableStream` body in an outgoing `fetch()` is sent as its bytes. It
|
|
92
|
+
used to go out as the text `[object ReadableStream]`.
|
|
93
|
+
- `clone()` of a Request or Response with a stream body gives both copies
|
|
94
|
+
the whole body.
|
|
95
|
+
- A copy of an incoming request keeps its raw bytes.
|
|
96
|
+
|
|
97
|
+
### Added
|
|
98
|
+
|
|
99
|
+
- `examples/request`, built at `2026-10-23` and checked by `bun run examples`:
|
|
100
|
+
forwarding an incoming request and the Request rules above.
|
|
101
|
+
|
|
13
102
|
## [0.23.0] - 2026-10-22
|
|
14
103
|
|
|
15
104
|
### Added
|
|
@@ -1023,7 +1112,8 @@ its own package.
|
|
|
1023
1112
|
- Renamed the package to `sproutboat` (was `@sproutboat/cli`); dropped the
|
|
1024
1113
|
`sprout` bin alias in favour of a user-defined shell alias.
|
|
1025
1114
|
|
|
1026
|
-
[Unreleased]: https://github.com/baronunread/sproutboat-cli/compare/v0.
|
|
1115
|
+
[Unreleased]: https://github.com/baronunread/sproutboat-cli/compare/v0.24.0...HEAD
|
|
1116
|
+
[0.24.0]: https://github.com/baronunread/sproutboat-cli/compare/v0.23.0...v0.24.0
|
|
1027
1117
|
[0.19.0]: https://github.com/baronunread/sproutboat-cli/compare/v0.18.0...v0.19.0
|
|
1028
1118
|
[0.18.0]: https://github.com/baronunread/sproutboat-cli/compare/v0.17.0...v0.18.0
|
|
1029
1119
|
[0.17.0]: https://github.com/baronunread/sproutboat-cli/compare/v0.16.0...v0.17.0
|
package/SURFACE.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sproutboat",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "Wrangler-shaped CLI for Sproutboat. Deploys workers to any control plane via --api-url / SPROUTBOAT_API_URL.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -64,9 +64,9 @@
|
|
|
64
64
|
"@sproutboat/artifact": "^0.3.0",
|
|
65
65
|
"@sproutboat/assets": "^0.3.0",
|
|
66
66
|
"@sproutboat/config": "^0.5.0",
|
|
67
|
-
"@sproutboat/runtime": "^0.
|
|
68
|
-
"@sproutboat/toolchain": "^0.
|
|
69
|
-
"@sproutboat/wire": "^0.
|
|
67
|
+
"@sproutboat/runtime": "^0.26.0",
|
|
68
|
+
"@sproutboat/toolchain": "^0.13.0",
|
|
69
|
+
"@sproutboat/wire": "^0.15.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@oxlint/plugins": "1.85.0",
|
|
@@ -78,10 +78,10 @@
|
|
|
78
78
|
"typescript": "7.0.2"
|
|
79
79
|
},
|
|
80
80
|
"optionalDependencies": {
|
|
81
|
-
"@sproutboat/cli-darwin-arm64": "0.
|
|
82
|
-
"@sproutboat/cli-darwin-x64": "0.
|
|
83
|
-
"@sproutboat/cli-linux-arm64": "0.
|
|
84
|
-
"@sproutboat/cli-linux-x64": "0.
|
|
81
|
+
"@sproutboat/cli-darwin-arm64": "0.25.0",
|
|
82
|
+
"@sproutboat/cli-darwin-x64": "0.25.0",
|
|
83
|
+
"@sproutboat/cli-linux-arm64": "0.25.0",
|
|
84
|
+
"@sproutboat/cli-linux-x64": "0.25.0"
|
|
85
85
|
},
|
|
86
86
|
"engines": {
|
|
87
87
|
"node": ">=18"
|