sproutboat 0.12.0 → 0.12.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.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,37 @@ maintained going forward by the `release` skill.
10
10
 
11
11
  ## Unreleased
12
12
 
13
+ ## [0.12.2] - 2026-10-01
14
+
15
+ ### Fixed
16
+
17
+ - `sproutboat dev` no longer kills a large app's sprout with SIGBUS (exit 138)
18
+ on its first request. Every async function runs on its own fiber stack,
19
+ which Porffor fixes at 256 KiB, and the unoptimised code `dev` builds
20
+ overflowed it within a few nested awaits. `@sproutboat/toolchain` 0.4.15
21
+ raises it to 8 MiB; only touched pages cost memory. Release builds had the
22
+ same limit at a higher threshold, so a deep async chain could crash a
23
+ deployed sprout the same way (baronunread/sproutboat#178).
24
+
25
+ ## [0.12.1] - 2026-09-30
26
+
27
+ ### Fixed
28
+
29
+ - `sproutboat` with no arguments linked the platform repository and said to
30
+ use `bunx`, not `npx`. The CLI has shipped as a self-contained binary since
31
+ 0.11.0, so `npx` works; the help now links https://docs.sproutboat.com.
32
+ - Handler types now declare `batch.ackAll()`/`retryAll()`, per-message
33
+ `delaySeconds` in `sendBatch()` and D1 `raw()`, matching the runtime.
34
+ Comments that said direct R2 uploads are unavailable standalone, and that an
35
+ un-acked queue message is redelivered, are corrected.
36
+
37
+ ### Changed
38
+
39
+ - `examples/runtime-comparison` runs one Worker-style app on Node, workerd and
40
+ a standalone Sproutboat binary and checks every response;
41
+ `benchmarks/v0.12.0` holds the first tagged run, which sproutboat.com
42
+ renders.
43
+
13
44
  ## [0.12.0] - 2026-09-28
14
45
 
15
46
  ### Added
@@ -639,7 +670,9 @@ its own package.
639
670
  - Renamed the package to `sproutboat` (was `@sproutboat/cli`); dropped the
640
671
  `sprout` bin alias in favour of a user-defined shell alias.
641
672
 
642
- [Unreleased]: https://github.com/baronunread/sproutboat-cli/compare/v0.12.0...HEAD
673
+ [Unreleased]: https://github.com/baronunread/sproutboat-cli/compare/v0.12.2...HEAD
674
+ [0.12.2]: https://github.com/baronunread/sproutboat-cli/compare/v0.12.1...v0.12.2
675
+ [0.12.1]: https://github.com/baronunread/sproutboat-cli/compare/v0.12.0...v0.12.1
643
676
  [0.12.0]: https://github.com/baronunread/sproutboat-cli/compare/v0.11.13...v0.12.0
644
677
  [0.11.13]: https://github.com/baronunread/sproutboat-cli/compare/v0.11.12...v0.11.13
645
678
  [0.11.12]: https://github.com/baronunread/sproutboat-cli/compare/v0.11.11...v0.11.12
package/SURFACE.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > Generated by `src/surface.test.ts` from `src/surface.ts` + the pinned
4
4
  > toolchain constants. Do not edit by hand — run `UPDATE_SURFACE=1 bun test`.
5
5
 
6
- **Package:** `sproutboat` 0.12.0 · runs on Bun (use `bunx`, not `npx`)
6
+ **Package:** `sproutboat` 0.12.2
7
7
 
8
8
  ## Commands
9
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sproutboat",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
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",
@@ -65,7 +65,7 @@
65
65
  "@sproutboat/assets": "^0.3.0",
66
66
  "@sproutboat/config": "^0.4.0",
67
67
  "@sproutboat/runtime": "^0.13.0",
68
- "@sproutboat/toolchain": "^0.4.14",
68
+ "@sproutboat/toolchain": "^0.4.15",
69
69
  "@sproutboat/wire": "^0.9.1"
70
70
  },
71
71
  "devDependencies": {
@@ -78,10 +78,10 @@
78
78
  "typescript": "7.0.2"
79
79
  },
80
80
  "optionalDependencies": {
81
- "@sproutboat/cli-darwin-arm64": "0.12.0",
82
- "@sproutboat/cli-darwin-x64": "0.12.0",
83
- "@sproutboat/cli-linux-arm64": "0.12.0",
84
- "@sproutboat/cli-linux-x64": "0.12.0"
81
+ "@sproutboat/cli-darwin-arm64": "0.12.2",
82
+ "@sproutboat/cli-darwin-x64": "0.12.2",
83
+ "@sproutboat/cli-linux-arm64": "0.12.2",
84
+ "@sproutboat/cli-linux-x64": "0.12.2"
85
85
  },
86
86
  "engines": {
87
87
  "node": ">=18"
package/src/surface.ts CHANGED
@@ -7,7 +7,7 @@ import { bold, dim, leaf } from "./style";
7
7
 
8
8
  export const CLI_NAME = "sproutboat";
9
9
  export const TAGLINE = "Deploy JavaScript handlers as tiny native binaries on your own VPS.";
10
- export const REPO_URL = "https://github.com/baronunread/sproutboat";
10
+ export const DOCS_URL = "https://docs.sproutboat.com";
11
11
 
12
12
  export type Group = "Develop" | "Ship" | "Storage" | "Configure" | "Account";
13
13
 
@@ -356,7 +356,7 @@ export function helpText(): string {
356
356
  lines.push(
357
357
  "",
358
358
  dim(`Run \`${CLI_NAME} <command>\` with no/invalid args to see that command's full usage.`),
359
- dim(`Docs: ${REPO_URL} · runs on Bun — use \`bunx\`, not \`npx\`.`),
359
+ dim(`Docs: ${DOCS_URL}`),
360
360
  );
361
361
  return lines.join("\n");
362
362
  }
@@ -52,6 +52,8 @@ declare global {
52
52
  /** The first row, or one column of it when named. `null` if there are none. */
53
53
  first<T = Record<string, unknown>>(): T | null;
54
54
  first<T = unknown>(column: string): T | null;
55
+ /** Rows as arrays of column values. */
56
+ raw<T = unknown[]>(): T[];
55
57
  }
56
58
 
57
59
  interface D1Database {
@@ -81,8 +83,8 @@ declare global {
81
83
  httpMetadata: R2HttpMetadata;
82
84
  customMetadata?: Record<string, string>;
83
85
  /**
84
- * The object as a string. A get holds the object whole in memory, so keep
85
- * downloads small until native download tickets are available.
86
+ * The object as a string. A get holds the object whole in memory, so serve
87
+ * large objects with `createDownloadUrl` instead.
86
88
  *
87
89
  * `new Response(obj.body, ...)` corrupts any non-ASCII/binary content: the
88
90
  * runtime cannot tell these bytes apart from a string a handler built, so
@@ -159,9 +161,9 @@ declare global {
159
161
  createMultipartUpload(key: string, options?: R2PutOptions): R2MultipartUpload;
160
162
  /** Reconstructs a multipart handle after storing its key and upload id. */
161
163
  resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload;
162
- /** Broker-backed direct PUT. Not available in native standalone mode yet. */
164
+ /** Direct PUT to a one-use URL, streamed to storage without passing through the handler. */
163
165
  createUploadUrl(key: string, options?: R2UploadTicketOptions): R2TransferTicket;
164
- /** Broker-backed direct GET or HEAD, including Range. */
166
+ /** Direct GET or HEAD from a one-use URL, including Range. */
165
167
  createDownloadUrl(key: string, options?: R2DownloadTicketOptions): R2TransferTicket;
166
168
  get(key: string): R2Object | null;
167
169
  /** Metadata without the body. */
@@ -179,14 +181,14 @@ declare global {
179
181
  interface Queue<Body = unknown> {
180
182
  /** Returns immediately. The batch reaches `queue()` out of band. */
181
183
  send(body: Body, options?: QueueSendOptions): void;
182
- sendBatch(messages: Array<{ body: Body }>): void;
184
+ sendBatch(messages: Array<{ body: Body; delaySeconds?: number }>): void;
183
185
  }
184
186
 
185
187
  interface QueueMessage<Body = unknown> {
186
188
  id: string;
187
189
  timestamp: number;
188
190
  body: Body;
189
- /** Mark as handled. Without this the message is redelivered. */
191
+ /** Mark as handled. A message neither acked nor retried counts as acked. */
190
192
  ack(): void;
191
193
  /** Hand it back for another attempt. */
192
194
  retry(): void;
@@ -195,6 +197,8 @@ declare global {
195
197
  interface MessageBatch<Body = unknown> {
196
198
  queue: string;
197
199
  messages: Array<QueueMessage<Body>>;
200
+ ackAll(): void;
201
+ retryAll(): void;
198
202
  }
199
203
 
200
204
  // --------------------------------------------------- Durable Objects
@@ -273,8 +277,8 @@ declare global {
273
277
  *
274
278
  * `crypto.scryptVerify` is a Sproutboat extension (#153), not WebCrypto: it
275
279
  * re-derives a scrypt hash and compares it in constant time, for migrating
276
- * password hashes made by Node/Bun `scrypt`. Verify-only on purpose; new
277
- * credentials should use HMAC/PBKDF2 via `crypto.subtle`.
280
+ * password hashes made by Node/Bun `scrypt`. Verify-only on purpose; derive
281
+ * new credentials with HMAC via `crypto.subtle`.
278
282
  */
279
283
  interface Crypto {
280
284
  scryptVerify(