@visulima/error-handler 1.0.2 → 1.0.4

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 (36) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE.md +13 -5
  3. package/README.md +24 -18
  4. package/dist/error-handler/html-error-handler.d.ts +4 -4
  5. package/dist/error-handler/html-error-handler.js +7 -35
  6. package/dist/error-handler/json-error-handler.d.ts +3 -3
  7. package/dist/error-handler/json-error-handler.js +1 -31
  8. package/dist/error-handler/jsonapi-error-handler.d.ts +1 -1
  9. package/dist/error-handler/jsonapi-error-handler.js +1 -46
  10. package/dist/error-handler/jsonp-error-handler.d.ts +3 -3
  11. package/dist/error-handler/jsonp-error-handler.js +1 -36
  12. package/dist/error-handler/problem-error-handler.d.ts +1 -1
  13. package/dist/error-handler/problem-error-handler.js +1 -53
  14. package/dist/error-handler/text-error-handler.d.ts +3 -3
  15. package/dist/error-handler/text-error-handler.js +2 -27
  16. package/dist/error-handler/xml-error-handler.d.ts +8 -8
  17. package/dist/error-handler/xml-error-handler.js +1 -45
  18. package/dist/handler/cli-handler.d.ts +2 -2
  19. package/dist/handler/cli-handler.js +2 -172
  20. package/dist/handler/http/fetch-handler.d.ts +2 -2
  21. package/dist/handler/http/fetch-handler.js +1 -267
  22. package/dist/handler/http/node-handler.d.ts +4 -4
  23. package/dist/handler/http/node-handler.js +1 -17
  24. package/dist/index.d.ts +6 -6
  25. package/dist/index.js +1 -8
  26. package/dist/packem_shared/add-status-code-to-response-BE6paXjR.js +1 -0
  27. package/dist/packem_shared/cliHandler-B3-YFZRV.js +1 -0
  28. package/dist/packem_shared/createNegotiatedErrorHandler-BLks0_Ak.js +1 -0
  29. package/dist/packem_shared/send-json-Cedv8-Bt.js +1 -0
  30. package/dist/packem_shared/set-error-headers-DT9rVGtW.js +1 -0
  31. package/dist/packem_shared/{types.d-DLy8CCca.d.ts → types.d-BQZBUb3b.d.ts} +1 -4
  32. package/package.json +3 -3
  33. package/dist/packem_shared/add-status-code-to-response-DdfxTQsK.js +0 -17
  34. package/dist/packem_shared/createNegotiatedErrorHandler-Cd7yj67Z.js +0 -52
  35. package/dist/packem_shared/send-json-o-t1rNfw.js +0 -8
  36. package/dist/packem_shared/set-error-headers-B6ZeX5k4.js +0 -10
@@ -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-BE6paXjR.js";import{a as X}from"../packem_shared/set-error-headers-DT9rVGtW.js";var f=Object.defineProperty,b=l((t,e)=>f(t,"name",{value:e,configurable:!0}),"l");const h=b((t={})=>async(e,n,o)=>{d(o,e),X(o,e);const{statusCode:r}=o,a=p(r)||"An error occurred";let s;if(t.formatter)s=await t.formatter({error:e,reasonPhrase:a,request:n,response:o,statusCode:r});else{const{expose:i}=e;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{h as xmlErrorHandler};
@@ -23,8 +23,8 @@ type BaseCliOptions = {
23
23
  type CliHandlerOptions = BaseCliOptions & {
24
24
  logger?: CliLogger;
25
25
  };
26
+ declare const terminalOutput: (error: Error, options?: CliHandlerOptions) => Promise<void>;
26
27
 
27
28
  declare const ansiHandler: (error: Error, options?: BaseCliOptions) => Promise<string>;
28
- declare const cliHandler: (error: Error, options?: CliHandlerOptions) => Promise<void>;
29
29
 
30
- export { type BaseCliOptions, type CliHandlerOptions, ansiHandler, cliHandler };
30
+ export { type BaseCliOptions, type CliHandlerOptions, ansiHandler, terminalOutput as cliHandler };
@@ -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 o=Object.defineProperty;var a=(r,e)=>o(r,"name",{value:e,configurable:!0});import{buildOutput as i}from"../packem_shared/cliHandler-B3-YFZRV.js";import{terminalOutput as f}from"../packem_shared/cliHandler-B3-YFZRV.js";var u=Object.defineProperty,l=a((r,e)=>u(r,"name",{value:e,configurable:!0}),"o");const d=l(async(r,e={})=>{const{errorAnsi:t,solutionBox:n}=await i(r,e);return n===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
+ ${n}`},"ansiHandler");export{d as ansiHandler,f as cliHandler};
@@ -1,11 +1,11 @@
1
1
  import { HtmlErrorHandlerOptions } from '../../error-handler/html-error-handler.js';
2
- import { F as FetchErrorHandlers } from '../../packem_shared/types.d-DLy8CCca.js';
2
+ import { F as FetchErrorHandlers } from '../../packem_shared/types.d-BQZBUb3b.js';
3
3
  import 'node:http';
4
4
 
5
5
  declare const fetchHandler: (error: Error, options?: HtmlErrorHandlerOptions & {
6
- showTrace?: boolean;
7
6
  extraHandlers?: FetchErrorHandlers;
8
7
  onError?: (error: Error, request: Request) => void | Promise<void>;
8
+ showTrace?: boolean;
9
9
  }) => Promise<(request: Request) => Promise<Response>>;
10
10
 
11
11
  export { fetchHandler as default };
@@ -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 c=(r,e)=>b(r,"name",{value:e,configurable:!0});import{jsonErrorHandler as g}from"../../error-handler/json-error-handler.js";import w from"../../error-handler/jsonapi-error-handler.js";import{jsonpErrorHandler as y}from"../../error-handler/jsonp-error-handler.js";import u from"../../error-handler/problem-error-handler.js";import{textErrorHandler as H}from"../../error-handler/text-error-handler.js";import{xmlErrorHandler as v}from"../../error-handler/xml-error-handler.js";import{htmlErrorHandler as L}from"../../error-handler/html-error-handler.js";var j=Object.defineProperty,h=c((r,e)=>j(r,"name",{value:e,configurable:!0}),"a$1");class x{static{c(this,"j")}static{h(this,"MockServerResponse")}statusCode=200;headers={};_body="";setHeader(e,s){this.headers[e.toLowerCase()]=s}getHeader(e){return this.headers[e.toLowerCase()]}getHeaders(){return{...this.headers}}writeHead(e){this.statusCode=e}write(e){this._body+=e.toString()}end(e){e&&(this._body+=e.toString())}flushHeaders(){}}const k=h(r=>{if(!r)return"text/html";const e=r.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"),d=h(r=>async(e,s)=>{const a={headers:Object.fromEntries(s.headers.entries()),method:s.method,url:s.url},i=new x;await r(e,a,i);const o={};for(const[l,n]of Object.entries(i.headers))o[l]=Array.isArray(n)?n.join(", "):String(n);return new Response(i._body,{headers:o,status:i.statusCode})},"adaptErrorHandlerToFetch"),C=h((r,e,s)=>async(a,i)=>{const o=i.headers.get("accept"),l=k(o);let n=s||d(u);if(l==="text/html"&&s)n=s;else switch(l){case"application/javascript":{n=d(y());break}case"application/json":{n=d(g());break}case"application/problem+json":{n=d(u);break}case"application/vnd.api+json":{n=d(w);break}case"application/xml":{n=d(v());break}case"text/plain":{n=d(H());break}}for(const{handler:p,regex:m}of r){const f=o??"";if(m.test(f)){n=p;break}}return a.expose=e,n(a,i)},"createFetchNegotiatedErrorHandler");var E=Object.defineProperty,t=c((r,e)=>E(r,"name",{value:e,configurable:!0}),"e");class S{static{c(this,"b")}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="";sendDate=!0;strictContentLength=!1;chunkedEncoding=!1;shouldKeepAlive=!0;useChunkedEncodingByDefault=!0;_hasBody=!0;_trailer="";connection=null;socket=null;setHeader(e,s){return this.headers[e.toLowerCase()]=s,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,s,a){return this.statusCode=e,typeof s=="string"&&(this.statusMessage=s),typeof s=="object"&&(a=s),a&&Object.assign(this.headers,a),this}write(e){return this.body+=e.toString(),!0}end(e,s,a){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")}const M=t((r={})=>{const e=L(r);return async(s,a)=>{const i={headers:Object.fromEntries(a.headers.entries()),method:a.method,url:a.url},o=new S;await e(s,i,o);const l=o.getHeader("content-type")||"text/html; charset=utf-8";return new Response(o.body,{headers:{"content-type":l,...o.headers},status:o.statusCode})}},"fetchHtmlErrorHandler");var O=Object.defineProperty,_=c((r,e)=>O(r,"name",{value:e,configurable:!0}),"t");const B=_(async(r,e={})=>{const s=M(e),a=C(e.extraHandlers??[],e.showTrace??!0,s);return async i=>(e?.onError&&await e.onError(r,i),a(r,i))},"fetchHandler");export{B as default};
@@ -1,11 +1,11 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import { HtmlErrorHandlerOptions } from '../../error-handler/html-error-handler.js';
3
- import { E as ErrorHandlers } from '../../packem_shared/types.d-DLy8CCca.js';
3
+ import { E as ErrorHandlers } from '../../packem_shared/types.d-BQZBUb3b.js';
4
4
 
5
- declare const httpHandler: (error: Error, options?: HtmlErrorHandlerOptions & {
6
- showTrace?: boolean;
5
+ declare const nodeHandler: (error: Error, options?: HtmlErrorHandlerOptions & {
7
6
  extraHandlers?: ErrorHandlers;
8
7
  onError?: (error: Error, request: IncomingMessage, response: ServerResponse) => void | Promise<void>;
8
+ showTrace?: boolean;
9
9
  }) => Promise<(request: IncomingMessage, response: ServerResponse) => Promise<void>>;
10
10
 
11
- export { httpHandler as default };
11
+ export { nodeHandler 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 c from"../../packem_shared/createNegotiatedErrorHandler-BLks0_Ak.js";import{htmlErrorHandler as m}from"../../error-handler/html-error-handler.js";var d=Object.defineProperty,i=o((a,r)=>d(a,"name",{value:r,configurable:!0}),"s");const v=i(async(a,r={})=>{const n=m(r),l=c(r.extraHandlers??[],r.showTrace??!0,n);return async(e,t)=>{r?.onError&&await r.onError(a,e,t),await l(a,e,t)}},"nodeHandler");export{v as default};
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
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 { HtmlErrorHandlerOptions, htmlErrorHandler } from './error-handler/html-error-handler.js';
4
1
  import { IncomingMessage, ServerResponse } from 'node:http';
5
- import { E as ErrorHandlers, a as ErrorHandler } from './packem_shared/types.d-DLy8CCca.js';
6
- export { A as ApiFormat } from './packem_shared/types.d-DLy8CCca.js';
7
- export { TextErrorFormatter, TextErrorHandlerOptions, textErrorHandler } from './error-handler/text-error-handler.js';
2
+ import { E as ErrorHandlers, a as ErrorHandler } from './packem_shared/types.d-BQZBUb3b.js';
3
+ export { A as ApiFormat } from './packem_shared/types.d-BQZBUb3b.js';
4
+ export { HtmlErrorHandlerOptions, htmlErrorHandler } from './error-handler/html-error-handler.js';
8
5
  export { JsonErrorBody, JsonErrorFormatter, JsonErrorHandlerOptions, jsonErrorHandler } from './error-handler/json-error-handler.js';
6
+ export { default as jsonapiErrorHandler } from './error-handler/jsonapi-error-handler.js';
9
7
  export { JsonpErrorBody, JsonpErrorFormatter, JsonpErrorHandlerOptions, jsonpErrorHandler } from './error-handler/jsonp-error-handler.js';
8
+ export { default as problemErrorHandler } from './error-handler/problem-error-handler.js';
9
+ export { TextErrorFormatter, TextErrorHandlerOptions, textErrorHandler } from './error-handler/text-error-handler.js';
10
10
  export { ToXmlOptions, XmlErrorBody, XmlErrorFormatter, XmlErrorHandlerOptions, xmlErrorHandler } from './error-handler/xml-error-handler.js';
11
11
 
12
12
  declare const createNegotiatedErrorHandler: <Request extends IncomingMessage, Response extends ServerResponse>(errorHandlers: ErrorHandlers, showTrace: boolean, defaultHtmlHandler?: ErrorHandler) => (error: Error, request: Request, response: Response) => Promise<void>;
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"./packem_shared/createNegotiatedErrorHandler-BLks0_Ak.js";import{htmlErrorHandler as t}from"./error-handler/html-error-handler.js";import{jsonErrorHandler as d}from"./error-handler/json-error-handler.js";import{default as m}from"./error-handler/jsonapi-error-handler.js";import{jsonpErrorHandler as p}from"./error-handler/jsonp-error-handler.js";import{default as E}from"./error-handler/problem-error-handler.js";import{textErrorHandler as s}from"./error-handler/text-error-handler.js";import{xmlErrorHandler as u}from"./error-handler/xml-error-handler.js";export{e as createNegotiatedErrorHandler,t as htmlErrorHandler,d as jsonErrorHandler,m as jsonapiErrorHandler,p as jsonpErrorHandler,E as problemErrorHandler,s as textErrorHandler,u as xmlErrorHandler};
@@ -0,0 +1 @@
1
+ var r=Object.defineProperty;var o=(e,s)=>r(e,"name",{value:s,configurable:!0});import{StatusCodes as u}from"http-status-codes";var d=Object.defineProperty,n=o((e,s)=>d(e,"name",{value:s,configurable:!0}),"s");const i=n((e,s)=>{const a=s,t=Number(a.statusCode??a.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 m=Object.defineProperty;var u=(e,r)=>m(e,"name",{value:r,configurable:!0});import{parseStacktrace as g}from"@visulima/error/stacktrace";import{boxen as x}from"@visulima/boxen";import{renderError as b}from"@visulima/error/error";import{readFile as j}from"node:fs/promises";import{fileURLToPath as h}from"node:url";import{ruleBasedFinder as y,errorHintFinder as v}from"@visulima/error/solution";var w=Object.defineProperty,O=u((e,r)=>w(e,"name",{value:r,configurable:!0}),"r");const F=["cjs","mjs"],A=["mdoc"],B=O(e=>{const r=(e.split("?")[0]??e).split(".").pop()?.toLowerCase();if(!r||F.includes(r))return"javascript";if(A.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 k=Object.defineProperty,L=u((e,r)=>k(e,"name",{value:r,configurable:!0}),"o");const c=new Map,P=L(async e=>{if(/^(?:http|https|file|data):/.test(e)){if(c.has(e))return c.get(e);if(e.startsWith("file:"))try{const r=h(e),t=await j(r,"utf8");return c.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 c.set(e,t),t}catch(r){console.log(r);return}}},"getFileSource");var S=Object.defineProperty,f=u((e,r)=>S(e,"name",{value:r,configurable:!0}),"d");const T=f(e=>e.replace(/^\s*#+\s*/,"").trim(),"sanitizeTitle"),$=f(async(e,r,t=!1)=>{const l=[...r,y,v],n=g(e,{frameLimit:1})[0]??{};for await(const o of l.sort((i,s)=>i.priority-s.priority)){const{handle:i,name:s}=o;if(t&&console.debug(`Running solution finder: ${s}`),typeof i!="function")continue;const a=await i(e,{file:n.file??"",language:B(n.file??""),line:n.line??0,snippet:n.file?await P(n.file):""});if(a)return a}},"runSolutionFinders"),q=f(async(e,r)=>{const{solutionFinders:t=[],solutionTitle:l,color:n,debug:o=!1,...i}=r,s=b(e,{...i,...n?.codeFrame}),a=await $(e,t,o);if(!a)return{errorAnsi:s,solutionBox:void 0};const d=T(a.header??l??"A possible solution to this error"),p=x(a.body,{borderStyle:"round",padding:{top:1,right:2,bottom:1,left:2},margin:{top:0,right:0,bottom:0,left:0},headerText:`💡 ${d}`,headerAlignment:"left",textAlignment:"left",...n?.boxen});return{errorAnsi:s,solutionBox:p}},"buildOutput"),W=f(async(e,r={})=>{const{logger:t=console,...l}=r,{errorAnsi:n,solutionBox:o}=await q(e,l);t.error(n),o&&(t.log(""),t.log(o))},"terminalOutput");export{q as buildOutput,W as terminalOutput};
@@ -0,0 +1 @@
1
+ var j=Object.defineProperty;var c=(r,e)=>j(r,"name",{value:e,configurable:!0});import{Accepts as d}from"@tinyhttp/accepts";import{jsonErrorHandler as b}from"../error-handler/json-error-handler.js";import v from"../error-handler/jsonapi-error-handler.js";import{jsonpErrorHandler as k}from"../error-handler/jsonp-error-handler.js";import l from"../error-handler/problem-error-handler.js";import{textErrorHandler as E}from"../error-handler/text-error-handler.js";import{xmlErrorHandler as h}from"../error-handler/xml-error-handler.js";var y=Object.defineProperty,H=c((r,e)=>y(r,"name",{value:e,configurable:!0}),"i");const q=H((r,e,t)=>async(p,o,s)=>{const n=new d(o).type(["text/html","application/vnd.api+json","application/problem+json","application/json","text/plain","application/javascript","text/javascript","application/xml","text/xml"]);let a=t||l;if(n==="text/html"&&t)a=t;else switch(n){case"application/javascript":case"text/javascript":{a=k();break}case"application/json":{a=b();break}case"application/problem+json":{a=l;break}case"application/vnd.api+json":{a=v;break}case"application/xml":case"text/xml":{a=h();break}case"text/plain":{a=E();break}}for(const{handler:m,regex:x}of r){const i=o.headers.accept??"",f=Array.isArray(i)?i.join(","):i;if(x.test(f)){a=m;break}}p.expose=e,await a(p,o,s)},"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 c=Object.defineProperty;var o=(e,r)=>c(e,"name",{value:r,configurable:!0});var n=Object.defineProperty,s=o((e,r)=>n(e,"name",{value:r,configurable:!0}),"o");const b=s((e,r)=>{const a=r.headers??{};Object.keys(a).forEach(t=>{e.setHeader(t,a[t])})},"setErrorHeaders");export{b as a};
@@ -6,10 +6,7 @@ type ErrorHandler = <Request extends IncomingMessage, Response extends ServerRes
6
6
  response: Response,
7
7
  ) => Promise<void> | void;
8
8
 
9
- type FetchErrorHandler = (
10
- error: unknown,
11
- request: Request,
12
- ) => Promise<Response> | Response;
9
+ type FetchErrorHandler = (error: unknown, request: Request) => Promise<Response>;
13
10
 
14
11
  type ErrorHandlers = {
15
12
  handler: ErrorHandler;