@orion-js/http 3.11.8 → 3.12.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/dist/index.cjs +39283 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +39261 -0
- package/package.json +25 -20
- package/LICENSE +0 -21
- package/lib/errors.d.ts +0 -5
- package/lib/errors.js +0 -48
- package/lib/index.d.ts +0 -17
- package/lib/index.js +0 -39
- package/lib/index.test.d.ts +0 -1
- package/lib/index.test.js +0 -26
- package/lib/routes/executeRequest.d.ts +0 -3
- package/lib/routes/executeRequest.js +0 -46
- package/lib/routes/registerRoute.d.ts +0 -2
- package/lib/routes/registerRoute.js +0 -41
- package/lib/routes/registerRoutes.d.ts +0 -2
- package/lib/routes/registerRoutes.js +0 -14
- package/lib/routes/route.d.ts +0 -2
- package/lib/routes/route.js +0 -8
- package/lib/routes/route.test.d.ts +0 -1
- package/lib/routes/route.test.js +0 -113
- package/lib/routes/streaming.test.d.ts +0 -1
- package/lib/routes/streaming.test.js +0 -43
- package/lib/service/index.d.ts +0 -4
- package/lib/service/index.js +0 -37
- package/lib/service/index.test.d.ts +0 -1
- package/lib/service/index.test.js +0 -59
- package/lib/start.d.ts +0 -8
- package/lib/start.js +0 -33
- package/lib/types.d.ts +0 -47
- package/lib/types.js +0 -2
- package/lib/viewer.d.ts +0 -3
- package/lib/viewer.js +0 -21
- package/lib/viewer.test.d.ts +0 -1
- package/lib/viewer.test.js +0 -51
package/package.json
CHANGED
|
@@ -1,46 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orion-js/http",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"main": "
|
|
5
|
-
"types": "
|
|
3
|
+
"version": "3.12.0",
|
|
4
|
+
"main": "./dist/index.cjs",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
7
|
-
"
|
|
7
|
+
"dist"
|
|
8
8
|
],
|
|
9
9
|
"author": "nicolaslopezj",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"scripts": {
|
|
12
|
-
"test": "
|
|
12
|
+
"test": "bun test",
|
|
13
13
|
"prepare": "yarn run build",
|
|
14
|
-
"clean": "rm -rf ./
|
|
15
|
-
"build": "
|
|
14
|
+
"clean": "rm -rf ./dist",
|
|
15
|
+
"build": "bun run build.ts",
|
|
16
16
|
"watch": "tsc -w",
|
|
17
|
-
"upgrade-interactive": "yarn upgrade-interactive"
|
|
17
|
+
"upgrade-interactive": "yarn upgrade-interactive",
|
|
18
|
+
"dev": "bun --watch src/index.ts"
|
|
18
19
|
},
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"@orion-js/env": "
|
|
21
|
-
"@orion-js/helpers": "
|
|
22
|
-
"@orion-js/resolvers": "
|
|
23
|
-
"@orion-js/schema": "
|
|
24
|
-
"@orion-js/services": "
|
|
21
|
+
"@orion-js/env": "3.12.0",
|
|
22
|
+
"@orion-js/helpers": "3.12.0",
|
|
23
|
+
"@orion-js/resolvers": "3.12.0",
|
|
24
|
+
"@orion-js/schema": "3.12.0",
|
|
25
|
+
"@orion-js/services": "3.12.0",
|
|
25
26
|
"body-parser": "1.19.0",
|
|
26
27
|
"express": "4.17.1",
|
|
27
28
|
"reflect-metadata": "^0.1.13"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
|
-
"@shelf/jest-mongodb": "^2.1.0",
|
|
31
31
|
"@types/body-parser": "^1.19.1",
|
|
32
32
|
"@types/express": "4.17.13",
|
|
33
|
-
"@types/jest": "^27.0.2",
|
|
34
33
|
"@types/lodash": "4.14.176",
|
|
35
34
|
"@types/supertest": "2.0.11",
|
|
36
|
-
"jest": "27.3.1",
|
|
37
35
|
"superagent": "^6.1.0",
|
|
38
36
|
"supertest": "^6.1.6",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
37
|
+
"typescript": "^5.4.5",
|
|
38
|
+
"@types/bun": "^1.2.4"
|
|
41
39
|
},
|
|
42
40
|
"publishConfig": {
|
|
43
41
|
"access": "public"
|
|
44
42
|
},
|
|
45
|
-
"gitHead": "
|
|
46
|
-
|
|
43
|
+
"gitHead": "9fd28b6f6b348cebc9f0dc207805647969277372",
|
|
44
|
+
"type": "module",
|
|
45
|
+
"module": "./dist/index.js",
|
|
46
|
+
"exports": {
|
|
47
|
+
"types": "./dist/index.d.ts",
|
|
48
|
+
"import": "./dist/index.js",
|
|
49
|
+
"require": "./dist/index.cjs"
|
|
50
|
+
}
|
|
51
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2022 Orionjs Team
|
|
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/lib/errors.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
declare type onErrorFunction = (req: express.Request, res: express.Response, error: any) => Promise<void>;
|
|
3
|
-
export declare const onError: onErrorFunction;
|
|
4
|
-
export declare const setOnError: (onErrorFunc: onErrorFunction) => void;
|
|
5
|
-
export {};
|
package/lib/errors.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
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
|
-
exports.setOnError = exports.onError = void 0;
|
|
7
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
-
const defaultOnError = async (req, res, error) => {
|
|
9
|
-
if (error.isOrionError) {
|
|
10
|
-
let statusCode = 400;
|
|
11
|
-
if (error.code === 'AuthError') {
|
|
12
|
-
statusCode = 401;
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
console.warn(`[route/handler] OrionError in ${req.path}:`, error);
|
|
16
|
-
}
|
|
17
|
-
const data = error.getInfo();
|
|
18
|
-
res.status(statusCode);
|
|
19
|
-
res.json(data);
|
|
20
|
-
}
|
|
21
|
-
else if (error.isGraphQLError) {
|
|
22
|
-
res.writeHead(error.statusCode);
|
|
23
|
-
res.end(error.message);
|
|
24
|
-
console.warn(`[route/handler] GraphQLError in ${req.path}:`, error);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
const hash = crypto_1.default
|
|
28
|
-
.createHash('sha1')
|
|
29
|
-
.update(error.message, 'utf8')
|
|
30
|
-
.digest('hex')
|
|
31
|
-
.substring(0, 10);
|
|
32
|
-
const statusCode = 500;
|
|
33
|
-
const data = { error: 500, message: 'Internal server error', hash };
|
|
34
|
-
res.writeHead(statusCode);
|
|
35
|
-
res.end(JSON.stringify(data, null, 2));
|
|
36
|
-
error.hash = hash;
|
|
37
|
-
console.error(`[route/handler] Internal server error in ${req.url}:`, error);
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
let onErrorRef = defaultOnError;
|
|
41
|
-
const onError = async (req, res, error) => {
|
|
42
|
-
await onErrorRef(req, res, error);
|
|
43
|
-
};
|
|
44
|
-
exports.onError = onError;
|
|
45
|
-
const setOnError = (onErrorFunc) => {
|
|
46
|
-
onErrorRef = onErrorFunc;
|
|
47
|
-
};
|
|
48
|
-
exports.setOnError = setOnError;
|
package/lib/index.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { setOnError, onError } from './errors';
|
|
2
|
-
import { getViewer, setGetViewer } from './viewer';
|
|
3
|
-
import { startServer, getApp, getServer } from './start';
|
|
4
|
-
import express from 'express';
|
|
5
|
-
import route from './routes/route';
|
|
6
|
-
import registerRoute from './routes/registerRoute';
|
|
7
|
-
import registerRoutes from './routes/registerRoutes';
|
|
8
|
-
import { json, raw, text, urlencoded } from 'body-parser';
|
|
9
|
-
declare const bodyParser: {
|
|
10
|
-
json: typeof json;
|
|
11
|
-
raw: typeof raw;
|
|
12
|
-
text: typeof text;
|
|
13
|
-
urlencoded: typeof urlencoded;
|
|
14
|
-
};
|
|
15
|
-
export { express, startServer, getApp, getServer, getViewer, setGetViewer, setOnError, onError, route, registerRoute, registerRoutes, bodyParser };
|
|
16
|
-
export * from './types';
|
|
17
|
-
export * from './service';
|
package/lib/index.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
-
};
|
|
15
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.bodyParser = exports.registerRoutes = exports.registerRoute = exports.route = exports.onError = exports.setOnError = exports.setGetViewer = exports.getViewer = exports.getServer = exports.getApp = exports.startServer = exports.express = void 0;
|
|
17
|
-
const errors_1 = require("./errors");
|
|
18
|
-
Object.defineProperty(exports, "setOnError", { enumerable: true, get: function () { return errors_1.setOnError; } });
|
|
19
|
-
Object.defineProperty(exports, "onError", { enumerable: true, get: function () { return errors_1.onError; } });
|
|
20
|
-
const viewer_1 = require("./viewer");
|
|
21
|
-
Object.defineProperty(exports, "getViewer", { enumerable: true, get: function () { return viewer_1.getViewer; } });
|
|
22
|
-
Object.defineProperty(exports, "setGetViewer", { enumerable: true, get: function () { return viewer_1.setGetViewer; } });
|
|
23
|
-
const start_1 = require("./start");
|
|
24
|
-
Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return start_1.startServer; } });
|
|
25
|
-
Object.defineProperty(exports, "getApp", { enumerable: true, get: function () { return start_1.getApp; } });
|
|
26
|
-
Object.defineProperty(exports, "getServer", { enumerable: true, get: function () { return start_1.getServer; } });
|
|
27
|
-
const express_1 = __importDefault(require("express"));
|
|
28
|
-
exports.express = express_1.default;
|
|
29
|
-
const route_1 = __importDefault(require("./routes/route"));
|
|
30
|
-
exports.route = route_1.default;
|
|
31
|
-
const registerRoute_1 = __importDefault(require("./routes/registerRoute"));
|
|
32
|
-
exports.registerRoute = registerRoute_1.default;
|
|
33
|
-
const registerRoutes_1 = __importDefault(require("./routes/registerRoutes"));
|
|
34
|
-
exports.registerRoutes = registerRoutes_1.default;
|
|
35
|
-
const body_parser_1 = require("body-parser");
|
|
36
|
-
const bodyParser = { json: body_parser_1.json, raw: body_parser_1.raw, text: body_parser_1.text, urlencoded: body_parser_1.urlencoded };
|
|
37
|
-
exports.bodyParser = bodyParser;
|
|
38
|
-
__exportStar(require("./types"), exports);
|
|
39
|
-
__exportStar(require("./service"), exports);
|
package/lib/index.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/lib/index.test.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const _1 = require(".");
|
|
4
|
-
it('should correctly register a route', async () => {
|
|
5
|
-
const homeRoute = (0, _1.route)({
|
|
6
|
-
path: '/',
|
|
7
|
-
method: 'get',
|
|
8
|
-
async resolve(req, res, viewer) { }
|
|
9
|
-
});
|
|
10
|
-
(0, _1.registerRoute)(homeRoute);
|
|
11
|
-
});
|
|
12
|
-
it('should correctly register a route map', async () => {
|
|
13
|
-
const routes = {
|
|
14
|
-
route1: (0, _1.route)({
|
|
15
|
-
path: '/',
|
|
16
|
-
method: 'get',
|
|
17
|
-
async resolve(req, res, viewer) { }
|
|
18
|
-
}),
|
|
19
|
-
route2: (0, _1.route)({
|
|
20
|
-
path: '/2',
|
|
21
|
-
method: 'get',
|
|
22
|
-
async resolve(req, res, viewer) { }
|
|
23
|
-
})
|
|
24
|
-
};
|
|
25
|
-
(0, _1.registerRoutes)(routes);
|
|
26
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.executeRequest = void 0;
|
|
4
|
-
const errors_1 = require("../errors");
|
|
5
|
-
const viewer_1 = require("./../viewer");
|
|
6
|
-
const lodash_1 = require("lodash");
|
|
7
|
-
const env_1 = require("@orion-js/env");
|
|
8
|
-
const helpers_1 = require("@orion-js/helpers");
|
|
9
|
-
const simulateLatency = (0, env_1.internalGetEnv)('simulate_latency', 'SIMULATE_LATENCY');
|
|
10
|
-
async function executeRequest(route, req, res) {
|
|
11
|
-
if (simulateLatency) {
|
|
12
|
-
const time = parseInt(simulateLatency);
|
|
13
|
-
if (time) {
|
|
14
|
-
await (0, helpers_1.sleep)((0, lodash_1.random)(time * 0.9, time * 1.1));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
try {
|
|
18
|
-
const viewer = await (0, viewer_1.getViewer)(req);
|
|
19
|
-
const result = await route.resolve(req, res, viewer);
|
|
20
|
-
if (!result)
|
|
21
|
-
return;
|
|
22
|
-
// add status code to response
|
|
23
|
-
if (result.statusCode) {
|
|
24
|
-
res.status(result.statusCode);
|
|
25
|
-
}
|
|
26
|
-
// add headers to response
|
|
27
|
-
if (result.headers) {
|
|
28
|
-
Object.keys(result.headers).forEach(key => {
|
|
29
|
-
res.setHeader(key, result.headers[key]);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
// add body to response
|
|
33
|
-
if (!(0, lodash_1.isNil)(result.body)) {
|
|
34
|
-
if ((0, lodash_1.isPlainObject)(result.body)) {
|
|
35
|
-
res.json(result.body);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
res.send(result.body);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
await (0, errors_1.onError)(req, res, error);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
exports.executeRequest = executeRequest;
|
|
@@ -1,41 +0,0 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
const start_1 = require("./../start");
|
|
23
|
-
const executeRequest_1 = require("./executeRequest");
|
|
24
|
-
const bodyParser = __importStar(require("body-parser"));
|
|
25
|
-
function registerRoute(route) {
|
|
26
|
-
const app = route.app || (0, start_1.getApp)();
|
|
27
|
-
const method = route.method;
|
|
28
|
-
const handler = async (req, res) => {
|
|
29
|
-
(0, executeRequest_1.executeRequest)(route, req, res);
|
|
30
|
-
};
|
|
31
|
-
const handlers = [handler];
|
|
32
|
-
if (route.bodyParser) {
|
|
33
|
-
const parser = bodyParser[route.bodyParser](route.bodyParserOptions);
|
|
34
|
-
handlers.unshift(parser);
|
|
35
|
-
}
|
|
36
|
-
if (route.middlewares) {
|
|
37
|
-
handlers.unshift(...route.middlewares);
|
|
38
|
-
}
|
|
39
|
-
app[method](route.path, ...handlers);
|
|
40
|
-
}
|
|
41
|
-
exports.default = registerRoute;
|
|
@@ -1,14 +0,0 @@
|
|
|
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 lodash_1 = require("lodash");
|
|
7
|
-
const registerRoute_1 = __importDefault(require("./registerRoute"));
|
|
8
|
-
function registerRoutes(routesMap) {
|
|
9
|
-
const routes = (0, lodash_1.values)(routesMap);
|
|
10
|
-
for (const route of routes) {
|
|
11
|
-
(0, registerRoute_1.default)(route);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
exports.default = registerRoutes;
|
package/lib/routes/route.d.ts
DELETED
package/lib/routes/route.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/lib/routes/route.test.js
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
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 start_1 = require("./../start");
|
|
7
|
-
const route_1 = __importDefault(require("./route"));
|
|
8
|
-
const registerRoute_1 = __importDefault(require("./registerRoute"));
|
|
9
|
-
const supertest_1 = __importDefault(require("supertest"));
|
|
10
|
-
let app = (0, start_1.getApp)();
|
|
11
|
-
describe('Test routes', () => {
|
|
12
|
-
test('It should reply a http get request with a custom status code', async () => {
|
|
13
|
-
const test = { hello: 'world' };
|
|
14
|
-
const testRoute = (0, route_1.default)({
|
|
15
|
-
path: '/test1',
|
|
16
|
-
method: 'get',
|
|
17
|
-
async resolve(req, res, viewer) {
|
|
18
|
-
return { body: test, statusCode: 201 };
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
(0, registerRoute_1.default)(testRoute);
|
|
22
|
-
const response = await (0, supertest_1.default)(app).get('/test1');
|
|
23
|
-
expect(response.statusCode).toBe(201);
|
|
24
|
-
expect(response.body).toEqual(test);
|
|
25
|
-
});
|
|
26
|
-
test('It should fail on different method', async () => {
|
|
27
|
-
const testRoute = (0, route_1.default)({
|
|
28
|
-
path: '/test2',
|
|
29
|
-
method: 'post',
|
|
30
|
-
async resolve(req, res, viewer) {
|
|
31
|
-
return { body: { status: 'ok' }, statusCode: 200 };
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
(0, registerRoute_1.default)(testRoute);
|
|
35
|
-
const response = await (0, supertest_1.default)(app).get('/test2');
|
|
36
|
-
expect(response.statusCode).toBe(404);
|
|
37
|
-
});
|
|
38
|
-
test('It should correctly send error messages', async () => {
|
|
39
|
-
const testRoute = (0, route_1.default)({
|
|
40
|
-
path: '/test3',
|
|
41
|
-
method: 'post',
|
|
42
|
-
async resolve(req, res, viewer) {
|
|
43
|
-
return { body: { error: '504' }, statusCode: 504 };
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
(0, registerRoute_1.default)(testRoute);
|
|
47
|
-
const response = await (0, supertest_1.default)(app).post('/test3');
|
|
48
|
-
expect(response.statusCode).toBe(504);
|
|
49
|
-
expect(response.body).toEqual({ error: '504' });
|
|
50
|
-
});
|
|
51
|
-
// test a http get request with query params
|
|
52
|
-
test('It should reply a http get request with query params', async () => {
|
|
53
|
-
const testRoute = (0, route_1.default)({
|
|
54
|
-
path: '/test4',
|
|
55
|
-
method: 'get',
|
|
56
|
-
async resolve(req, res, viewer) {
|
|
57
|
-
return { body: req.query, statusCode: 200 };
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
(0, registerRoute_1.default)(testRoute);
|
|
61
|
-
const response = await (0, supertest_1.default)(app).get('/test4?hello=world');
|
|
62
|
-
expect(response.statusCode).toBe(200);
|
|
63
|
-
expect(response.body).toEqual({ hello: 'world' });
|
|
64
|
-
});
|
|
65
|
-
test('It should respond a http get request with text body', async () => {
|
|
66
|
-
const testRoute = (0, route_1.default)({
|
|
67
|
-
path: '/test5',
|
|
68
|
-
method: 'get',
|
|
69
|
-
async resolve(req, res, viewer) {
|
|
70
|
-
return { body: 'hello world', statusCode: 200 };
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
(0, registerRoute_1.default)(testRoute);
|
|
74
|
-
const response = await (0, supertest_1.default)(app).get('/test5');
|
|
75
|
-
expect(response.statusCode).toBe(200);
|
|
76
|
-
expect(response.text).toBe('hello world');
|
|
77
|
-
});
|
|
78
|
-
test('It should handle a http request of type get and post on the same path', async () => {
|
|
79
|
-
const testRoute = (0, route_1.default)({
|
|
80
|
-
path: '/test6',
|
|
81
|
-
method: 'all',
|
|
82
|
-
async resolve(req, res, viewer) {
|
|
83
|
-
return { body: 'hello world', statusCode: 200 };
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
(0, registerRoute_1.default)(testRoute);
|
|
87
|
-
const response = await (0, supertest_1.default)(app).get('/test6');
|
|
88
|
-
expect(response.statusCode).toBe(200);
|
|
89
|
-
expect(response.text).toBe('hello world');
|
|
90
|
-
const response2 = await (0, supertest_1.default)(app).post('/test6');
|
|
91
|
-
expect(response2.statusCode).toBe(200);
|
|
92
|
-
expect(response2.text).toBe('hello world');
|
|
93
|
-
});
|
|
94
|
-
test('It should handle 302 route types', async () => {
|
|
95
|
-
const testRoute = (0, route_1.default)({
|
|
96
|
-
path: '/test7',
|
|
97
|
-
method: 'get',
|
|
98
|
-
async resolve(req, res, viewer) {
|
|
99
|
-
return {
|
|
100
|
-
statusCode: 302,
|
|
101
|
-
body: '',
|
|
102
|
-
headers: {
|
|
103
|
-
location: '/test8'
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
(0, registerRoute_1.default)(testRoute);
|
|
109
|
-
const response = await (0, supertest_1.default)(app).get('/test7');
|
|
110
|
-
expect(response.statusCode).toBe(302);
|
|
111
|
-
expect(response.header.location).toBe('/test8');
|
|
112
|
-
});
|
|
113
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
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 start_1 = require("./../start");
|
|
7
|
-
const route_1 = __importDefault(require("./route"));
|
|
8
|
-
const registerRoute_1 = __importDefault(require("./registerRoute"));
|
|
9
|
-
const supertest_1 = __importDefault(require("supertest"));
|
|
10
|
-
const lodash_1 = require("lodash");
|
|
11
|
-
const helpers_1 = require("@orion-js/helpers");
|
|
12
|
-
const app = (0, start_1.getApp)();
|
|
13
|
-
describe('Test streaming responses', () => {
|
|
14
|
-
it('Should be able to send a streaming response', async () => {
|
|
15
|
-
const testRoute = (0, route_1.default)({
|
|
16
|
-
path: '/test-streaming',
|
|
17
|
-
method: 'get',
|
|
18
|
-
async resolve(_req, res) {
|
|
19
|
-
for (const i of (0, lodash_1.range)(5)) {
|
|
20
|
-
res.write(`data: ${JSON.stringify({ count: i })}\n\n`); // "data:" is important here
|
|
21
|
-
await (0, helpers_1.sleep)(100);
|
|
22
|
-
}
|
|
23
|
-
res.end();
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
(0, registerRoute_1.default)(testRoute);
|
|
27
|
-
const response = await (0, supertest_1.default)(app)
|
|
28
|
-
.get('/test-streaming')
|
|
29
|
-
.parse((res, callback) => {
|
|
30
|
-
let data = '';
|
|
31
|
-
res.setEncoding('binary');
|
|
32
|
-
res.on('data', chunk => {
|
|
33
|
-
console.log('got chunk', chunk);
|
|
34
|
-
data += chunk;
|
|
35
|
-
});
|
|
36
|
-
res.on('end', () => {
|
|
37
|
-
callback(null, '');
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
const body = response.body;
|
|
41
|
-
console.log(body);
|
|
42
|
-
});
|
|
43
|
-
});
|
package/lib/service/index.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { OrionRouteOptions, RouteResolve, RoutesMap } from '../types';
|
|
2
|
-
export declare function Routes(): ClassDecorator;
|
|
3
|
-
export declare function Route(options: Omit<OrionRouteOptions, 'resolve'>): (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<RouteResolve>) => void;
|
|
4
|
-
export declare function getServiceRoutes(target: any): RoutesMap;
|
package/lib/service/index.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
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
|
-
exports.getServiceRoutes = exports.Route = exports.Routes = void 0;
|
|
7
|
-
const services_1 = require("@orion-js/services");
|
|
8
|
-
const route_1 = __importDefault(require("../routes/route"));
|
|
9
|
-
function Routes() {
|
|
10
|
-
return function (target) {
|
|
11
|
-
(0, services_1.Service)()(target);
|
|
12
|
-
target.prototype.service = target;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
exports.Routes = Routes;
|
|
16
|
-
function Route(options) {
|
|
17
|
-
return function (target, propertyKey, descriptor) {
|
|
18
|
-
if (!descriptor.value)
|
|
19
|
-
throw new Error(`You must pass resolver function to ${propertyKey}`);
|
|
20
|
-
target.routes = target.routes || {};
|
|
21
|
-
target.routes[propertyKey] = (0, route_1.default)({
|
|
22
|
-
...options,
|
|
23
|
-
resolve: async (req, res, viewer) => {
|
|
24
|
-
const instance = (0, services_1.getInstance)(target.service);
|
|
25
|
-
return await instance[propertyKey](req, res, viewer);
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
exports.Route = Route;
|
|
31
|
-
function getServiceRoutes(target) {
|
|
32
|
-
if (!target.prototype) {
|
|
33
|
-
throw new Error('You must pass a class to getServiceRoutes');
|
|
34
|
-
}
|
|
35
|
-
return target.prototype.routes || {};
|
|
36
|
-
}
|
|
37
|
-
exports.getServiceRoutes = getServiceRoutes;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,59 +0,0 @@
|
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const services_1 = require("@orion-js/services");
|
|
16
|
-
const _1 = require(".");
|
|
17
|
-
const start_1 = require("../start");
|
|
18
|
-
const supertest_1 = __importDefault(require("supertest"));
|
|
19
|
-
const registerRoutes_1 = __importDefault(require("../routes/registerRoutes"));
|
|
20
|
-
describe('Routes with service injections', () => {
|
|
21
|
-
it('Should define a routes map using services', async () => {
|
|
22
|
-
let ServiceExample = class ServiceExample {
|
|
23
|
-
sayHi(name) {
|
|
24
|
-
return `hello ${name}`;
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
ServiceExample = __decorate([
|
|
28
|
-
(0, services_1.Service)()
|
|
29
|
-
], ServiceExample);
|
|
30
|
-
let RoutesService = class RoutesService {
|
|
31
|
-
async route(req) {
|
|
32
|
-
return {
|
|
33
|
-
statusCode: 200,
|
|
34
|
-
body: {
|
|
35
|
-
message: this.serviceExample.sayHi(req.body.name)
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
__decorate([
|
|
41
|
-
(0, services_1.Inject)(),
|
|
42
|
-
__metadata("design:type", ServiceExample)
|
|
43
|
-
], RoutesService.prototype, "serviceExample", void 0);
|
|
44
|
-
__decorate([
|
|
45
|
-
(0, _1.Route)({ method: 'post', path: '/route-service-test', bodyParser: 'json' }),
|
|
46
|
-
__metadata("design:type", Function),
|
|
47
|
-
__metadata("design:paramtypes", [Object]),
|
|
48
|
-
__metadata("design:returntype", Promise)
|
|
49
|
-
], RoutesService.prototype, "route", null);
|
|
50
|
-
RoutesService = __decorate([
|
|
51
|
-
(0, _1.Routes)()
|
|
52
|
-
], RoutesService);
|
|
53
|
-
const routes = (0, _1.getServiceRoutes)(RoutesService);
|
|
54
|
-
(0, registerRoutes_1.default)(routes);
|
|
55
|
-
const app = (0, start_1.getApp)();
|
|
56
|
-
const response = await (0, supertest_1.default)(app).post('/route-service-test').send({ name: 'nico' });
|
|
57
|
-
expect(response.body).toEqual({ message: `hello nico` });
|
|
58
|
-
});
|
|
59
|
-
});
|
package/lib/start.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/// <reference types="express-serve-static-core" />
|
|
2
|
-
import express from 'express';
|
|
3
|
-
export interface StartOrionOptions {
|
|
4
|
-
keepAliveTimeout?: number;
|
|
5
|
-
}
|
|
6
|
-
export declare const startServer: (port?: number, otherOptions?: StartOrionOptions) => express.Express;
|
|
7
|
-
export declare const getApp: () => express.Express;
|
|
8
|
-
export declare const getServer: () => any;
|