@bquery/bquery 1.11.0 → 1.12.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.
Files changed (110) hide show
  1. package/README.md +79 -59
  2. package/dist/{a11y-DgUQ8-fI.js → a11y-IV_bfLyn.js} +3 -3
  3. package/dist/{a11y-DgUQ8-fI.js.map → a11y-IV_bfLyn.js.map} +1 -1
  4. package/dist/a11y.es.mjs +1 -1
  5. package/dist/{component-D8ydhe58.js → component-BtsRbf6c.js} +7 -7
  6. package/dist/{component-D8ydhe58.js.map → component-BtsRbf6c.js.map} +1 -1
  7. package/dist/component.es.mjs +1 -1
  8. package/dist/{concurrency-BU1wPEsZ.js → concurrency-kycgAZvW.js} +3 -3
  9. package/dist/{concurrency-BU1wPEsZ.js.map → concurrency-kycgAZvW.js.map} +1 -1
  10. package/dist/concurrency.es.mjs +1 -1
  11. package/dist/{config-DhT9auRm.js → config-BP7KwiR5.js} +1 -1
  12. package/dist/{config-DhT9auRm.js.map → config-BP7KwiR5.js.map} +1 -1
  13. package/dist/constraints-Dlbx_m1b.js.map +1 -1
  14. package/dist/core-tOP6QOrY.js.map +1 -1
  15. package/dist/{core-CongXJuo.js → core-yg9rJXiR.js} +1 -1
  16. package/dist/{core-CongXJuo.js.map → core-yg9rJXiR.js.map} +1 -1
  17. package/dist/custom-directives-5DlKqvd2.js.map +1 -1
  18. package/dist/devtools-QosAqo0T.js.map +1 -1
  19. package/dist/dnd-d2OU4len.js.map +1 -1
  20. package/dist/{effect-Cc51IH91.js → effect-v8OIEmPs.js} +2 -2
  21. package/dist/{effect-Cc51IH91.js.map → effect-v8OIEmPs.js.map} +1 -1
  22. package/dist/env-PvwYHnJq.js.map +1 -1
  23. package/dist/{forms-BLx4ZzT7.js → forms-DYcdlk_h.js} +8 -8
  24. package/dist/{forms-BLx4ZzT7.js.map → forms-DYcdlk_h.js.map} +1 -1
  25. package/dist/forms.es.mjs +1 -1
  26. package/dist/full.d.ts +11 -11
  27. package/dist/full.d.ts.map +1 -1
  28. package/dist/full.es.mjs +324 -279
  29. package/dist/full.iife.js +26 -26
  30. package/dist/full.iife.js.map +1 -1
  31. package/dist/full.umd.js +26 -26
  32. package/dist/full.umd.js.map +1 -1
  33. package/dist/function-Cybd57JV.js.map +1 -1
  34. package/dist/{i18n--p7PM-9r.js → i18n-unHU1jMo.js} +3 -3
  35. package/dist/{i18n--p7PM-9r.js.map → i18n-unHU1jMo.js.map} +1 -1
  36. package/dist/i18n.es.mjs +1 -1
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.es.mjs +198 -196
  39. package/dist/match-CrZRVC4z.js.map +1 -1
  40. package/dist/{media-gjbWNq50.js → media-Chh6mA0v.js} +3 -3
  41. package/dist/{media-gjbWNq50.js.map → media-Chh6mA0v.js.map} +1 -1
  42. package/dist/media.es.mjs +1 -1
  43. package/dist/{motion-BBMso9Ir.js → motion-27Od9aFE.js} +2 -2
  44. package/dist/{motion-BBMso9Ir.js.map → motion-27Od9aFE.js.map} +1 -1
  45. package/dist/motion.es.mjs +1 -1
  46. package/dist/{mount-0A9qtcRJ.js → mount-DwUFujZ_.js} +4 -4
  47. package/dist/{mount-0A9qtcRJ.js.map → mount-DwUFujZ_.js.map} +1 -1
  48. package/dist/object-BCk-1c8T.js.map +1 -1
  49. package/dist/{platform-BPHIXbw8.js → platform-2YkFA11t.js} +4 -4
  50. package/dist/{platform-BPHIXbw8.js.map → platform-2YkFA11t.js.map} +1 -1
  51. package/dist/platform.es.mjs +2 -2
  52. package/dist/plugin-SZEirbwq.js.map +1 -1
  53. package/dist/reactive/index.d.ts +2 -2
  54. package/dist/reactive/index.d.ts.map +1 -1
  55. package/dist/reactive/signal.d.ts +7 -7
  56. package/dist/reactive/signal.d.ts.map +1 -1
  57. package/dist/reactive/websocket.d.ts +15 -3
  58. package/dist/reactive/websocket.d.ts.map +1 -1
  59. package/dist/{reactive-BAd2hfl8.js → reactive-BvPR_FYA.js} +10 -10
  60. package/dist/{reactive-BAd2hfl8.js.map → reactive-BvPR_FYA.js.map} +1 -1
  61. package/dist/reactive.es.mjs +40 -40
  62. package/dist/{readonly-C0ZwS1Tf.js → readonly-Br-6pAgj.js} +2 -2
  63. package/dist/{readonly-C0ZwS1Tf.js.map → readonly-Br-6pAgj.js.map} +1 -1
  64. package/dist/registry-jpUQHf4E.js.map +1 -1
  65. package/dist/{router-C4weu0QL.js → router-CbnWKprL.js} +7 -7
  66. package/dist/{router-C4weu0QL.js.map → router-CbnWKprL.js.map} +1 -1
  67. package/dist/router.es.mjs +1 -1
  68. package/dist/sanitize-DOMkRO9G.js.map +1 -1
  69. package/dist/server/create-server.d.ts.map +1 -1
  70. package/dist/server/types.d.ts.map +1 -1
  71. package/dist/{server-QdyKtCS1.js → server-Dwiq_F49.js} +2 -2
  72. package/dist/server-Dwiq_F49.js.map +1 -0
  73. package/dist/server.es.mjs +1 -1
  74. package/dist/ssr/context.d.ts.map +1 -1
  75. package/dist/ssr/renderer.d.ts.map +1 -1
  76. package/dist/ssr/suspense.d.ts.map +1 -1
  77. package/dist/{ssr-Bt6BQA3J.js → ssr-CqJU1Ogp.js} +8 -8
  78. package/dist/ssr-CqJU1Ogp.js.map +1 -0
  79. package/dist/ssr.es.mjs +1 -1
  80. package/dist/store/index.d.ts +1 -1
  81. package/dist/store/index.d.ts.map +1 -1
  82. package/dist/store/plugins.d.ts +38 -0
  83. package/dist/store/plugins.d.ts.map +1 -1
  84. package/dist/{store-DnXuu6Li.js → store-DzrhVQ29.js} +69 -62
  85. package/dist/store-DzrhVQ29.js.map +1 -0
  86. package/dist/store.es.mjs +13 -11
  87. package/dist/storybook.es.mjs.map +1 -1
  88. package/dist/{testing-CeMUwrRD.js → testing-ByjwS2_D.js} +3 -3
  89. package/dist/{testing-CeMUwrRD.js.map → testing-ByjwS2_D.js.map} +1 -1
  90. package/dist/testing.es.mjs +1 -1
  91. package/dist/type-guards-BMX2c0LP.js.map +1 -1
  92. package/dist/{untrack-bjWDNdyE.js → untrack-uzz3JDNK.js} +3 -3
  93. package/dist/{untrack-bjWDNdyE.js.map → untrack-uzz3JDNK.js.map} +1 -1
  94. package/dist/view.es.mjs +8 -8
  95. package/package.json +12 -11
  96. package/src/full.ts +75 -6
  97. package/src/index.ts +2 -2
  98. package/src/reactive/index.ts +5 -4
  99. package/src/reactive/signal.ts +7 -6
  100. package/src/reactive/websocket.ts +15 -2
  101. package/src/server/create-server.ts +10 -5
  102. package/src/server/types.ts +1 -5
  103. package/src/ssr/context.ts +6 -2
  104. package/src/ssr/renderer.ts +5 -2
  105. package/src/ssr/suspense.ts +17 -8
  106. package/src/store/index.ts +1 -1
  107. package/src/store/plugins.ts +48 -1
  108. package/dist/server-QdyKtCS1.js.map +0 -1
  109. package/dist/ssr-Bt6BQA3J.js.map +0 -1
  110. package/dist/store-DnXuu6Li.js.map +0 -1
@@ -215,11 +215,7 @@ export interface ServerContext {
215
215
  * return ctx.render('<h1 bq-text="title"></h1>', { title: 'Dashboard' });
216
216
  * ```
217
217
  */
218
- render(
219
- template: string,
220
- data: BindingContext,
221
- options?: ServerRenderResponseOptions
222
- ): Response;
218
+ render(template: string, data: BindingContext, options?: ServerRenderResponseOptions): Response;
223
219
 
224
220
  /**
225
221
  * `true` when the incoming request is a WebSocket upgrade handshake.
@@ -175,7 +175,9 @@ const hasHeadersApi = (value: unknown): value is Headers =>
175
175
  typeof value === 'object' && value !== null && typeof (value as Headers).get === 'function';
176
176
 
177
177
  const hasAbortSignalApi = (value: unknown): value is AbortSignal =>
178
- typeof value === 'object' && value !== null && typeof (value as AbortSignal).aborted === 'boolean';
178
+ typeof value === 'object' &&
179
+ value !== null &&
180
+ typeof (value as AbortSignal).aborted === 'boolean';
179
181
 
180
182
  const createHeadersLike = (): Headers =>
181
183
  typeof Headers === 'function' ? new Headers() : createHeadersFallback();
@@ -219,7 +221,9 @@ export const createSSRContext = (options: CreateSSRContextOptions = {}): SSRCont
219
221
  const cookies = parseCookies(headers.get('cookie') ?? '');
220
222
  const userAgent = options.userAgent ?? headers.get('user-agent') ?? '';
221
223
  const locale = options.locale ?? parseLocale(headers.get('accept-language'));
222
- const signal = options.signal ?? (hasAbortSignalApi(request.signal) ? request.signal : createAbortSignalFallback());
224
+ const signal =
225
+ options.signal ??
226
+ (hasAbortSignalApi(request.signal) ? request.signal : createAbortSignalFallback());
223
227
  const nonce = options.nonce ?? safeNonce();
224
228
 
225
229
  const ctx: SSRContext = {
@@ -75,7 +75,8 @@ const isAllowedHtmlAttribute = (name: string): boolean => {
75
75
  return DEFAULT_ALLOWED_ATTRIBUTES.has(lowerName);
76
76
  };
77
77
 
78
- const isSafeHtmlIdOrName = (value: string): boolean => !RESERVED_IDS.has(value.toLowerCase().trim());
78
+ const isSafeHtmlIdOrName = (value: string): boolean =>
79
+ !RESERVED_IDS.has(value.toLowerCase().trim());
79
80
 
80
81
  const isExternalHtmlUrl = (url: string): boolean => {
81
82
  try {
@@ -231,7 +232,9 @@ export const sanitizeHtmlForSSR = (raw: string): string => {
231
232
  const isExternal = href ? isExternalHtmlUrl(href) : false;
232
233
 
233
234
  if (hasTargetBlank || isExternal) {
234
- const relValues = new Set((node.attributes.rel ?? '').trim().split(REL_SPLIT_PATTERN).filter(Boolean));
235
+ const relValues = new Set(
236
+ (node.attributes.rel ?? '').trim().split(REL_SPLIT_PATTERN).filter(Boolean)
237
+ );
235
238
  relValues.add('noopener');
236
239
  relValues.add('noreferrer');
237
240
  setAttr(node, 'rel', Array.from(relValues).join(' '));
@@ -135,8 +135,10 @@ const escapeScriptBody = (s: string): string =>
135
135
  * inherited from the base async render options. Head/store injection and other
136
136
  * response-shaping options are intentionally unsupported here.
137
137
  */
138
- export interface SuspenseStreamOptions
139
- extends Pick<AsyncRenderOptions, 'context' | 'prefix' | 'stripDirectives' | 'annotateHydration'> {
138
+ export interface SuspenseStreamOptions extends Pick<
139
+ AsyncRenderOptions,
140
+ 'context' | 'prefix' | 'stripDirectives' | 'annotateHydration'
141
+ > {
140
142
  /**
141
143
  * Prefix used for slot/template IDs. Default: `'bq-s'` for placeholders
142
144
  * and `'bq-r'` for resolved templates.
@@ -207,7 +209,11 @@ const removeAttr = (el: SSRElement, name: string): void => {
207
209
  if (index !== -1) el.attributeOrder.splice(index, 1);
208
210
  };
209
211
 
210
- const createSlotWrapper = (slotTag: string, slotId: string, children: SSRNode[] = []): SSRElement => ({
212
+ const createSlotWrapper = (
213
+ slotTag: string,
214
+ slotId: string,
215
+ children: SSRNode[] = []
216
+ ): SSRElement => ({
211
217
  type: 'element',
212
218
  tag: slotTag,
213
219
  attributes: { id: slotId },
@@ -281,7 +287,8 @@ const replaceSlotsInShell = (
281
287
  };
282
288
 
283
289
  /** Returns true for characters that can appear immediately before an attribute name. */
284
- const canPrecedeAttributeName = (ch: string | undefined): boolean => ch !== undefined && /\s/.test(ch);
290
+ const canPrecedeAttributeName = (ch: string | undefined): boolean =>
291
+ ch !== undefined && /\s/.test(ch);
285
292
 
286
293
  /** Returns true for characters that can terminate an attribute name in a start tag. */
287
294
  const canFollowAttributeName = (ch: string | undefined): boolean =>
@@ -449,10 +456,12 @@ export const renderToStreamSuspense = (
449
456
  };
450
457
 
451
458
  for (const [index, slot] of slots.entries()) {
452
- slot.promise.then<SettledSuspenseSlot, SettledSuspenseSlot>(
453
- (value) => ({ index, slot, ok: true, value }),
454
- (error) => ({ index, slot, ok: false, error })
455
- ).then(enqueueSettled);
459
+ slot.promise
460
+ .then<SettledSuspenseSlot, SettledSuspenseSlot>(
461
+ (value) => ({ index, slot, ok: true, value }),
462
+ (error) => ({ index, slot, ok: false, error })
463
+ )
464
+ .then(enqueueSettled);
456
465
  }
457
466
 
458
467
  const nextSettled = async (): Promise<SettledSuspenseSlot> => {
@@ -22,6 +22,6 @@ export { createStore } from './create-store';
22
22
  export { defineStore } from './define-store';
23
23
  export { mapActions, mapGetters, mapState } from './mapping';
24
24
  export { createPersistedStore } from './persisted';
25
- export { registerPlugin } from './plugins';
25
+ export { clearPlugins, registerPlugin, unregisterPlugin } from './plugins';
26
26
  export { destroyStore, getStore, listStores } from './registry';
27
27
  export { watchStore } from './watch';
@@ -16,6 +16,53 @@ export const registerPlugin = (plugin: StorePlugin): void => {
16
16
  plugins.push(plugin);
17
17
  };
18
18
 
19
+ /**
20
+ * Unregisters a previously registered plugin.
21
+ *
22
+ * Removes the first matching registration by reference identity. Subsequent
23
+ * stores created via `defineStore()` will no longer receive the plugin's
24
+ * extensions; already-created stores keep any previously applied extensions.
25
+ *
26
+ * @param plugin - The plugin function passed to {@link registerPlugin}
27
+ * @returns `true` if the plugin was found and removed, `false` otherwise
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * import { registerPlugin, unregisterPlugin } from '@bquery/bquery/store';
32
+ *
33
+ * const logger = ({ store }) => {
34
+ * store.$subscribe(console.log);
35
+ * };
36
+ *
37
+ * registerPlugin(logger);
38
+ * // …later
39
+ * unregisterPlugin(logger); // → true
40
+ * ```
41
+ */
42
+ export const unregisterPlugin = (plugin: StorePlugin): boolean => {
43
+ const index = plugins.indexOf(plugin);
44
+ if (index === -1) return false;
45
+ plugins.splice(index, 1);
46
+ return true;
47
+ };
48
+
49
+ /**
50
+ * Removes all registered store plugins.
51
+ *
52
+ * Useful in test teardown to ensure plugin state does not leak between
53
+ * test cases or between independently authored test files.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * import { clearPlugins } from '@bquery/bquery/store';
58
+ *
59
+ * afterEach(() => clearPlugins());
60
+ * ```
61
+ */
62
+ export const clearPlugins = (): void => {
63
+ plugins.length = 0;
64
+ };
65
+
19
66
  /** @internal */
20
67
  export const applyPlugins = (
21
68
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -23,7 +70,7 @@ export const applyPlugins = (
23
70
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
71
  options: StoreDefinition<any, any, any>
25
72
  ): void => {
26
- for (const plugin of plugins) {
73
+ for (const plugin of [...plugins]) {
27
74
  const extension = plugin({ store, options });
28
75
  if (extension) {
29
76
  Object.assign(store, extension);
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-QdyKtCS1.js","names":[],"sources":["../src/server/create-server.ts"],"sourcesContent":["import { isPrototypePollutionKey } from '../core/utils/object';\nimport { sanitizeHtml } from '../security/index';\nimport { renderToString, serializeStoreState } from '../ssr/index';\nimport type {\n CreateServerOptions,\n ServerApp,\n ServerContext,\n ServerHandler,\n ServerHtmlResponseInit,\n ServerMiddleware,\n ServerNext,\n ServerQuery,\n ServerRenderResponseOptions,\n ServerResult,\n ServerRequestInit,\n ServerResponseInit,\n ServerRoute,\n ServerWebSocketConnection,\n ServerWebSocketHandlerSet,\n ServerWebSocketMiddleware,\n ServerWebSocketNext,\n ServerWebSocketPeer,\n ServerWebSocketRouteHandler,\n ServerWebSocketSession,\n} from './types';\n\ninterface CompiledRoute {\n handler: ServerHandler;\n methods: Set<string> | null;\n middlewares: ServerMiddleware[];\n paramNames: string[];\n path: string;\n pattern: RegExp;\n}\n\ntype CompiledWebSocketRoute = Omit<CompiledRoute, 'handler' | 'middlewares'> & {\n handler: ServerWebSocketRouteHandler<unknown>;\n middlewares: ServerWebSocketMiddleware[];\n};\n\ntype PipelineHandler = (context: ServerContext, next: ServerNext) => Response | Promise<Response>;\ntype WebSocketPipelineHandler = (\n context: ServerContext,\n next: ServerWebSocketNext\n) => ServerResult | Promise<ServerResult>;\n\nconst DEFAULT_BASE_URL = 'http://localhost';\nconst JSON_ESCAPE_LOOKUP: Record<string, string> = {\n '<': '\\\\u003C',\n '>': '\\\\u003E',\n '&': '\\\\u0026',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n};\nconst JSON_ESCAPE_PATTERN = /[<>&\\u2028\\u2029]/g;\nconst METHOD_ALL = null;\nconst WEBSOCKET_PASSTHROUGH_HEADER = 'x-bquery-websocket-passthrough';\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n/**\n * Creates a null-prototype dictionary for request-derived data.\n *\n * Request-controlled keys such as query params and route params must never write\n * into the default object prototype, otherwise names like `__proto__` can trigger\n * prototype-pollution bugs. Using `Object.create(null)` keeps these maps isolated\n * even before higher-level validation runs.\n */\nconst createDictionary = <T>(): Record<string, T> => Object.create(null) as Record<string, T>;\n\nconst normalizePath = (path: string): string => {\n if (!path) {\n throw new Error(`route path must be a non-empty string; received ${String(path)}`);\n }\n\n if (path === '*' || path === '/*') {\n return '/*';\n }\n\n const withLeadingSlash = path.startsWith('/') ? path : `/${path}`;\n if (withLeadingSlash.length > 1 && withLeadingSlash.endsWith('/')) {\n return withLeadingSlash.slice(0, -1);\n }\n\n return withLeadingSlash;\n};\n\nconst compileRoutePath = (path: string): Pick<CompiledRoute, 'paramNames' | 'path' | 'pattern'> => {\n const normalizedPath = normalizePath(path);\n\n if (normalizedPath === '/*') {\n return { path: normalizedPath, paramNames: [], pattern: /^\\/.*$/ };\n }\n\n const segments = normalizedPath.split('/').filter(Boolean);\n if (segments.length === 0) {\n return { path: normalizedPath, paramNames: [], pattern: /^\\/$/ };\n }\n\n const paramNames: string[] = [];\n let source = '^';\n\n for (const [index, segment] of segments.entries()) {\n source += '/';\n if (segment === '*') {\n if (index !== segments.length - 1) {\n throw new Error(`invalid route path: \"*\" must be the final segment in \"${normalizedPath}\"`);\n }\n source += '.*';\n break;\n }\n\n if (segment.startsWith(':')) {\n const paramName = segment.slice(1);\n if (!/^[A-Za-z_$][\\w$]*$/.test(paramName)) {\n throw new Error(\n `invalid route param name: ${paramName} - must start with a letter, $, or _ and contain only word characters`\n );\n }\n if (isPrototypePollutionKey(paramName)) {\n throw new Error(`invalid route param name: ${paramName} - reserved for object safety`);\n }\n paramNames.push(paramName);\n source += '([^/]+)';\n continue;\n }\n\n source += escapeRegex(segment);\n }\n\n source += '/?$';\n return { path: normalizedPath, paramNames, pattern: new RegExp(source) };\n};\n\nconst normalizeMethods = (method?: string | string[]): Set<string> | null => {\n if (typeof method === 'undefined') {\n return METHOD_ALL;\n }\n\n const values = Array.isArray(method) ? method : [method];\n if (values.length === 0) {\n throw new Error('route method must be specified - received empty array');\n }\n\n const normalizedMethods = new Set(\n values.map((value) => value.trim().toUpperCase()).filter(Boolean)\n );\n if (normalizedMethods.size === 0) {\n throw new Error(\n `route method must include at least one non-empty method string; received ${JSON.stringify(method)}`\n );\n }\n\n return normalizedMethods;\n};\n\nconst parseQuery = (url: URL): ServerQuery => {\n const query = createDictionary<string | string[] | undefined>() as ServerQuery;\n\n for (const [key, value] of url.searchParams.entries()) {\n if (isPrototypePollutionKey(key)) {\n continue;\n }\n const current = query[key];\n if (typeof current === 'undefined') {\n query[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n query[key] = [current, value];\n }\n }\n\n return query;\n};\n\nconst normalizeUrl = (value: string | URL, baseUrl: string): URL => {\n return value instanceof URL ? new URL(value.toString()) : new URL(value, baseUrl);\n};\n\nconst normalizeRequest = (\n input: Request | string | URL | ServerRequestInit,\n baseUrl: string\n): Request => {\n if (input instanceof Request) {\n return input;\n }\n\n if (typeof input === 'string' || input instanceof URL) {\n return new Request(normalizeUrl(input, baseUrl).toString());\n }\n\n const { url, method = 'GET', headers, body = null } = input;\n return new Request(normalizeUrl(url, baseUrl).toString(), { method, headers, body });\n};\n\nconst normalizeWebSocketProtocols = (protocols?: string | string[]): string[] => {\n if (typeof protocols === 'undefined') {\n return [];\n }\n\n const values = Array.isArray(protocols) ? protocols : [protocols];\n return [...new Set(values.map((value) => value.trim()).filter(Boolean))];\n};\n\nconst defaultDeserialize = <TReceive>(event: MessageEvent): TReceive => {\n const raw = event.data;\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw) as TReceive;\n } catch {\n // Match `useWebSocket()` in `src/reactive/websocket.ts`: malformed JSON\n // payloads fall back to the original string instead of throwing.\n return raw as TReceive;\n }\n }\n\n return raw as TReceive;\n};\n\nconst escapeJsonString = (value: string): string =>\n value.replace(JSON_ESCAPE_PATTERN, (match) => JSON_ESCAPE_LOOKUP[match]);\n\nconst createHeaders = (headers?: HeadersInit): Headers => new Headers(headers);\n\nconst withContentType = (headers: Headers, contentType: string): Headers => {\n if (!headers.has('content-type')) {\n headers.set('content-type', contentType);\n }\n return headers;\n};\n\nconst response = (body?: BodyInit | null, init: ServerResponseInit = {}): Response => {\n const { headers, ...rest } = init;\n return new Response(body, { ...rest, headers: createHeaders(headers) });\n};\n\nconst text = (body: string, init: ServerResponseInit = {}): Response => {\n const headers = withContentType(createHeaders(init.headers), 'text/plain; charset=utf-8');\n return response(body, { ...init, headers });\n};\n\nconst html = (body: string, init: ServerHtmlResponseInit = {}): Response => {\n const { trusted = false, ...rest } = init;\n const headers = withContentType(createHeaders(rest.headers), 'text/html; charset=utf-8');\n return response(trusted ? body : sanitizeHtml(body), { ...rest, headers });\n};\n\nconst json = (data: unknown, init: ServerResponseInit = {}): Response => {\n const headers = withContentType(createHeaders(init.headers), 'application/json; charset=utf-8');\n let serialized: string;\n try {\n serialized = JSON.stringify(data) ?? 'null';\n } catch {\n serialized = 'null';\n }\n return response(escapeJsonString(serialized), { ...init, headers });\n};\n\nconst redirect = (location: string | URL, status = 302): Response => {\n const headers = createHeaders({ location: location.toString() });\n return response(null, { headers, status });\n};\n\nconst render = (\n template: string,\n data: Parameters<typeof renderToString>[1],\n options: ServerRenderResponseOptions = {}\n): Response => {\n const { includeStoreState = false, status = 200, headers, ...renderOptions } = options;\n const result = renderToString(template, data, { ...renderOptions, includeStoreState: false });\n const storeState = includeStoreState\n ? serializeStoreState({\n storeIds: Array.isArray(includeStoreState) ? includeStoreState : undefined,\n }).scriptTag\n : '';\n const body = `${result.html}${storeState}`;\n return html(body, { headers, status, trusted: true });\n};\n\n/**\n * Returns `true` when the request is a WebSocket upgrade handshake.\n */\nexport const isWebSocketRequest = (request: Request): boolean => {\n if (request.method.toUpperCase() !== 'GET') {\n return false;\n }\n\n const upgrade = request.headers.get('upgrade');\n if (typeof upgrade !== 'string' || upgrade.trim().toLowerCase() !== 'websocket') {\n return false;\n }\n\n const connection = request.headers.get('connection');\n if (typeof connection !== 'string') {\n return false;\n }\n\n if (!connection.split(',').some((part) => part.trim().toLowerCase() === 'upgrade')) {\n return false;\n }\n\n const version = request.headers.get('sec-websocket-version');\n if (version?.trim() !== '13') {\n return false;\n }\n\n const key = request.headers.get('sec-websocket-key')?.trim();\n return typeof key === 'string' && /^[A-Za-z0-9+/]{22}==$/.test(key);\n};\n\n/**\n * Type guard for values returned by `handleWebSocket()`.\n */\nexport const isServerWebSocketSession = (value: unknown): value is ServerWebSocketSession => {\n if (typeof value !== 'object' || value === null || value instanceof Response) {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.open === 'function' &&\n typeof candidate.message === 'function' &&\n typeof candidate.close === 'function' &&\n typeof candidate.error === 'function'\n );\n};\n\nconst createWebSocketConnectionFactory = () => {\n const cache = new WeakMap<object, ServerWebSocketConnection>();\n\n return (socket: ServerWebSocketPeer): ServerWebSocketConnection => {\n const existing = cache.get(socket);\n if (existing) {\n return existing;\n }\n\n const connection: ServerWebSocketConnection = {\n get protocol() {\n return socket.protocol;\n },\n get readyState() {\n return socket.readyState;\n },\n get url() {\n return socket.url;\n },\n send(data) {\n socket.send(data);\n },\n sendJson(data) {\n const payload = JSON.stringify(data);\n if (typeof payload !== 'string') {\n throw new TypeError('socket.sendJson() does not support undefined values');\n }\n socket.send(payload);\n },\n close(code, reason) {\n socket.close(code, reason);\n },\n };\n\n cache.set(socket, connection);\n return connection;\n };\n};\n\nconst createWebSocketSession = <TReceive>(\n context: ServerContext,\n handlers: ServerWebSocketHandlerSet<TReceive>\n): ServerWebSocketSession => {\n const toConnection = createWebSocketConnectionFactory();\n const deserialize = handlers.deserialize ?? defaultDeserialize<TReceive>;\n\n return {\n context,\n protocols: normalizeWebSocketProtocols(handlers.protocols),\n headers: handlers.headers,\n async open(socket) {\n if (handlers.onOpen) {\n await handlers.onOpen(toConnection(socket), context);\n }\n },\n async message(socket, event) {\n if (handlers.onMessage) {\n await handlers.onMessage(deserialize(event), toConnection(socket), context, event);\n }\n },\n async close(socket, event) {\n if (handlers.onClose) {\n await handlers.onClose(event, toConnection(socket), context);\n }\n },\n async error(socket, event) {\n if (handlers.onError) {\n await handlers.onError(event, toConnection(socket), context);\n }\n },\n };\n};\n\nconst createWebSocketPassthroughResponse = (): Response => {\n const headers = createHeaders({\n [WEBSOCKET_PASSTHROUGH_HEADER]: '1',\n });\n return response(null, { headers, status: 204 });\n};\n\nconst isWebSocketPassthroughResponse = (value: Response): boolean => {\n return value.headers.get(WEBSOCKET_PASSTHROUGH_HEADER) === '1';\n};\n\nconst matchRoute = (\n route: Pick<CompiledRoute, 'methods' | 'paramNames' | 'pattern'>,\n method: string,\n path: string\n): Record<string, string> | null => {\n if (route.methods && !route.methods.has(method)) {\n return null;\n }\n\n const match = route.pattern.exec(path);\n if (!match) {\n return null;\n }\n\n const params = createDictionary<string>();\n for (const [index, paramName] of route.paramNames.entries()) {\n try {\n params[paramName] = decodeURIComponent(match[index + 1] ?? '');\n } catch (error) {\n if (error instanceof URIError) {\n return null;\n }\n throw error;\n }\n }\n\n return params;\n};\n\nconst resolveMatchingRoute = <TRoute extends CompiledRoute | CompiledWebSocketRoute>(\n routes: TRoute[],\n method: string,\n path: string,\n context: ServerContext\n): TRoute | null => {\n for (const candidate of routes) {\n const params = matchRoute(candidate, method, path);\n if (!params) {\n continue;\n }\n context.params = params;\n return candidate;\n }\n\n return null;\n};\n\nconst runPipeline = async (\n context: ServerContext,\n handlers: PipelineHandler[],\n terminal: ServerNext\n): Promise<Response> => {\n const dispatch = async (index: number): Promise<Response> => {\n const current = handlers[index];\n if (!current) {\n return terminal();\n }\n\n let advanced = false;\n return await current(context, async () => {\n if (advanced) {\n throw new Error(\n 'middleware next() called multiple times - if a middleware calls next(), it may only do so once'\n );\n }\n advanced = true;\n return await dispatch(index + 1);\n });\n };\n\n return await dispatch(0);\n};\n\nconst runWebSocketPipeline = async (\n context: ServerContext,\n handlers: WebSocketPipelineHandler[],\n terminal: ServerWebSocketNext\n): Promise<ServerResult> => {\n const dispatch = async (index: number): Promise<ServerResult> => {\n const current = handlers[index];\n if (!current) {\n return terminal();\n }\n\n let advanced = false;\n return await current(context, async () => {\n if (advanced) {\n throw new Error(\n 'middleware next() called multiple times - if a middleware calls next(), it may only do so once'\n );\n }\n advanced = true;\n return await dispatch(index + 1);\n });\n };\n\n return await dispatch(0);\n};\n\nconst adaptHttpMiddlewareToWebSocket = (middleware: ServerMiddleware): WebSocketPipelineHandler => {\n return async (context, next) => {\n let downstream: ServerResult = null;\n let downstreamResponse: Response | null = null;\n const middlewareResponse = await middleware(context, async () => {\n downstream = await next();\n if (downstream instanceof Response) {\n downstreamResponse = downstream;\n return downstream;\n }\n return createWebSocketPassthroughResponse();\n });\n\n if (downstreamResponse) {\n return middlewareResponse;\n }\n\n if (middlewareResponse instanceof Response && isWebSocketPassthroughResponse(middlewareResponse)) {\n return downstream;\n }\n\n return middlewareResponse;\n };\n};\n\nconst compileRoute = (route: ServerRoute): CompiledRoute => {\n const compiledPath = compileRoutePath(route.path);\n return {\n handler: route.handler,\n methods: normalizeMethods(route.method),\n middlewares: route.middlewares ?? [],\n paramNames: compiledPath.paramNames,\n path: compiledPath.path,\n pattern: compiledPath.pattern,\n };\n};\n\n/**\n * Create a lightweight, Express-inspired request pipeline for SSR-aware\n * backends without introducing runtime dependencies.\n *\n * @example\n * ```ts\n * import { createServer } from '@bquery/bquery/server';\n *\n * const app = createServer();\n * app.get('/health', (ctx) => ctx.json({ ok: true }));\n *\n * const response = await app.handle('/health');\n * ```\n */\nexport const createServer = (options: CreateServerOptions = {}): ServerApp => {\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n const middlewares = [...(options.middlewares ?? [])];\n const routes: CompiledRoute[] = [];\n const webSocketRoutes: CompiledWebSocketRoute[] = [];\n\n const notFound =\n options.notFound ??\n ((context: ServerContext) => {\n return context.text('Not Found', { status: 404 });\n });\n\n const onError =\n options.onError ??\n ((error: unknown, context: ServerContext) => {\n if (error instanceof Response) {\n return error;\n }\n return context.text('Internal Server Error', { status: 500 });\n });\n\n const addRoute = (\n method: string | string[] | undefined,\n path: string,\n handler: ServerHandler,\n routeMiddlewares?: ServerMiddleware[]\n ): ServerApp => {\n routes.push(\n compileRoute({\n handler,\n method,\n middlewares: routeMiddlewares,\n path,\n })\n );\n return app;\n };\n\n const addWebSocketRoute = (\n path: string,\n handler: ServerWebSocketRouteHandler<unknown>,\n routeMiddlewares?: ServerWebSocketMiddleware[]\n ): ServerApp => {\n const compiledPath = compileRoutePath(path);\n webSocketRoutes.push({\n handler,\n methods: new Set(['GET']),\n middlewares: routeMiddlewares ?? [],\n paramNames: compiledPath.paramNames,\n path: compiledPath.path,\n pattern: compiledPath.pattern,\n });\n return app;\n };\n\n const app: ServerApp = {\n use(middleware) {\n middlewares.push(middleware);\n return app;\n },\n\n add(route) {\n routes.push(compileRoute(route));\n return app;\n },\n\n get(path, handler, routeMiddlewares) {\n return addRoute('GET', path, handler, routeMiddlewares);\n },\n\n post(path, handler, routeMiddlewares) {\n return addRoute('POST', path, handler, routeMiddlewares);\n },\n\n put(path, handler, routeMiddlewares) {\n return addRoute('PUT', path, handler, routeMiddlewares);\n },\n\n patch(path, handler, routeMiddlewares) {\n return addRoute('PATCH', path, handler, routeMiddlewares);\n },\n\n delete(path, handler, routeMiddlewares) {\n return addRoute('DELETE', path, handler, routeMiddlewares);\n },\n\n all(path, handler, routeMiddlewares) {\n return addRoute(undefined, path, handler, routeMiddlewares);\n },\n\n ws(path, handler, routeMiddlewares) {\n return addWebSocketRoute(path, handler as ServerWebSocketRouteHandler<unknown>, routeMiddlewares);\n },\n\n async handle(input) {\n const request = normalizeRequest(input, baseUrl);\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const path = normalizePath(url.pathname || '/');\n const query = parseQuery(url);\n\n const context: ServerContext = {\n request,\n url,\n method,\n path,\n params: createDictionary<string>(),\n query,\n state: {},\n response,\n text,\n html,\n json,\n redirect,\n render,\n isWebSocketRequest: isWebSocketRequest(request),\n };\n\n try {\n const route = resolveMatchingRoute(routes, method, path, context);\n\n if (!route) {\n return await notFound(context);\n }\n\n const stack: PipelineHandler[] = [\n ...middlewares,\n ...route.middlewares,\n async (ctx) => await route.handler(ctx),\n ];\n\n const result = await runPipeline(context, stack, async () => {\n return await notFound(context);\n });\n return result;\n } catch (error) {\n return await onError(error, context);\n }\n },\n\n async handleWebSocket(input) {\n const request = normalizeRequest(input, baseUrl);\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const path = normalizePath(url.pathname || '/');\n const query = parseQuery(url);\n\n const context: ServerContext = {\n request,\n url,\n method,\n path,\n params: createDictionary<string>(),\n query,\n state: {},\n response,\n text,\n html,\n json,\n redirect,\n render,\n isWebSocketRequest: isWebSocketRequest(request),\n };\n\n if (!context.isWebSocketRequest) {\n return null;\n }\n\n try {\n const route = resolveMatchingRoute(webSocketRoutes, method, path, context);\n if (!route) {\n return null;\n }\n\n const stack: WebSocketPipelineHandler[] = [\n ...middlewares.map(adaptHttpMiddlewareToWebSocket),\n ...route.middlewares,\n ];\n return await runWebSocketPipeline(context, stack, async () => {\n const handlers =\n typeof route.handler === 'function'\n ? await route.handler(context)\n : route.handler;\n return createWebSocketSession(context, handlers as ServerWebSocketHandlerSet<unknown>);\n });\n } catch (error) {\n return await onError(error, context);\n }\n },\n };\n\n return app;\n};\n"],"mappings":"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"}