@eggjs/onerror 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/dist/commonjs/agent.d.ts +6 -0
  4. package/dist/commonjs/agent.js +16 -0
  5. package/dist/commonjs/app.d.ts +12 -0
  6. package/dist/commonjs/app.js +150 -0
  7. package/dist/commonjs/config/config.default.d.ts +27 -0
  8. package/dist/commonjs/config/config.default.js +15 -0
  9. package/dist/commonjs/index.d.ts +1 -0
  10. package/dist/commonjs/index.js +4 -0
  11. package/dist/commonjs/lib/error_view.d.ts +154 -0
  12. package/dist/commonjs/lib/error_view.js +248 -0
  13. package/dist/commonjs/lib/onerror_page.mustache.html +761 -0
  14. package/dist/commonjs/lib/utils.d.ts +10 -0
  15. package/dist/commonjs/lib/utils.js +53 -0
  16. package/dist/commonjs/package.json +3 -0
  17. package/dist/commonjs/types.d.ts +7 -0
  18. package/dist/commonjs/types.js +3 -0
  19. package/dist/esm/agent.d.ts +6 -0
  20. package/dist/esm/agent.js +13 -0
  21. package/dist/esm/app.d.ts +12 -0
  22. package/dist/esm/app.js +144 -0
  23. package/dist/esm/config/config.default.d.ts +27 -0
  24. package/dist/esm/config/config.default.js +10 -0
  25. package/dist/esm/index.d.ts +1 -0
  26. package/dist/esm/index.js +2 -0
  27. package/dist/esm/lib/error_view.d.ts +154 -0
  28. package/dist/esm/lib/error_view.js +241 -0
  29. package/dist/esm/lib/onerror_page.mustache.html +761 -0
  30. package/dist/esm/lib/utils.d.ts +10 -0
  31. package/dist/esm/lib/utils.js +43 -0
  32. package/dist/esm/package.json +3 -0
  33. package/dist/esm/types.d.ts +7 -0
  34. package/dist/esm/types.js +2 -0
  35. package/dist/package.json +4 -0
  36. package/package.json +93 -0
  37. package/src/agent.ts +12 -0
  38. package/src/app.ts +160 -0
  39. package/src/config/config.default.ts +34 -0
  40. package/src/index.ts +1 -0
  41. package/src/lib/error_view.ts +281 -0
  42. package/src/lib/onerror_page.mustache.html +761 -0
  43. package/src/lib/utils.ts +47 -0
  44. package/src/types.ts +12 -0
  45. package/src/typings/index.d.ts +4 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017-present Alibaba Group Holding Limited and other contributors.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # @eggjs/onerror
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![Node.js CI](https://github.com/eggjs/onerror/actions/workflows/nodejs.yml/badge.svg)](https://github.com/eggjs/onerror/actions/workflows/nodejs.yml)
5
+ [![Test coverage][codecov-image]][codecov-url]
6
+ [![Known Vulnerabilities][snyk-image]][snyk-url]
7
+ [![npm download][download-image]][download-url]
8
+ [![Node.js Version](https://img.shields.io/node/v/@eggjs/onerror.svg?style=flat)](https://nodejs.org/en/download/)
9
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://makeapullrequest.com)
10
+ ![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/eggjs/onerror)
11
+
12
+ [npm-image]: https://img.shields.io/npm/v/@eggjs/onerror.svg?style=flat-square
13
+ [npm-url]: https://npmjs.org/package/@eggjs/onerror
14
+ [codecov-image]: https://codecov.io/github/eggjs/onerror/coverage.svg?branch=master
15
+ [codecov-url]: https://codecov.io/github/eggjs/onerror?branch=master
16
+ [snyk-image]: https://snyk.io/test/npm/@eggjs/onerror/badge.svg?style=flat-square
17
+ [snyk-url]: https://snyk.io/test/npm/@eggjs/onerror
18
+ [download-image]: https://img.shields.io/npm/dm/@eggjs/onerror.svg?style=flat-square
19
+ [download-url]: https://npmjs.org/package/@eggjs/onerror
20
+
21
+ Default error handling plugin for egg.
22
+
23
+ ## Install
24
+
25
+ ```bash
26
+ npm i @eggjs/onerror
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ `egg-onerror` is on by default in egg. But you still can configure its properties to fits your scenarios.
32
+
33
+ - `errorPageUrl: String or Function` - If user request html pages in production environment and unexpected error happened, it will redirect user to `errorPageUrl`.
34
+ - `accepts: Function` - detect user's request accept `json` or `html`.
35
+ - `all: Function` - customize error handler, if `all` present, negotiation will be ignored.
36
+ - `html: Function` - customize html error handler.
37
+ - `text: Function` - customize text error handler.
38
+ - `json: Function` - customize json error handler.
39
+ - `jsonp: Function` - customize jsonp error handler.
40
+
41
+ ```js
42
+ // config.default.js
43
+ // errorPageUrl support function
44
+ exports.onerror = {
45
+ errorPageUrl: (err, ctx) => ctx.errorPageUrl || '/500',
46
+ };
47
+
48
+ // an accept detect function that mark all request with `x-requested-with=XMLHttpRequest` header accepts json.
49
+ function accepts(ctx) {
50
+ if (ctx.get('x-requested-with') === 'XMLHttpRequest') return 'json';
51
+ return 'html';
52
+ }
53
+ ```
54
+
55
+ ## Questions & Suggestions
56
+
57
+ Please open an issue [here](https://github.com/eggjs/egg/issues).
58
+
59
+ ## License
60
+
61
+ [MIT](https://github.com/eggjs/onerror/blob/master/LICENSE)
62
+
63
+ ## Contributors
64
+
65
+ [![Contributors](https://contrib.rocks/image?repo=eggjs/onerror)](https://github.com/eggjs/onerror/graphs/contributors)
66
+
67
+ Made with [contributors-img](https://contrib.rocks).
@@ -0,0 +1,6 @@
1
+ import type { ILifecycleBoot, EggCore } from '@eggjs/core';
2
+ export default class Boot implements ILifecycleBoot {
3
+ private agent;
4
+ constructor(agent: EggCore);
5
+ didLoad(): Promise<void>;
6
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class Boot {
4
+ agent;
5
+ constructor(agent) {
6
+ this.agent = agent;
7
+ }
8
+ async didLoad() {
9
+ // should watch error event
10
+ this.agent.on('error', err => {
11
+ this.agent.coreLogger.error(err);
12
+ });
13
+ }
14
+ }
15
+ exports.default = Boot;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxNQUFxQixJQUFJO0lBQ0g7SUFBcEIsWUFBb0IsS0FBYztRQUFkLFVBQUssR0FBTCxLQUFLLENBQVM7SUFBRyxDQUFDO0lBRXRDLEtBQUssQ0FBQyxPQUFPO1FBQ1gsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFURCx1QkFTQyJ9
@@ -0,0 +1,12 @@
1
+ import { type OnerrorError } from 'koa-onerror';
2
+ import type { ILifecycleBoot, EggCore } from '@eggjs/core';
3
+ export interface OnerrorErrorWithCode extends OnerrorError {
4
+ code?: string;
5
+ type?: string;
6
+ errors?: any[];
7
+ }
8
+ export default class Boot implements ILifecycleBoot {
9
+ private app;
10
+ constructor(app: EggCore);
11
+ didLoad(): Promise<void>;
12
+ }
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_http_1 = __importDefault(require("node:http"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const koa_onerror_1 = require("koa-onerror");
9
+ const error_view_js_1 = require("./lib/error_view.js");
10
+ const utils_js_1 = require("./lib/utils.js");
11
+ class Boot {
12
+ app;
13
+ constructor(app) {
14
+ this.app = app;
15
+ }
16
+ async didLoad() {
17
+ // logging error
18
+ const config = this.app.config.onerror;
19
+ const viewTemplate = node_fs_1.default.readFileSync(config.templatePath, 'utf8');
20
+ const app = this.app;
21
+ app.on('error', (err, ctx) => {
22
+ if (!ctx) {
23
+ ctx = app.currentContext || app.createAnonymousContext();
24
+ }
25
+ if (config.appErrorFilter && !config.appErrorFilter(err, ctx))
26
+ return;
27
+ const status = (0, utils_js_1.detectStatus)(err);
28
+ // 5xx
29
+ if (status >= 500) {
30
+ try {
31
+ ctx.logger.error(err);
32
+ }
33
+ catch (ex) {
34
+ app.logger.error(err);
35
+ app.logger.error(ex);
36
+ }
37
+ return;
38
+ }
39
+ // 4xx
40
+ try {
41
+ ctx.logger.warn(err);
42
+ }
43
+ catch (ex) {
44
+ app.logger.warn(err);
45
+ app.logger.error(ex);
46
+ }
47
+ });
48
+ const errorOptions = {
49
+ // support customize accepts function
50
+ accepts() {
51
+ const fn = config.accepts || utils_js_1.accepts;
52
+ return fn(this);
53
+ },
54
+ html(err, ctx) {
55
+ const status = (0, utils_js_1.detectStatus)(err);
56
+ const errorPageUrl = typeof config.errorPageUrl === 'function'
57
+ ? config.errorPageUrl(err, ctx)
58
+ : config.errorPageUrl;
59
+ // keep the real response status
60
+ ctx.realStatus = status;
61
+ // don't respond any error message in production env
62
+ if ((0, utils_js_1.isProd)(app)) {
63
+ // 5xx
64
+ if (status >= 500) {
65
+ if (errorPageUrl) {
66
+ const statusQuery = (errorPageUrl.indexOf('?') > 0 ? '&' : '?') +
67
+ `real_status=${status}`;
68
+ return ctx.redirect(errorPageUrl + statusQuery);
69
+ }
70
+ ctx.status = 500;
71
+ ctx.body = `<h2>Internal Server Error, real status: ${status}</h2>`;
72
+ return;
73
+ }
74
+ // 4xx
75
+ ctx.status = status;
76
+ ctx.body = `<h2>${status} ${node_http_1.default.STATUS_CODES[status]}</h2>`;
77
+ return;
78
+ }
79
+ // show simple error format for unittest
80
+ if (app.config.env === 'unittest') {
81
+ ctx.status = status;
82
+ ctx.body = `${err.name}: ${err.message}\n${err.stack}`;
83
+ return;
84
+ }
85
+ const errorView = new error_view_js_1.ErrorView(ctx, err, viewTemplate);
86
+ ctx.body = errorView.toHTML();
87
+ },
88
+ json(err, ctx) {
89
+ const status = (0, utils_js_1.detectStatus)(err);
90
+ let errorJson = {};
91
+ ctx.status = status;
92
+ const code = err.code ?? err.type;
93
+ const message = (0, utils_js_1.detectErrorMessage)(ctx, err);
94
+ if ((0, utils_js_1.isProd)(app)) {
95
+ // 5xx server side error
96
+ if (status >= 500) {
97
+ errorJson = {
98
+ code,
99
+ // don't respond any error message in production env
100
+ message: node_http_1.default.STATUS_CODES[status],
101
+ };
102
+ }
103
+ else {
104
+ // 4xx client side error
105
+ // addition `errors`
106
+ errorJson = {
107
+ code,
108
+ message,
109
+ errors: err.errors,
110
+ };
111
+ }
112
+ }
113
+ else {
114
+ errorJson = {
115
+ code,
116
+ message,
117
+ errors: err.errors,
118
+ };
119
+ if (status >= 500) {
120
+ // provide detail error stack in local env
121
+ errorJson.stack = err.stack;
122
+ errorJson.name = err.name;
123
+ for (const key in err) {
124
+ if (!errorJson[key]) {
125
+ errorJson[key] = err[key];
126
+ }
127
+ }
128
+ }
129
+ }
130
+ ctx.body = errorJson;
131
+ },
132
+ js(err, ctx) {
133
+ errorOptions.json.call(ctx, err, ctx);
134
+ if (ctx.createJsonpBody) {
135
+ ctx.createJsonpBody(ctx.body);
136
+ }
137
+ },
138
+ };
139
+ // support customize error response
140
+ const keys = ['all', 'html', 'json', 'text', 'js'];
141
+ for (const type of keys) {
142
+ if (config[type]) {
143
+ Reflect.set(errorOptions, type, config[type]);
144
+ }
145
+ }
146
+ (0, koa_onerror_1.onerror)(app, errorOptions);
147
+ }
148
+ }
149
+ exports.default = Boot;
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDBEQUE2QjtBQUM3QixzREFBeUI7QUFDekIsNkNBQThFO0FBRTlFLHVEQUFnRDtBQUNoRCw2Q0FBbUY7QUFTbkYsTUFBcUIsSUFBSTtJQUNIO0lBQXBCLFlBQW9CLEdBQVk7UUFBWixRQUFHLEdBQUgsR0FBRyxDQUFTO0lBQUcsQ0FBQztJQUVwQyxLQUFLLENBQUMsT0FBTztRQUNYLGdCQUFnQjtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkMsTUFBTSxZQUFZLEdBQUcsaUJBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxHQUFHLEdBQUcsR0FBRyxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUFFLE9BQU87WUFFdEUsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBWSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLE1BQU07WUFDTixJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDO29CQUNILEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO2dCQUFDLE9BQU8s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
@@ -0,0 +1,27 @@
1
+ import type { Context } from '@eggjs/core';
2
+ import type { OnerrorError, OnerrorOptions } from 'koa-onerror';
3
+ export interface OnerrorConfig extends OnerrorOptions {
4
+ /**
5
+ * 5xx error will redirect to ${errorPageUrl}
6
+ * won't redirect in local env
7
+ *
8
+ * Default: `''`
9
+ */
10
+ errorPageUrl: string | ((err: OnerrorError, ctx: Context) => string);
11
+ /**
12
+ * will execute `appErrorFilter` when emit an error in `app`
13
+ * If `appErrorFilter` return false, egg-onerror won't log this error.
14
+ * You can logging in `appErrorFilter` and return false to override the default error logging.
15
+ *
16
+ * Default: `undefined`
17
+ */
18
+ appErrorFilter?: (err: OnerrorError, ctx: Context) => boolean;
19
+ /**
20
+ * default template path
21
+ */
22
+ templatePath: string;
23
+ }
24
+ declare const _default: {
25
+ onerror: OnerrorConfig;
26
+ };
27
+ export default _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_path_1 = __importDefault(require("node:path"));
7
+ const utils_js_1 = require("../lib/utils.js");
8
+ exports.default = {
9
+ onerror: {
10
+ errorPageUrl: '',
11
+ appErrorFilter: undefined,
12
+ templatePath: node_path_1.default.join((0, utils_js_1.getSourceDirname)(), 'lib/onerror_page.mustache.html'),
13
+ },
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMERBQTZCO0FBRzdCLDhDQUFtRDtBQXdCbkQsa0JBQWU7SUFDYixPQUFPLEVBQUU7UUFDUCxZQUFZLEVBQUUsRUFBRTtRQUNoQixjQUFjLEVBQUUsU0FBUztRQUN6QixZQUFZLEVBQUUsbUJBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSwyQkFBZ0IsR0FBRSxFQUFFLGdDQUFnQyxDQUFDO0tBQzdEO0NBQ25CLENBQUMifQ==
@@ -0,0 +1 @@
1
+ import './types.js';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./types.js");
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQkFBb0IifQ==
@@ -0,0 +1,154 @@
1
+ import { type StackFrame } from 'stack-trace';
2
+ import type { OnerrorError } from 'koa-onerror';
3
+ import type { Context } from '@eggjs/core';
4
+ export interface FrameSource {
5
+ pre: string[];
6
+ line: string;
7
+ post: string[];
8
+ }
9
+ export interface Frame extends StackFrame {
10
+ context?: FrameSource;
11
+ }
12
+ export declare class ErrorView {
13
+ ctx: Context;
14
+ error: OnerrorError;
15
+ request: Context['request'];
16
+ app: Context['app'];
17
+ assets: Map<string, string>;
18
+ viewTemplate: string;
19
+ codeContext: number;
20
+ _filterHeaders: string[];
21
+ constructor(ctx: Context, error: OnerrorError, template: string);
22
+ /**
23
+ * get html error page
24
+ *
25
+ * @return {String} html page
26
+ */
27
+ toHTML(): string;
28
+ /**
29
+ * compile view
30
+ *
31
+ * @param {String} tpl - template
32
+ * @param {Object} locals - data used by template
33
+ */
34
+ compileView(tpl: string, locals: Record<string, unknown>): string;
35
+ /**
36
+ * check if the frame is node native file.
37
+ *
38
+ * @param {Frame} frame - current frame
39
+ */
40
+ isNode(frame: Frame): boolean;
41
+ /**
42
+ * check if the frame is app modules.
43
+ *
44
+ * @param {Object} frame - current frame
45
+ */
46
+ isApp(frame: Frame): boolean;
47
+ /**
48
+ * cache file asserts
49
+ *
50
+ * @param {String} key - assert key
51
+ * @param {String} value - assert content
52
+ */
53
+ setAssets(key: string, value: string): void;
54
+ /**
55
+ * get cache file asserts
56
+ *
57
+ * @param {String} key - assert key
58
+ */
59
+ getAssets(key: string): string | undefined;
60
+ /**
61
+ * get frame source
62
+ *
63
+ * @param {Object} frame - current frame
64
+ */
65
+ getFrameSource(frame: StackFrame): FrameSource;
66
+ /**
67
+ * parse error and return frame stack
68
+ */
69
+ parseError(): Frame[];
70
+ /**
71
+ * get stack context
72
+ *
73
+ * @param {Object} frame - current frame
74
+ */
75
+ getContext(frame: Frame): {
76
+ start?: undefined;
77
+ pre?: undefined;
78
+ line?: undefined;
79
+ post?: undefined;
80
+ } | {
81
+ start: number;
82
+ pre: string;
83
+ line: string;
84
+ post: string;
85
+ };
86
+ /**
87
+ * get frame classes, let view identify the frame
88
+ *
89
+ * @param {any} frame - current frame
90
+ * @param {any} index - current index
91
+ */
92
+ getFrameClasses(frame: Frame, index: number): string;
93
+ /**
94
+ * serialize frame and return meaningful data
95
+ *
96
+ * @param {Object} frame - current frame
97
+ */
98
+ serializeFrame(frame: Frame): {
99
+ extname: string;
100
+ file: string;
101
+ method: string;
102
+ line: number;
103
+ column: number;
104
+ context: {
105
+ start?: undefined;
106
+ pre?: undefined;
107
+ line?: undefined;
108
+ post?: undefined;
109
+ } | {
110
+ start: number;
111
+ pre: string;
112
+ line: string;
113
+ post: string;
114
+ };
115
+ classes: string;
116
+ };
117
+ /**
118
+ * serialize base data
119
+ *
120
+ * @param {Object} stack - frame stack
121
+ * @param {Function} frameFormatter - frame formatter function
122
+ */
123
+ serializeData(stack: Frame[], frameFormatter: (frame: Frame, index: number) => any): {
124
+ code: any;
125
+ message: string;
126
+ name: string;
127
+ status: number;
128
+ frames: any[];
129
+ };
130
+ /**
131
+ * serialize request object
132
+ */
133
+ serializeRequest(): {
134
+ url: string;
135
+ httpVersion: string;
136
+ method: string;
137
+ connection: string | undefined;
138
+ headers: {
139
+ key: string;
140
+ value: string | string[] | undefined;
141
+ }[];
142
+ cookies: {
143
+ key: string;
144
+ value: string | undefined;
145
+ }[];
146
+ };
147
+ /**
148
+ * serialize app info object
149
+ */
150
+ serializeAppInfo(): {
151
+ baseDir: string;
152
+ config: string;
153
+ };
154
+ }