@visulima/error-handler 1.0.1 → 1.0.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## @visulima/error-handler [1.0.3](https://github.com/visulima/visulima/compare/@visulima/error-handler@1.0.2...@visulima/error-handler@1.0.3) (2025-09-19)
2
+
3
+ ### Miscellaneous Chores
4
+
5
+ * **deps:** update dependencies and improve build scripts ([1979067](https://github.com/visulima/visulima/commit/197906796481aeaad4c57f7bb207ea6d8a9e227b))
6
+
7
+
8
+ ### Dependencies
9
+
10
+ * **@visulima/error:** upgraded to 4.6.1
11
+
12
+ ## @visulima/error-handler [1.0.2](https://github.com/visulima/visulima/compare/@visulima/error-handler@1.0.1...@visulima/error-handler@1.0.2) (2025-09-12)
13
+
14
+
15
+ ### Dependencies
16
+
17
+ * **@visulima/error:** upgraded to 4.6.0
18
+
1
19
  ## @visulima/error-handler [1.0.1](https://github.com/visulima/visulima/compare/@visulima/error-handler@1.0.0...@visulima/error-handler@1.0.1) (2025-09-12)
2
20
 
3
21
  ### Miscellaneous Chores
@@ -1,41 +1,17 @@
1
- import { getReasonPhrase } from 'http-status-codes';
2
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
3
-
4
- var __defProp = Object.defineProperty;
5
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
- const htmlErrorHandler = /* @__PURE__ */ __name((options = {}) => {
7
- return async (error, request, response) => {
8
- addStatusCodeToResponse(response, error);
9
- response.setHeader("content-type", "text/html; charset=utf-8");
10
- const title = getReasonPhrase(response.statusCode) || "Error";
11
- const nonceAttr = options.cspNonce ? ` nonce="${options.cspNonce}"` : "";
12
- if (options.errorPage) {
13
- const override = typeof options.errorPage === "function" ? await options.errorPage({
14
- error,
15
- request,
16
- response,
17
- reasonPhrase: title,
18
- statusCode: response.statusCode
19
- }) : options.errorPage;
20
- if (override) {
21
- response.end(override);
22
- return;
23
- }
24
- }
25
- response.end(`<!DOCTYPE html>
1
+ var l=Object.defineProperty;var d=(e,r)=>l(e,"name",{value:r,configurable:!0});import{getReasonPhrase as c}from"http-status-codes";import{a as m}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";var g=Object.defineProperty,s=d((e,r)=>g(e,"name",{value:r,configurable:!0}),"n");const x=s((e={})=>async(r,n,t)=>{m(t,r),t.setHeader("content-type","text/html; charset=utf-8");const o=c(t.statusCode)||"Error",a=e.cspNonce?` nonce="${e.cspNonce}"`:"";if(e.errorPage){const i=typeof e.errorPage=="function"?await e.errorPage({error:r,request:n,response:t,reasonPhrase:o,statusCode:t.statusCode}):e.errorPage;if(i){t.end(i);return}}t.end(`<!DOCTYPE html>
26
2
  <html lang="en">
27
3
  <head>
28
4
  <meta charset="utf-8">
29
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
30
6
 
31
- <title>${title}</title>
7
+ <title>${o}</title>
32
8
  <meta name="robots" content="noindex">
33
9
 
34
- <style${nonceAttr}>
10
+ <style${a}>
35
11
  /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}code{font-family:monospace,monospace;font-size:1em}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}code{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-r{border-right-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-xl{max-width:36rem}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\\:rounded-lg{border-radius:.5rem}.sm\\:block{display:block}.sm\\:items-center{align-items:center}.sm\\:justify-start{justify-content:flex-start}.sm\\:justify-between{justify-content:space-between}.sm\\:h-20{height:5rem}.sm\\:ml-0{margin-left:0}.sm\\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\\:pt-0{padding-top:0}.sm\\:text-left{text-align:left}.sm\\:text-right{text-align:right}}@media (min-width:768px){.md\\:border-t-0{border-top-width:0}.md\\:border-l{border-left-width:1px}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}}
36
12
  </style>
37
13
 
38
- <style${nonceAttr}>
14
+ <style${a}>
39
15
  body {
40
16
  font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
41
17
  }
@@ -46,18 +22,14 @@ const htmlErrorHandler = /* @__PURE__ */ __name((options = {}) => {
46
22
  <div class="max-w-xl mx-auto sm:px-6 lg:px-8">
47
23
  <div class="flex items-center justify-center">
48
24
  <div class="px-6 text-lg text-gray-600 dark:text-gray-400 border-r border-gray-400 dark:border-gray-700 tracking-wider font-semibold">
49
- ${response.statusCode}
25
+ ${t.statusCode}
50
26
  </div>
51
27
 
52
28
  <div class="ml-4 text-lg text-gray-600 dark:text-gray-400 uppercase tracking-wider">
53
- ${title}
29
+ ${o}
54
30
  </div>
55
31
  </div>
56
32
  </div>
57
33
  </div>
58
34
  </body>
59
- </html>`);
60
- };
61
- }, "htmlErrorHandler");
62
-
63
- export { htmlErrorHandler };
35
+ </html>`)},"htmlErrorHandler");export{x as htmlErrorHandler};
@@ -1,31 +1 @@
1
- import { getReasonPhrase } from 'http-status-codes';
2
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
3
- import { s as sendJson } from '../packem_shared/send-json-o-t1rNfw.js';
4
- import { s as setErrorHeaders } from '../packem_shared/set-error-headers-B6ZeX5k4.js';
5
-
6
- var __defProp = Object.defineProperty;
7
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
- const jsonErrorHandler = /* @__PURE__ */ __name((options = {}) => {
9
- return async (error, request, response) => {
10
- addStatusCodeToResponse(response, error);
11
- setErrorHeaders(response, error);
12
- const statusCode = response.statusCode;
13
- const reasonPhrase = getReasonPhrase(statusCode) || "An error occurred";
14
- if (options.formatter) {
15
- const body = await options.formatter({ error, request, response, reasonPhrase, statusCode });
16
- sendJson(response, body);
17
- return;
18
- }
19
- const expose = error.expose;
20
- sendJson(response, {
21
- statusCode,
22
- // eslint-disable-next-line perfectionist/sort-objects
23
- error: reasonPhrase,
24
- // eslint-disable-next-line perfectionist/sort-objects
25
- message: error.message || reasonPhrase,
26
- ...expose ? { stack: error.stack } : {}
27
- });
28
- };
29
- }, "jsonErrorHandler");
30
-
31
- export { jsonErrorHandler };
1
+ var p=Object.defineProperty;var a=(e,r)=>p(e,"name",{value:r,configurable:!0});import{getReasonPhrase as u}from"http-status-codes";import{a as f}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";import{s as n}from"../packem_shared/send-json-Cedv8-Bt.js";import{s as i}from"../packem_shared/set-error-headers-BWc7Sbh2.js";var g=Object.defineProperty,l=a((e,r)=>g(e,"name",{value:r,configurable:!0}),"n");const P=l((e={})=>async(r,d,s)=>{f(s,r),i(s,r);const o=s.statusCode,t=u(o)||"An error occurred";if(e.formatter){const c=await e.formatter({error:r,request:d,response:s,reasonPhrase:t,statusCode:o});n(s,c);return}const m=r.expose;n(s,{statusCode:o,error:t,message:r.message||t,...m?{stack:r.stack}:{}})},"jsonErrorHandler");export{P as jsonErrorHandler};
@@ -1,46 +1 @@
1
- import { isHttpError } from 'http-errors';
2
- import { getReasonPhrase } from 'http-status-codes';
3
- import tsJapi from 'ts-japi';
4
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
5
- import { s as sendJson } from '../packem_shared/send-json-o-t1rNfw.js';
6
- import { s as setErrorHeaders } from '../packem_shared/set-error-headers-B6ZeX5k4.js';
7
-
8
- var __defProp = Object.defineProperty;
9
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
- const defaultTitle = "An error occurred";
11
- const jsonapiErrorHandler = /* @__PURE__ */ __name((error, _request, response) => {
12
- addStatusCodeToResponse(response, error);
13
- setErrorHeaders(response, error);
14
- if (error instanceof tsJapi.JapiError || tsJapi.JapiError.isLikeJapiError(error)) {
15
- const serializer = new tsJapi.ErrorSerializer();
16
- sendJson(response, serializer.serialize(error));
17
- } else if (isHttpError(error)) {
18
- const statusCode = "statusCode" in error && typeof error.statusCode === "number" ? error.statusCode : "status" in error && typeof error.status === "number" ? error.status : response.statusCode;
19
- const title = "title" in error && typeof error.title === "string" ? error.title : void 0;
20
- const message = "message" in error && typeof error.message === "string" ? error.message : "";
21
- sendJson(response, {
22
- errors: [
23
- {
24
- code: statusCode ?? response.statusCode,
25
- title: title || getReasonPhrase(statusCode) || defaultTitle,
26
- // eslint-disable-next-line perfectionist/sort-objects
27
- detail: message
28
- }
29
- ]
30
- });
31
- } else {
32
- const { message } = error;
33
- sendJson(response, {
34
- errors: [
35
- {
36
- code: "500",
37
- title: getReasonPhrase(response.statusCode) || defaultTitle,
38
- // eslint-disable-next-line perfectionist/sort-objects
39
- detail: message
40
- }
41
- ]
42
- });
43
- }
44
- }, "jsonapiErrorHandler");
45
-
46
- export { jsonapiErrorHandler as default };
1
+ var u=Object.defineProperty;var i=(e,s)=>u(e,"name",{value:s,configurable:!0});import{isHttpError as f}from"http-errors";import{getReasonPhrase as n}from"http-status-codes";import a from"ts-japi";import{a as l}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";import{s as t}from"../packem_shared/send-json-Cedv8-Bt.js";import{s as c}from"../packem_shared/set-error-headers-BWc7Sbh2.js";var g=Object.defineProperty,C=i((e,s)=>g(e,"name",{value:s,configurable:!0}),"n");const d="An error occurred",z=C((e,s,r)=>{if(l(r,e),c(r,e),e instanceof a.JapiError||a.JapiError.isLikeJapiError(e)){const o=new a.ErrorSerializer;t(r,o.serialize(e))}else if(f(e)){const o="statusCode"in e&&typeof e.statusCode=="number"?e.statusCode:"status"in e&&typeof e.status=="number"?e.status:r.statusCode,m="title"in e&&typeof e.title=="string"?e.title:void 0,p="message"in e&&typeof e.message=="string"?e.message:"";t(r,{errors:[{code:o??r.statusCode,title:m||n(o)||d,detail:p}]})}else{const{message:o}=e;t(r,{errors:[{code:"500",title:n(r.statusCode)||d,detail:o}]})}},"jsonapiErrorHandler");export{z as default};
@@ -1,36 +1 @@
1
- import { getReasonPhrase } from 'http-status-codes';
2
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
3
- import { s as setErrorHeaders } from '../packem_shared/set-error-headers-B6ZeX5k4.js';
4
-
5
- var __defProp = Object.defineProperty;
6
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- const defaultCallbackParam = "callback";
8
- const jsonpErrorHandler = /* @__PURE__ */ __name((options = {}) => {
9
- return async (error, request, response) => {
10
- addStatusCodeToResponse(response, error);
11
- setErrorHeaders(response, error);
12
- const statusCode = response.statusCode;
13
- const reasonPhrase = getReasonPhrase(statusCode) || "An error occurred";
14
- const url = new URL(request.url ?? "http://localhost", "http://localhost");
15
- const callbackParamName = options.callbackParamName || defaultCallbackParam;
16
- const callbackName = url.searchParams.get(callbackParamName) || "callback";
17
- let payload;
18
- if (options.formatter) {
19
- payload = await options.formatter({ error, request, response, reasonPhrase, statusCode });
20
- } else {
21
- const expose = error.expose;
22
- payload = {
23
- statusCode,
24
- // eslint-disable-next-line perfectionist/sort-objects
25
- error: reasonPhrase,
26
- // eslint-disable-next-line perfectionist/sort-objects
27
- message: error.message || reasonPhrase,
28
- ...expose ? { stack: error.stack } : {}
29
- };
30
- }
31
- response.setHeader("content-type", "application/javascript; charset=utf-8");
32
- response.end(`${callbackName}(${JSON.stringify(payload)});`);
33
- };
34
- }, "jsonpErrorHandler");
35
-
36
- export { jsonpErrorHandler };
1
+ var i=Object.defineProperty;var n=(a,e)=>i(a,"name",{value:e,configurable:!0});import{getReasonPhrase as u}from"http-status-codes";import{a as f}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";import{s as h}from"../packem_shared/set-error-headers-BWc7Sbh2.js";var g=Object.defineProperty,b=n((a,e)=>g(a,"name",{value:e,configurable:!0}),"c");const k="callback",C=b((a={})=>async(e,c,r)=>{f(r,e),h(r,e);const t=r.statusCode,s=u(t)||"An error occurred",l=new URL(c.url??"http://localhost","http://localhost"),p=a.callbackParamName||k,m=l.searchParams.get(p)||"callback";let o;if(a.formatter)o=await a.formatter({error:e,request:c,response:r,reasonPhrase:s,statusCode:t});else{const d=e.expose;o={statusCode:t,error:s,message:e.message||s,...d?{stack:e.stack}:{}}}r.setHeader("content-type","application/javascript; charset=utf-8"),r.end(`${m}(${JSON.stringify(o)});`)},"jsonpErrorHandler");export{C as jsonpErrorHandler};
@@ -1,53 +1 @@
1
- import { isHttpError } from 'http-errors';
2
- import { getReasonPhrase } from 'http-status-codes';
3
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
4
- import { s as sendJson } from '../packem_shared/send-json-o-t1rNfw.js';
5
- import { s as setErrorHeaders } from '../packem_shared/set-error-headers-B6ZeX5k4.js';
6
-
7
- var __defProp = Object.defineProperty;
8
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
- const defaultType = "about:blank";
10
- const defaultTitle = "An error occurred";
11
- const problemErrorHandler = /* @__PURE__ */ __name((error, _request, response) => {
12
- const { message, stack } = error;
13
- if (isHttpError(error)) {
14
- const expose = "expose" in error ? error.expose : void 0;
15
- const statusCode = "statusCode" in error && typeof error.statusCode === "number" ? error.statusCode : "status" in error && typeof error.status === "number" ? error.status : response.statusCode;
16
- const title = "title" in error && typeof error.title === "string" ? error.title : void 0;
17
- const type = "type" in error && typeof error.type === "string" ? error.type : void 0;
18
- response.statusCode = statusCode;
19
- setErrorHeaders(response, error);
20
- sendJson(
21
- response,
22
- {
23
- type: type || defaultType,
24
- // eslint-disable-next-line perfectionist/sort-objects
25
- title: title || getReasonPhrase(statusCode) || defaultTitle,
26
- // eslint-disable-next-line perfectionist/sort-objects
27
- status: statusCode,
28
- // eslint-disable-next-line perfectionist/sort-objects
29
- detail: message,
30
- ...expose ? { trace: stack } : {}
31
- },
32
- "application/problem+json"
33
- );
34
- } else {
35
- addStatusCodeToResponse(response, error);
36
- sendJson(
37
- response,
38
- {
39
- type: defaultType,
40
- // eslint-disable-next-line perfectionist/sort-objects
41
- title: getReasonPhrase(response.statusCode) || defaultTitle,
42
- // eslint-disable-next-line perfectionist/sort-objects
43
- status: response.statusCode,
44
- // eslint-disable-next-line perfectionist/sort-objects
45
- detail: message,
46
- ...error.expose ? { trace: stack } : {}
47
- },
48
- "application/problem+json"
49
- );
50
- }
51
- }, "problemErrorHandler");
52
-
53
- export { problemErrorHandler as default };
1
+ var c=Object.defineProperty;var i=(e,o)=>c(e,"name",{value:o,configurable:!0});import{isHttpError as y}from"http-errors";import{getReasonPhrase as p}from"http-status-codes";import{a as b}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";import{s as n}from"../packem_shared/send-json-Cedv8-Bt.js";import{s as C}from"../packem_shared/set-error-headers-BWc7Sbh2.js";var v=Object.defineProperty,g=i((e,o)=>v(e,"name",{value:o,configurable:!0}),"i");const d="about:blank",u="An error occurred",R=g((e,o,t)=>{const{message:r,stack:a}=e;if(y(e)){const l="expose"in e?e.expose:void 0,s="statusCode"in e&&typeof e.statusCode=="number"?e.statusCode:"status"in e&&typeof e.status=="number"?e.status:t.statusCode,m="title"in e&&typeof e.title=="string"?e.title:void 0,f="type"in e&&typeof e.type=="string"?e.type:void 0;t.statusCode=s,C(t,e),n(t,{type:f||d,title:m||p(s)||u,status:s,detail:r,...l?{trace:a}:{}},"application/problem+json")}else b(t,e),n(t,{type:d,title:p(t.statusCode)||u,status:t.statusCode,detail:r,...e.expose?{trace:a}:{}},"application/problem+json")},"problemErrorHandler");export{R as default};
@@ -1,28 +1,3 @@
1
- import { getReasonPhrase } from 'http-status-codes';
2
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
3
- import { s as setErrorHeaders } from '../packem_shared/set-error-headers-B6ZeX5k4.js';
1
+ var i=Object.defineProperty;var d=(t,e)=>i(t,"name",{value:e,configurable:!0});import{getReasonPhrase as p}from"http-status-codes";import{a as f}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";import{s as u}from"../packem_shared/set-error-headers-BWc7Sbh2.js";var l=Object.defineProperty,x=d((t,e)=>l(t,"name",{value:e,configurable:!0}),"m");const h=x((t={})=>async(e,m,r)=>{f(r,e),u(r,e);const o=r.statusCode,s=p(o)||"Error";if(r.setHeader("content-type","text/plain; charset=utf-8"),t.formatter){const c=await t.formatter({error:e,request:m,response:r,reasonPhrase:s,statusCode:o});r.end(c);return}const a=e.message||s,n=e.expose?e.stack:void 0;r.end(n?`${a}
4
2
 
5
- var __defProp = Object.defineProperty;
6
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- const textErrorHandler = /* @__PURE__ */ __name((options = {}) => {
8
- return async (error, request, response) => {
9
- addStatusCodeToResponse(response, error);
10
- setErrorHeaders(response, error);
11
- const statusCode = response.statusCode;
12
- const reasonPhrase = getReasonPhrase(statusCode) || "Error";
13
- response.setHeader("content-type", "text/plain; charset=utf-8");
14
- if (options.formatter) {
15
- const text = await options.formatter({ error, request, response, reasonPhrase, statusCode });
16
- response.end(text);
17
- return;
18
- }
19
- const message = error.message || reasonPhrase;
20
- const expose = error.expose;
21
- const stack = expose ? error.stack : void 0;
22
- response.end(stack ? `${message}
23
-
24
- ${stack}` : message);
25
- };
26
- }, "textErrorHandler");
27
-
28
- export { textErrorHandler };
3
+ ${n}`:a)},"textErrorHandler");export{h as textErrorHandler};
@@ -1,45 +1 @@
1
- import { getReasonPhrase } from 'http-status-codes';
2
- import { toXML } from 'jstoxml';
3
- import { a as addStatusCodeToResponse } from '../packem_shared/add-status-code-to-response-DdfxTQsK.js';
4
- import { s as setErrorHeaders } from '../packem_shared/set-error-headers-B6ZeX5k4.js';
5
-
6
- var __defProp = Object.defineProperty;
7
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
- const xmlErrorHandler = /* @__PURE__ */ __name((options = {}) => {
9
- return async (error, request, response) => {
10
- addStatusCodeToResponse(response, error);
11
- setErrorHeaders(response, error);
12
- const statusCode = response.statusCode;
13
- const reasonPhrase = getReasonPhrase(statusCode) || "An error occurred";
14
- let payload;
15
- if (options.formatter) {
16
- payload = await options.formatter({ error, request, response, reasonPhrase, statusCode });
17
- } else {
18
- const expose = error.expose;
19
- payload = {
20
- error: {
21
- statusCode,
22
- // eslint-disable-next-line perfectionist/sort-objects
23
- name: reasonPhrase,
24
- // eslint-disable-next-line perfectionist/sort-objects
25
- message: error.message || reasonPhrase,
26
- ...expose ? { stack: error.stack } : {}
27
- }
28
- };
29
- }
30
- const xml = toXML(payload, {
31
- header: options.toXml?.header ?? options.xmlHeader ?? true,
32
- indent: options.toXml?.indent ?? " ",
33
- ...options.toXml?.attributeReplacements ? { attributeReplacements: options.toXml.attributeReplacements } : {},
34
- ...options.toXml?.attributeFilter ? { attributeFilter: options.toXml.attributeFilter } : {},
35
- ...options.toXml?.attributeExplicitTrue !== void 0 ? { attributeExplicitTrue: options.toXml.attributeExplicitTrue } : {},
36
- ...options.toXml?.contentMap ? { contentMap: options.toXml.contentMap } : {},
37
- ...options.toXml?.contentReplacements ? { contentReplacements: options.toXml.contentReplacements } : {},
38
- ...options.toXml?.selfCloseTags !== void 0 ? { selfCloseTags: options.toXml.selfCloseTags } : {}
39
- });
40
- response.setHeader("content-type", "application/xml; charset=utf-8");
41
- response.end(xml);
42
- };
43
- }, "xmlErrorHandler");
44
-
45
- export { xmlErrorHandler };
1
+ var c=Object.defineProperty;var l=(t,e)=>c(t,"name",{value:e,configurable:!0});import{getReasonPhrase as p}from"http-status-codes";import{toXML as u}from"jstoxml";import{a as d}from"../packem_shared/add-status-code-to-response-DOfo6_g6.js";import{s as X}from"../packem_shared/set-error-headers-BWc7Sbh2.js";var f=Object.defineProperty,b=l((t,e)=>f(t,"name",{value:e,configurable:!0}),"l");const E=b((t={})=>async(e,n,o)=>{d(o,e),X(o,e);const r=o.statusCode,a=p(r)||"An error occurred";let s;if(t.formatter)s=await t.formatter({error:e,request:n,response:o,reasonPhrase:a,statusCode:r});else{const i=e.expose;s={error:{statusCode:r,name:a,message:e.message||a,...i?{stack:e.stack}:{}}}}const m=u(s,{header:t.toXml?.header??t.xmlHeader??!0,indent:t.toXml?.indent??" ",...t.toXml?.attributeReplacements?{attributeReplacements:t.toXml.attributeReplacements}:{},...t.toXml?.attributeFilter?{attributeFilter:t.toXml.attributeFilter}:{},...t.toXml?.attributeExplicitTrue!==void 0?{attributeExplicitTrue:t.toXml.attributeExplicitTrue}:{},...t.toXml?.contentMap?{contentMap:t.toXml.contentMap}:{},...t.toXml?.contentReplacements?{contentReplacements:t.toXml.contentReplacements}:{},...t.toXml?.selfCloseTags!==void 0?{selfCloseTags:t.toXml.selfCloseTags}:{}});o.setHeader("content-type","application/xml; charset=utf-8"),o.end(m)},"xmlErrorHandler");export{E as xmlErrorHandler};
@@ -1,173 +1,3 @@
1
- import { parseStacktrace } from '@visulima/error/stacktrace';
2
- import { boxen } from '@visulima/boxen';
3
- import { renderError } from '@visulima/error/error';
4
- import { readFile } from 'node:fs/promises';
5
- import { fileURLToPath } from 'node:url';
6
- import { ruleBasedFinder, errorHintFinder } from '@visulima/error/solution';
1
+ var g=Object.defineProperty;var c=(e,r)=>g(e,"name",{value:r,configurable:!0});import{parseStacktrace as b}from"@visulima/error/stacktrace";import{boxen as x}from"@visulima/boxen";import{renderError as j}from"@visulima/error/error";import{readFile as v}from"node:fs/promises";import{fileURLToPath as y}from"node:url";import{ruleBasedFinder as h,errorHintFinder as w}from"@visulima/error/solution";var O=Object.defineProperty,$=c((e,r)=>O(e,"name",{value:r,configurable:!0}),"r");const A=["cjs","mjs"],F=["mdoc"],B=$(e=>{const r=(e.split("?")[0]??e).split(".").pop()?.toLowerCase();if(!r||A.includes(r))return"javascript";if(F.includes(r))return"markdown";switch(r){case"js":return"javascript";case"json":return"json";case"json5":return"json5";case"jsonc":return"jsonc";case"jsx":return"jsx";case"sql":return"sql";case"ts":return"typescript";case"tsx":return"tsx";case"xml":return"xml";case"md":return"markdown";case"mdx":return"mdx";default:return"javascript"}},"findLanguageBasedOnExtension");var P=Object.defineProperty,k=c((e,r)=>P(e,"name",{value:r,configurable:!0}),"o$1");const u=new Map,H=k(async e=>{if(/^(?:http|https|file|data):/.test(e)){if(u.has(e))return u.get(e);if(e.startsWith("file:"))try{const r=y(e),t=await v(r,"utf8");return u.set(e,t),t}catch(r){console.log(r);return}try{const r=await fetch(e);if(!r.ok)return;const t=await r.text();return u.set(e,t),t}catch(r){console.log(r);return}}},"getFileSource");var L=Object.defineProperty,f=c((e,r)=>L(e,"name",{value:r,configurable:!0}),"d");const S=f(e=>e.replace(/^\s*#+\s*/,"").trim(),"sanitizeTitle"),T=f(async(e,r,t=!1)=>{const o=[...r,h,w],n=b(e,{frameLimit:1})[0]??{};for await(const i of o.sort((a,s)=>a.priority-s.priority)){const{handle:a,name:s}=i;if(t&&console.debug(`Running solution finder: ${s}`),typeof a!="function")continue;const l=await a(e,{file:n.file??"",language:B(n.file??""),line:n.line??0,snippet:n.file?await H(n.file):""});if(l)return l}},"runSolutionFinders"),d=f(async(e,r)=>{const{solutionFinders:t=[],solutionTitle:o,color:n,debug:i=!1,...a}=r,s=j(e,{...a,...n?.codeFrame}),l=await T(e,t,i);if(!l)return{errorAnsi:s,solutionBox:void 0};const p=S(l.header??o??"A possible solution to this error"),m=x(l.body,{borderStyle:"round",padding:{top:1,right:2,bottom:1,left:2},margin:{top:0,right:0,bottom:0,left:0},headerText:`💡 ${p}`,headerAlignment:"left",textAlignment:"left",...n?.boxen});return{errorAnsi:s,solutionBox:m}},"buildOutput"),q=f(async(e,r={})=>{const{logger:t=console,...o}=r,{errorAnsi:n,solutionBox:i}=await d(e,o);t.error(n),i&&(t.log(""),t.log(i))},"terminalOutput");var C=Object.defineProperty,E=c((e,r)=>C(e,"name",{value:r,configurable:!0}),"o");const I=E(async(e,r={})=>{const{errorAnsi:t,solutionBox:o}=await d(e,r);return o===void 0?t:`${t}
7
2
 
8
- var __defProp$3 = Object.defineProperty;
9
- var __name$3 = (target, value) => __defProp$3(target, "name", { value, configurable: true });
10
- const ALTERNATIVE_JS_EXTS = ["cjs", "mjs"];
11
- const ALTERNATIVE_MD_EXTS = ["mdoc"];
12
- const findLanguageBasedOnExtension = /* @__PURE__ */ __name$3((file) => {
13
- const cleaned = file.split("?")[0] ?? file;
14
- const extension = cleaned.split(".").pop()?.toLowerCase();
15
- if (!extension) {
16
- return "javascript";
17
- }
18
- if (ALTERNATIVE_JS_EXTS.includes(extension)) {
19
- return "javascript";
20
- }
21
- if (ALTERNATIVE_MD_EXTS.includes(extension)) {
22
- return "markdown";
23
- }
24
- switch (extension) {
25
- case "js": {
26
- return "javascript";
27
- }
28
- case "json": {
29
- return "json";
30
- }
31
- case "json5": {
32
- return "json5";
33
- }
34
- case "jsonc": {
35
- return "jsonc";
36
- }
37
- case "jsx": {
38
- return "jsx";
39
- }
40
- case "sql": {
41
- return "sql";
42
- }
43
- case "ts": {
44
- return "typescript";
45
- }
46
- case "tsx": {
47
- return "tsx";
48
- }
49
- case "xml": {
50
- return "xml";
51
- }
52
- case "md": {
53
- return "markdown";
54
- }
55
- case "mdx": {
56
- return "mdx";
57
- }
58
- default: {
59
- return "javascript";
60
- }
61
- }
62
- }, "findLanguageBasedOnExtension");
63
-
64
- var __defProp$2 = Object.defineProperty;
65
- var __name$2 = (target, value) => __defProp$2(target, "name", { value, configurable: true });
66
- const cache = /* @__PURE__ */ new Map();
67
- const getFileSource = /* @__PURE__ */ __name$2(async (file) => {
68
- if (!/^(?:http|https|file|data):/.test(file)) {
69
- return void 0;
70
- }
71
- if (cache.has(file)) {
72
- return cache.get(file);
73
- }
74
- if (file.startsWith("file:")) {
75
- try {
76
- const path = fileURLToPath(file);
77
- const source = await readFile(path, "utf8");
78
- cache.set(file, source);
79
- return source;
80
- } catch (error) {
81
- console.log(error);
82
- return void 0;
83
- }
84
- }
85
- try {
86
- const response = await fetch(file);
87
- if (!response.ok) {
88
- return void 0;
89
- }
90
- const source = await response.text();
91
- cache.set(file, source);
92
- return source;
93
- } catch (error) {
94
- console.log(error);
95
- return void 0;
96
- }
97
- }, "getFileSource");
98
-
99
- var __defProp$1 = Object.defineProperty;
100
- var __name$1 = (target, value) => __defProp$1(target, "name", { value, configurable: true });
101
- const sanitizeTitle = /* @__PURE__ */ __name$1((title) => title.replace(/^\s*#+\s*/, "").trim(), "sanitizeTitle");
102
- const runSolutionFinders = /* @__PURE__ */ __name$1(async (error, solutionFinders, debug = false) => {
103
- const candidates = [...solutionFinders, ruleBasedFinder, errorHintFinder];
104
- const firstTrace = parseStacktrace(error, { frameLimit: 1 })[0] ?? {};
105
- for await (const handler of candidates.sort((a, b) => a.priority - b.priority)) {
106
- const { handle, name } = handler;
107
- if (debug) {
108
- console.debug(`Running solution finder: ${name}`);
109
- }
110
- if (typeof handle !== "function") {
111
- continue;
112
- }
113
- const hint = await handle(error, {
114
- file: firstTrace.file ?? "",
115
- language: findLanguageBasedOnExtension(firstTrace.file ?? ""),
116
- line: firstTrace.line ?? 0,
117
- snippet: firstTrace.file ? await getFileSource(firstTrace.file) : ""
118
- });
119
- if (hint) {
120
- return hint;
121
- }
122
- }
123
- return void 0;
124
- }, "runSolutionFinders");
125
- const buildOutput = /* @__PURE__ */ __name$1(async (error, options) => {
126
- const { solutionFinders = [], solutionTitle, color, debug = false, ...renderOptions } = options;
127
- const errorAnsi = renderError(error, {
128
- ...renderOptions,
129
- ...color?.codeFrame
130
- });
131
- const hint = await runSolutionFinders(error, solutionFinders, debug);
132
- if (!hint) {
133
- return { errorAnsi, solutionBox: void 0 };
134
- }
135
- const header = sanitizeTitle(hint.header ?? solutionTitle ?? "A possible solution to this error");
136
- const solutionBox = boxen(hint.body, {
137
- borderStyle: "round",
138
- padding: { top: 1, right: 2, bottom: 1, left: 2 },
139
- margin: { top: 0, right: 0, bottom: 0, left: 0 },
140
- headerText: `💡 ${header}`,
141
- headerAlignment: "left",
142
- textAlignment: "left",
143
- ...color?.boxen
144
- });
145
- return {
146
- errorAnsi,
147
- solutionBox
148
- };
149
- }, "buildOutput");
150
- const terminalOutput = /* @__PURE__ */ __name$1(async (error, options = {}) => {
151
- const { logger = console, ...rest } = options;
152
- const { errorAnsi, solutionBox } = await buildOutput(error, rest);
153
- logger.error(errorAnsi);
154
- if (solutionBox) {
155
- logger.log("");
156
- logger.log(solutionBox);
157
- }
158
- }, "terminalOutput");
159
-
160
- var __defProp = Object.defineProperty;
161
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
162
- const ansiHandler = /* @__PURE__ */ __name(async (error, options = {}) => {
163
- const { errorAnsi, solutionBox } = await buildOutput(error, options);
164
- if (solutionBox === void 0) {
165
- return errorAnsi;
166
- }
167
- return `${errorAnsi}
168
-
169
- ${solutionBox}`;
170
- }, "ansiHandler");
171
- const cliHandler = terminalOutput;
172
-
173
- export { ansiHandler, cliHandler };
3
+ ${o}`},"ansiHandler"),J=q;export{I as ansiHandler,J as cliHandler};
@@ -1,267 +1 @@
1
- import { htmlErrorHandler } from '../../error-handler/html-error-handler.js';
2
- import jsonapiErrorHandler from '../../error-handler/jsonapi-error-handler.js';
3
- import problemErrorHandler from '../../error-handler/problem-error-handler.js';
4
- import { textErrorHandler } from '../../error-handler/text-error-handler.js';
5
- import { jsonErrorHandler } from '../../error-handler/json-error-handler.js';
6
- import { jsonpErrorHandler } from '../../error-handler/jsonp-error-handler.js';
7
- import { xmlErrorHandler } from '../../error-handler/xml-error-handler.js';
8
-
9
- var __defProp$2 = Object.defineProperty;
10
- var __name$2 = (target, value) => __defProp$2(target, "name", { value, configurable: true });
11
- class MockServerResponse {
12
- static {
13
- __name$2(this, "MockServerResponse");
14
- }
15
- statusCode = 200;
16
- statusMessage = "";
17
- headers = {};
18
- headersSent = false;
19
- writable = true;
20
- finished = false;
21
- writableEnded = false;
22
- writableFinished = false;
23
- writableHighWaterMark = 16384;
24
- writableLength = 0;
25
- destroyed = false;
26
- writableCorked = 0;
27
- readable = false;
28
- readableHighWaterMark = 16384;
29
- readableLength = 0;
30
- errored = null;
31
- closed = false;
32
- readableAborted = false;
33
- readableDidRead = false;
34
- readableEncoding = null;
35
- readableEnded = false;
36
- readableFlowing = null;
37
- _events;
38
- _eventsCount = 0;
39
- _maxListeners;
40
- body = "";
41
- setHeader(name, value) {
42
- this.headers[name.toLowerCase()] = value;
43
- return this;
44
- }
45
- getHeader(name) {
46
- return this.headers[name.toLowerCase()];
47
- }
48
- getHeaders() {
49
- return { ...this.headers };
50
- }
51
- getHeaderNames() {
52
- return Object.keys(this.headers);
53
- }
54
- hasHeader(name) {
55
- return name.toLowerCase() in this.headers;
56
- }
57
- removeHeader(name) {
58
- delete this.headers[name.toLowerCase()];
59
- return this;
60
- }
61
- writeHead(statusCode, statusMessage, headers) {
62
- this.statusCode = statusCode;
63
- if (typeof statusMessage === "string") {
64
- this.statusMessage = statusMessage;
65
- }
66
- if (typeof statusMessage === "object") {
67
- headers = statusMessage;
68
- }
69
- if (headers) {
70
- Object.assign(this.headers, headers);
71
- }
72
- return this;
73
- }
74
- write(chunk) {
75
- this.body += chunk.toString();
76
- return true;
77
- }
78
- end(data, encoding, cb) {
79
- if (data) {
80
- this.body += data.toString();
81
- }
82
- this.finished = true;
83
- return this;
84
- }
85
- flushHeaders() {
86
- this.headersSent = true;
87
- }
88
- // Stub methods for interface compliance
89
- addListener = /* @__PURE__ */ __name$2(() => this, "addListener");
90
- on = /* @__PURE__ */ __name$2(() => this, "on");
91
- once = /* @__PURE__ */ __name$2(() => this, "once");
92
- removeListener = /* @__PURE__ */ __name$2(() => this, "removeListener");
93
- off = /* @__PURE__ */ __name$2(() => this, "off");
94
- removeAllListeners = /* @__PURE__ */ __name$2(() => this, "removeAllListeners");
95
- setMaxListeners = /* @__PURE__ */ __name$2(() => this, "setMaxListeners");
96
- getMaxListeners = /* @__PURE__ */ __name$2(() => 10, "getMaxListeners");
97
- listeners = /* @__PURE__ */ __name$2(() => [], "listeners");
98
- rawListeners = /* @__PURE__ */ __name$2(() => [], "rawListeners");
99
- emit = /* @__PURE__ */ __name$2(() => false, "emit");
100
- eventNames = /* @__PURE__ */ __name$2(() => [], "eventNames");
101
- listenerCount = /* @__PURE__ */ __name$2(() => 0, "listenerCount");
102
- prependListener = /* @__PURE__ */ __name$2(() => this, "prependListener");
103
- prependOnceListener = /* @__PURE__ */ __name$2(() => this, "prependOnceListener");
104
- // Additional methods
105
- cork = /* @__PURE__ */ __name$2(() => {
106
- }, "cork");
107
- uncork = /* @__PURE__ */ __name$2(() => {
108
- }, "uncork");
109
- destroy = /* @__PURE__ */ __name$2(() => this, "destroy");
110
- read = /* @__PURE__ */ __name$2(() => null, "read");
111
- setEncoding = /* @__PURE__ */ __name$2(() => this, "setEncoding");
112
- pause = /* @__PURE__ */ __name$2(() => this, "pause");
113
- resume = /* @__PURE__ */ __name$2(() => this, "resume");
114
- isPaused = /* @__PURE__ */ __name$2(() => false, "isPaused");
115
- destroySoon = /* @__PURE__ */ __name$2(() => this, "destroySoon");
116
- pipe = /* @__PURE__ */ __name$2(() => ({}), "pipe");
117
- unpipe = /* @__PURE__ */ __name$2(() => this, "unpipe");
118
- unshift = /* @__PURE__ */ __name$2(() => {
119
- }, "unshift");
120
- wrap = /* @__PURE__ */ __name$2(() => this, "wrap");
121
- setTimeout = /* @__PURE__ */ __name$2(() => this, "setTimeout");
122
- assignSocket = /* @__PURE__ */ __name$2(() => {
123
- }, "assignSocket");
124
- detachSocket = /* @__PURE__ */ __name$2(() => {
125
- }, "detachSocket");
126
- writeContinue = /* @__PURE__ */ __name$2(() => {
127
- }, "writeContinue");
128
- writeEarlyHints = /* @__PURE__ */ __name$2(() => {
129
- }, "writeEarlyHints");
130
- sendDate = true;
131
- strictContentLength = false;
132
- chunkedEncoding = false;
133
- shouldKeepAlive = true;
134
- useChunkedEncodingByDefault = true;
135
- _hasBody = true;
136
- _trailer = "";
137
- connection = null;
138
- socket = null;
139
- }
140
- const fetchHtmlErrorHandler = /* @__PURE__ */ __name$2((options = {}) => {
141
- const nodeHandler = htmlErrorHandler(options);
142
- return async (error, request) => {
143
- const mockReq = {
144
- url: request.url,
145
- method: request.method,
146
- headers: Object.fromEntries(Array.from(request.headers.entries()))
147
- };
148
- const mockRes = new MockServerResponse();
149
- await nodeHandler(error, mockReq, mockRes);
150
- const contentType = mockRes.getHeader("content-type") || "text/html; charset=utf-8";
151
- return new Response(mockRes.body, {
152
- status: mockRes.statusCode,
153
- headers: {
154
- "content-type": contentType,
155
- ...mockRes.headers
156
- }
157
- });
158
- };
159
- }, "fetchHtmlErrorHandler");
160
-
161
- var __defProp$1 = Object.defineProperty;
162
- var __name$1 = (target, value) => __defProp$1(target, "name", { value, configurable: true });
163
- const negotiateContentType = /* @__PURE__ */ __name$1((acceptHeader) => {
164
- if (!acceptHeader) return "text/html";
165
- const accept = acceptHeader.toLowerCase();
166
- if (accept.includes("text/html")) return "text/html";
167
- if (accept.includes("application/vnd.api+json")) return "application/vnd.api+json";
168
- if (accept.includes("application/problem+json")) return "application/problem+json";
169
- if (accept.includes("application/json")) return "application/json";
170
- if (accept.includes("text/plain")) return "text/plain";
171
- if (accept.includes("application/javascript") || accept.includes("text/javascript")) return "application/javascript";
172
- if (accept.includes("application/xml") || accept.includes("text/xml")) return "application/xml";
173
- return "text/html";
174
- }, "negotiateContentType");
175
- const adaptErrorHandlerToFetch = /* @__PURE__ */ __name$1((nodeHandler) => {
176
- return async (error, request) => {
177
- const mockReq = {
178
- url: request.url,
179
- method: request.method,
180
- headers: Object.fromEntries(request.headers.entries())
181
- };
182
- const mockRes = {
183
- statusCode: 200,
184
- headers: {},
185
- _body: "",
186
- setHeader(name, value) {
187
- this.headers[name.toLowerCase()] = value;
188
- },
189
- getHeader(name) {
190
- return this.headers[name.toLowerCase()];
191
- },
192
- getHeaders() {
193
- return { ...this.headers };
194
- },
195
- writeHead(statusCode) {
196
- this.statusCode = statusCode;
197
- },
198
- write(chunk) {
199
- this._body += chunk.toString();
200
- },
201
- end(data) {
202
- if (data) {
203
- this._body += data.toString();
204
- }
205
- },
206
- flushHeaders() {
207
- }
208
- };
209
- await nodeHandler(error, mockReq, mockRes);
210
- const headers = {};
211
- for (const [key, value] of Object.entries(mockRes.headers)) {
212
- if (Array.isArray(value)) {
213
- headers[key] = value.join(", ");
214
- } else {
215
- headers[key] = String(value);
216
- }
217
- }
218
- return new Response(mockRes._body, {
219
- status: mockRes.statusCode,
220
- headers
221
- });
222
- };
223
- }, "adaptErrorHandlerToFetch");
224
- const createFetchNegotiatedErrorHandler = /* @__PURE__ */ __name$1((errorHandlers, showTrace, defaultHtmlHandler) => async (error, request) => {
225
- const accept = request.headers.get("accept");
226
- const chosenType = negotiateContentType(accept);
227
- let fetchErrorHandler = defaultHtmlHandler || adaptErrorHandlerToFetch(problemErrorHandler);
228
- if (chosenType === "text/html" && defaultHtmlHandler) {
229
- fetchErrorHandler = defaultHtmlHandler;
230
- } else if (chosenType === "application/vnd.api+json") {
231
- fetchErrorHandler = adaptErrorHandlerToFetch(jsonapiErrorHandler);
232
- } else if (chosenType === "application/problem+json") {
233
- fetchErrorHandler = adaptErrorHandlerToFetch(problemErrorHandler);
234
- } else if (chosenType === "application/json") {
235
- fetchErrorHandler = adaptErrorHandlerToFetch(jsonErrorHandler());
236
- } else if (chosenType === "text/plain") {
237
- fetchErrorHandler = adaptErrorHandlerToFetch(textErrorHandler());
238
- } else if (chosenType === "application/javascript") {
239
- fetchErrorHandler = adaptErrorHandlerToFetch(jsonpErrorHandler());
240
- } else if (chosenType === "application/xml") {
241
- fetchErrorHandler = adaptErrorHandlerToFetch(xmlErrorHandler());
242
- }
243
- for (const { handler, regex } of errorHandlers) {
244
- const headerStr = accept ?? "";
245
- if (regex.test(headerStr)) {
246
- fetchErrorHandler = handler;
247
- break;
248
- }
249
- }
250
- error.expose = showTrace;
251
- return fetchErrorHandler(error, request);
252
- }, "createFetchNegotiatedErrorHandler");
253
-
254
- var __defProp = Object.defineProperty;
255
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
256
- const fetchHandler = /* @__PURE__ */ __name(async (error, options = {}) => {
257
- const defaultHtml = fetchHtmlErrorHandler(options);
258
- const negotiated = createFetchNegotiatedErrorHandler(options.extraHandlers ?? [], options.showTrace ?? true, defaultHtml);
259
- return async (request) => {
260
- if (options?.onError) {
261
- await options.onError(error, request);
262
- }
263
- return negotiated(error, request);
264
- };
265
- }, "fetchHandler");
266
-
267
- export { fetchHandler as default };
1
+ var b=Object.defineProperty;var h=(s,e)=>b(s,"name",{value:e,configurable:!0});import{htmlErrorHandler as g}from"../../error-handler/html-error-handler.js";import y from"../../error-handler/jsonapi-error-handler.js";import u from"../../error-handler/problem-error-handler.js";import{textErrorHandler as w}from"../../error-handler/text-error-handler.js";import{jsonErrorHandler as H}from"../../error-handler/json-error-handler.js";import{jsonpErrorHandler as v}from"../../error-handler/jsonp-error-handler.js";import{xmlErrorHandler as L}from"../../error-handler/xml-error-handler.js";var j=Object.defineProperty,t=h((s,e)=>j(s,"name",{value:e,configurable:!0}),"e");class x{static{h(this,"u")}static{t(this,"MockServerResponse")}statusCode=200;statusMessage="";headers={};headersSent=!1;writable=!0;finished=!1;writableEnded=!1;writableFinished=!1;writableHighWaterMark=16384;writableLength=0;destroyed=!1;writableCorked=0;readable=!1;readableHighWaterMark=16384;readableLength=0;errored=null;closed=!1;readableAborted=!1;readableDidRead=!1;readableEncoding=null;readableEnded=!1;readableFlowing=null;_events;_eventsCount=0;_maxListeners;body="";setHeader(e,a){return this.headers[e.toLowerCase()]=a,this}getHeader(e){return this.headers[e.toLowerCase()]}getHeaders(){return{...this.headers}}getHeaderNames(){return Object.keys(this.headers)}hasHeader(e){return e.toLowerCase()in this.headers}removeHeader(e){return delete this.headers[e.toLowerCase()],this}writeHead(e,a,n){return this.statusCode=e,typeof a=="string"&&(this.statusMessage=a),typeof a=="object"&&(n=a),n&&Object.assign(this.headers,n),this}write(e){return this.body+=e.toString(),!0}end(e,a,n){return e&&(this.body+=e.toString()),this.finished=!0,this}flushHeaders(){this.headersSent=!0}addListener=t(()=>this,"addListener");on=t(()=>this,"on");once=t(()=>this,"once");removeListener=t(()=>this,"removeListener");off=t(()=>this,"off");removeAllListeners=t(()=>this,"removeAllListeners");setMaxListeners=t(()=>this,"setMaxListeners");getMaxListeners=t(()=>10,"getMaxListeners");listeners=t(()=>[],"listeners");rawListeners=t(()=>[],"rawListeners");emit=t(()=>!1,"emit");eventNames=t(()=>[],"eventNames");listenerCount=t(()=>0,"listenerCount");prependListener=t(()=>this,"prependListener");prependOnceListener=t(()=>this,"prependOnceListener");cork=t(()=>{},"cork");uncork=t(()=>{},"uncork");destroy=t(()=>this,"destroy");read=t(()=>null,"read");setEncoding=t(()=>this,"setEncoding");pause=t(()=>this,"pause");resume=t(()=>this,"resume");isPaused=t(()=>!1,"isPaused");destroySoon=t(()=>this,"destroySoon");pipe=t(()=>({}),"pipe");unpipe=t(()=>this,"unpipe");unshift=t(()=>{},"unshift");wrap=t(()=>this,"wrap");setTimeout=t(()=>this,"setTimeout");assignSocket=t(()=>{},"assignSocket");detachSocket=t(()=>{},"detachSocket");writeContinue=t(()=>{},"writeContinue");writeEarlyHints=t(()=>{},"writeEarlyHints");sendDate=!0;strictContentLength=!1;chunkedEncoding=!1;shouldKeepAlive=!0;useChunkedEncodingByDefault=!0;_hasBody=!0;_trailer="";connection=null;socket=null}const C=t((s={})=>{const e=g(s);return async(a,n)=>{const o={url:n.url,method:n.method,headers:Object.fromEntries(Array.from(n.headers.entries()))},d=new x;await e(a,o,d);const r=d.getHeader("content-type")||"text/html; charset=utf-8";return new Response(d.body,{status:d.statusCode,headers:{"content-type":r,...d.headers}})}},"fetchHtmlErrorHandler");var E=Object.defineProperty,c=h((s,e)=>E(s,"name",{value:e,configurable:!0}),"l");const k=c(s=>{if(!s)return"text/html";const e=s.toLowerCase();return e.includes("text/html")?"text/html":e.includes("application/vnd.api+json")?"application/vnd.api+json":e.includes("application/problem+json")?"application/problem+json":e.includes("application/json")?"application/json":e.includes("text/plain")?"text/plain":e.includes("application/javascript")||e.includes("text/javascript")?"application/javascript":e.includes("application/xml")||e.includes("text/xml")?"application/xml":"text/html"},"negotiateContentType"),l=c(s=>async(e,a)=>{const n={url:a.url,method:a.method,headers:Object.fromEntries(a.headers.entries())},o={statusCode:200,headers:{},_body:"",setHeader(r,i){this.headers[r.toLowerCase()]=i},getHeader(r){return this.headers[r.toLowerCase()]},getHeaders(){return{...this.headers}},writeHead(r){this.statusCode=r},write(r){this._body+=r.toString()},end(r){r&&(this._body+=r.toString())},flushHeaders(){}};await s(e,n,o);const d={};for(const[r,i]of Object.entries(o.headers))Array.isArray(i)?d[r]=i.join(", "):d[r]=String(i);return new Response(o._body,{status:o.statusCode,headers:d})},"adaptErrorHandlerToFetch"),S=c((s,e,a)=>async(n,o)=>{const d=o.headers.get("accept"),r=k(d);let i=a||l(u);r==="text/html"&&a?i=a:r==="application/vnd.api+json"?i=l(y):r==="application/problem+json"?i=l(u):r==="application/json"?i=l(H()):r==="text/plain"?i=l(w()):r==="application/javascript"?i=l(v()):r==="application/xml"&&(i=l(L()));for(const{handler:p,regex:m}of s){const f=d??"";if(m.test(f)){i=p;break}}return n.expose=e,i(n,o)},"createFetchNegotiatedErrorHandler");var O=Object.defineProperty,M=h((s,e)=>O(s,"name",{value:e,configurable:!0}),"t");const B=M(async(s,e={})=>{const a=C(e),n=S(e.extraHandlers??[],e.showTrace??!0,a);return async o=>(e?.onError&&await e.onError(s,o),n(s,o))},"fetchHandler");export{B as default};
@@ -1,17 +1 @@
1
- import { htmlErrorHandler } from '../../error-handler/html-error-handler.js';
2
- import createNegotiatedErrorHandler from '../../packem_shared/createNegotiatedErrorHandler-Cd7yj67Z.js';
3
-
4
- var __defProp = Object.defineProperty;
5
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
- const httpHandler = /* @__PURE__ */ __name(async (error, options = {}) => {
7
- const defaultHtml = htmlErrorHandler(options);
8
- const negotiated = createNegotiatedErrorHandler(options.extraHandlers ?? [], options.showTrace ?? true, defaultHtml);
9
- return async (request, response) => {
10
- if (options?.onError) {
11
- await options.onError(error, request, response);
12
- }
13
- await negotiated(error, request, response);
14
- };
15
- }, "httpHandler");
16
-
17
- export { httpHandler as default };
1
+ var s=Object.defineProperty;var o=(a,r)=>s(a,"name",{value:r,configurable:!0});import{htmlErrorHandler as c}from"../../error-handler/html-error-handler.js";import m from"../../packem_shared/createNegotiatedErrorHandler-ElYcOlsu.js";var i=Object.defineProperty,u=o((a,r)=>i(a,"name",{value:r,configurable:!0}),"s");const h=u(async(a,r={})=>{const n=c(r),l=m(r.extraHandlers??[],r.showTrace??!0,n);return async(t,e)=>{r?.onError&&await r.onError(a,t,e),await l(a,t,e)}},"httpHandler");export{h as default};
package/dist/index.js CHANGED
@@ -1,8 +1 @@
1
- export { default as jsonapiErrorHandler } from './error-handler/jsonapi-error-handler.js';
2
- export { default as problemErrorHandler } from './error-handler/problem-error-handler.js';
3
- export { htmlErrorHandler } from './error-handler/html-error-handler.js';
4
- export { default as createNegotiatedErrorHandler } from './packem_shared/createNegotiatedErrorHandler-Cd7yj67Z.js';
5
- export { textErrorHandler } from './error-handler/text-error-handler.js';
6
- export { jsonErrorHandler } from './error-handler/json-error-handler.js';
7
- export { jsonpErrorHandler } from './error-handler/jsonp-error-handler.js';
8
- export { xmlErrorHandler } from './error-handler/xml-error-handler.js';
1
+ import{default as e}from"./error-handler/jsonapi-error-handler.js";import{default as t}from"./error-handler/problem-error-handler.js";import{htmlErrorHandler as d}from"./error-handler/html-error-handler.js";import{default as m}from"./packem_shared/createNegotiatedErrorHandler-ElYcOlsu.js";import{textErrorHandler as p}from"./error-handler/text-error-handler.js";import{jsonErrorHandler as E}from"./error-handler/json-error-handler.js";import{jsonpErrorHandler as s}from"./error-handler/jsonp-error-handler.js";import{xmlErrorHandler as u}from"./error-handler/xml-error-handler.js";export{m as createNegotiatedErrorHandler,d as htmlErrorHandler,E as jsonErrorHandler,e as jsonapiErrorHandler,s as jsonpErrorHandler,t as problemErrorHandler,p as textErrorHandler,u as xmlErrorHandler};
@@ -0,0 +1 @@
1
+ var r=Object.defineProperty;var a=(e,s)=>r(e,"name",{value:s,configurable:!0});import{StatusCodes as u}from"http-status-codes";var d=Object.defineProperty,n=a((e,s)=>d(e,"name",{value:s,configurable:!0}),"s");const i=n((e,s)=>{const o=s,t=Number(o.statusCode??o.status);if(Number.isInteger(t)&&t>=400&&t<=599){e.statusCode=t;return}e.statusCode<400&&(e.statusCode=u.INTERNAL_SERVER_ERROR)},"addStatusCodeToResponse");export{i as a};
@@ -0,0 +1 @@
1
+ var j=Object.defineProperty;var l=(a,o)=>j(a,"name",{value:o,configurable:!0});import d from"../error-handler/jsonapi-error-handler.js";import c from"../error-handler/problem-error-handler.js";import{textErrorHandler as v}from"../error-handler/text-error-handler.js";import{jsonErrorHandler as b}from"../error-handler/json-error-handler.js";import{jsonpErrorHandler as y}from"../error-handler/jsonp-error-handler.js";import{xmlErrorHandler as E}from"../error-handler/xml-error-handler.js";import{Accepts as H}from"@tinyhttp/accepts";var g=Object.defineProperty,h=l((a,o)=>g(a,"name",{value:o,configurable:!0}),"i");const q=h((a,o,e)=>async(n,i,m)=>{const r=new H(i).type(["text/html","application/vnd.api+json","application/problem+json","application/json","text/plain","application/javascript","text/javascript","application/xml","text/xml"]);let t=e||c;r==="text/html"&&e?t=e:r==="application/vnd.api+json"?t=d:r==="application/problem+json"?t=c:r==="application/json"?t=b():r==="text/plain"?t=v():r==="application/javascript"||r==="text/javascript"?t=y():(r==="application/xml"||r==="text/xml")&&(t=E());for(const{handler:s,regex:x}of a){const p=i.headers.accept??"",f=Array.isArray(p)?p.join(","):p;if(x.test(f)){t=s;break}}n.expose=o,await t(n,i,m)},"createNegotiatedErrorHandler");export{q as default};
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var t=(e,n)=>s(e,"name",{value:n,configurable:!0});var a=Object.defineProperty,o=t((e,n)=>a(e,"name",{value:n,configurable:!0}),"t");const i=o((e,n,r="application/json; charset=utf-8")=>{e.setHeader("content-type",r),e.end(JSON.stringify(n))},"sendJson");export{i as s};
@@ -0,0 +1 @@
1
+ var o=Object.defineProperty;var s=(e,r)=>o(e,"name",{value:r,configurable:!0});var c=Object.defineProperty,n=s((e,r)=>c(e,"name",{value:r,configurable:!0}),"o");const b=n((e,r)=>{const a=r.headers??{};Object.keys(a).forEach(t=>{e.setHeader(t,a[t])})},"setErrorHeaders");export{b as s};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/error-handler",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Error handlers for use in development and production environments.",
5
5
  "keywords": [
6
6
  "visulima",
@@ -133,9 +133,9 @@
133
133
  "CHANGELOG.md"
134
134
  ],
135
135
  "dependencies": {
136
- "@tinyhttp/accepts": "^2.2.3",
136
+ "@tinyhttp/accepts": "^2.2.4",
137
137
  "@visulima/boxen": "2.0.3",
138
- "@visulima/error": "4.5.0",
138
+ "@visulima/error": "4.6.1",
139
139
  "http-errors": "^2.0.0",
140
140
  "http-status-codes": "^2.3.0",
141
141
  "jstoxml": "^7.0.1",
@@ -1,17 +0,0 @@
1
- import { StatusCodes } from 'http-status-codes';
2
-
3
- var __defProp = Object.defineProperty;
4
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
- const addStatusCodeToResponse = /* @__PURE__ */ __name((response, error) => {
6
- const err = error;
7
- const candidate = Number(err.statusCode ?? err.status);
8
- if (Number.isInteger(candidate) && candidate >= 400 && candidate <= 599) {
9
- response.statusCode = candidate;
10
- return;
11
- }
12
- if (response.statusCode < 400) {
13
- response.statusCode = StatusCodes.INTERNAL_SERVER_ERROR;
14
- }
15
- }, "addStatusCodeToResponse");
16
-
17
- export { addStatusCodeToResponse as a };
@@ -1,52 +0,0 @@
1
- import jsonapiErrorHandler from '../error-handler/jsonapi-error-handler.js';
2
- import problemErrorHandler from '../error-handler/problem-error-handler.js';
3
- import { textErrorHandler } from '../error-handler/text-error-handler.js';
4
- import { jsonErrorHandler } from '../error-handler/json-error-handler.js';
5
- import { jsonpErrorHandler } from '../error-handler/jsonp-error-handler.js';
6
- import { xmlErrorHandler } from '../error-handler/xml-error-handler.js';
7
- import { Accepts } from '@tinyhttp/accepts';
8
-
9
- var __defProp = Object.defineProperty;
10
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
11
- const createNegotiatedErrorHandler = /* @__PURE__ */ __name((errorHandlers, showTrace, defaultHtmlHandler) => async (error, request, response) => {
12
- const accept = new Accepts(request);
13
- const chosenType = accept.type([
14
- "text/html",
15
- "application/vnd.api+json",
16
- "application/problem+json",
17
- "application/json",
18
- "text/plain",
19
- "application/javascript",
20
- "text/javascript",
21
- "application/xml",
22
- "text/xml"
23
- ]);
24
- let errorHandler = defaultHtmlHandler || problemErrorHandler;
25
- if (chosenType === "text/html" && defaultHtmlHandler) {
26
- errorHandler = defaultHtmlHandler;
27
- } else if (chosenType === "application/vnd.api+json") {
28
- errorHandler = jsonapiErrorHandler;
29
- } else if (chosenType === "application/problem+json") {
30
- errorHandler = problemErrorHandler;
31
- } else if (chosenType === "application/json") {
32
- errorHandler = jsonErrorHandler();
33
- } else if (chosenType === "text/plain") {
34
- errorHandler = textErrorHandler();
35
- } else if (chosenType === "application/javascript" || chosenType === "text/javascript") {
36
- errorHandler = jsonpErrorHandler();
37
- } else if (chosenType === "application/xml" || chosenType === "text/xml") {
38
- errorHandler = xmlErrorHandler();
39
- }
40
- for (const { handler, regex } of errorHandlers) {
41
- const headerVal = request.headers.accept ?? "";
42
- const headerStr = Array.isArray(headerVal) ? headerVal.join(",") : headerVal;
43
- if (regex.test(headerStr)) {
44
- errorHandler = handler;
45
- break;
46
- }
47
- }
48
- error.expose = showTrace;
49
- await errorHandler(error, request, response);
50
- }, "createNegotiatedErrorHandler");
51
-
52
- export { createNegotiatedErrorHandler as default };
@@ -1,8 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
- const sendJson = /* @__PURE__ */ __name((response, jsonBody, contentType = "application/json; charset=utf-8") => {
4
- response.setHeader("content-type", contentType);
5
- response.end(JSON.stringify(jsonBody));
6
- }, "sendJson");
7
-
8
- export { sendJson as s };
@@ -1,10 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
- const setErrorHeaders = /* @__PURE__ */ __name((response, error) => {
4
- const headers = error.headers ?? {};
5
- Object.keys(headers).forEach((header) => {
6
- response.setHeader(header, headers[header]);
7
- });
8
- }, "setErrorHeaders");
9
-
10
- export { setErrorHeaders as s };