@bakery-framework/core 2.4.2 → 2.5.0-alpha.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bakery-framework/core",
3
- "version": "2.4.2",
3
+ "version": "2.5.0-alpha.1",
4
4
  "description": "Bakery framework core: handlers, router, config, session, caches, logger, compiler.",
5
5
  "keywords": [
6
6
  "bakery",
@@ -65,6 +65,6 @@
65
65
  "!src/tests"
66
66
  ],
67
67
  "engines": {
68
- "bun": ">=1.4.0"
68
+ "bun": ">=1.4.4"
69
69
  }
70
70
  }
@@ -4,7 +4,7 @@ import { Bakery } from '../core/bakery'
4
4
  import { checkCacheVersion } from '../core/cache-version'
5
5
  import { serveLog } from '../logger/serve-log'
6
6
  import { fs } from '../utils'
7
- import { Try } from '../utils/common/try'
7
+ import { Try } from '../utils/isomorphic/try'
8
8
 
9
9
  /**
10
10
  * The tiered cache's spill-to-disk store: sessions and LRU overflow.
@@ -134,9 +134,8 @@ if (!stored) {
134
134
  export function applyJournalMode(db: Database, file: string): string {
135
135
  const asked = Try.return(
136
136
  () =>
137
- db
138
- .query<{ journal_mode: string }, []>('PRAGMA journal_mode = WAL;')
139
- .get()?.journal_mode ?? '',
137
+ db.query<{ journal_mode: string }, []>('PRAGMA journal_mode = WAL;').get()
138
+ ?.journal_mode ?? '',
140
139
  (error: Error) => `threw: ${error.message}`,
141
140
  )
142
141
  if (asked.toLowerCase() === 'wal') return 'wal'
@@ -362,7 +362,7 @@ function connect() {
362
362
  ws.onmessage = e => {
363
363
  const data = typeof e.data === 'string' ? e.data : String(e.data)
364
364
 
365
- // The server sends two frame shapes: legacy plain strings (a
365
+ // The server sends two frame shapes: plain strings (a
366
366
  // watcher-relative filename, or the literal 'force_reload') and JSON
367
367
  // objects, currently `{type: 'error', title, body}` from
368
368
  // compiler/dev-service.ts's notifyError. A relative path can never begin
@@ -374,7 +374,7 @@ function connect() {
374
374
  frame = JSON.parse(data)
375
375
  } catch {
376
376
  // A '{'-prefixed frame that is not JSON is not a filename either;
377
- // frame stays null and the string falls through as a legacy frame.
377
+ // frame stays null and the string falls through as a plain frame.
378
378
  }
379
379
  if (frame) {
380
380
  if (frame.type === 'error') {
@@ -1,5 +1,3 @@
1
- /** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: '*/
2
-
3
1
  /**
4
2
  * Browser runtime: binds the shared utilities onto `globalThis` and adds the
5
3
  * DOM-dependent pieces ($fmt, speculation rules, live navigation) on top.
@@ -29,7 +29,7 @@ export function notifySockets(server: any, filename: string) {
29
29
  * `{type: 'error', title, body}`. client/livereload.ts renders it as an
30
30
  * overlay and removes it on the next successful reload frame.
31
31
  *
32
- * Legacy reload frames stay plain filename strings: the client distinguishes
32
+ * Reload frames are plain filename strings: the client distinguishes
33
33
  * the two by a leading `{`, so this must always be JSON and filenames must
34
34
  * never be. Paths that cannot reach a live socket at all (worker dead, boot
35
35
  * failure before `Bun.serve`) are covered client-side by the disconnect
@@ -1,6 +1,6 @@
1
1
  import { unlinkSync } from 'node:fs'
2
2
  import { cacheDir } from '../core/context'
3
- import { Try } from '../utils/common/try'
3
+ import { Try } from '../utils/isomorphic/try'
4
4
 
5
5
  /**
6
6
  * **`cacheDir` comes from `core/context`, not from `Bakery`. Do not change it
@@ -64,11 +64,6 @@ export function isCacheStale(
64
64
  )
65
65
  }
66
66
 
67
- /** Test seam: forget that the check ran, so a fixture can exercise it again. */
68
- export function __resetCacheVersionCheck(): void {
69
- done = null
70
- }
71
-
72
67
  async function run(): Promise<void> {
73
68
  // Workers inherit a directory the master already validated. Re-running here
74
69
  // would race the master's own wipe.
package/src/core/jsx.ts CHANGED
@@ -33,7 +33,7 @@ export const Fragment = ({ children }: { children?: any }) =>
33
33
  * like a string everywhere (`.trim()`, concatenation, `String()`), so callers
34
34
  * are unaffected.
35
35
  */
36
- export class SafeHtml extends String {}
36
+ class SafeHtml extends String {}
37
37
 
38
38
  /** Mark a string as trusted HTML, exempting it from escaping. */
39
39
  export function raw(value: unknown): string {
@@ -142,8 +142,7 @@ export function html<P = {}>(render: RenderFn<P>) {
142
142
  const prefix =
143
143
  startsAt < 0 ? '' : rawDom.slice(startsAt, startsAt + 9).toLowerCase()
144
144
 
145
- if (prefix.startsWith('<html'))
146
- return `<!DOCTYPE html>\n${rawDom}`
145
+ if (prefix.startsWith('<html')) return `<!DOCTYPE html>\n${rawDom}`
147
146
  if (prefix.startsWith('<!doctype')) return rawDom
148
147
 
149
148
  let title = 'Document'
package/src/global.d.ts CHANGED
@@ -50,8 +50,7 @@ declare global {
50
50
  * string) is ignored and the next middleware runs. See `$middleware.ts`.
51
51
  */
52
52
  type MiddlewareResponse =
53
- | Response
54
- | import('./utils/common/json').JsonResponseData
53
+ Response | import('./utils/common/json').JsonResponseData
55
54
 
56
55
  type HostEntry = {
57
56
  root?: string
@@ -115,7 +115,6 @@ export namespace Route {
115
115
  // namespace for its nested classes; `const RouteData = { Info: class {} }`
116
116
  // provides only the value, and every one of those type references stops
117
117
  // resolving.
118
- // biome-ignore lint/complexity/noStaticOnlyClass: also a type namespace. See above
119
118
  export class RouteData {
120
119
  static Info = class Info {
121
120
  readonly params: string[]
@@ -130,7 +130,6 @@ export class DynamicHandler extends Handler {
130
130
  // Segment matching with catch-all and specificity precedence. The branches
131
131
  // are the precedence rules; splitting them hides the ordering that is the
132
132
  // whole point.
133
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: route-precedence dispatcher
134
133
  static findDynamicRoute(path: string): Route.Info | null {
135
134
  const root = Bakery.serveRoot
136
135
  let deferred: Route.Info[] | null = null
@@ -125,7 +125,6 @@ export class HandlerMap<T extends typeof Handler = typeof Handler> extends Map<
125
125
  */
126
126
  // The `probed` bookkeeping exists because middleware has side effects and
127
127
  // must not run twice. That constraint is what the branching encodes.
128
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: cache-path + side-effect-sensitive probe loop
129
128
  async resolve(path: string, req?: Request, ...rest: any[]) {
130
129
  // The **resolved** host, not the header. `__hostname` is whatever arrived
131
130
  // in `Host`, and `routeCache` is one bounded LRU shared by every tenant, so
@@ -174,7 +174,6 @@ async function getCatchAllRoute(
174
174
  return info
175
175
  }
176
176
 
177
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: request-to-route dispatcher
178
177
  export async function getRoute(
179
178
  pathOrArr: string | string[],
180
179
  exts: string[] = [],
@@ -1,8 +1,8 @@
1
1
  import { PromptTracker } from '../compiler/prompt-tracker'
2
2
  import type { MapOf } from '../types'
3
3
  import { Case } from '../utils/common/case'
4
- import { match } from '../utils/common/match'
5
- import { Try } from '../utils/common/try'
4
+ import { match } from '../utils/isomorphic/match'
5
+ import { Try } from '../utils/isomorphic/try'
6
6
 
7
7
  const logLevels = ['info', 'warn', 'error', 'fatal', 'debug', 'trace'] as const
8
8
  const byLength = 15
package/src/router.ts CHANGED
@@ -289,7 +289,8 @@ export const serveWebSocket: Bun.WebSocketHandler<any> = {
289
289
  try {
290
290
  const h = prepareWSData(ws)
291
291
  if (h) return await h.handler.message(ws, message, h.data)
292
- config.websocket.message(ws, message)
292
+ // Optional since bun-types 1.4.4, like the other three below.
293
+ await config.websocket.message?.(ws, message)
293
294
  } catch (err: any) {
294
295
  serveLog.UNHANDLED_ERR({
295
296
  error: `WebSocket message error: ${errorMsg(err)}`,
@@ -1,5 +1,5 @@
1
1
  export * from './case'
2
2
  export * from './json'
3
- export * from './match'
3
+ export * from '../isomorphic/match'
4
4
  export * from './misc'
5
- export * from './try'
5
+ export * from '../isomorphic/try'
package/src/utils/fs.ts CHANGED
@@ -585,7 +585,10 @@ export namespace FileSystem {
585
585
  * of the source before it. That is how an SFC in a dev server kept its old
586
586
  * styles beside a new template and script after three quick edits.
587
587
  */
588
- function versionedName(cacheName: string, sourceMtime: number | null): string {
588
+ function versionedName(
589
+ cacheName: string,
590
+ sourceMtime: number | null,
591
+ ): string {
589
592
  if (!sourceMtime) return cacheName
590
593
  const ext = parse(cacheName).ext
591
594
  return `${cacheName.slice(0, cacheName.length - ext.length)}@${sourceMtime}${ext}`
@@ -4,7 +4,7 @@ import { Bakery, hostStore } from '../../core/bakery'
4
4
  import { hostEntryKey } from '../../core/config'
5
5
  import type { MapOf } from '../../types'
6
6
  import { is } from '../common/misc'
7
- import { Try } from '../common/try'
7
+ import { Try } from '../isomorphic/try'
8
8
  import { fs } from '../fs'
9
9
  import { escapeScriptJson } from '../isomorphic/escape'
10
10
 
@@ -135,7 +135,6 @@ export namespace ETag {
135
135
  negotiationMemo.clear()
136
136
  }
137
137
 
138
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: content negotiation, one branch per encoding outcome
139
138
  function negotiateFile(file: Bun.BunFile, req?: Request) {
140
139
  const fileName = file.name || 'file'
141
140
 
@@ -1,6 +1,6 @@
1
1
  import { Bakery, hostStore } from '../../core/bakery'
2
2
  import type { MapOf } from '../../types'
3
- import { Try } from '../common/try'
3
+ import { Try } from '../isomorphic/try'
4
4
  import { DOMTools, headBodyCache } from './dom'
5
5
  import { ETag } from './etag'
6
6
 
@@ -3,7 +3,7 @@ export * from './body'
3
3
  export * from './credential'
4
4
  export * from './csrf'
5
5
  export * from './dom'
6
- export * from './escape'
6
+ export * from '../isomorphic/escape'
7
7
  export * from './etag'
8
8
  export * from './html'
9
9
  export * from './ip'
@@ -28,8 +28,7 @@ export interface StandardSchemaLike<T> {
28
28
  }
29
29
 
30
30
  type StandardResult<T> =
31
- | { value: T; issues?: undefined }
32
- | { issues: readonly StandardIssue[] }
31
+ { value: T; issues?: undefined } | { issues: readonly StandardIssue[] }
33
32
 
34
33
  interface StandardIssue {
35
34
  message: string
@@ -48,8 +47,7 @@ export interface ValidationIssue {
48
47
  }
49
48
 
50
49
  export type ValidationResult<T> =
51
- | { ok: true; value: T }
52
- | { ok: false; issues: ValidationIssue[] }
50
+ { ok: true; value: T } | { ok: false; issues: ValidationIssue[] }
53
51
 
54
52
  function isStandardSchema<T>(v: Validator<T>): v is StandardSchemaLike<T> {
55
53
  return typeof v === 'object' && v !== null && '~standard' in v
@@ -1,6 +0,0 @@
1
- /**
2
- * Moved to `utils/isomorphic/match` so the browser bundle and the server share
3
- * one implementation: the prototype-chain fix (`Object.hasOwn` rather than
4
- * `in`) previously had to be applied to both copies separately.
5
- */
6
- export * from '../isomorphic/match'
@@ -1,6 +0,0 @@
1
- /**
2
- * Moved to `utils/isomorphic/try` so the browser bundle and the server share one
3
- * implementation. Re-exported here because `@server/utils` and a number of
4
- * modules import `Try` from this path.
5
- */
6
- export * from '../isomorphic/try'
@@ -1,8 +0,0 @@
1
- /**
2
- * Server-facing path for the escaping primitives.
3
- *
4
- * The implementation lives in `utils/isomorphic/escape` because the browser
5
- * bundle needs it too; server code imports it from here (or from `@server/utils`)
6
- * so callers don't have to know which side of that boundary it sits on.
7
- */
8
- export { escapeHtml, escapeScriptJson } from '../isomorphic/escape'
@@ -1,15 +0,0 @@
1
- /**
2
- * Pure utilities shared by the server and the browser bundle.
3
- *
4
- * Rule for this directory: no `Bun.*`, no node builtins, no DOM globals. These
5
- * modules are compiled into the client bundle as-is, so anything that reaches
6
- * for a runtime API belongs one layer up in `utils/` or in `client/`.
7
- */
8
- export * from './case'
9
- export * from './escape'
10
- export * from './is'
11
- export * from './match'
12
- export * from './math'
13
- export * from './misc'
14
- export * from './stringify'
15
- export * from './try'