elysia 2.0.0-beta.12 → 2.0.0-beta.13

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 (51) hide show
  1. package/dist/adapter/bun/index.js +28 -17
  2. package/dist/adapter/bun/index.mjs +28 -17
  3. package/dist/adapter/utils.js +1 -0
  4. package/dist/adapter/utils.mjs +1 -0
  5. package/dist/adapter/web-standard/handler.js +2 -2
  6. package/dist/adapter/web-standard/handler.mjs +2 -2
  7. package/dist/compile/aot-emit.js +1 -1
  8. package/dist/compile/aot-emit.mjs +1 -1
  9. package/dist/compile/aot.d.ts +1 -1
  10. package/dist/compile/aot.js +2 -2
  11. package/dist/compile/aot.mjs +2 -2
  12. package/dist/compile/handler/descriptor.d.ts +2 -3
  13. package/dist/compile/handler/descriptor.js +6 -16
  14. package/dist/compile/handler/descriptor.mjs +7 -16
  15. package/dist/compile/handler/index.d.ts +1 -1
  16. package/dist/compile/handler/index.js +15 -6
  17. package/dist/compile/handler/index.mjs +15 -6
  18. package/dist/compile/handler/jit.js +71 -66
  19. package/dist/compile/handler/jit.mjs +72 -67
  20. package/dist/compile/handler/params.js +3 -2
  21. package/dist/compile/handler/params.mjs +4 -3
  22. package/dist/compile/handler/static-clone-resolver.d.ts +6 -0
  23. package/dist/compile/handler/static-clone-resolver.js +8 -0
  24. package/dist/compile/handler/static-clone-resolver.mjs +7 -0
  25. package/dist/compile/handler/utils.d.ts +7 -6
  26. package/dist/compile/handler/utils.js +23 -18
  27. package/dist/compile/handler/utils.mjs +23 -19
  28. package/dist/compile/utils.js +7 -4
  29. package/dist/compile/utils.mjs +7 -4
  30. package/dist/cookie/lib.js +2 -1
  31. package/dist/cookie/lib.mjs +2 -1
  32. package/dist/cookie/utils.d.ts +1 -1
  33. package/dist/cookie/utils.js +9 -23
  34. package/dist/cookie/utils.mjs +9 -23
  35. package/dist/handler/error.js +3 -4
  36. package/dist/handler/error.mjs +3 -4
  37. package/dist/handler/fetch.js +17 -13
  38. package/dist/handler/fetch.mjs +17 -13
  39. package/dist/package.js +1 -1
  40. package/dist/package.mjs +1 -1
  41. package/dist/plugin/aot/core.d.ts +2 -0
  42. package/dist/plugin/aot/core.js +6 -0
  43. package/dist/plugin/aot/core.mjs +6 -0
  44. package/dist/plugin/aot/hooks.js +5 -1
  45. package/dist/plugin/aot/hooks.mjs +5 -1
  46. package/dist/trace.js +14 -5
  47. package/dist/trace.mjs +14 -5
  48. package/dist/type/constants.d.ts +1 -1
  49. package/dist/types.d.ts +5 -4
  50. package/dist/utils.d.ts +0 -1
  51. package/package.json +4 -4
@@ -167,12 +167,10 @@ const BunAdapter = require_adapter_index.createAdapter({
167
167
  response: require_adapter_web_standard_index.WebStandardAdapter.response,
168
168
  listen(app, options, callback) {
169
169
  if (app.server || app["~ext"]?.stop) throw new Error("[Elysia] Cannot call listen() while a server or teardown is active");
170
+ const requestReady = Promise.withResolvers();
170
171
  function gatedFetch(request, server) {
171
- return live ? live(request, server) : Promise.resolve(ready).then(async () => {
172
- if (!live) {
173
- await startupShutdown;
174
- throw new Error("[Elysia] Server was stopped before it was ready");
175
- }
172
+ return live && !cancelled ? live(request, server) : requestReady.promise.then(() => {
173
+ if (cancelled || !live) return unavailableFetch();
176
174
  return live(request, server);
177
175
  });
178
176
  }
@@ -194,7 +192,6 @@ const BunAdapter = require_adapter_index.createAdapter({
194
192
  } : serve);
195
193
  let live;
196
194
  let cancelled = false;
197
- let startupShutdown;
198
195
  let shutdownAttempt;
199
196
  let ready;
200
197
  let wsLifecycle;
@@ -280,7 +277,9 @@ const BunAdapter = require_adapter_index.createAdapter({
280
277
  };
281
278
  const nativeStop = async (closeActiveConnections, errors) => {
282
279
  try {
283
- await server.stop(closeActiveConnections);
280
+ const stopping = server.stop(closeActiveConnections);
281
+ await (closeActiveConnections ? stopping : Promise.race([stopping, force.promise]));
282
+ if (!closeActiveConnections && forceRequested && !forceDone) return false;
284
283
  nativeStopped = true;
285
284
  if (closeActiveConnections) {
286
285
  forceDone = true;
@@ -368,6 +367,7 @@ const BunAdapter = require_adapter_index.createAdapter({
368
367
  if (!forceDone) forceRequested = true;
369
368
  }
370
369
  cancelled = true;
370
+ requestReady.resolve();
371
371
  clearAppServer(app, server);
372
372
  let outcome;
373
373
  if (shutdownAttempt) {
@@ -436,7 +436,6 @@ const BunAdapter = require_adapter_index.createAdapter({
436
436
  }
437
437
  })().then(resolve, reject);
438
438
  }
439
- if (!published) startupShutdown ??= outcome;
440
439
  if (!reentrant) return outcome;
441
440
  if (observedOutcome !== outcome) {
442
441
  observedOutcome = outcome;
@@ -448,18 +447,30 @@ const BunAdapter = require_adapter_index.createAdapter({
448
447
  };
449
448
  ext.stop = stop;
450
449
  const publish = () => {
451
- if (cancelled || app.server !== server) return;
452
- built ??= build();
453
- live = serve.fetch = withOrigin(built.fetch);
454
- published = true;
455
- if (built.websocket) serve.websocket = built.websocket;
456
- if (built.routes) serve.routes = built.routes;
457
- reloadServer(server, serve);
458
- if (callback) callback(server);
450
+ if (cancelled || app.server !== server) {
451
+ requestReady.resolve();
452
+ return;
453
+ }
454
+ try {
455
+ built ??= build();
456
+ live = serve.fetch = withOrigin(built.fetch);
457
+ published = true;
458
+ if (built.websocket) serve.websocket = built.websocket;
459
+ if (built.routes) serve.routes = built.routes;
460
+ reloadServer(server, serve);
461
+ if (callback) callback(server);
462
+ } catch (error) {
463
+ startupFailure ??= { error };
464
+ throw error;
465
+ }
466
+ requestReady.resolve();
459
467
  };
460
468
  const start = () => {
461
469
  modulesReady = void 0;
462
- if (cancelled || app.server !== server) return;
470
+ if (cancelled || app.server !== server) {
471
+ requestReady.resolve();
472
+ return;
473
+ }
463
474
  const setupReady = setup();
464
475
  if (setupReady && typeof setupReady.then === "function") return Promise.resolve(setupReady).then(publish);
465
476
  publish();
@@ -166,12 +166,10 @@ const BunAdapter = createAdapter({
166
166
  response: WebStandardAdapter.response,
167
167
  listen(app, options, callback) {
168
168
  if (app.server || app["~ext"]?.stop) throw new Error("[Elysia] Cannot call listen() while a server or teardown is active");
169
+ const requestReady = Promise.withResolvers();
169
170
  function gatedFetch(request, server) {
170
- return live ? live(request, server) : Promise.resolve(ready).then(async () => {
171
- if (!live) {
172
- await startupShutdown;
173
- throw new Error("[Elysia] Server was stopped before it was ready");
174
- }
171
+ return live && !cancelled ? live(request, server) : requestReady.promise.then(() => {
172
+ if (cancelled || !live) return unavailableFetch();
175
173
  return live(request, server);
176
174
  });
177
175
  }
@@ -193,7 +191,6 @@ const BunAdapter = createAdapter({
193
191
  } : serve);
194
192
  let live;
195
193
  let cancelled = false;
196
- let startupShutdown;
197
194
  let shutdownAttempt;
198
195
  let ready;
199
196
  let wsLifecycle;
@@ -279,7 +276,9 @@ const BunAdapter = createAdapter({
279
276
  };
280
277
  const nativeStop = async (closeActiveConnections, errors) => {
281
278
  try {
282
- await server.stop(closeActiveConnections);
279
+ const stopping = server.stop(closeActiveConnections);
280
+ await (closeActiveConnections ? stopping : Promise.race([stopping, force.promise]));
281
+ if (!closeActiveConnections && forceRequested && !forceDone) return false;
283
282
  nativeStopped = true;
284
283
  if (closeActiveConnections) {
285
284
  forceDone = true;
@@ -367,6 +366,7 @@ const BunAdapter = createAdapter({
367
366
  if (!forceDone) forceRequested = true;
368
367
  }
369
368
  cancelled = true;
369
+ requestReady.resolve();
370
370
  clearAppServer(app, server);
371
371
  let outcome;
372
372
  if (shutdownAttempt) {
@@ -435,7 +435,6 @@ const BunAdapter = createAdapter({
435
435
  }
436
436
  })().then(resolve, reject);
437
437
  }
438
- if (!published) startupShutdown ??= outcome;
439
438
  if (!reentrant) return outcome;
440
439
  if (observedOutcome !== outcome) {
441
440
  observedOutcome = outcome;
@@ -447,18 +446,30 @@ const BunAdapter = createAdapter({
447
446
  };
448
447
  ext.stop = stop;
449
448
  const publish = () => {
450
- if (cancelled || app.server !== server) return;
451
- built ??= build();
452
- live = serve.fetch = withOrigin(built.fetch);
453
- published = true;
454
- if (built.websocket) serve.websocket = built.websocket;
455
- if (built.routes) serve.routes = built.routes;
456
- reloadServer(server, serve);
457
- if (callback) callback(server);
449
+ if (cancelled || app.server !== server) {
450
+ requestReady.resolve();
451
+ return;
452
+ }
453
+ try {
454
+ built ??= build();
455
+ live = serve.fetch = withOrigin(built.fetch);
456
+ published = true;
457
+ if (built.websocket) serve.websocket = built.websocket;
458
+ if (built.routes) serve.routes = built.routes;
459
+ reloadServer(server, serve);
460
+ if (callback) callback(server);
461
+ } catch (error) {
462
+ startupFailure ??= { error };
463
+ throw error;
464
+ }
465
+ requestReady.resolve();
458
466
  };
459
467
  const start = () => {
460
468
  modulesReady = void 0;
461
- if (cancelled || app.server !== server) return;
469
+ if (cancelled || app.server !== server) {
470
+ requestReady.resolve();
471
+ return;
472
+ }
462
473
  const setupReady = setup();
463
474
  if (setupReady && typeof setupReady.then === "function") return Promise.resolve(setupReady).then(publish);
464
475
  publish();
@@ -145,6 +145,7 @@ function enqueueBinaryChunk(controller, chunk) {
145
145
  }
146
146
  function createStreamHandler({ mapResponse, mapCompactResponse }) {
147
147
  return async (generator, set, request, skipFormat, owned = false) => {
148
+ if (request === null) return void 0;
148
149
  if (require_utils.isByteStream(generator)) {
149
150
  if (generator.locked) throw new TypeError("Cannot transfer a locked or consumed byte stream");
150
151
  if (set) {
@@ -144,6 +144,7 @@ function enqueueBinaryChunk(controller, chunk) {
144
144
  }
145
145
  function createStreamHandler({ mapResponse, mapCompactResponse }) {
146
146
  return async (generator, set, request, skipFormat, owned = false) => {
147
+ if (request === null) return void 0;
147
148
  if (isByteStream(generator)) {
148
149
  if (generator.locked) throw new TypeError("Cannot transfer a locked or consumed byte stream");
149
150
  if (set) {
@@ -137,11 +137,11 @@ function mapFallback(response, set, request, owned = false) {
137
137
  status: response.status,
138
138
  headers: response.headers ? { ...response.headers } : {}
139
139
  }, request, owned);
140
- if (response instanceof require_universal_file.ElysiaFile) return handleElysiaFile(response, void 0, request);
140
+ if (response instanceof require_universal_file.ElysiaFile) return handleElysiaFile(response, set, request);
141
141
  if (require_utils.isElysiaForm(response)) return new Response(require_utils.formToFormData(response), set);
142
142
  if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
143
143
  if (typeof response?.then === "function") return response.then((x) => set ? mapResponse(x, set, request, owned) : mapCompactResponse(x, request, owned));
144
- if (Array.isArray(response)) return Response.json(response);
144
+ if (Array.isArray(response)) return Response.json(response, set);
145
145
  if (typeof response?.toResponse === "function") return set ? mapResponse(response.toResponse(), set, request, owned) : mapCompactResponse(response.toResponse(), request, owned);
146
146
  if (responseTag(response) === "Cookie" && require_cookie_cookie.Cookie.isCookie(response)) return set ? mapResponse(response.value, set, request, owned) : mapCompactResponse(response.value, request, owned);
147
147
  return new Response(response, set);
@@ -136,11 +136,11 @@ function mapFallback(response, set, request, owned = false) {
136
136
  status: response.status,
137
137
  headers: response.headers ? { ...response.headers } : {}
138
138
  }, request, owned);
139
- if (response instanceof ElysiaFile) return handleElysiaFile(response, void 0, request);
139
+ if (response instanceof ElysiaFile) return handleElysiaFile(response, set, request);
140
140
  if (isElysiaForm(response)) return new Response(formToFormData(response), set);
141
141
  if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
142
142
  if (typeof response?.then === "function") return response.then((x) => set ? mapResponse(x, set, request, owned) : mapCompactResponse(x, request, owned));
143
- if (Array.isArray(response)) return Response.json(response);
143
+ if (Array.isArray(response)) return Response.json(response, set);
144
144
  if (typeof response?.toResponse === "function") return set ? mapResponse(response.toResponse(), set, request, owned) : mapCompactResponse(response.toResponse(), request, owned);
145
145
  if (responseTag(response) === "Cookie" && Cookie.isCookie(response)) return set ? mapResponse(response.value, set, request, owned) : mapCompactResponse(response.value, request, owned);
146
146
  return new Response(response, set);
@@ -28,7 +28,7 @@ function reconstructCheckCode(build) {
28
28
  const { defs, value } = reconstructCheck(build);
29
29
  return checkCode(defs, value);
30
30
  }
31
- const checkFactorySource = (identifier, code) => `function(${identifier}){${code}}`;
31
+ const checkFactorySource = (identifier, code) => `(${identifier})=>{${code}}`;
32
32
  const handlerFactorySource = (alias, code) => `function(h${alias ? "," + alias : ""}){return ${code}}`;
33
33
  function externalsMatch(a, b) {
34
34
  if (a.length !== b.length) return false;
@@ -27,7 +27,7 @@ function reconstructCheckCode(build) {
27
27
  const { defs, value } = reconstructCheck(build);
28
28
  return checkCode(defs, value);
29
29
  }
30
- const checkFactorySource = (identifier, code) => `function(${identifier}){${code}}`;
30
+ const checkFactorySource = (identifier, code) => `(${identifier})=>{${code}}`;
31
31
  const handlerFactorySource = (alias, code) => `function(h${alias ? "," + alias : ""}){return ${code}}`;
32
32
  function externalsMatch(a, b) {
33
33
  if (a.length !== b.length) return false;
@@ -1,6 +1,6 @@
1
1
  import { CoerceNode } from "../type/coerce-plan.js";
2
2
  //#region src/compile/aot.d.ts
3
- declare const AOT_MANIFEST_FORMAT = 3;
3
+ declare const AOT_MANIFEST_FORMAT = 4;
4
4
  declare const AOT_ABI: string;
5
5
  interface AotFingerprint {
6
6
  abi: string;
@@ -4,8 +4,8 @@ const require_universal_env = require('../universal/env.js');
4
4
  const require_package = require('../package.js');
5
5
 
6
6
  //#region src/compile/aot.ts
7
- const AOT_MANIFEST_FORMAT = 3;
8
- const AOT_ABI = `${require_package.version}:${3}`;
7
+ const AOT_MANIFEST_FORMAT = 4;
8
+ const AOT_ABI = `${require_package.version}:${4}`;
9
9
  const sharedAotFingerprint = Object.freeze({ abi: AOT_ABI });
10
10
  const createAotFingerprint = () => sharedAotFingerprint;
11
11
  let activeSession;
@@ -3,8 +3,8 @@ import { env } from "../universal/env.mjs";
3
3
  import { version } from "../package.mjs";
4
4
 
5
5
  //#region src/compile/aot.ts
6
- const AOT_MANIFEST_FORMAT = 3;
7
- const AOT_ABI = `${version}:${3}`;
6
+ const AOT_MANIFEST_FORMAT = 4;
7
+ const AOT_ABI = `${version}:${4}`;
8
8
  const sharedAotFingerprint = Object.freeze({ abi: AOT_ABI });
9
9
  const createAotFingerprint = () => sharedAotFingerprint;
10
10
  let activeSession;
@@ -65,10 +65,9 @@ interface DescribeRouteInput {
65
65
  * Populated on each JIT compile, and read only by tests and introspection
66
66
  */
67
67
  declare const routeDescriptors: WeakMap<AnyElysia, Map<string, RouteDescriptor>>;
68
- declare function mayReturnIdentifier(fn: Function): boolean;
69
- declare const lifecycleMayReturnPromise: (handlers: MaybeArray<Function> | undefined, observed: boolean) => boolean;
68
+ declare const lifecycleMayReturnPromise: (handlers: MaybeArray<Function> | undefined) => boolean;
70
69
  /** Whether a hook can be skipped by a native static response. */
71
70
  declare function isEmptyPipelineHook(hook: AnyLocalHook | undefined): boolean;
72
71
  declare function describeRoute(input: DescribeRouteInput): RouteCompileState;
73
72
  //#endregion
74
- export { DescribeRouteInput, RouteCompileState, RouteDescriptor, describeRoute, isEmptyPipelineHook, lifecycleMayReturnPromise, mayReturnIdentifier, routeDescriptors };
73
+ export { DescribeRouteInput, RouteCompileState, RouteDescriptor, describeRoute, isEmptyPipelineHook, lifecycleMayReturnPromise, routeDescriptors };
@@ -15,16 +15,7 @@ const require_sucrose = require('../../sucrose.js');
15
15
  */
16
16
  const routeDescriptors = /* @__PURE__ */ new WeakMap();
17
17
  const noTracePhases = /* @__PURE__ */ new Set();
18
- const matchReturnIdentifier = /(?:=>\s*|\breturn\s+)(?!(?:true|false|null|undefined|void|new|typeof|async|await|function|class)\b)[A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*)*\s*(?![\w$([])/;
19
- const mayReturnIdentifierCache = /* @__PURE__ */ new WeakMap();
20
- function mayReturnIdentifier(fn) {
21
- let result = mayReturnIdentifierCache.get(fn);
22
- if (result !== void 0) return result;
23
- result = matchReturnIdentifier.test(fn.toString());
24
- mayReturnIdentifierCache.set(fn, result);
25
- return result;
26
- }
27
- const lifecycleMayReturnPromise = (handlers, observed) => handlers ? Array.isArray(handlers) ? handlers.some((fn) => !require_compile_utils.isAsyncFunction(fn) && (require_compile_utils.mayReturnPromise(fn) || observed && mayReturnIdentifier(fn))) : !require_compile_utils.isAsyncFunction(handlers) && (require_compile_utils.mayReturnPromise(handlers) || observed && mayReturnIdentifier(handlers)) : false;
18
+ const lifecycleMayReturnPromise = (handlers) => handlers ? Array.isArray(handlers) ? handlers.some(require_compile_utils.mayReturnPromise) : require_compile_utils.mayReturnPromise(handlers) : false;
28
19
  const compactPrefixInference = /* @__PURE__ */ new WeakMap();
29
20
  const compactPrefixAsync = /* @__PURE__ */ new WeakMap();
30
21
  const inferCompactPrefix = (prefix) => {
@@ -66,7 +57,7 @@ function compactPrefixForcesAsync(prefix) {
66
57
  const item = pending[i];
67
58
  for (let j = 0; !value && j < item.added.length; j++) {
68
59
  const fn = item.added[j];
69
- value = require_compile_utils.isAsyncFunction(fn) || !require_compile_utils.isAsyncFunction(fn) && (require_compile_utils.mayReturnPromise(fn) || mayReturnIdentifier(fn));
60
+ value = require_compile_utils.mayReturnPromise(fn);
70
61
  }
71
62
  compactPrefixAsync.set(item, value);
72
63
  }
@@ -134,11 +125,11 @@ function describeRoute(input) {
134
125
  }
135
126
  }
136
127
  const handlerIsAsync = isHandleFunction && require_compile_utils.isAsyncFunction(handler);
137
- const errorHookForcesAsync = hasErrorHook && (hasAfterHandle || hasMapResponse || hasResponseValidator || require_compile_utils.isAsyncLifecycle(hook?.error) || lifecycleMayReturnPromise(hook?.error, false));
128
+ const errorHookForcesAsync = hasErrorHook && (hasAfterHandle || hasMapResponse || hasResponseValidator || require_compile_utils.isAsyncLifecycle(hook?.error) || lifecycleMayReturnPromise(hook?.error));
138
129
  const afterResponseForcesAsync = hasStaticAfterResponse && require_compile_utils.isAsyncLifecycle(hook?.afterResponse) || hasAfterResponse && (hasAfterHandle || hasMapResponse || hasResponseValidator || hasErrorHook);
139
- const traceForcesAsync = (traceHandleOn || phaseOn("error") || phaseOn("afterResponse")) && isHandleFunction && !handlerIsAsync && (require_compile_utils.mayReturnPromise(handler) || mayReturnIdentifier(handler));
140
- const handlerResultObserved = isHandleFunction && !handlerIsAsync && (hasResponseValidator || hasAfterHandle || hasMapResponse) && (require_compile_utils.mayReturnPromise(handler) || mayReturnIdentifier(handler));
141
- const lifecycleForcesAsync = !!hook && ((beforeHandlePrefix ? compactPrefixForcesAsync(beforeHandlePrefix) : false) || lifecycleMayReturnPromise(hook.beforeHandle, true) || lifecycleMayReturnPromise(hook.transform, false) || lifecycleMayReturnPromise(hook.afterHandle, true) || lifecycleMayReturnPromise(hook.mapResponse, true));
130
+ const traceForcesAsync = (traceHandleOn || phaseOn("error") || phaseOn("afterResponse")) && isHandleFunction && !handlerIsAsync && require_compile_utils.mayReturnPromise(handler);
131
+ const handlerResultObserved = isHandleFunction && !handlerIsAsync && (hasResponseValidator || hasAfterHandle || hasMapResponse) && require_compile_utils.mayReturnPromise(handler);
132
+ const lifecycleForcesAsync = !!hook && ((beforeHandlePrefix ? compactPrefixForcesAsync(beforeHandlePrefix) : false) || lifecycleMayReturnPromise(hook.beforeHandle) || lifecycleMayReturnPromise(hook.transform) || lifecycleMayReturnPromise(hook.afterHandle) || lifecycleMayReturnPromise(hook.mapResponse));
142
133
  const isAsync = hasBody || handlerIsAsync || errorHookForcesAsync || traceForcesAsync || afterResponseForcesAsync || handlerResultObserved || lifecycleForcesAsync || asyncCookieSign || responseValiAsync || hook && (!!require_compile_utils.isAsyncLifecycle(hook?.afterHandle) || !!require_compile_utils.isAsyncLifecycle(hook?.beforeHandle) || !!require_compile_utils.isAsyncLifecycle(hook?.transform) || !!require_compile_utils.isAsyncLifecycle(hook?.mapResponse) || !!require_compile_utils.isAsyncLifecycle(hook?.error) || bodyValiIsAsync || headersValiIsAsync || paramsValiIsAsync || queryValiIsAsync || cookieValidIsAsync);
143
134
  const callHandlerSyncOnAsync = isAsync && isHandleFunction && !handlerIsAsync;
144
135
  const syncErrorHook = hasErrorHook && !isAsync && !hasTrace;
@@ -192,5 +183,4 @@ function describeRoute(input) {
192
183
  exports.describeRoute = describeRoute;
193
184
  exports.isEmptyPipelineHook = isEmptyPipelineHook;
194
185
  exports.lifecycleMayReturnPromise = lifecycleMayReturnPromise;
195
- exports.mayReturnIdentifier = mayReturnIdentifier;
196
186
  exports.routeDescriptors = routeDescriptors;
@@ -14,16 +14,7 @@ import { mergeInference, sucrose } from "../../sucrose.mjs";
14
14
  */
15
15
  const routeDescriptors = /* @__PURE__ */ new WeakMap();
16
16
  const noTracePhases = /* @__PURE__ */ new Set();
17
- const matchReturnIdentifier = /(?:=>\s*|\breturn\s+)(?!(?:true|false|null|undefined|void|new|typeof|async|await|function|class)\b)[A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*)*\s*(?![\w$([])/;
18
- const mayReturnIdentifierCache = /* @__PURE__ */ new WeakMap();
19
- function mayReturnIdentifier(fn) {
20
- let result = mayReturnIdentifierCache.get(fn);
21
- if (result !== void 0) return result;
22
- result = matchReturnIdentifier.test(fn.toString());
23
- mayReturnIdentifierCache.set(fn, result);
24
- return result;
25
- }
26
- const lifecycleMayReturnPromise = (handlers, observed) => handlers ? Array.isArray(handlers) ? handlers.some((fn) => !isAsyncFunction(fn) && (mayReturnPromise(fn) || observed && mayReturnIdentifier(fn))) : !isAsyncFunction(handlers) && (mayReturnPromise(handlers) || observed && mayReturnIdentifier(handlers)) : false;
17
+ const lifecycleMayReturnPromise = (handlers) => handlers ? Array.isArray(handlers) ? handlers.some(mayReturnPromise) : mayReturnPromise(handlers) : false;
27
18
  const compactPrefixInference = /* @__PURE__ */ new WeakMap();
28
19
  const compactPrefixAsync = /* @__PURE__ */ new WeakMap();
29
20
  const inferCompactPrefix = (prefix) => {
@@ -65,7 +56,7 @@ function compactPrefixForcesAsync(prefix) {
65
56
  const item = pending[i];
66
57
  for (let j = 0; !value && j < item.added.length; j++) {
67
58
  const fn = item.added[j];
68
- value = isAsyncFunction(fn) || !isAsyncFunction(fn) && (mayReturnPromise(fn) || mayReturnIdentifier(fn));
59
+ value = mayReturnPromise(fn);
69
60
  }
70
61
  compactPrefixAsync.set(item, value);
71
62
  }
@@ -133,11 +124,11 @@ function describeRoute(input) {
133
124
  }
134
125
  }
135
126
  const handlerIsAsync = isHandleFunction && isAsyncFunction(handler);
136
- const errorHookForcesAsync = hasErrorHook && (hasAfterHandle || hasMapResponse || hasResponseValidator || isAsyncLifecycle(hook?.error) || lifecycleMayReturnPromise(hook?.error, false));
127
+ const errorHookForcesAsync = hasErrorHook && (hasAfterHandle || hasMapResponse || hasResponseValidator || isAsyncLifecycle(hook?.error) || lifecycleMayReturnPromise(hook?.error));
137
128
  const afterResponseForcesAsync = hasStaticAfterResponse && isAsyncLifecycle(hook?.afterResponse) || hasAfterResponse && (hasAfterHandle || hasMapResponse || hasResponseValidator || hasErrorHook);
138
- const traceForcesAsync = (traceHandleOn || phaseOn("error") || phaseOn("afterResponse")) && isHandleFunction && !handlerIsAsync && (mayReturnPromise(handler) || mayReturnIdentifier(handler));
139
- const handlerResultObserved = isHandleFunction && !handlerIsAsync && (hasResponseValidator || hasAfterHandle || hasMapResponse) && (mayReturnPromise(handler) || mayReturnIdentifier(handler));
140
- const lifecycleForcesAsync = !!hook && ((beforeHandlePrefix ? compactPrefixForcesAsync(beforeHandlePrefix) : false) || lifecycleMayReturnPromise(hook.beforeHandle, true) || lifecycleMayReturnPromise(hook.transform, false) || lifecycleMayReturnPromise(hook.afterHandle, true) || lifecycleMayReturnPromise(hook.mapResponse, true));
129
+ const traceForcesAsync = (traceHandleOn || phaseOn("error") || phaseOn("afterResponse")) && isHandleFunction && !handlerIsAsync && mayReturnPromise(handler);
130
+ const handlerResultObserved = isHandleFunction && !handlerIsAsync && (hasResponseValidator || hasAfterHandle || hasMapResponse) && mayReturnPromise(handler);
131
+ const lifecycleForcesAsync = !!hook && ((beforeHandlePrefix ? compactPrefixForcesAsync(beforeHandlePrefix) : false) || lifecycleMayReturnPromise(hook.beforeHandle) || lifecycleMayReturnPromise(hook.transform) || lifecycleMayReturnPromise(hook.afterHandle) || lifecycleMayReturnPromise(hook.mapResponse));
141
132
  const isAsync = hasBody || handlerIsAsync || errorHookForcesAsync || traceForcesAsync || afterResponseForcesAsync || handlerResultObserved || lifecycleForcesAsync || asyncCookieSign || responseValiAsync || hook && (!!isAsyncLifecycle(hook?.afterHandle) || !!isAsyncLifecycle(hook?.beforeHandle) || !!isAsyncLifecycle(hook?.transform) || !!isAsyncLifecycle(hook?.mapResponse) || !!isAsyncLifecycle(hook?.error) || bodyValiIsAsync || headersValiIsAsync || paramsValiIsAsync || queryValiIsAsync || cookieValidIsAsync);
142
133
  const callHandlerSyncOnAsync = isAsync && isHandleFunction && !handlerIsAsync;
143
134
  const syncErrorHook = hasErrorHook && !isAsync && !hasTrace;
@@ -188,4 +179,4 @@ function describeRoute(input) {
188
179
  }
189
180
 
190
181
  //#endregion
191
- export { describeRoute, isEmptyPipelineHook, lifecycleMayReturnPromise, mayReturnIdentifier, routeDescriptors };
182
+ export { describeRoute, isEmptyPipelineHook, lifecycleMayReturnPromise, routeDescriptors };
@@ -14,7 +14,7 @@ declare function clearHandlerAnalysisCaches(root: AnyElysia): void;
14
14
  declare function chainResolver(root: AnyElysia): ((node: ChainNode) => Partial<AppHook> | undefined) | undefined;
15
15
  declare const localMacroRoot: (instance: AnyElysia, root: AnyElysia) => AnyElysia;
16
16
  declare function buildNativeStaticResponse(route: InternalRoute, root: AnyElysia): Response | undefined;
17
- declare function composeRouteHook(instance: AnyElysia, localHook: Partial<AnyLocalHook> | undefined, appHook: ChainNode | undefined, inheritedChain: ChainNode | undefined, root: AnyElysia, macroScope?: AnyElysia): AnyLocalHook | undefined;
17
+ declare function composeRouteHook(instance: AnyElysia, localHook: Partial<AnyLocalHook> | undefined, appHook: ChainNode | undefined, inheritedChain: ChainNode | undefined, root: AnyElysia, macroScope?: AnyElysia, allowCompactPrefix?: boolean): AnyLocalHook | undefined;
18
18
  declare function compileHandler(route: InternalRoute, root: AnyElysia, precomputedStatic?: Response, liveOnly?: boolean): CompiledHandler;
19
19
  //#endregion
20
20
  export { buildNativeStaticResponse, chainResolver, clearHandlerAnalysisCaches, compileHandler, composeRouteHook, localMacroRoot, resolveLocalHook, resolveWSLocalHook, setCaptureHeaderShorthand };
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_universal_constants = require('../../universal/constants.js');
3
3
  const require_universal_file = require('../../universal/file.js');
4
4
  const require_utils = require('../../utils.js');
5
+ const require_adapter_web_standard_handler = require('../../adapter/web-standard/handler.js');
5
6
  const require_compile_aot = require('../aot.js');
6
7
  const require_generation = require('../../generation.js');
7
8
  const require_compile_handler_params = require('./params.js');
@@ -224,13 +225,16 @@ function buildNativeStaticResponse(route, root) {
224
225
  if (hook && !require_compile_handler_descriptor.isEmptyPipelineHook(hook)) return;
225
226
  const rootHeaders = frozenRoot["~ext"]?.headers;
226
227
  if (handler instanceof Response && !rootHeaders) return handler;
227
- const mapped = adapter.response.map(handler, { headers: rootHeaders ? Object.assign(require_utils.nullObject(), rootHeaders) : require_utils.nullObject() });
228
+ const response = adapter.response;
229
+ const map = response.map;
230
+ const set = { headers: rootHeaders ? Object.assign(require_utils.nullObject(), rootHeaders) : require_utils.nullObject() };
231
+ const mapped = map === require_adapter_web_standard_handler.mapResponse ? require_adapter_web_standard_handler.mapResponse(handler, set, null) : Reflect.apply(map, response, [handler, set]);
228
232
  if (mapped instanceof Response) return staticPrimitiveType(mapped, handler);
229
233
  }
230
234
  function toArray(name, hook) {
231
235
  if (typeof hook[name] === "function") hook[name] = [hook[name]];
232
236
  }
233
- function composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope) {
237
+ function composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope, allowCompactPrefix = true) {
234
238
  const resolve = chainResolver(root);
235
239
  localHook = resolveLocalHook(localMacroRoot(macroScope ?? instance, root), localHook, root);
236
240
  if (localHook && localHook.derive !== void 0) {
@@ -240,7 +244,7 @@ function composeRouteHook(instance, localHook, appHook, inheritedChain, root, ma
240
244
  const flatAppHook = appHook ? require_utils.flattenChainMemo(root, appHook, resolve) : void 0;
241
245
  let locals = instance !== root ? require_utils.flattenChain(require_generation.frozenRootOf(root)["~hookChain"], require_utils.isLocalScope, inheritedChain, resolve) : void 0;
242
246
  const instanceLocal = instance !== root ? require_utils.flattenChain(instance["~hookChain"], require_utils.isLocalScope) : void 0;
243
- const compactPrefix = instance !== root && !require_compile_aot.Capture.isCapturing() && !require_compile_aot.Capture.isAotBuildEnv() && resolve === void 0 && require_utils.isCompactBeforeHandleOnly(localHook) && require_utils.isCompactBeforeHandleOnly(flatAppHook) && require_utils.isCompactBeforeHandleOnly(locals) && !instanceLocal?.error ? require_utils.compactBeforeHandlePrefix(inheritedChain) : void 0;
247
+ const compactPrefix = allowCompactPrefix && instance !== root && !require_compile_aot.Capture.isCapturing() && !require_compile_aot.Capture.isAotBuildEnv() && resolve === void 0 && require_utils.isCompactBeforeHandleOnly(localHook) && require_utils.isCompactBeforeHandleOnly(flatAppHook) && require_utils.isCompactBeforeHandleOnly(locals) && !instanceLocal?.error ? require_utils.compactBeforeHandlePrefix(inheritedChain) : void 0;
244
248
  let present = collectHookOrigins(localHook, void 0);
245
249
  present = collectHookOrigins(flatAppHook, present);
246
250
  if (compactPrefix && !present?.size && !require_utils.compactBeforeHandleConflicts(localHook) && !require_utils.compactBeforeHandleConflicts(flatAppHook) && !require_utils.compactBeforeHandleConflicts(locals)) {
@@ -296,7 +300,7 @@ function compileHandler(route, root, precomputedStatic, liveOnly = false) {
296
300
  cookieConfig: void 0,
297
301
  tracers: void 0
298
302
  }));
299
- const hook = composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope);
303
+ const hook = composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope, !reconstructed);
300
304
  if (hook) {
301
305
  promoteDerive(hook);
302
306
  toArray("parse", hook);
@@ -320,7 +324,9 @@ function compileHandler(route, root, precomputedStatic, liveOnly = false) {
320
324
  else if (!isHandleFunction && !(handler instanceof Promise) && !(!require_universal_constants.isBun && handler instanceof require_universal_file.ElysiaFile) && !declaresResponse) {
321
325
  const rootHeaders = frozenRoot["~ext"]?.headers;
322
326
  const set = { headers: rootHeaders ? Object.assign(require_utils.nullObject(), rootHeaders) : require_utils.nullObject() };
323
- const mapped = adapter.response.map(handler, set);
327
+ const response = adapter.response;
328
+ const map = response.map;
329
+ const mapped = map === require_adapter_web_standard_handler.mapResponse ? require_adapter_web_standard_handler.mapResponse(handler, set, null) : Reflect.apply(map, response, [handler, set]);
324
330
  if (mapped instanceof Response) handler = staticPrimitiveType(mapped, handler);
325
331
  }
326
332
  const isStaticResponse = !isHandleFunction && handler instanceof Response;
@@ -339,7 +345,10 @@ function compileHandler(route, root, precomputedStatic, liveOnly = false) {
339
345
  cookieConfig: reconstructed.a.includes("cc") ? require_compile_handler_reconstruct.Reconstrct.cookie(hook, root) : void 0,
340
346
  tracers: reconstructed.a.includes("tr") ? require_compile_handler_reconstruct.Reconstrct.trace(hook, root) : void 0
341
347
  }));
342
- if (hook === void 0 && isHandleFunction && !precomputedStatic && !mountMeta && (method === "GET" || method === "HEAD") && !root["~hasTrace"] && root["~introspect"] !== true && root["~config"]?.introspect !== true && !require_utils.isNotEmpty(frozenRoot["~ext"]?.headers) && !require_compile_aot.Capture.isAotBuildEnv() && !require_compile_aot.Capture.isCapturing() && isContextFreeHandler(handler)) return require_compile_handler_jit.createInlineHandler(adapter.response.compact ?? adapter.response.map, handler);
348
+ if (hook === void 0 && isHandleFunction && !precomputedStatic && !mountMeta && (method === "GET" || method === "HEAD") && !root["~hasTrace"] && root["~introspect"] !== true && root["~config"]?.introspect !== true && !require_utils.isNotEmpty(frozenRoot["~ext"]?.headers) && !require_compile_aot.Capture.isAotBuildEnv() && !require_compile_aot.Capture.isCapturing() && isContextFreeHandler(handler)) {
349
+ const compact = adapter.response.compact;
350
+ if (compact) return require_compile_handler_jit.createInlineHandler(compact, handler);
351
+ }
343
352
  const state = require_compile_handler_descriptor.describeRoute({
344
353
  method,
345
354
  path,
@@ -1,6 +1,7 @@
1
1
  import { isBun } from "../../universal/constants.mjs";
2
2
  import { ElysiaFile } from "../../universal/file.mjs";
3
3
  import { cloneHook, compactBeforeHandleConflicts, compactBeforeHandlePrefix, eventProperties, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, isCompactBeforeHandleOnly, isLocalScope, isNotEmpty, macroEpoch, mergeHook, nullObject, replaceUrlPath } from "../../utils.mjs";
4
+ import { mapResponse } from "../../adapter/web-standard/handler.mjs";
4
5
  import { Capture, Compiled } from "../aot.mjs";
5
6
  import { frozenRootOf } from "../../generation.mjs";
6
7
  import { resolveHandlerParams } from "./params.mjs";
@@ -223,13 +224,16 @@ function buildNativeStaticResponse(route, root) {
223
224
  if (hook && !isEmptyPipelineHook(hook)) return;
224
225
  const rootHeaders = frozenRoot["~ext"]?.headers;
225
226
  if (handler instanceof Response && !rootHeaders) return handler;
226
- const mapped = adapter.response.map(handler, { headers: rootHeaders ? Object.assign(nullObject(), rootHeaders) : nullObject() });
227
+ const response = adapter.response;
228
+ const map = response.map;
229
+ const set = { headers: rootHeaders ? Object.assign(nullObject(), rootHeaders) : nullObject() };
230
+ const mapped = map === mapResponse ? mapResponse(handler, set, null) : Reflect.apply(map, response, [handler, set]);
227
231
  if (mapped instanceof Response) return staticPrimitiveType(mapped, handler);
228
232
  }
229
233
  function toArray(name, hook) {
230
234
  if (typeof hook[name] === "function") hook[name] = [hook[name]];
231
235
  }
232
- function composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope) {
236
+ function composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope, allowCompactPrefix = true) {
233
237
  const resolve = chainResolver(root);
234
238
  localHook = resolveLocalHook(localMacroRoot(macroScope ?? instance, root), localHook, root);
235
239
  if (localHook && localHook.derive !== void 0) {
@@ -239,7 +243,7 @@ function composeRouteHook(instance, localHook, appHook, inheritedChain, root, ma
239
243
  const flatAppHook = appHook ? flattenChainMemo(root, appHook, resolve) : void 0;
240
244
  let locals = instance !== root ? flattenChain(frozenRootOf(root)["~hookChain"], isLocalScope, inheritedChain, resolve) : void 0;
241
245
  const instanceLocal = instance !== root ? flattenChain(instance["~hookChain"], isLocalScope) : void 0;
242
- const compactPrefix = instance !== root && !Capture.isCapturing() && !Capture.isAotBuildEnv() && resolve === void 0 && isCompactBeforeHandleOnly(localHook) && isCompactBeforeHandleOnly(flatAppHook) && isCompactBeforeHandleOnly(locals) && !instanceLocal?.error ? compactBeforeHandlePrefix(inheritedChain) : void 0;
246
+ const compactPrefix = allowCompactPrefix && instance !== root && !Capture.isCapturing() && !Capture.isAotBuildEnv() && resolve === void 0 && isCompactBeforeHandleOnly(localHook) && isCompactBeforeHandleOnly(flatAppHook) && isCompactBeforeHandleOnly(locals) && !instanceLocal?.error ? compactBeforeHandlePrefix(inheritedChain) : void 0;
243
247
  let present = collectHookOrigins(localHook, void 0);
244
248
  present = collectHookOrigins(flatAppHook, present);
245
249
  if (compactPrefix && !present?.size && !compactBeforeHandleConflicts(localHook) && !compactBeforeHandleConflicts(flatAppHook) && !compactBeforeHandleConflicts(locals)) {
@@ -295,7 +299,7 @@ function compileHandler(route, root, precomputedStatic, liveOnly = false) {
295
299
  cookieConfig: void 0,
296
300
  tracers: void 0
297
301
  }));
298
- const hook = composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope);
302
+ const hook = composeRouteHook(instance, localHook, appHook, inheritedChain, root, macroScope, !reconstructed);
299
303
  if (hook) {
300
304
  promoteDerive(hook);
301
305
  toArray("parse", hook);
@@ -319,7 +323,9 @@ function compileHandler(route, root, precomputedStatic, liveOnly = false) {
319
323
  else if (!isHandleFunction && !(handler instanceof Promise) && !(!isBun && handler instanceof ElysiaFile) && !declaresResponse) {
320
324
  const rootHeaders = frozenRoot["~ext"]?.headers;
321
325
  const set = { headers: rootHeaders ? Object.assign(nullObject(), rootHeaders) : nullObject() };
322
- const mapped = adapter.response.map(handler, set);
326
+ const response = adapter.response;
327
+ const map = response.map;
328
+ const mapped = map === mapResponse ? mapResponse(handler, set, null) : Reflect.apply(map, response, [handler, set]);
323
329
  if (mapped instanceof Response) handler = staticPrimitiveType(mapped, handler);
324
330
  }
325
331
  const isStaticResponse = !isHandleFunction && handler instanceof Response;
@@ -338,7 +344,10 @@ function compileHandler(route, root, precomputedStatic, liveOnly = false) {
338
344
  cookieConfig: reconstructed.a.includes("cc") ? Reconstrct.cookie(hook, root) : void 0,
339
345
  tracers: reconstructed.a.includes("tr") ? Reconstrct.trace(hook, root) : void 0
340
346
  }));
341
- if (hook === void 0 && isHandleFunction && !precomputedStatic && !mountMeta && (method === "GET" || method === "HEAD") && !root["~hasTrace"] && root["~introspect"] !== true && root["~config"]?.introspect !== true && !isNotEmpty(frozenRoot["~ext"]?.headers) && !Capture.isAotBuildEnv() && !Capture.isCapturing() && isContextFreeHandler(handler)) return createInlineHandler(adapter.response.compact ?? adapter.response.map, handler);
347
+ if (hook === void 0 && isHandleFunction && !precomputedStatic && !mountMeta && (method === "GET" || method === "HEAD") && !root["~hasTrace"] && root["~introspect"] !== true && root["~config"]?.introspect !== true && !isNotEmpty(frozenRoot["~ext"]?.headers) && !Capture.isAotBuildEnv() && !Capture.isCapturing() && isContextFreeHandler(handler)) {
348
+ const compact = adapter.response.compact;
349
+ if (compact) return createInlineHandler(compact, handler);
350
+ }
342
351
  const state = describeRoute({
343
352
  method,
344
353
  path,