@midwayjs/cross-domain 3.0.0-beta.15

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/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ # [3.0.0-beta.15](https://github.com/midwayjs/midway/compare/v3.0.0-beta.14...v3.0.0-beta.15) (2022-01-07)
7
+
8
+
9
+ ### Features
10
+
11
+ * cross domain component ([#1493](https://github.com/midwayjs/midway/issues/1493)) ([ca81b2f](https://github.com/midwayjs/midway/commit/ca81b2fa2824fbddc7870a971fa23274c86d05df))
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ ## Cross-domain 跨域组件
2
+
3
+ 适用于 `@midwayjs/faas` 、`@midwayjs/web` 、`@midwayjs/koa` 和 `@midwayjs/express` 多种框架的通用跨域组件,支持 `cors` 、`jsonp` 多种模式。
4
+
5
+ ### Usage
6
+
7
+ 1. 安装依赖
8
+ ```shell
9
+ tnpm i @midwayjs/cross-domain --save
10
+ ```
11
+ 2. 在 configuration 中引入组件,
12
+ ```ts
13
+ import * as crossDomain from '@midwayjs/cross-domain';
14
+ @Configuration({
15
+ imports: [
16
+ // ...other components
17
+ crossDomain
18
+ ],
19
+ })
20
+ export class AutoConfiguration {}
21
+ ```
22
+
23
+
24
+
25
+ ### CORS 配置
26
+ ```ts
27
+ export const cors = {
28
+ allowMethods: string |string[];
29
+ origin: string|Function;
30
+ exposeHeaders: string |string[];
31
+ allowHeaders: string |string[];
32
+ credentials: boolean|Function;
33
+ keepHeadersOnError: boolean;
34
+ maxAge: number;
35
+ }
36
+ ```
37
+
38
+
39
+ ### JSONP 配置
40
+ ```ts
41
+ export const jsonp = {
42
+ callback: 'jsonp',
43
+ limit: 512,
44
+ }
45
+ ```
@@ -0,0 +1,4 @@
1
+ import { CORSOptions, JSONPOptions } from '../interface';
2
+ export declare const cors: Partial<CORSOptions>;
3
+ export declare const jsonp: JSONPOptions;
4
+ //# sourceMappingURL=config.default.d.ts.map
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jsonp = exports.cors = void 0;
4
+ exports.cors = {
5
+ allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH',
6
+ credentials: false,
7
+ };
8
+ exports.jsonp = {
9
+ callback: 'jsonp',
10
+ limit: 512,
11
+ csrf: false,
12
+ };
13
+ //# sourceMappingURL=config.default.js.map
@@ -0,0 +1,6 @@
1
+ import { MidwayApplicationManager } from '@midwayjs/core';
2
+ export declare class CrossDomainConfiguration {
3
+ applicationManager: MidwayApplicationManager;
4
+ onReady(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=configuration.d.ts.map
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CrossDomainConfiguration = void 0;
13
+ const decorator_1 = require("@midwayjs/decorator");
14
+ const DefaultConfig = require("./config/config.default");
15
+ const core_1 = require("@midwayjs/core");
16
+ const cors_1 = require("./middleware/cors");
17
+ let CrossDomainConfiguration = class CrossDomainConfiguration {
18
+ async onReady() {
19
+ this.applicationManager
20
+ .getApplications(['koa', 'faas', 'express', 'egg'])
21
+ .forEach(app => {
22
+ app.useMiddleware(cors_1.CorsMiddleware);
23
+ });
24
+ }
25
+ };
26
+ __decorate([
27
+ (0, decorator_1.Inject)(),
28
+ __metadata("design:type", core_1.MidwayApplicationManager)
29
+ ], CrossDomainConfiguration.prototype, "applicationManager", void 0);
30
+ CrossDomainConfiguration = __decorate([
31
+ (0, decorator_1.Configuration)({
32
+ namespace: 'cross-domain',
33
+ importConfigs: [
34
+ {
35
+ default: DefaultConfig,
36
+ },
37
+ ],
38
+ })
39
+ ], CrossDomainConfiguration);
40
+ exports.CrossDomainConfiguration = CrossDomainConfiguration;
41
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1,5 @@
1
+ import { httpError } from '@midwayjs/core';
2
+ export declare class JSONPCSRFError extends httpError.ForbiddenError {
3
+ constructor();
4
+ }
5
+ //# sourceMappingURL=error.d.ts.map
package/dist/error.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JSONPCSRFError = void 0;
4
+ const core_1 = require("@midwayjs/core");
5
+ // csrf 403
6
+ class JSONPCSRFError extends core_1.httpError.ForbiddenError {
7
+ constructor() {
8
+ super('jsonp request security validate failed');
9
+ }
10
+ }
11
+ exports.JSONPCSRFError = JSONPCSRFError;
12
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1,6 @@
1
+ export { CrossDomainConfiguration as Configuration } from './configuration';
2
+ export * from './middleware/cors';
3
+ export * from './middleware/jsonp';
4
+ export * from './jsonp';
5
+ export * from './interface';
6
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.Configuration = void 0;
14
+ var configuration_1 = require("./configuration");
15
+ Object.defineProperty(exports, "Configuration", { enumerable: true, get: function () { return configuration_1.CrossDomainConfiguration; } });
16
+ __exportStar(require("./middleware/cors"), exports);
17
+ __exportStar(require("./middleware/jsonp"), exports);
18
+ __exportStar(require("./jsonp"), exports);
19
+ __exportStar(require("./interface"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,15 @@
1
+ export interface CORSOptions {
2
+ allowMethods: string | string[];
3
+ origin: string | Function;
4
+ exposeHeaders: string | string[];
5
+ allowHeaders: string | string[];
6
+ credentials: boolean | Function;
7
+ keepHeadersOnError: boolean;
8
+ maxAge: number;
9
+ }
10
+ export interface JSONPOptions {
11
+ callback: string;
12
+ limit: number;
13
+ csrf: boolean;
14
+ }
15
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1,8 @@
1
+ import { JSONPOptions } from './interface';
2
+ export declare class JSONPService {
3
+ ctx: any;
4
+ jsonpConfig: any;
5
+ res: any;
6
+ jsonp(body: any, config?: JSONPOptions): string;
7
+ }
8
+ //# sourceMappingURL=jsonp.d.ts.map
package/dist/jsonp.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.JSONPService = void 0;
13
+ const decorator_1 = require("@midwayjs/decorator");
14
+ let JSONPService = class JSONPService {
15
+ jsonp(body, config) {
16
+ this.ctx.type = 'js';
17
+ // https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Content-Type-Options
18
+ if (this.ctx.set) {
19
+ this.ctx.set('x-content-type-options', 'nosniff');
20
+ }
21
+ else if (this.res.set) {
22
+ this.res.set('x-content-type-options', 'nosniff');
23
+ }
24
+ const { callback, limit } = Object.assign({}, this.jsonpConfig, config);
25
+ // Only allow "[","]","a-zA-Z0123456789_", "$" and "." characters.
26
+ let cb = (this.ctx.query[callback] || 'callback').replace(/[^[\]\w$.]+/g, '');
27
+ if (cb.length > limit) {
28
+ cb = cb.substring(0, limit);
29
+ }
30
+ const str = JSON.stringify(body === undefined ? null : body);
31
+ // protect from jsonp xss
32
+ return `/**/ typeof ${cb} === 'function' && ${cb}(${str});`;
33
+ }
34
+ };
35
+ __decorate([
36
+ (0, decorator_1.Inject)(),
37
+ __metadata("design:type", Object)
38
+ ], JSONPService.prototype, "ctx", void 0);
39
+ __decorate([
40
+ (0, decorator_1.Config)('jsonp'),
41
+ __metadata("design:type", Object)
42
+ ], JSONPService.prototype, "jsonpConfig", void 0);
43
+ __decorate([
44
+ (0, decorator_1.Inject)(),
45
+ __metadata("design:type", Object)
46
+ ], JSONPService.prototype, "res", void 0);
47
+ JSONPService = __decorate([
48
+ (0, decorator_1.Provide)()
49
+ ], JSONPService);
50
+ exports.JSONPService = JSONPService;
51
+ //# sourceMappingURL=jsonp.js.map
@@ -0,0 +1,8 @@
1
+ import { IMiddleware } from '@midwayjs/core';
2
+ import { CORSOptions } from '../interface';
3
+ export declare class CorsMiddleware implements IMiddleware<any, any> {
4
+ cors: CORSOptions;
5
+ resolve(app: any): (req: any, res: any, next: any) => Promise<any>;
6
+ compatibleMiddleware(request: any, response: any, next: any): Promise<any>;
7
+ }
8
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CorsMiddleware = void 0;
13
+ const decorator_1 = require("@midwayjs/decorator");
14
+ const vary = require("vary");
15
+ let CorsMiddleware = class CorsMiddleware {
16
+ resolve(app) {
17
+ if (app.getFrameworkType() === decorator_1.MidwayFrameworkType.WEB_EXPRESS) {
18
+ return async (req, res, next) => {
19
+ return this.compatibleMiddleware(req, res, next);
20
+ };
21
+ }
22
+ else {
23
+ return async (ctx, next) => {
24
+ return this.compatibleMiddleware(ctx.request, ctx, next);
25
+ };
26
+ }
27
+ }
28
+ async compatibleMiddleware(request, response, next) {
29
+ const requestOrigin = request.get('origin');
30
+ // Always set Vary header
31
+ response.vary('Origin');
32
+ if (!requestOrigin) {
33
+ return await next();
34
+ }
35
+ let origin;
36
+ if (typeof this.cors.origin === 'function') {
37
+ origin = await Promise.resolve(this.cors.origin(request));
38
+ if (!origin) {
39
+ return await next();
40
+ }
41
+ }
42
+ else {
43
+ origin = this.cors.origin || requestOrigin;
44
+ }
45
+ let credentials;
46
+ if (typeof this.cors.credentials === 'function') {
47
+ credentials = await Promise.resolve(this.cors.credentials(request));
48
+ }
49
+ else {
50
+ credentials = !!this.cors.credentials;
51
+ }
52
+ if (request.method.toUpperCase() === 'OPTIONS') {
53
+ if (!request.get('Access-Control-Request-Method')) {
54
+ return await next();
55
+ }
56
+ response.set('Access-Control-Allow-Origin', origin);
57
+ if (credentials === true) {
58
+ response.set('Access-Control-Allow-Credentials', 'true');
59
+ }
60
+ if (this.cors.maxAge) {
61
+ response.set('Access-Control-Max-Age', this.cors.maxAge);
62
+ }
63
+ if (this.cors.allowMethods) {
64
+ response.set('Access-Control-Allow-Methods', this.cors.allowMethods);
65
+ }
66
+ let allowHeaders = this.cors.allowHeaders;
67
+ if (!allowHeaders) {
68
+ allowHeaders = request.get('Access-Control-Request-Headers');
69
+ }
70
+ if (allowHeaders) {
71
+ response.set('Access-Control-Allow-Headers', allowHeaders);
72
+ }
73
+ if (response.sendStatus) {
74
+ response.sendStatus(204);
75
+ }
76
+ else {
77
+ response.status = 204;
78
+ }
79
+ return;
80
+ }
81
+ const headersSet = {};
82
+ function set(key, value) {
83
+ response.set(key, value);
84
+ headersSet[key] = value;
85
+ }
86
+ set('Access-Control-Allow-Origin', origin);
87
+ if (credentials === true) {
88
+ set('Access-Control-Allow-Credentials', 'true');
89
+ }
90
+ if (this.cors.exposeHeaders) {
91
+ set('Access-Control-Expose-Headers', this.cors.exposeHeaders);
92
+ }
93
+ if (!this.cors.keepHeadersOnError) {
94
+ return await next();
95
+ }
96
+ try {
97
+ return await next();
98
+ }
99
+ catch (err) {
100
+ const errHeadersSet = err.headers || {};
101
+ const varyWithOrigin = vary.append(errHeadersSet.vary || errHeadersSet.Vary || '', 'Origin');
102
+ delete errHeadersSet.Vary;
103
+ err.headers = {
104
+ ...errHeadersSet,
105
+ ...headersSet,
106
+ ...{ vary: varyWithOrigin },
107
+ };
108
+ throw err;
109
+ }
110
+ }
111
+ };
112
+ __decorate([
113
+ (0, decorator_1.Config)('cors'),
114
+ __metadata("design:type", Object)
115
+ ], CorsMiddleware.prototype, "cors", void 0);
116
+ CorsMiddleware = __decorate([
117
+ (0, decorator_1.Middleware)()
118
+ ], CorsMiddleware);
119
+ exports.CorsMiddleware = CorsMiddleware;
120
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1,11 @@
1
+ import { IMiddleware } from '@midwayjs/core';
2
+ import { JSONPOptions } from '../interface';
3
+ export declare class JSONPFilter {
4
+ match(value: any, req: any): Promise<any>;
5
+ }
6
+ export declare class JSONPMiddleware implements IMiddleware<any, any> {
7
+ jsonp: JSONPOptions;
8
+ resolve(app: any): (req: any, res: any, next: any) => Promise<any>;
9
+ compatibleMiddleware(context: any, next: any): Promise<any>;
10
+ }
11
+ //# sourceMappingURL=jsonp.d.ts.map
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.JSONPMiddleware = exports.JSONPFilter = void 0;
13
+ const decorator_1 = require("@midwayjs/decorator");
14
+ const jsonp_1 = require("../jsonp");
15
+ const error_1 = require("../error");
16
+ let JSONPFilter = class JSONPFilter {
17
+ async match(value, req) {
18
+ const jsonpService = await req.requestContext.getAsync(jsonp_1.JSONPService);
19
+ return jsonpService.jsonp(value);
20
+ }
21
+ };
22
+ JSONPFilter = __decorate([
23
+ (0, decorator_1.Match)()
24
+ ], JSONPFilter);
25
+ exports.JSONPFilter = JSONPFilter;
26
+ let JSONPMiddleware = class JSONPMiddleware {
27
+ resolve(app) {
28
+ if (app.getFrameworkType() === decorator_1.MidwayFrameworkType.WEB_EXPRESS) {
29
+ app.useFilter(JSONPFilter);
30
+ return async (req, res, next) => {
31
+ return this.compatibleMiddleware(req, next);
32
+ };
33
+ }
34
+ else {
35
+ return async (ctx, next) => {
36
+ const result = await this.compatibleMiddleware(ctx, next);
37
+ const jsonpService = await ctx.requestContext.getAsync(jsonp_1.JSONPService);
38
+ return jsonpService.jsonp(result);
39
+ };
40
+ }
41
+ }
42
+ async compatibleMiddleware(context, next) {
43
+ const { csrf } = this.jsonp;
44
+ // midway security
45
+ if (csrf && context.assertCsrf) {
46
+ try {
47
+ context.assertCsrf();
48
+ }
49
+ catch (_) {
50
+ throw new error_1.JSONPCSRFError();
51
+ }
52
+ }
53
+ return await next();
54
+ }
55
+ };
56
+ __decorate([
57
+ (0, decorator_1.Config)('jsonp'),
58
+ __metadata("design:type", Object)
59
+ ], JSONPMiddleware.prototype, "jsonp", void 0);
60
+ JSONPMiddleware = __decorate([
61
+ (0, decorator_1.Middleware)()
62
+ ], JSONPMiddleware);
63
+ exports.JSONPMiddleware = JSONPMiddleware;
64
+ //# sourceMappingURL=jsonp.js.map
package/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { CORSOptions, JSONPOptions } from './dist/index';
2
+ export * from './dist/index';
3
+
4
+ declare module '@midwayjs/core/dist/interface' {
5
+ interface MidwayConfig {
6
+ cors: Partial<CORSOptions>;
7
+ jsonp: Partial<JSONPOptions>;
8
+ }
9
+ }
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@midwayjs/cross-domain",
3
+ "version": "3.0.0-beta.15",
4
+ "description": "Midway Component for Cross Domain",
5
+ "main": "dist/index.js",
6
+ "typings": "index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "node --require=ts-node/register ../../node_modules/.bin/jest",
10
+ "cov": "node --require=ts-node/register ../../node_modules/.bin/jest --coverage --forceExit",
11
+ "ci": "npm run test"
12
+ },
13
+ "keywords": [],
14
+ "author": "",
15
+ "files": [
16
+ "dist/**/*.js",
17
+ "dist/**/*.d.ts",
18
+ "index.d.ts"
19
+ ],
20
+ "engines": {
21
+ "node": ">=12"
22
+ },
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "vary": "^1.1.2"
26
+ },
27
+ "devDependencies": {
28
+ "@midwayjs/core": "^3.0.0-beta.15",
29
+ "@midwayjs/decorator": "^3.0.0-beta.15",
30
+ "@midwayjs/express": "^3.0.0-beta.15",
31
+ "@midwayjs/faas": "^3.0.0-beta.15",
32
+ "@midwayjs/koa": "^3.0.0-beta.15",
33
+ "@midwayjs/mock": "^3.0.0-beta.15",
34
+ "@midwayjs/serverless-app": "^3.0.0-beta.15",
35
+ "@midwayjs/web": "^3.0.0-beta.15"
36
+ },
37
+ "gitHead": "6b9778557289d9e8b562c7ce6127736db1248973"
38
+ }