h3 0.7.8 → 0.7.11

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/dist/index.cjs CHANGED
@@ -82,7 +82,7 @@ function handleCacheHeaders(event, opts) {
82
82
  const cacheControls = ["public"].concat(opts.cacheControls || []);
83
83
  let cacheMatched = false;
84
84
  if (opts.maxAge !== void 0) {
85
- opts.cacheControls?.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
85
+ cacheControls.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
86
86
  }
87
87
  if (opts.modifiedTime) {
88
88
  const modifiedTime = new Date(opts.modifiedTime);
@@ -183,14 +183,19 @@ class H3Error extends Error {
183
183
  constructor() {
184
184
  super(...arguments);
185
185
  this.statusCode = 500;
186
- this.statusMessage = "H3Error";
186
+ this.fatal = false;
187
+ this.unhandled = false;
188
+ this.statusMessage = "Internal Server Error";
187
189
  }
188
190
  }
189
191
  function createError(input) {
192
+ if (typeof input === "string") {
193
+ return new H3Error(input);
194
+ }
190
195
  if (input instanceof H3Error) {
191
196
  return input;
192
197
  }
193
- const err = new H3Error(input.message ?? input.statusMessage);
198
+ const err = new H3Error(input.message ?? input.statusMessage, input.cause ? { cause: input.cause } : void 0);
194
199
  if (input.statusCode) {
195
200
  err.statusCode = input.statusCode;
196
201
  }
@@ -200,6 +205,12 @@ function createError(input) {
200
205
  if (input.data) {
201
206
  err.data = input.data;
202
207
  }
208
+ if (input.fatal !== void 0) {
209
+ err.fatal = input.fatal;
210
+ }
211
+ if (input.unhandled !== void 0) {
212
+ err.unhandled = input.unhandled;
213
+ }
203
214
  return err;
204
215
  }
205
216
  function sendError(event, error, debug) {
@@ -373,14 +384,18 @@ function createApp(options = {}) {
373
384
  const event = createEvent(req, res);
374
385
  try {
375
386
  await handler(event);
376
- } catch (err) {
387
+ } catch (_error) {
388
+ const error = createError(_error);
389
+ if (!isError(_error)) {
390
+ error.unhandled = true;
391
+ }
392
+ if (error.unhandled || error.fatal) {
393
+ console.error("[h3]", error.fatal ? "[fatal]" : "[unhandled]", error);
394
+ }
377
395
  if (options.onError) {
378
- await options.onError(err, event);
396
+ await options.onError(error, event);
379
397
  } else {
380
- if (!isError(err)) {
381
- console.error("[h3]", err);
382
- }
383
- await sendError(event, err, !!options.debug);
398
+ await sendError(event, error, !!options.debug);
384
399
  }
385
400
  }
386
401
  };
package/dist/index.d.ts CHANGED
@@ -2,12 +2,14 @@ import http from 'http';
2
2
  import { CookieSerializeOptions } from 'cookie-es';
3
3
  import * as ufo from 'ufo';
4
4
 
5
+ interface H3EventContext extends Record<string, any> {
6
+ }
5
7
  interface H3Event {
6
8
  '__is_event__': true;
7
9
  event: H3Event;
8
10
  req: IncomingMessage;
9
11
  res: ServerResponse;
10
- context: Record<string, any>;
12
+ context: H3EventContext;
11
13
  }
12
14
  declare type CompatibilityEvent = H3Event | IncomingMessage;
13
15
  declare type H3Response<T = any> = T | Promise<T>;
@@ -96,12 +98,16 @@ declare function createAppEventHandler(stack: Stack, options: AppOptions): Event
96
98
  * @extends Error
97
99
  * @property {Number} statusCode An Integer indicating the HTTP response status code.
98
100
  * @property {String} statusMessage A String representing the HTTP status message
101
+ * @property {String} fatal Indicates if the error is a fatal error.
102
+ * @property {String} unhandled Indicates if the error was unhandled and auto captured.
99
103
  * @property {Any} data An extra data that will includes in the response.<br>
100
104
  * This can be used to pass additional information about the error.
101
105
  * @property {Boolean} internal Setting this property to <code>true</code> will mark error as an internal error
102
106
  */
103
107
  declare class H3Error extends Error {
104
108
  statusCode: number;
109
+ fatal: boolean;
110
+ unhandled: boolean;
105
111
  statusMessage: string;
106
112
  data?: any;
107
113
  }
@@ -111,7 +117,7 @@ declare class H3Error extends Error {
111
117
  * @param input {Partial<H3Error>}
112
118
  * @return {H3Error} An instance of the H3Error
113
119
  */
114
- declare function createError(input: Partial<H3Error>): H3Error;
120
+ declare function createError(input: string | Partial<H3Error>): H3Error;
115
121
  /**
116
122
  * Receive an error and return the corresponding response.<br>
117
123
  * H3 internally uses this function to handle unhandled errors.<br>
@@ -240,4 +246,4 @@ interface Router extends AddRouteShortcuts {
240
246
  }
241
247
  declare function createRouter(): Router;
242
248
 
243
- export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CompatibilityEvent, CompatibilityEventHandler, DynamicEventHandler, Encoding, EventHandler, H3Error, H3Event, H3Response, HTTPMethod, Handler, IncomingMessage, InputLayer, InputStack, Layer, LazyEventHandler, LazyHandler, MIMES, Matcher, Middleware, NodeHandler, PromisifiedHandler, Router, RouterMethod, RouterUse, ServerResponse, Stack, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
249
+ export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CompatibilityEvent, CompatibilityEventHandler, DynamicEventHandler, Encoding, EventHandler, H3Error, H3Event, H3EventContext, H3Response, HTTPMethod, Handler, IncomingMessage, InputLayer, InputStack, Layer, LazyEventHandler, LazyHandler, MIMES, Matcher, Middleware, NodeHandler, PromisifiedHandler, Router, RouterMethod, RouterUse, ServerResponse, Stack, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
package/dist/index.mjs CHANGED
@@ -74,7 +74,7 @@ function handleCacheHeaders(event, opts) {
74
74
  const cacheControls = ["public"].concat(opts.cacheControls || []);
75
75
  let cacheMatched = false;
76
76
  if (opts.maxAge !== void 0) {
77
- opts.cacheControls?.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
77
+ cacheControls.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
78
78
  }
79
79
  if (opts.modifiedTime) {
80
80
  const modifiedTime = new Date(opts.modifiedTime);
@@ -175,14 +175,19 @@ class H3Error extends Error {
175
175
  constructor() {
176
176
  super(...arguments);
177
177
  this.statusCode = 500;
178
- this.statusMessage = "H3Error";
178
+ this.fatal = false;
179
+ this.unhandled = false;
180
+ this.statusMessage = "Internal Server Error";
179
181
  }
180
182
  }
181
183
  function createError(input) {
184
+ if (typeof input === "string") {
185
+ return new H3Error(input);
186
+ }
182
187
  if (input instanceof H3Error) {
183
188
  return input;
184
189
  }
185
- const err = new H3Error(input.message ?? input.statusMessage);
190
+ const err = new H3Error(input.message ?? input.statusMessage, input.cause ? { cause: input.cause } : void 0);
186
191
  if (input.statusCode) {
187
192
  err.statusCode = input.statusCode;
188
193
  }
@@ -192,6 +197,12 @@ function createError(input) {
192
197
  if (input.data) {
193
198
  err.data = input.data;
194
199
  }
200
+ if (input.fatal !== void 0) {
201
+ err.fatal = input.fatal;
202
+ }
203
+ if (input.unhandled !== void 0) {
204
+ err.unhandled = input.unhandled;
205
+ }
195
206
  return err;
196
207
  }
197
208
  function sendError(event, error, debug) {
@@ -365,14 +376,18 @@ function createApp(options = {}) {
365
376
  const event = createEvent(req, res);
366
377
  try {
367
378
  await handler(event);
368
- } catch (err) {
379
+ } catch (_error) {
380
+ const error = createError(_error);
381
+ if (!isError(_error)) {
382
+ error.unhandled = true;
383
+ }
384
+ if (error.unhandled || error.fatal) {
385
+ console.error("[h3]", error.fatal ? "[fatal]" : "[unhandled]", error);
386
+ }
369
387
  if (options.onError) {
370
- await options.onError(err, event);
388
+ await options.onError(error, event);
371
389
  } else {
372
- if (!isError(err)) {
373
- console.error("[h3]", err);
374
- }
375
- await sendError(event, err, !!options.debug);
390
+ await sendError(event, error, !!options.debug);
376
391
  }
377
392
  }
378
393
  };
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "0.7.8",
3
+ "version": "0.7.11",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",
7
7
  "sideEffects": false,
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.mjs",
11
12
  "require": "./dist/index.cjs"
12
13
  }
@@ -21,7 +22,7 @@
21
22
  "cookie-es": "^0.5.0",
22
23
  "destr": "^1.1.1",
23
24
  "radix3": "^0.1.2",
24
- "ufo": "^0.8.3"
25
+ "ufo": "^0.8.5"
25
26
  },
26
27
  "devDependencies": {
27
28
  "0x": "latest",
@@ -44,7 +45,7 @@
44
45
  "unbuild": "latest",
45
46
  "vitest": "latest"
46
47
  },
47
- "packageManager": "pnpm@7.0.0",
48
+ "packageManager": "pnpm@7.5.2",
48
49
  "scripts": {
49
50
  "build": "unbuild",
50
51
  "dev": "vitest",