Commit Graph
196 Commits
Author SHA1 Message Date
tbenandClaude Opus 5.5 96e392f556 1.4.0: not_found, server-only response options, compression
- Server functions can return not_found: true to render the 404 page
  with status 404.
- Page components and window.__PAGE_PROPS__ (and HMR updates) only get
  props, query, url and error. response_options, redirect, cache settings
  and res_transform stay on the server, so cookies and private headers no
  longer end up in the HTML. BunextPageProps is narrowed to match
  (breaking for code that read server-only fields from component props).
- response_options headers go through a Headers object, so repeated
  headers such as several Set-Cookie survive.
- Redirects: status_code wins over permanent; response_options headers
  and res_transform apply to redirects too.
- Gzip for compressible text responses; compress: false to turn it off.
- Files the router matches but never bundles (.server.ts, __root,
  excluded paths and directories) return 404 instead of looping through
  dev rebuild retries.
- Missing public files return 404 rather than 403, so dotted page paths
  like /users/john.doe fall through to pages again.
- importFresh detects rewrites within the filesystem's mtime granularity.
- README: self-hosted React (not esm.sh), snake_case option names, static
  file serving, cache headers, the new options.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-09 04:14:56 +01:00
tbenandClaude Opus 5.5 b410b92f9f Make the dist directory configurable
Set it with `dist_dir` in bunext.config.ts or `--dist-dir` on any CLI
command (precedence: --dist-dir > BUNEXT_DIST_DIR > dist_dir > .bunext).
setupDistDir() resolves it in the CLI's preAction hook and at the start
of bunextInit(), so custom servers get the config value too.

- Read dist-derived paths from grabDirNames() inside functions instead of
  at import time; a guard test enforces this.
- Derive the client asset URL prefix from the dist dir instead of
  hard-coding /.bunext.
- Make the dev watcher ignore rules and probe follow the dist dir.
- Validate the dir: inside the project root, outside src/, public/ and
  node_modules/, URL-safe characters only.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-09 03:55:54 +01:00
tbenandClaude Opus 5.5 4d4a79a6dd Push HMR updates before the SSR rebuild in dev
Client-only edits are sent to the browser right after the hydration build,
without re-running server functions; SSR rebuilds afterwards and props are
re-fetched only when a .server.ts output changed or after fullRebuild. Page
requests wait for an in-flight SSR rebuild. The SSR build no longer runs
Tailwind, the PostCSS processor is reused across rebuilds, and the watcher
debounce drops from 200ms to 50ms.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 07:32:33 +01:00
tben ed788dff97 Add SSR bundle minify config 2026-10-17 15:03:30 +01:00
tben 8a981c854a Builds errors bugfix 2026-10-16 16:54:55 +01:00
tben af12852fb9 Republish dev memory leak bugfix branch 2026-10-16 16:42:27 +01:00
tben 1e3e9c4d69 Merge branch 'fix-memory-errors-in-dev' 2026-10-16 14:47:24 +01:00
tben c64501cae5 Revert to v1.2.4 2026-10-16 14:43:31 +01:00
tben 5dc783fe97 Fix memory leak in dev server 2026-10-16 14:25:18 +01:00
tbenandClaude Opus 5.5 3d0771f2d0 Stop per-request module re-imports leaking memory in production
Page rendering imported the SSR bundle and .server.ts modules with a
unique ?t= query on every request, in production too. Each one became a
new, never-evicted module record (and re-ran module top-level code), so
RSS grew with request count. Cache-bust only in dev via importFresh.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 19:37:15 +01:00
tben 7694e80c60 Build with bun 1.4.3 2026-10-15 18:04:52 +01:00
tbenandClaude Opus 5.5 40c17f903e Keep bunext sitemap alive while sitemap exports query the DB
Bun's SQL client (mariadb/mysql adapters, Bun 1.3.14) doesn't keep the
event loop alive for a query on an idle connection, so a second dynamic
route's sitemap export querying the DB made the command exit silently.
Hold the loop open with a timer during generation, and log what a stuck
run is waiting on.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 09:00:40 +01:00
tbenandClaude Opus 5.5 23a309005a Add disable_seo config to keep preview deployments out of search engines
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 05:29:08 +01:00
tbenandClaude Opus 5.5 3a75880ae4 Date sitemap lastmod from the build pipeline; warn on skipped pages
- bunext build records when each page's client bundle hash last changed
  in .bunext/page-lastmod.json (sitemap.lastmod_file to relocate). The
  hash covers the page's whole import graph, so component edits re-date
  every page that uses them. The sitemap uses these dates as lastmod
- Add sitemap.default_lastmod
- BREAKING: use_file_lastmod now defaults to false (file mtimes are reset
  by checkouts); it is a fallback after the build record
- Warn when a page or __root.tsx is skipped because its default export
  is not at the start of a line (e.g. export { Page as default })
- Replace leaking module mocks in tests (log, grab-root-file-path) with
  spies and fixtures

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 18:25:38 +01:00
tbenandClaude Opus 5.5 be4bebaa22 Add robots.txt generation and sitemap chunking
- bunext sitemap now writes public/robots.txt (configurable via the
  robots config key; robots: false or --no-robots to skip). Hand-written
  robots.txt files are never overwritten without a robots config
- Large sitemaps are split into public/sitemap-chunks/sitemap-N.xml
  (sitemap.chunk_size, default 10,000, max 50,000; 50MB per file) with
  sitemap.xml as a sitemap index; stale chunks are cleaned up
- Export bunextGenerateRobotsTxt
- Run tests in publish.sh

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 18:02:52 +01:00
tben 1169729b06 Add sitemap generation utility 2026-10-14 17:42:27 +01:00
tben 632881e174 Add sitemap generation utility 2026-10-14 17:41:50 +01:00
tbenandClaude Opus 5.5 d9de858439 Add sitemap generation and bunext sitemap command
- Add generateSitemap util (exported as bunext.bunextGenerateSitemap)
  that builds sitemap.xml from static pages, with exclude patterns,
  additional paths (array or sync/async function), lastmod from file
  mtime, trailing slash, and default changefreq/priority options
- Let page .server.ts files export a `sitemap` function to list URLs
  for dynamic routes, or override a static page's entry
- Add `bunext sitemap` command reading `sitemap` from bunext.config.ts,
  writing public/sitemap.xml by default, with --output/--origin flags
- Fix handle-routes test leaking a grab-router module mock into
  bunext-req-handler tests; set global.BUNEXT_ROUTER instead
- Ignore /.tmp
- Document sitemap usage in README and CLAUDE.md

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 17:41:21 +01:00
tben 3025b1681d Fix module watcher errors 2026-10-14 12:30:41 +01:00
tben eefb2ea5d2 Fix security vulnerabilities 2026-10-13 15:52:34 +01:00
tbenandClaude Opus 5.5 74103a19c9 Fix security vulnerabilities and request handling bugs
- Move page cache out of the publicly served .bunext/public dir and hash cache keys
- Skip caching credentialed requests, non-2xx and Set-Cookie responses; cap entries
- Enforce API body size limit while reading; keep req body readable for handlers
- Hide error messages from clients in production
- Escape inline script JSON; strip cookies from HMR payloads
- Only trust X-Forwarded-Proto with trust_proxy config
- Fix console race in SSR, dotted page paths, middleware rewrites,
  excluded path status, encoded static file names, symlinked dirs
- Upgrade vulnerable deps, remove micromatch, pin bun versions, delete dead code

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 15:48:08 +01:00
tben 4238d9a4ea Fix watcher rebuild on page add and delete 2026-10-13 15:18:41 +01:00
tben 7bab610b38 Fix failing tests, update page component handler to exclude 404 pages on retries 2026-10-03 03:32:01 +01:00
tben 6e6cfef5e5 Fix failing tests 2026-10-03 03:18:03 +01:00
tben 3a4ece5255 Updates 2026-10-02 14:50:13 +01:00
tben 8fa5b64b48 Fix build lags 2026-10-02 14:48:38 +01:00
tben 17a5c3df01 Updates 2026-10-02 07:23:33 +01:00
tben 7e353dbeb3 Error handling bugfix: pass #2 2026-10-02 07:20:55 +01:00
tben d8ea4f8e02 Error handling bugfix: pass #1 2026-10-02 07:04:22 +01:00
tben 39a5e91eeb Add build info JSON file after builds 2026-09-23 05:18:53 +01:00
tben 2335c60cc3 Refactor artifacts to use relative directory for build step and retrieval 2026-09-23 05:08:54 +01:00
tben 2803dfa0be Updates 2026-09-22 16:52:54 +01:00
tben d4cc401209 Updates 2026-09-22 16:43:14 +01:00
tben 15eb1f7982 Updates 2026-09-22 16:07:09 +01:00
tben 1c52617728 Updates 2026-09-22 16:01:25 +01:00
tben 1bf1b651db Update dev server 2026-08-14 13:12:35 +01:00
tben 247a64c873 Update dev server 2026-08-14 12:59:20 +01:00
tben f590deb11b Update dev server 2026-08-14 09:58:12 +01:00
tben 3426c7b53b Update dev server 2026-08-14 09:57:22 +01:00
tben afd1af1827 Update dev server 2026-08-14 09:55:57 +01:00
tben 22d3dedab2 Update page server types 2026-08-14 06:49:12 +01:00
tben 8d12329f01 Add perpetual watcher reload in dev 2026-08-13 05:39:14 +01:00
tben 78e86b3999 Rename global variables 2026-08-03 12:01:40 +01:00
tben 87948340b0 Add public envs 2026-08-03 08:42:33 +01:00
tben 86ea86e7bd Updates 2026-08-01 05:25:47 +01:00
tben 596b9de047 Add request cookie to HMR reload pipeline 2026-07-31 07:21:52 +01:00
tben 9da1e16318 Bugfix: Fix dev function 2026-07-30 14:50:54 +01:00
tben 823c5bb1ca Remove bun imports from esbuild bundler 2026-07-30 11:52:08 +01:00
tben 88ead3b3d6 Remove all Loader.registry.delete lines 2026-07-29 14:05:12 +01:00
tben 45509deff8 Dev Server Refresh Bugfix. Loop happens after a file route is refactored to a folder route with index.ts 2026-07-29 13:55:23 +01:00