@feathersjs/express 5.0.0-pre.1 → 5.0.0-pre.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 +167 -0
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/lib/authentication.d.ts +1 -1
- package/lib/authentication.js +5 -8
- package/lib/authentication.js.map +1 -1
- package/lib/declarations.d.ts +39 -0
- package/lib/declarations.js +3 -0
- package/lib/declarations.js.map +1 -0
- package/lib/index.d.ts +6 -18
- package/lib/index.js +34 -26
- package/lib/index.js.map +1 -1
- package/lib/rest.d.ts +9 -0
- package/lib/rest.js +100 -0
- package/lib/rest.js.map +1 -0
- package/package.json +21 -20
- package/src/authentication.ts +3 -3
- package/src/declarations.ts +60 -0
- package/src/index.ts +37 -50
- package/src/rest.ts +119 -0
- package/lib/rest/getHandler.d.ts +0 -17
- package/lib/rest/getHandler.js +0 -105
- package/lib/rest/getHandler.js.map +0 -1
- package/lib/rest/index.d.ts +0 -20
- package/lib/rest/index.js +0 -129
- package/lib/rest/index.js.map +0 -1
- package/src/rest/getHandler.ts +0 -115
- package/src/rest/index.ts +0 -148
package/lib/rest/index.js
DELETED
|
@@ -1,129 +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.rest = exports.formatter = exports.getDefaultRoutes = exports.getServiceRoutes = exports.parseRoute = exports.getDefaultUri = exports.httpMethod = void 0;
|
|
7
|
-
const debug_1 = __importDefault(require("debug"));
|
|
8
|
-
const commons_1 = require("@feathersjs/commons");
|
|
9
|
-
const authentication_1 = require("../authentication");
|
|
10
|
-
const getHandler_1 = require("./getHandler");
|
|
11
|
-
const debug = debug_1.default('@feathersjs/express/rest');
|
|
12
|
-
const HTTP_METHOD = Symbol('@feathersjs/express/rest/HTTP_METHOD');
|
|
13
|
-
function httpMethod(verb, uris) {
|
|
14
|
-
return (method) => {
|
|
15
|
-
Object.defineProperty(method, HTTP_METHOD, {
|
|
16
|
-
enumerable: false,
|
|
17
|
-
configurable: true,
|
|
18
|
-
writable: false,
|
|
19
|
-
value: (Array.isArray(uris) ? uris : [uris])
|
|
20
|
-
.reduce((result, uri) => ([...result, { verb, uri }]), method[HTTP_METHOD] || [])
|
|
21
|
-
});
|
|
22
|
-
return method;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
exports.httpMethod = httpMethod;
|
|
26
|
-
function getDefaultUri(path, methods, method) {
|
|
27
|
-
return methods[method].indexOf('id') === -1
|
|
28
|
-
? `/${path}/${method}`
|
|
29
|
-
: `/${path}/:__feathersId/${method}`;
|
|
30
|
-
}
|
|
31
|
-
exports.getDefaultUri = getDefaultUri;
|
|
32
|
-
function parseRoute(path, methods, method, route) {
|
|
33
|
-
return {
|
|
34
|
-
method,
|
|
35
|
-
verb: route.verb,
|
|
36
|
-
uri: route.uri ? `/${path}/${commons_1.stripSlashes(route.uri)}` : getDefaultUri(path, methods, method)
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
exports.parseRoute = parseRoute;
|
|
40
|
-
function getServiceRoutes(service, path, defaultRoutes) {
|
|
41
|
-
const { methods } = service;
|
|
42
|
-
return Object.keys(methods)
|
|
43
|
-
.filter(method => (service[method] && service[method][HTTP_METHOD]))
|
|
44
|
-
.reduce((result, method) => {
|
|
45
|
-
const routes = service[method][HTTP_METHOD];
|
|
46
|
-
if (Array.isArray(routes)) {
|
|
47
|
-
return [
|
|
48
|
-
...result,
|
|
49
|
-
...routes.map(route => parseRoute(path, methods, method, route))
|
|
50
|
-
];
|
|
51
|
-
}
|
|
52
|
-
return [
|
|
53
|
-
...result,
|
|
54
|
-
parseRoute(path, methods, method, routes)
|
|
55
|
-
];
|
|
56
|
-
}, defaultRoutes);
|
|
57
|
-
}
|
|
58
|
-
exports.getServiceRoutes = getServiceRoutes;
|
|
59
|
-
function getDefaultRoutes(uri) {
|
|
60
|
-
const idUri = `${uri}/:__feathersId`;
|
|
61
|
-
return [
|
|
62
|
-
{ method: 'find', verb: 'GET', uri },
|
|
63
|
-
{ method: 'get', verb: 'GET', uri: idUri },
|
|
64
|
-
{ method: 'create', verb: 'POST', uri },
|
|
65
|
-
{ method: 'patch', verb: 'PATCH', uri: idUri },
|
|
66
|
-
{ method: 'patch', verb: 'PATCH', uri },
|
|
67
|
-
{ method: 'update', verb: 'PUT', uri: idUri },
|
|
68
|
-
{ method: 'update', verb: 'PUT', uri },
|
|
69
|
-
{ method: 'remove', verb: 'DELETE', uri: idUri },
|
|
70
|
-
{ method: 'remove', verb: 'DELETE', uri } // remove(null, data, params)
|
|
71
|
-
];
|
|
72
|
-
}
|
|
73
|
-
exports.getDefaultRoutes = getDefaultRoutes;
|
|
74
|
-
function formatter(_req, res, next) {
|
|
75
|
-
if (res.data === undefined) {
|
|
76
|
-
return next();
|
|
77
|
-
}
|
|
78
|
-
res.format({
|
|
79
|
-
'application/json'() {
|
|
80
|
-
res.json(res.data);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
exports.formatter = formatter;
|
|
85
|
-
function rest(handler = formatter) {
|
|
86
|
-
return function () {
|
|
87
|
-
const app = this;
|
|
88
|
-
if (typeof app.route !== 'function') {
|
|
89
|
-
throw new Error('@feathersjs/express/rest needs an Express compatible app. Feathers apps have to wrapped with feathers-express first.');
|
|
90
|
-
}
|
|
91
|
-
if (!app.version || app.version < '3.0.0') {
|
|
92
|
-
throw new Error(`@feathersjs/express/rest requires an instance of a Feathers application version 3.x or later (got ${app.version})`);
|
|
93
|
-
}
|
|
94
|
-
app.rest = {
|
|
95
|
-
find: getHandler_1.getHandler('find'),
|
|
96
|
-
get: getHandler_1.getHandler('get'),
|
|
97
|
-
create: getHandler_1.getHandler('create'),
|
|
98
|
-
update: getHandler_1.getHandler('update'),
|
|
99
|
-
patch: getHandler_1.getHandler('patch'),
|
|
100
|
-
remove: getHandler_1.getHandler('remove')
|
|
101
|
-
};
|
|
102
|
-
app.use((req, _res, next) => {
|
|
103
|
-
req.feathers = Object.assign({
|
|
104
|
-
provider: 'rest',
|
|
105
|
-
headers: req.headers
|
|
106
|
-
}, req.feathers);
|
|
107
|
-
next();
|
|
108
|
-
});
|
|
109
|
-
app.use(authentication_1.parseAuthentication());
|
|
110
|
-
// Register the REST provider
|
|
111
|
-
app.providers.push(function (service, path, options) {
|
|
112
|
-
const baseUri = `/${path}`;
|
|
113
|
-
const { middleware: { before } } = options;
|
|
114
|
-
let { middleware: { after } } = options;
|
|
115
|
-
if (typeof handler === 'function') {
|
|
116
|
-
after = after.concat(handler);
|
|
117
|
-
}
|
|
118
|
-
debug(`Adding REST provider for service \`${path}\` at base route \`${baseUri}\``);
|
|
119
|
-
const routes = getServiceRoutes(service, path, getDefaultRoutes(baseUri));
|
|
120
|
-
for (const { method, verb, uri } of routes) {
|
|
121
|
-
app.route(uri)[verb.toLowerCase()](...before, getHandler_1.getHandler(method)(service, routes), ...after);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
exports.rest = rest;
|
|
127
|
-
rest.formatter = formatter;
|
|
128
|
-
rest.httpMethod = httpMethod;
|
|
129
|
-
//# sourceMappingURL=index.js.map
|
package/lib/rest/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"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"}
|
package/src/rest/getHandler.ts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import Debug from 'debug';
|
|
2
|
-
import { Request, Response, NextFunction } from 'express';
|
|
3
|
-
import { MethodNotAllowed } from '@feathersjs/errors';
|
|
4
|
-
import { _ } from '@feathersjs/commons';
|
|
5
|
-
import { HookContext } from '@feathersjs/feathers';
|
|
6
|
-
|
|
7
|
-
const { omit } = _;
|
|
8
|
-
const debug = Debug('@feathersjs/express/rest');
|
|
9
|
-
|
|
10
|
-
export const statusCodes = {
|
|
11
|
-
created: 201,
|
|
12
|
-
noContent: 204,
|
|
13
|
-
methodNotAllowed: 405
|
|
14
|
-
};
|
|
15
|
-
export const methodMap = {
|
|
16
|
-
find: 'GET',
|
|
17
|
-
get: 'GET',
|
|
18
|
-
create: 'POST',
|
|
19
|
-
update: 'PUT',
|
|
20
|
-
patch: 'PATCH',
|
|
21
|
-
remove: 'DELETE'
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export function getAllowedMethods (service: any, routes: any) {
|
|
25
|
-
if (routes) {
|
|
26
|
-
return routes
|
|
27
|
-
.filter(({ method }: any) => typeof service[method] === 'function')
|
|
28
|
-
.map((methodRoute: any) => methodRoute.verb.toUpperCase())
|
|
29
|
-
.filter((value: any, index: number, list: any) => list.indexOf(value) === index);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return Object.keys(methodMap)
|
|
33
|
-
.filter((method: any) => typeof service[method] === 'function')
|
|
34
|
-
.map((method: any) => (methodMap as any)[method])
|
|
35
|
-
// Filter out duplicates
|
|
36
|
-
.filter((value: any, index: number, list: any) => list.indexOf(value) === index);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function makeArgsGetter (argsOrder: any) {
|
|
40
|
-
return (req: Request, params: any) => argsOrder.map((argName: string) => {
|
|
41
|
-
switch (argName) {
|
|
42
|
-
case 'id':
|
|
43
|
-
return req.params.__feathersId || null;
|
|
44
|
-
case 'data':
|
|
45
|
-
return req.body;
|
|
46
|
-
case 'params':
|
|
47
|
-
return params;
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// A function that returns the middleware for a given method and service
|
|
53
|
-
// `getArgs` is a function that should return additional leading service arguments
|
|
54
|
-
export function getHandler (method: string) {
|
|
55
|
-
return (service: any, routes: any) => {
|
|
56
|
-
const getArgs = makeArgsGetter(service.methods[method]);
|
|
57
|
-
const allowedMethods = getAllowedMethods(service, routes);
|
|
58
|
-
|
|
59
|
-
return (req: Request, res: Response, next: NextFunction) => {
|
|
60
|
-
const { query } = req;
|
|
61
|
-
const route = omit(req.params, '__feathersId');
|
|
62
|
-
|
|
63
|
-
res.setHeader('Allow', allowedMethods.join(','));
|
|
64
|
-
|
|
65
|
-
// Check if the method exists on the service at all. Send 405 (Method not allowed) if not
|
|
66
|
-
if (typeof service[method] !== 'function') {
|
|
67
|
-
debug(`Method '${method}' not allowed on '${req.url}'`);
|
|
68
|
-
res.status(statusCodes.methodNotAllowed);
|
|
69
|
-
|
|
70
|
-
return next(new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`));
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Grab the service parameters. Use req.feathers
|
|
74
|
-
// and set the query to req.query merged with req.params
|
|
75
|
-
const params = Object.assign({
|
|
76
|
-
query, route
|
|
77
|
-
}, req.feathers);
|
|
78
|
-
|
|
79
|
-
Object.defineProperty(params, '__returnHook', {
|
|
80
|
-
value: true
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
const args = getArgs(req, params);
|
|
84
|
-
|
|
85
|
-
debug(`REST handler calling \`${method}\` from \`${req.url}\``);
|
|
86
|
-
|
|
87
|
-
service[method](...args, true)
|
|
88
|
-
.then((hook: HookContext) => {
|
|
89
|
-
const data = hook.dispatch !== undefined ? hook.dispatch : hook.result;
|
|
90
|
-
|
|
91
|
-
res.data = data;
|
|
92
|
-
res.hook = hook;
|
|
93
|
-
|
|
94
|
-
if (hook.statusCode) {
|
|
95
|
-
res.status(hook.statusCode);
|
|
96
|
-
} else if (!data) {
|
|
97
|
-
debug(`No content returned for '${req.url}'`);
|
|
98
|
-
res.status(statusCodes.noContent);
|
|
99
|
-
} else if (method === 'create') {
|
|
100
|
-
res.status(statusCodes.created);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return next();
|
|
104
|
-
})
|
|
105
|
-
.catch((hook: HookContext) => {
|
|
106
|
-
const { error } = hook;
|
|
107
|
-
|
|
108
|
-
debug(`Error in handler: \`${error.message}\``);
|
|
109
|
-
res.hook = hook;
|
|
110
|
-
|
|
111
|
-
return next(hook.error);
|
|
112
|
-
});
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
}
|
package/src/rest/index.ts
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import Debug from 'debug';
|
|
2
|
-
import { stripSlashes } from '@feathersjs/commons';
|
|
3
|
-
import { Request, Response, NextFunction, RequestHandler } from 'express';
|
|
4
|
-
import { parseAuthentication } from '../authentication';
|
|
5
|
-
import { getHandler } from './getHandler';
|
|
6
|
-
|
|
7
|
-
const debug = Debug('@feathersjs/express/rest');
|
|
8
|
-
const HTTP_METHOD = Symbol('@feathersjs/express/rest/HTTP_METHOD');
|
|
9
|
-
|
|
10
|
-
export function httpMethod (verb: any, uris?: any) {
|
|
11
|
-
return (method: any) => {
|
|
12
|
-
Object.defineProperty(method, HTTP_METHOD, {
|
|
13
|
-
enumerable: false,
|
|
14
|
-
configurable: true,
|
|
15
|
-
writable: false,
|
|
16
|
-
value: (Array.isArray(uris) ? uris : [uris])
|
|
17
|
-
.reduce(
|
|
18
|
-
(result, uri) => ([...result, { verb, uri }]),
|
|
19
|
-
method[HTTP_METHOD] || []
|
|
20
|
-
)
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
return method;
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function getDefaultUri (path: string, methods: any, method: any) {
|
|
28
|
-
return methods[method].indexOf('id') === -1
|
|
29
|
-
? `/${path}/${method}`
|
|
30
|
-
: `/${path}/:__feathersId/${method}`;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function parseRoute (path: any, methods: any, method: any, route: any) {
|
|
34
|
-
return {
|
|
35
|
-
method,
|
|
36
|
-
verb: route.verb,
|
|
37
|
-
uri: route.uri ? `/${path}/${stripSlashes(route.uri)}` : getDefaultUri(path, methods, method)
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function getServiceRoutes (service: any, path: any, defaultRoutes: any) {
|
|
42
|
-
const { methods } = service;
|
|
43
|
-
|
|
44
|
-
return Object.keys(methods)
|
|
45
|
-
.filter(method => (service[method] && service[method][HTTP_METHOD]))
|
|
46
|
-
.reduce((result, method) => {
|
|
47
|
-
const routes = service[method][HTTP_METHOD];
|
|
48
|
-
|
|
49
|
-
if (Array.isArray(routes)) {
|
|
50
|
-
return [
|
|
51
|
-
...result,
|
|
52
|
-
...routes.map(route => parseRoute(path, methods, method, route))
|
|
53
|
-
];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return [
|
|
57
|
-
...result,
|
|
58
|
-
parseRoute(path, methods, method, routes)
|
|
59
|
-
];
|
|
60
|
-
}, defaultRoutes);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function getDefaultRoutes (uri: string) {
|
|
64
|
-
const idUri = `${uri}/:__feathersId`;
|
|
65
|
-
|
|
66
|
-
return [
|
|
67
|
-
{ method: 'find', verb: 'GET', uri }, // find(params)
|
|
68
|
-
{ method: 'get', verb: 'GET', uri: idUri }, // get(id, params)
|
|
69
|
-
{ method: 'create', verb: 'POST', uri }, // create(data, params)
|
|
70
|
-
{ method: 'patch', verb: 'PATCH', uri: idUri }, // patch(id, data, params)
|
|
71
|
-
{ method: 'patch', verb: 'PATCH', uri }, // patch(null, data, params)
|
|
72
|
-
{ method: 'update', verb: 'PUT', uri: idUri }, // update(id, data, params)
|
|
73
|
-
{ method: 'update', verb: 'PUT', uri }, // update(null, data, params)
|
|
74
|
-
{ method: 'remove', verb: 'DELETE', uri: idUri }, // remove(id, data, params)
|
|
75
|
-
{ method: 'remove', verb: 'DELETE', uri } // remove(null, data, params)
|
|
76
|
-
];
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export function formatter (_req: Request, res: Response, next: NextFunction) {
|
|
80
|
-
if (res.data === undefined) {
|
|
81
|
-
return next();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
res.format({
|
|
85
|
-
'application/json' () {
|
|
86
|
-
res.json(res.data);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function rest (handler: RequestHandler = formatter) {
|
|
92
|
-
return function (this: any) {
|
|
93
|
-
const app = this;
|
|
94
|
-
|
|
95
|
-
if (typeof app.route !== 'function') {
|
|
96
|
-
throw new Error('@feathersjs/express/rest needs an Express compatible app. Feathers apps have to wrapped with feathers-express first.');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (!app.version || app.version < '3.0.0') {
|
|
100
|
-
throw new Error(`@feathersjs/express/rest requires an instance of a Feathers application version 3.x or later (got ${app.version})`);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
app.rest = {
|
|
104
|
-
find: getHandler('find'),
|
|
105
|
-
get: getHandler('get'),
|
|
106
|
-
create: getHandler('create'),
|
|
107
|
-
update: getHandler('update'),
|
|
108
|
-
patch: getHandler('patch'),
|
|
109
|
-
remove: getHandler('remove')
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
app.use((req: Request, _res: Response, next: NextFunction) => {
|
|
113
|
-
req.feathers = Object.assign({
|
|
114
|
-
provider: 'rest',
|
|
115
|
-
headers: req.headers
|
|
116
|
-
}, req.feathers);
|
|
117
|
-
next();
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
app.use(parseAuthentication());
|
|
121
|
-
|
|
122
|
-
// Register the REST provider
|
|
123
|
-
app.providers.push(function (service: any, path: string, options: any) {
|
|
124
|
-
const baseUri = `/${path}`;
|
|
125
|
-
const { middleware: { before } } = options;
|
|
126
|
-
let { middleware: { after } } = options;
|
|
127
|
-
|
|
128
|
-
if (typeof handler === 'function') {
|
|
129
|
-
after = after.concat(handler);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
debug(`Adding REST provider for service \`${path}\` at base route \`${baseUri}\``);
|
|
133
|
-
|
|
134
|
-
const routes = getServiceRoutes(service, path, getDefaultRoutes(baseUri));
|
|
135
|
-
|
|
136
|
-
for (const { method, verb, uri } of routes) {
|
|
137
|
-
app.route(uri)[verb.toLowerCase()](
|
|
138
|
-
...before,
|
|
139
|
-
getHandler(method)(service, routes),
|
|
140
|
-
...after
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
rest.formatter = formatter;
|
|
148
|
-
rest.httpMethod = httpMethod;
|