@eggjs/onerror 4.0.0-beta.20 → 4.0.0-beta.21

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.
@@ -1,158 +1,154 @@
1
- import { OnerrorError } from "koa-onerror";
2
- import { StackFrame } from "stack-trace";
3
- import { Context } from "egg";
4
-
5
- //#region src/lib/error_view.d.ts
6
- interface FrameSource {
7
- pre: string[];
8
- line: string;
9
- post: string[];
1
+ import { type StackFrame } from 'stack-trace';
2
+ import type { OnerrorError } from 'koa-onerror';
3
+ import type { Context } from 'egg';
4
+ export interface FrameSource {
5
+ pre: string[];
6
+ line: string;
7
+ post: string[];
10
8
  }
11
- interface Frame extends StackFrame {
12
- context?: FrameSource;
9
+ export interface Frame extends StackFrame {
10
+ context?: FrameSource;
13
11
  }
14
- declare class ErrorView {
15
- ctx: Context;
16
- error: OnerrorError;
17
- request: Context['request'];
18
- app: Context['app'];
19
- assets: Map<string, string>;
20
- viewTemplate: string;
21
- codeContext: number;
22
- _filterHeaders: string[];
23
- constructor(ctx: Context, error: OnerrorError, template: string);
24
- /**
25
- * get html error page
26
- *
27
- * @return {String} html page
28
- */
29
- toHTML(): string;
30
- /**
31
- * compile view
32
- *
33
- * @param {String} tpl - template
34
- * @param {Object} locals - data used by template
35
- */
36
- compileView(tpl: string, locals: Record<string, unknown>): string;
37
- /**
38
- * check if the frame is node native file.
39
- *
40
- * @param {Frame} frame - current frame
41
- */
42
- isNode(frame: Frame): boolean;
43
- /**
44
- * check if the frame is app modules.
45
- *
46
- * @param {Object} frame - current frame
47
- */
48
- isApp(frame: Frame): boolean;
49
- /**
50
- * cache file asserts
51
- *
52
- * @param {String} key - assert key
53
- * @param {String} value - assert content
54
- */
55
- setAssets(key: string, value: string): void;
56
- /**
57
- * get cache file asserts
58
- *
59
- * @param {String} key - assert key
60
- */
61
- getAssets(key: string): string | undefined;
62
- /**
63
- * get frame source
64
- *
65
- * @param {Object} frame - current frame
66
- */
67
- getFrameSource(frame: StackFrame): FrameSource;
68
- /**
69
- * parse error and return frame stack
70
- */
71
- parseError(): Frame[];
72
- /**
73
- * get stack context
74
- *
75
- * @param {Object} frame - current frame
76
- */
77
- getContext(frame: Frame): {
78
- start?: undefined;
79
- pre?: undefined;
80
- line?: undefined;
81
- post?: undefined;
82
- } | {
83
- start: number;
84
- pre: string;
85
- line: string;
86
- post: string;
87
- };
88
- /**
89
- * get frame classes, let view identify the frame
90
- *
91
- * @param {any} frame - current frame
92
- * @param {any} index - current index
93
- */
94
- getFrameClasses(frame: Frame, index: number): string;
95
- /**
96
- * serialize frame and return meaningful data
97
- *
98
- * @param {Object} frame - current frame
99
- */
100
- serializeFrame(frame: Frame): {
101
- extname: string;
102
- file: string;
103
- method: string;
104
- line: number;
105
- column: number;
106
- context: {
107
- start?: undefined;
108
- pre?: undefined;
109
- line?: undefined;
110
- post?: undefined;
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;
111
80
  } | {
112
- start: number;
113
- pre: string;
114
- line: string;
115
- post: string;
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;
116
153
  };
117
- classes: string;
118
- };
119
- /**
120
- * serialize base data
121
- *
122
- * @param {Object} stack - frame stack
123
- * @param {Function} frameFormatter - frame formatter function
124
- */
125
- serializeData(stack: Frame[], frameFormatter: (frame: Frame, index: number) => any): {
126
- code: any;
127
- message: string;
128
- name: string;
129
- status: number;
130
- frames: any[];
131
- };
132
- /**
133
- * serialize request object
134
- */
135
- serializeRequest(): {
136
- url: string;
137
- httpVersion: string;
138
- method: string;
139
- connection: string | undefined;
140
- headers: {
141
- key: string;
142
- value: string | string[] | undefined;
143
- }[];
144
- cookies: {
145
- key: string;
146
- value: string | undefined;
147
- }[];
148
- };
149
- /**
150
- * serialize app info object
151
- */
152
- serializeAppInfo(): {
153
- baseDir: string;
154
- config: string;
155
- };
156
154
  }
157
- //#endregion
158
- export { ErrorView, Frame, FrameSource };
@@ -1,4 +1,241 @@
1
- import "../utils-S1o8_vNA.js";
2
- import { ErrorView } from "../error_view-mAkjBkEW.js";
3
-
4
- export { ErrorView };
1
+ // modify from https://github.com/poppinss/youch/blob/develop/src/Youch/index.js
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import util from 'node:util';
5
+ import { parse } from 'cookie';
6
+ import Mustache from 'mustache';
7
+ import stackTrace, {} from 'stack-trace';
8
+ import { detectErrorMessage } from "./utils.js";
9
+ const startingSlashRegex = /\\|\//;
10
+ export class ErrorView {
11
+ ctx;
12
+ error;
13
+ request;
14
+ app;
15
+ assets;
16
+ viewTemplate;
17
+ codeContext = 5;
18
+ _filterHeaders = ['cookie', 'connection'];
19
+ constructor(ctx, error, template) {
20
+ this.ctx = ctx;
21
+ this.error = error;
22
+ this.request = ctx.request;
23
+ this.app = ctx.app;
24
+ this.assets = new Map();
25
+ this.viewTemplate = template;
26
+ }
27
+ /**
28
+ * get html error page
29
+ *
30
+ * @return {String} html page
31
+ */
32
+ toHTML() {
33
+ const stack = this.parseError();
34
+ const data = this.serializeData(stack, (frame, index) => {
35
+ const serializedFrame = this.serializeFrame(frame);
36
+ serializedFrame.classes = this.getFrameClasses(frame, index);
37
+ return serializedFrame;
38
+ });
39
+ return this.compileView(this.viewTemplate, {
40
+ ...data,
41
+ appInfo: this.serializeAppInfo(),
42
+ request: this.serializeRequest(),
43
+ });
44
+ }
45
+ /**
46
+ * compile view
47
+ *
48
+ * @param {String} tpl - template
49
+ * @param {Object} locals - data used by template
50
+ */
51
+ compileView(tpl, locals) {
52
+ return Mustache.render(tpl, locals);
53
+ }
54
+ /**
55
+ * check if the frame is node native file.
56
+ *
57
+ * @param {Frame} frame - current frame
58
+ */
59
+ isNode(frame) {
60
+ if (frame.isNative()) {
61
+ return true;
62
+ }
63
+ const filename = frame.getFileName() || '';
64
+ return !path.isAbsolute(filename) && filename[0] !== '.';
65
+ }
66
+ /**
67
+ * check if the frame is app modules.
68
+ *
69
+ * @param {Object} frame - current frame
70
+ */
71
+ isApp(frame) {
72
+ if (this.isNode(frame)) {
73
+ return false;
74
+ }
75
+ const filename = frame.getFileName() || '';
76
+ return !filename.includes('node_modules' + path.sep);
77
+ }
78
+ /**
79
+ * cache file asserts
80
+ *
81
+ * @param {String} key - assert key
82
+ * @param {String} value - assert content
83
+ */
84
+ setAssets(key, value) {
85
+ this.assets.set(key, value);
86
+ }
87
+ /**
88
+ * get cache file asserts
89
+ *
90
+ * @param {String} key - assert key
91
+ */
92
+ getAssets(key) {
93
+ return this.assets.get(key);
94
+ }
95
+ /**
96
+ * get frame source
97
+ *
98
+ * @param {Object} frame - current frame
99
+ */
100
+ getFrameSource(frame) {
101
+ const filename = frame.getFileName();
102
+ const lineNumber = frame.getLineNumber();
103
+ let contents = this.getAssets(filename);
104
+ if (!contents) {
105
+ contents = fs.existsSync(filename) ? fs.readFileSync(filename, 'utf8') : '';
106
+ this.setAssets(filename, contents);
107
+ }
108
+ const lines = contents.split(/\r?\n/);
109
+ return {
110
+ pre: lines.slice(Math.max(0, lineNumber - (this.codeContext + 1)), lineNumber - 1),
111
+ line: lines[lineNumber - 1],
112
+ post: lines.slice(lineNumber, lineNumber + this.codeContext),
113
+ };
114
+ }
115
+ /**
116
+ * parse error and return frame stack
117
+ */
118
+ parseError() {
119
+ const stack = stackTrace.parse(this.error);
120
+ return stack.map((frame) => {
121
+ if (!this.isNode(frame)) {
122
+ frame.context = this.getFrameSource(frame);
123
+ }
124
+ return frame;
125
+ });
126
+ }
127
+ /**
128
+ * get stack context
129
+ *
130
+ * @param {Object} frame - current frame
131
+ */
132
+ getContext(frame) {
133
+ if (!frame.context) {
134
+ return {};
135
+ }
136
+ return {
137
+ start: frame.getLineNumber() - (frame.context.pre || []).length,
138
+ pre: frame.context.pre.join('\n'),
139
+ line: frame.context.line,
140
+ post: frame.context.post.join('\n'),
141
+ };
142
+ }
143
+ /**
144
+ * get frame classes, let view identify the frame
145
+ *
146
+ * @param {any} frame - current frame
147
+ * @param {any} index - current index
148
+ */
149
+ getFrameClasses(frame, index) {
150
+ const classes = [];
151
+ if (index === 0) {
152
+ classes.push('active');
153
+ }
154
+ if (!this.isApp(frame)) {
155
+ classes.push('native-frame');
156
+ }
157
+ return classes.join(' ');
158
+ }
159
+ /**
160
+ * serialize frame and return meaningful data
161
+ *
162
+ * @param {Object} frame - current frame
163
+ */
164
+ serializeFrame(frame) {
165
+ const filename = frame.getFileName();
166
+ const relativeFileName = filename.includes(process.cwd())
167
+ ? filename.replace(process.cwd(), '').replace(startingSlashRegex, '')
168
+ : filename;
169
+ const extname = path.extname(filename).replace('.', '');
170
+ return {
171
+ extname,
172
+ file: relativeFileName,
173
+ method: frame.getFunctionName(),
174
+ line: frame.getLineNumber(),
175
+ column: frame.getColumnNumber(),
176
+ context: this.getContext(frame),
177
+ classes: '',
178
+ };
179
+ }
180
+ /**
181
+ * serialize base data
182
+ *
183
+ * @param {Object} stack - frame stack
184
+ * @param {Function} frameFormatter - frame formatter function
185
+ */
186
+ serializeData(stack, frameFormatter) {
187
+ const code = Reflect.get(this.error, 'code') ?? Reflect.get(this.error, 'type');
188
+ let message = detectErrorMessage(this.ctx, this.error);
189
+ if (code) {
190
+ message = `${message} (code: ${code})`;
191
+ }
192
+ return {
193
+ code,
194
+ message,
195
+ name: this.error.name,
196
+ status: this.error.status,
197
+ frames: stack instanceof Array ? stack.filter(frame => frame.getFileName()).map(frameFormatter) : [],
198
+ };
199
+ }
200
+ /**
201
+ * serialize request object
202
+ */
203
+ serializeRequest() {
204
+ const headers = [];
205
+ Object.keys(this.request.headers).forEach(key => {
206
+ if (this._filterHeaders.includes(key)) {
207
+ return;
208
+ }
209
+ headers.push({
210
+ key,
211
+ value: this.request.headers[key],
212
+ });
213
+ });
214
+ const parsedCookies = parse(this.request.headers.cookie || '');
215
+ const cookies = Object.keys(parsedCookies).map(key => {
216
+ return { key, value: parsedCookies[key] };
217
+ });
218
+ return {
219
+ url: this.request.url,
220
+ httpVersion: this.request.req.httpVersion,
221
+ method: this.request.method,
222
+ connection: this.request.headers.connection,
223
+ headers,
224
+ cookies,
225
+ };
226
+ }
227
+ /**
228
+ * serialize app info object
229
+ */
230
+ serializeAppInfo() {
231
+ let config = this.app.config;
232
+ if ('dumpConfigToObject' in this.app && typeof this.app.dumpConfigToObject === 'function') {
233
+ config = this.app.dumpConfigToObject().config.config;
234
+ }
235
+ return {
236
+ baseDir: this.app.config.baseDir,
237
+ config: util.inspect(config),
238
+ };
239
+ }
240
+ }
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Jfdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZXJyb3Jfdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnRkFBZ0Y7QUFFaEYsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxVQUFVLEVBQUUsRUFBbUIsTUFBTSxhQUFhLENBQUM7QUFHMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2hELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDO0FBWW5DLE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEdBQUcsQ0FBVTtJQUNiLEtBQUssQ0FBZTtJQUNwQixPQUFPLENBQXFCO0lBQzVCLEdBQUcsQ0FBaUI7SUFDcEIsTUFBTSxDQUFzQjtJQUM1QixZQUFZLENBQVM7SUFFckIsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNoQixjQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFMUMsWUFBWSxHQUFZLEVBQUUsS0FBbUIsRUFBRSxRQUFnQjtRQUM3RCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFF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
@@ -1,10 +1,6 @@
1
- import { OnerrorError } from "koa-onerror";
2
- import { Application, Context } from "egg";
3
-
4
- //#region src/lib/utils.d.ts
5
- declare function detectErrorMessage(ctx: Context, err: OnerrorError): string;
6
- declare function detectStatus(err: OnerrorError): number;
7
- declare function accepts(ctx: Context): "json" | "js" | "html";
8
- declare function isProd(app: Application): boolean;
9
- //#endregion
10
- export { accepts, detectErrorMessage, detectStatus, isProd };
1
+ import type { Context, Application } from 'egg';
2
+ import type { OnerrorError } from 'koa-onerror';
3
+ export declare function detectErrorMessage(ctx: Context, err: OnerrorError): string;
4
+ export declare function detectStatus(err: OnerrorError): number;
5
+ export declare function accepts(ctx: Context): "html" | "json" | "js";
6
+ export declare function isProd(app: Application): boolean;
package/dist/lib/utils.js CHANGED
@@ -1,3 +1,29 @@
1
- import { accepts, detectErrorMessage, detectStatus, isProd } from "../utils-S1o8_vNA.js";
2
-
3
- export { accepts, detectErrorMessage, detectStatus, isProd };
1
+ export function detectErrorMessage(ctx, err) {
2
+ // detect json parse error
3
+ if (err.status === 400 &&
4
+ err.name === 'SyntaxError' &&
5
+ ctx.request.is('application/json', 'application/vnd.api+json', 'application/csp-report')) {
6
+ return 'Problems parsing JSON';
7
+ }
8
+ return err.message;
9
+ }
10
+ export function detectStatus(err) {
11
+ // detect status
12
+ let status = err.status || 500;
13
+ if (status < 200) {
14
+ // invalid status consider as 500, like urllib will return -1 status
15
+ status = 500;
16
+ }
17
+ return status;
18
+ }
19
+ export function accepts(ctx) {
20
+ if (ctx.acceptJSON)
21
+ return 'json';
22
+ if (ctx.acceptJSONP)
23
+ return 'js';
24
+ return 'html';
25
+ }
26
+ export function isProd(app) {
27
+ return app.config.env !== 'local' && app.config.env !== 'unittest';
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsR0FBaUI7SUFDaEUsMEJBQTBCO0lBQzFCLElBQ0UsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO1FBQ2xCLEdBQUcsQ0FBQyxJQUFJLEtBQUssYUFBYTtRQUMxQixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBRSx3QkFBd0IsQ0FBQyxFQUN4RixDQUFDO1FBQ0QsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQWlCO0lBQzVDLGdCQUFnQjtJQUNoQixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQixJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNqQixvRUFBb0U7UUFDcEUsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxHQUFZO0lBQ2xDLElBQUksR0FBRyxDQUFDLFVBQVU7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNsQyxJQUFJLEdBQUcsQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsR0FBZ0I7SUFDckMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDO0FBQ3JFLENBQUMifQ==
package/dist/types.d.ts CHANGED
@@ -1,2 +1,6 @@
1
- import "./config.default-BeF-r3l_.js";
2
- import "./types-DOaNcV87.js";
1
+ import type { OnerrorConfig } from './config/config.default.ts';
2
+ declare module 'egg' {
3
+ interface EggAppConfig {
4
+ onerror: OnerrorConfig;
5
+ }
6
+ }
package/dist/types.js CHANGED
@@ -1,3 +1,2 @@
1
- import "./types-DQoXDiso.js";
2
-
3
- export { };
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eggjs/onerror",
3
- "version": "4.0.0-beta.20",
3
+ "version": "4.0.0-beta.21",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -33,7 +33,7 @@
33
33
  "stack-trace": "^0.0.10"
34
34
  },
35
35
  "peerDependencies": {
36
- "egg": "4.1.0-beta.20"
36
+ "egg": "4.1.0-beta.21"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/mustache": "^4.2.5",
@@ -41,7 +41,7 @@
41
41
  "tsdown": "^0.15.4",
42
42
  "typescript": "^5.9.3",
43
43
  "vitest": "4.0.0-beta.16",
44
- "@eggjs/mock": "7.0.0-beta.20"
44
+ "@eggjs/mock": "7.0.0-beta.21"
45
45
  },
46
46
  "type": "module",
47
47
  "exports": {
@@ -64,6 +64,6 @@
64
64
  "lint": "oxlint --type-aware",
65
65
  "typecheck": "tsc --noEmit",
66
66
  "test": "vitest run",
67
- "build": "tsdown"
67
+ "build": "tsdown && rimraf dist && tsc -b --clean && tsc && cp src/lib/onerror_page.mustache.html dist/lib/onerror_page.mustache.html"
68
68
  }
69
69
  }