@eggjs/jsonp 4.0.0-beta.19 → 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.
- package/dist/app/extend/application.d.ts +9 -13
- package/dist/app/extend/application.js +106 -76
- package/dist/app/extend/context.d.ts +20 -24
- package/dist/app/extend/context.js +31 -33
- package/dist/config/config.default.d.ts +19 -22
- package/dist/config/config.default.js +9 -10
- package/dist/error/JSONPForbiddenReferrerError.d.ts +4 -7
- package/dist/error/JSONPForbiddenReferrerError.js +12 -15
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -1
- package/dist/lib/private_key.d.ts +1 -4
- package/dist/lib/private_key.js +2 -5
- package/dist/types.d.ts +32 -34
- package/dist/types.js +2 -1
- package/package.json +5 -5
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
jsonp(initOptions?: Partial<JSONPConfig>): MiddlewareFunc;
|
|
1
|
+
import { Application, type MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { JSONPConfig } from '../../config/config.default.ts';
|
|
3
|
+
export default class JSONPApplication extends Application {
|
|
4
|
+
/**
|
|
5
|
+
* return a middleware to enable jsonp response.
|
|
6
|
+
* will do some security check inside.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
jsonp(initOptions?: Partial<JSONPConfig>): MiddlewareFunc;
|
|
12
10
|
}
|
|
13
|
-
//#endregion
|
|
14
|
-
export { JSONPApplication as default };
|
|
@@ -1,83 +1,113 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import { parse as urlParse } from 'node:url';
|
|
3
|
+
import { Application } from 'egg';
|
|
2
4
|
import { JSONP_CONFIG } from "../../lib/private_key.js";
|
|
3
|
-
import "
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
5
|
+
import { JSONPForbiddenReferrerError } from "../../error/JSONPForbiddenReferrerError.js";
|
|
6
|
+
import JSONPContext from "./context.js";
|
|
7
|
+
const debug = debuglog('egg/jsonp/app/extend/application');
|
|
8
|
+
export default class JSONPApplication extends Application {
|
|
9
|
+
/**
|
|
10
|
+
* return a middleware to enable jsonp response.
|
|
11
|
+
* will do some security check inside.
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
jsonp(initOptions = {}) {
|
|
15
|
+
const options = {
|
|
16
|
+
...this.config.jsonp,
|
|
17
|
+
...initOptions,
|
|
18
|
+
};
|
|
19
|
+
if (!Array.isArray(options.callback)) {
|
|
20
|
+
options.callback = [options.callback];
|
|
21
|
+
}
|
|
22
|
+
const csrfEnable = this.plugins.security &&
|
|
23
|
+
this.plugins.security.enable && // security enable
|
|
24
|
+
this.config.security.csrf &&
|
|
25
|
+
this.config.security.csrf.enable !== false && // csrf enable
|
|
26
|
+
options.csrf; // jsonp csrf enabled
|
|
27
|
+
const validateReferrer = options.whiteList && createValidateReferer(options.whiteList);
|
|
28
|
+
if (!csrfEnable && !validateReferrer) {
|
|
29
|
+
this.coreLogger.warn('[@eggjs/jsonp] SECURITY WARNING!! csrf check and referrer check are both closed!');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* jsonp request security check, pass if
|
|
33
|
+
*
|
|
34
|
+
* 1. hit referrer white list
|
|
35
|
+
* 2. or pass csrf check
|
|
36
|
+
* 3. both check are disabled
|
|
37
|
+
*
|
|
38
|
+
* @param {Context} ctx request context
|
|
39
|
+
*/
|
|
40
|
+
function securityAssert(ctx) {
|
|
41
|
+
// all disabled. don't need check
|
|
42
|
+
if (!csrfEnable && !validateReferrer)
|
|
43
|
+
return;
|
|
44
|
+
// pass referrer check
|
|
45
|
+
const referrer = ctx.get('referrer');
|
|
46
|
+
if (validateReferrer && validateReferrer(referrer))
|
|
47
|
+
return;
|
|
48
|
+
if (csrfEnable && validateCsrf(ctx))
|
|
49
|
+
return;
|
|
50
|
+
throw new JSONPForbiddenReferrerError('jsonp request security validate failed', referrer, 403);
|
|
51
|
+
}
|
|
52
|
+
return async function jsonp(ctx, next) {
|
|
53
|
+
const jsonpFunction = getJsonpFunction(ctx.query, options.callback);
|
|
54
|
+
ctx[JSONP_CONFIG] = {
|
|
55
|
+
jsonpFunction,
|
|
56
|
+
options,
|
|
57
|
+
};
|
|
58
|
+
// before handle request, must do some security checks
|
|
59
|
+
securityAssert(ctx);
|
|
60
|
+
await next();
|
|
61
|
+
// generate jsonp body
|
|
62
|
+
ctx.createJsonpBody(ctx.body);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
52
66
|
function createValidateReferer(whiteList) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
if (!Array.isArray(whiteList)) {
|
|
68
|
+
whiteList = [whiteList];
|
|
69
|
+
}
|
|
70
|
+
return (referrer) => {
|
|
71
|
+
let parsed;
|
|
72
|
+
for (const rule of whiteList) {
|
|
73
|
+
if (rule instanceof RegExp) {
|
|
74
|
+
if (rule.test(referrer)) {
|
|
75
|
+
// regexp(/^https?:\/\/github.com\//): test the referrer with rule
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
parsed = parsed ?? urlParse(referrer);
|
|
81
|
+
const hostname = parsed.hostname || '';
|
|
82
|
+
// check if referrer's hostname match the string rule
|
|
83
|
+
if (rule[0] === '.' && (hostname.endsWith(rule) || hostname === rule.slice(1))) {
|
|
84
|
+
// string start with `.`(.github.com): referrer's hostname must ends with rule
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
else if (hostname === rule) {
|
|
88
|
+
// string not start with `.`(github.com): referrer's hostname must strict equal to rule
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// no rule matched
|
|
93
|
+
return false;
|
|
94
|
+
};
|
|
68
95
|
}
|
|
69
96
|
function validateCsrf(ctx) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
try {
|
|
98
|
+
ctx.assertCsrf();
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
debug('validate csrf failed: %s', err);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
77
105
|
}
|
|
78
106
|
function getJsonpFunction(query, callbacks) {
|
|
79
|
-
|
|
107
|
+
for (const callback of callbacks) {
|
|
108
|
+
if (query[callback]) {
|
|
109
|
+
return query[callback];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
80
112
|
}
|
|
81
|
-
|
|
82
|
-
//#endregion
|
|
83
|
-
export { JSONPApplication as default };
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLElBQUksUUFBUSxFQUEyQixNQUFNLFVBQVUsQ0FBQztBQUd0RSxPQUFPLEVBQUUsV0FBVyxFQUFxQyxNQUFNLEtBQUssQ0FBQztBQUVyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFeEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxZQUFZLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBRTNELE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0JBQWlCLFNBQVEsV0FBVztJQUN2RDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGNBQW9DLEVBQUU7UUFDMUMsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztZQUNwQixHQUFHLFdBQVc7U0FDeUIsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLGtCQUFrQjtZQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxD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
|
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { JSONP_CONFIG } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*/
|
|
22
|
-
createJsonpBody(body: any): void;
|
|
1
|
+
import { Context } from 'egg';
|
|
2
|
+
import { JSONP_CONFIG } from '../../lib/private_key.ts';
|
|
3
|
+
import type { JSONPConfig } from '../../config/config.default.ts';
|
|
4
|
+
export default class JSONPContext extends Context {
|
|
5
|
+
[JSONP_CONFIG]?: {
|
|
6
|
+
jsonpFunction?: string;
|
|
7
|
+
options?: JSONPConfig;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* detect if response should be jsonp
|
|
11
|
+
*/
|
|
12
|
+
get acceptJSONP(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* JSONP wrap body function
|
|
15
|
+
* Set jsonp response wrap function, other plugin can use it.
|
|
16
|
+
* If not necessary, please don't use this method in your application code.
|
|
17
|
+
* @param {Object} body response body
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
createJsonpBody(body: any): void;
|
|
23
21
|
}
|
|
24
|
-
//#endregion
|
|
25
|
-
export { JSONPContext as default };
|
|
@@ -1,34 +1,32 @@
|
|
|
1
|
+
import { jsonp as jsonpBody } from 'jsonp-body';
|
|
2
|
+
import { Context } from 'egg';
|
|
1
3
|
import { JSONP_CONFIG } from "../../lib/private_key.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
//#endregion
|
|
34
|
-
export { JSONPContext as default };
|
|
4
|
+
export default class JSONPContext extends Context {
|
|
5
|
+
/**
|
|
6
|
+
* detect if response should be jsonp
|
|
7
|
+
*/
|
|
8
|
+
get acceptJSONP() {
|
|
9
|
+
const jsonpConfig = this[JSONP_CONFIG];
|
|
10
|
+
return !!jsonpConfig?.jsonpFunction;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* JSONP wrap body function
|
|
14
|
+
* Set jsonp response wrap function, other plugin can use it.
|
|
15
|
+
* If not necessary, please don't use this method in your application code.
|
|
16
|
+
* @param {Object} body response body
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
createJsonpBody(body) {
|
|
20
|
+
const jsonpConfig = this[JSONP_CONFIG];
|
|
21
|
+
if (!jsonpConfig?.jsonpFunction) {
|
|
22
|
+
this.body = body;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this.set('x-content-type-options', 'nosniff');
|
|
26
|
+
this.type = 'js';
|
|
27
|
+
body = body === undefined ? null : body;
|
|
28
|
+
// protect from jsonp xss
|
|
29
|
+
this.body = jsonpBody(body, jsonpConfig.jsonpFunction, jsonpConfig.options);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvZXh0ZW5kL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssQ0FBQztBQUU5QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFhLFNBQVEsT0FBTztJQU0vQzs7T0FFRztJQUNILElBQUksV0FBVztRQUNiLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxlQUFlLENBQUMsSUFBUztRQUN2QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hDLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGIn0=
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
import { PartialEggConfig } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
*/
|
|
20
|
-
whiteList?: string | RegExp | (string | RegExp)[];
|
|
1
|
+
import type { PartialEggConfig } from 'egg';
|
|
2
|
+
export interface JSONPConfig {
|
|
3
|
+
/**
|
|
4
|
+
* jsonp callback methods key, default to `['_callback', 'callback' ]`
|
|
5
|
+
*/
|
|
6
|
+
callback: string[] | string;
|
|
7
|
+
/**
|
|
8
|
+
* callback method name's max length, default to `50`
|
|
9
|
+
*/
|
|
10
|
+
limit: number;
|
|
11
|
+
/**
|
|
12
|
+
* enable csrf check or not, default to `false`
|
|
13
|
+
*/
|
|
14
|
+
csrf: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* referrer white list, default to `undefined`
|
|
17
|
+
*/
|
|
18
|
+
whiteList?: string | RegExp | (string | RegExp)[];
|
|
21
19
|
}
|
|
22
20
|
declare const _default: PartialEggConfig;
|
|
23
|
-
|
|
24
|
-
export { JSONPConfig, _default as default };
|
|
21
|
+
export default _default;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
//#
|
|
10
|
-
export { config_default_default as default };
|
|
1
|
+
export default {
|
|
2
|
+
jsonp: {
|
|
3
|
+
limit: 50,
|
|
4
|
+
callback: ['_callback', 'callback'],
|
|
5
|
+
csrf: false,
|
|
6
|
+
whiteList: undefined,
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSxlQUFlO0lBQ2IsS0FBSyxFQUFFO1FBQ0wsS0FBSyxFQUFFLEVBQUU7UUFDVCxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBQ25DLElBQUksRUFBRSxLQUFLO1FBQ1gsU0FBUyxFQUFFLFNBQVM7S0FDckI7Q0FDa0IsQ0FBQyJ9
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
constructor(message: string, referrer: string, status: number);
|
|
1
|
+
export declare class JSONPForbiddenReferrerError extends Error {
|
|
2
|
+
referrer: string;
|
|
3
|
+
status: number;
|
|
4
|
+
constructor(message: string, referrer: string, status: number);
|
|
6
5
|
}
|
|
7
|
-
//#endregion
|
|
8
|
-
export { JSONPForbiddenReferrerError };
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
//#endregion
|
|
15
|
-
export { JSONPForbiddenReferrerError };
|
|
1
|
+
export class JSONPForbiddenReferrerError extends Error {
|
|
2
|
+
referrer;
|
|
3
|
+
status;
|
|
4
|
+
constructor(message, referrer, status) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = this.constructor.name;
|
|
7
|
+
this.referrer = referrer;
|
|
8
|
+
this.status = status;
|
|
9
|
+
Error.captureStackTrace(this, this.constructor);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSlNPTlBGb3JiaWRkZW5SZWZlcnJlckVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9yL0pTT05QRm9yYmlkZGVuUmVmZXJyZXJFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsS0FBSztJQUNwRCxRQUFRLENBQVM7SUFDakIsTUFBTSxDQUFTO0lBRWYsWUFBWSxPQUFlLEVBQUUsUUFBZ0IsRUFBRSxNQUFjO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import './types.ts';
|
package/dist/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import "./types.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLENBQUMifQ==
|
package/dist/lib/private_key.js
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
//#endregion
|
|
5
|
-
export { JSONP_CONFIG };
|
|
1
|
+
export const JSONP_CONFIG = Symbol('jsonp#config');
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3ByaXZhdGVfa2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMifQ==
|
package/dist/types.d.ts
CHANGED
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/types.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { JSONPConfig } from './config/config.default.ts';
|
|
5
3
|
declare module 'egg' {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
4
|
+
interface EggAppConfig {
|
|
5
|
+
/**
|
|
6
|
+
* jsonp options
|
|
7
|
+
* @member Config#jsonp
|
|
8
|
+
*/
|
|
9
|
+
jsonp?: JSONPConfig;
|
|
10
|
+
}
|
|
11
|
+
interface Context {
|
|
12
|
+
/**
|
|
13
|
+
* detect if response should be jsonp
|
|
14
|
+
*/
|
|
15
|
+
acceptJSONP: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* JSONP wrap body function
|
|
18
|
+
* Set jsonp response wrap function, other plugin can use it.
|
|
19
|
+
* If not necessary, please don't use this method in your application code.
|
|
20
|
+
* @param {Object} body response body
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
23
|
+
createJsonpBody(body: any): void;
|
|
24
|
+
}
|
|
25
|
+
interface Application {
|
|
26
|
+
/**
|
|
27
|
+
* return a middleware to enable jsonp response.
|
|
28
|
+
* will do some security check inside.
|
|
29
|
+
* @public
|
|
30
|
+
*/
|
|
31
|
+
jsonp(initOptions?: Partial<JSONPConfig>): MiddlewareFunc;
|
|
32
|
+
}
|
|
33
|
+
}
|
package/dist/types.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/jsonp",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.21",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -49,21 +49,21 @@
|
|
|
49
49
|
"jsonp-body": "^2.0.0"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"egg": "4.1.0-beta.
|
|
52
|
+
"egg": "4.1.0-beta.21"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@types/node": "^24.6.2",
|
|
56
56
|
"tsdown": "^0.15.4",
|
|
57
57
|
"typescript": "^5.9.3",
|
|
58
58
|
"vitest": "4.0.0-beta.16",
|
|
59
|
-
"@eggjs/mock": "7.0.0-beta.
|
|
60
|
-
"@eggjs/tsconfig": "3.1.0-beta.
|
|
59
|
+
"@eggjs/mock": "7.0.0-beta.21",
|
|
60
|
+
"@eggjs/tsconfig": "3.1.0-beta.21"
|
|
61
61
|
},
|
|
62
62
|
"main": "./dist/index.js",
|
|
63
63
|
"module": "./dist/index.js",
|
|
64
64
|
"types": "./dist/index.d.ts",
|
|
65
65
|
"scripts": {
|
|
66
|
-
"build": "tsdown",
|
|
66
|
+
"build": "tsdown && rimraf dist && tsc -b --clean && tsc",
|
|
67
67
|
"typecheck": "tsc --noEmit",
|
|
68
68
|
"lint": "oxlint --type-aware",
|
|
69
69
|
"lint:fix": "npm run lint -- --fix",
|