@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.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/commonjs/agent.d.ts +6 -0
- package/dist/commonjs/agent.js +16 -0
- package/dist/commonjs/app.d.ts +12 -0
- package/dist/commonjs/app.js +150 -0
- package/dist/commonjs/config/config.default.d.ts +27 -0
- package/dist/commonjs/config/config.default.js +15 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +4 -0
- package/dist/commonjs/lib/error_view.d.ts +154 -0
- package/dist/commonjs/lib/error_view.js +248 -0
- package/dist/commonjs/lib/onerror_page.mustache.html +761 -0
- package/dist/commonjs/lib/utils.d.ts +10 -0
- package/dist/commonjs/lib/utils.js +53 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/types.d.ts +7 -0
- package/dist/commonjs/types.js +3 -0
- package/dist/esm/agent.d.ts +6 -0
- package/dist/esm/agent.js +13 -0
- package/dist/esm/app.d.ts +12 -0
- package/dist/esm/app.js +144 -0
- package/dist/esm/config/config.default.d.ts +27 -0
- package/dist/esm/config/config.default.js +10 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/lib/error_view.d.ts +154 -0
- package/dist/esm/lib/error_view.js +241 -0
- package/dist/esm/lib/onerror_page.mustache.html +761 -0
- package/dist/esm/lib/utils.d.ts +10 -0
- package/dist/esm/lib/utils.js +43 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/types.d.ts +7 -0
- package/dist/esm/types.js +2 -0
- package/dist/package.json +4 -0
- package/package.json +93 -0
- package/src/agent.ts +12 -0
- package/src/app.ts +160 -0
- package/src/config/config.default.ts +34 -0
- package/src/index.ts +1 -0
- package/src/lib/error_view.ts +281 -0
- package/src/lib/onerror_page.mustache.html +761 -0
- package/src/lib/utils.ts +47 -0
- package/src/types.ts +12 -0
- 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
|
+
[](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
|
+
[](https://nodejs.org/en/download/)
|
|
9
|
+
[](https://makeapullrequest.com)
|
|
10
|
+

|
|
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
|
+
[](https://github.com/eggjs/onerror/graphs/contributors)
|
|
66
|
+
|
|
67
|
+
Made with [contributors-img](https://contrib.rocks).
|
|
@@ -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
|
+
}
|