@loopback/core 4.0.0-alpha.8 → 4.0.1

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.
Files changed (179) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +77 -2
  3. package/dist/application.d.ts +341 -0
  4. package/dist/application.js +554 -0
  5. package/dist/application.js.map +1 -0
  6. package/dist/component.d.ts +80 -0
  7. package/dist/component.js +59 -0
  8. package/dist/component.js.map +1 -0
  9. package/dist/extension-point.d.ts +121 -0
  10. package/dist/extension-point.js +227 -0
  11. package/dist/extension-point.js.map +1 -0
  12. package/dist/index.d.ts +21 -0
  13. package/dist/index.js +31 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/keys.d.ts +97 -0
  16. package/dist/keys.js +109 -0
  17. package/dist/keys.js.map +1 -0
  18. package/dist/lifecycle-registry.d.ts +91 -0
  19. package/dist/lifecycle-registry.js +191 -0
  20. package/dist/lifecycle-registry.js.map +1 -0
  21. package/dist/lifecycle.d.ts +47 -0
  22. package/dist/lifecycle.js +56 -0
  23. package/dist/lifecycle.js.map +1 -0
  24. package/dist/mixin-target.d.ts +60 -0
  25. package/{lib/internal-types.js → dist/mixin-target.js} +2 -3
  26. package/dist/mixin-target.js.map +1 -0
  27. package/dist/server.d.ts +16 -0
  28. package/{lib6/src/Component.js → dist/server.js} +2 -1
  29. package/dist/server.js.map +1 -0
  30. package/dist/service.d.ts +63 -0
  31. package/dist/service.js +151 -0
  32. package/dist/service.js.map +1 -0
  33. package/package.json +39 -37
  34. package/src/application.ts +719 -0
  35. package/src/component.ts +155 -0
  36. package/src/extension-point.ts +312 -0
  37. package/src/index.ts +29 -0
  38. package/src/keys.ts +144 -0
  39. package/src/lifecycle-registry.ts +268 -0
  40. package/src/lifecycle.ts +90 -0
  41. package/src/mixin-target.ts +69 -0
  42. package/src/server.ts +22 -0
  43. package/src/service.ts +211 -0
  44. package/index.d.ts +0 -6
  45. package/index.js +0 -9
  46. package/lib/Component.d.ts +0 -2
  47. package/lib/Component.js +0 -7
  48. package/lib/Sequence.d.ts +0 -14
  49. package/lib/Sequence.js +0 -58
  50. package/lib/application.d.ts +0 -52
  51. package/lib/application.js +0 -79
  52. package/lib/application.js.map +0 -1
  53. package/lib/component.js.map +0 -1
  54. package/lib/handlers/http.d.ts +0 -3
  55. package/lib/handlers/http.js +0 -13
  56. package/lib/handlers/http.js.map +0 -1
  57. package/lib/handlers/index.d.ts +0 -1
  58. package/lib/handlers/index.js +0 -11
  59. package/lib/handlers/index.js.map +0 -1
  60. package/lib/http-handler.d.ts +0 -16
  61. package/lib/http-handler.js +0 -62
  62. package/lib/http-handler.js.map +0 -1
  63. package/lib/index.d.ts +0 -16
  64. package/lib/index.js +0 -33
  65. package/lib/index.js.map +0 -1
  66. package/lib/internal-types.d.ts +0 -20
  67. package/lib/internal-types.js.map +0 -1
  68. package/lib/invoke.d.ts +0 -5
  69. package/lib/invoke.js +0 -30
  70. package/lib/parser.d.ts +0 -3
  71. package/lib/parser.js +0 -73
  72. package/lib/parser.js.map +0 -1
  73. package/lib/promisify.d.ts +0 -3
  74. package/lib/promisify.js +0 -34
  75. package/lib/promisify.js.map +0 -1
  76. package/lib/router/SwaggerRouter.d.ts +0 -39
  77. package/lib/router/SwaggerRouter.js +0 -205
  78. package/lib/router/metadata.d.ts +0 -12
  79. package/lib/router/metadata.js +0 -30
  80. package/lib/router/metadata.js.map +0 -1
  81. package/lib/router/routing-table.d.ts +0 -16
  82. package/lib/router/routing-table.js +0 -95
  83. package/lib/router/routing-table.js.map +0 -1
  84. package/lib/sequence.js.map +0 -1
  85. package/lib/server.d.ts +0 -23
  86. package/lib/server.js +0 -53
  87. package/lib/server.js.map +0 -1
  88. package/lib/src/Component.d.ts +0 -2
  89. package/lib/src/Component.js +0 -6
  90. package/lib/src/Sequence.d.ts +0 -6
  91. package/lib/src/Sequence.js +0 -26
  92. package/lib/src/application.d.ts +0 -27
  93. package/lib/src/application.js +0 -70
  94. package/lib/src/index.d.ts +0 -13
  95. package/lib/src/index.js +0 -29
  96. package/lib/src/invoke.d.ts +0 -5
  97. package/lib/src/invoke.js +0 -34
  98. package/lib/src/parser.d.ts +0 -3
  99. package/lib/src/parser.js +0 -72
  100. package/lib/src/promisify.d.ts +0 -3
  101. package/lib/src/promisify.js +0 -33
  102. package/lib/src/router/SwaggerRouter.d.ts +0 -53
  103. package/lib/src/router/SwaggerRouter.js +0 -101
  104. package/lib/src/router/metadata.d.ts +0 -13
  105. package/lib/src/router/metadata.js +0 -29
  106. package/lib/src/router/routing-table.d.ts +0 -13
  107. package/lib/src/router/routing-table.js +0 -83
  108. package/lib/src/server.d.ts +0 -17
  109. package/lib/src/server.js +0 -40
  110. package/lib/writer.d.ts +0 -4
  111. package/lib/writer.js +0 -24
  112. package/lib/writer.js.map +0 -1
  113. package/lib6/Component.d.ts +0 -2
  114. package/lib6/Component.js +0 -7
  115. package/lib6/Sequence.d.ts +0 -14
  116. package/lib6/Sequence.js +0 -68
  117. package/lib6/application.d.ts +0 -52
  118. package/lib6/application.js +0 -79
  119. package/lib6/application.js.map +0 -1
  120. package/lib6/component.js.map +0 -1
  121. package/lib6/handlers/http.d.ts +0 -3
  122. package/lib6/handlers/http.js +0 -21
  123. package/lib6/handlers/http.js.map +0 -1
  124. package/lib6/handlers/index.d.ts +0 -1
  125. package/lib6/handlers/index.js +0 -11
  126. package/lib6/handlers/index.js.map +0 -1
  127. package/lib6/http-handler.d.ts +0 -16
  128. package/lib6/http-handler.js +0 -72
  129. package/lib6/http-handler.js.map +0 -1
  130. package/lib6/index.d.ts +0 -16
  131. package/lib6/index.js +0 -33
  132. package/lib6/index.js.map +0 -1
  133. package/lib6/internal-types.d.ts +0 -20
  134. package/lib6/internal-types.js +0 -8
  135. package/lib6/internal-types.js.map +0 -1
  136. package/lib6/invoke.d.ts +0 -5
  137. package/lib6/invoke.js +0 -30
  138. package/lib6/parser.d.ts +0 -3
  139. package/lib6/parser.js +0 -83
  140. package/lib6/parser.js.map +0 -1
  141. package/lib6/promisify.d.ts +0 -3
  142. package/lib6/promisify.js +0 -34
  143. package/lib6/promisify.js.map +0 -1
  144. package/lib6/router/SwaggerRouter.d.ts +0 -39
  145. package/lib6/router/SwaggerRouter.js +0 -205
  146. package/lib6/router/metadata.d.ts +0 -12
  147. package/lib6/router/metadata.js +0 -30
  148. package/lib6/router/metadata.js.map +0 -1
  149. package/lib6/router/routing-table.d.ts +0 -16
  150. package/lib6/router/routing-table.js +0 -95
  151. package/lib6/router/routing-table.js.map +0 -1
  152. package/lib6/sequence.js.map +0 -1
  153. package/lib6/server.d.ts +0 -23
  154. package/lib6/server.js +0 -63
  155. package/lib6/server.js.map +0 -1
  156. package/lib6/src/Component.d.ts +0 -2
  157. package/lib6/src/Sequence.d.ts +0 -6
  158. package/lib6/src/Sequence.js +0 -36
  159. package/lib6/src/application.d.ts +0 -27
  160. package/lib6/src/application.js +0 -70
  161. package/lib6/src/index.d.ts +0 -13
  162. package/lib6/src/index.js +0 -29
  163. package/lib6/src/invoke.d.ts +0 -5
  164. package/lib6/src/invoke.js +0 -34
  165. package/lib6/src/parser.d.ts +0 -3
  166. package/lib6/src/parser.js +0 -82
  167. package/lib6/src/promisify.d.ts +0 -3
  168. package/lib6/src/promisify.js +0 -33
  169. package/lib6/src/router/SwaggerRouter.d.ts +0 -53
  170. package/lib6/src/router/SwaggerRouter.js +0 -101
  171. package/lib6/src/router/metadata.d.ts +0 -13
  172. package/lib6/src/router/metadata.js +0 -29
  173. package/lib6/src/router/routing-table.d.ts +0 -13
  174. package/lib6/src/router/routing-table.js +0 -83
  175. package/lib6/src/server.d.ts +0 -17
  176. package/lib6/src/server.js +0 -50
  177. package/lib6/writer.d.ts +0 -4
  178. package/lib6/writer.js +0 -24
  179. package/lib6/writer.js.map +0 -1
package/lib/src/invoke.js DELETED
@@ -1,34 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const debug = require('debug')('loopback:invoker');
8
- // tslint:enable:no-any
9
- function invoke(controller, operationName, args, response, next) {
10
- debug('invoke %s with arguments', operationName, args);
11
- // TODO(bajtos) support sync operations that return the value directly (no Promise)
12
- controller[operationName](...args).then(function onSuccess(result) {
13
- debug('%s() result -', operationName, result);
14
- // TODO(bajtos) handle non-string results via JSON.stringify
15
- if (result) {
16
- if (typeof result === 'object') {
17
- // TODO(ritch) remove this, should be configurable
18
- response.setHeader('Content-Type', 'application/json');
19
- // TODO(bajtos) handle errors - JSON.stringify can throw
20
- result = JSON.stringify(result);
21
- }
22
- else if (typeof result === 'string') {
23
- response.setHeader('Content-Type', 'text/plain');
24
- }
25
- response.write(result);
26
- }
27
- response.end();
28
- // Do not call next(), the request was handled.
29
- }, function onError(err) {
30
- debug('%s() failed - ', operationName, err.stack || err);
31
- next(err);
32
- });
33
- }
34
- exports.invoke = invoke;
@@ -1,3 +0,0 @@
1
- import { PathParameterValues, OperationArgs, ParsedRequest } from './router/SwaggerRouter';
2
- import { OperationObject } from '@loopback/openapi-spec';
3
- export declare function parseOperationArgs(request: ParsedRequest, operationSpec: OperationObject, pathParams: PathParameterValues): Promise<OperationArgs>;
package/lib/src/parser.js DELETED
@@ -1,72 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const _1 = require("./");
8
- const promisify_1 = require("./promisify");
9
- const jsonBody = require('body/json');
10
- // tslint:enable:no-any
11
- const parseJsonBody = promisify_1.promisify(jsonBody);
12
- async function parseOperationArgs(request, operationSpec, pathParams) {
13
- const args = [];
14
- const body = await loadRequestBodyIfNeeded(operationSpec, request);
15
- return buildOperationArguments(operationSpec, request, pathParams, body);
16
- }
17
- exports.parseOperationArgs = parseOperationArgs;
18
- function loadRequestBodyIfNeeded(operationSpec, request) {
19
- if (!hasArgumentsFromBody(operationSpec))
20
- return Promise.resolve();
21
- const contentType = request.headers['content-type'];
22
- if (contentType && !/json/.test(contentType)) {
23
- const err = new _1.HttpErrors.UnsupportedMediaType(`Content-type ${contentType} is not supported.`);
24
- return Promise.reject(err);
25
- }
26
- return parseJsonBody(request).catch((err) => {
27
- err.statusCode = 400;
28
- return Promise.reject(err);
29
- });
30
- }
31
- function hasArgumentsFromBody(operationSpec) {
32
- if (!operationSpec.parameters || !operationSpec.parameters.length)
33
- return false;
34
- for (const paramSpec of operationSpec.parameters) {
35
- if ('$ref' in paramSpec)
36
- continue;
37
- const source = paramSpec.in;
38
- if (source === 'formData' || source === 'body')
39
- return true;
40
- }
41
- return false;
42
- }
43
- function buildOperationArguments(operationSpec, request, pathParams, body) {
44
- const args = [];
45
- for (const paramSpec of operationSpec.parameters || []) {
46
- if ('$ref' in paramSpec) {
47
- // TODO(bajtos) implement $ref parameters
48
- throw new Error('$ref parameters are not supported yet.');
49
- }
50
- const spec = paramSpec;
51
- switch (spec.in) {
52
- case 'query':
53
- args.push(request.query[spec.name]);
54
- break;
55
- case 'path':
56
- args.push(pathParams[spec.name]);
57
- break;
58
- case 'header':
59
- args.push(request.headers[spec.name.toLowerCase()]);
60
- break;
61
- case 'formData':
62
- args.push(body ? body[spec.name] : undefined);
63
- break;
64
- case 'body':
65
- args.push(body);
66
- break;
67
- default:
68
- throw new _1.HttpErrors.NotImplemented('Parameters with "in: ' + spec.in + '" are not supported yet.');
69
- }
70
- }
71
- return args;
72
- }
@@ -1,3 +0,0 @@
1
- export declare function promisify<T>(func: (callback: (err: any, result: T) => void) => void): () => Promise<T>;
2
- export declare function promisify<T, A1>(func: (arg1: A1, callback: (err: any, result: T) => void) => void): (arg1: A1) => Promise<T>;
3
- export declare function promisify<T, A1, A2>(func: (arg1: A1, arg2: A2, callback: (err: any, result: T) => void) => void): (arg1: A1, arg2: A2) => Promise<T>;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- // TODO(bajtos) Move this file to a standalone module, or find an existing
8
- // npm module that we could use instead. Just make sure the existing
9
- // module is using native utils.promisify() when available.
10
- // tslint:disable:no-any
11
- const util = require("util");
12
- const nativePromisify = util.promisify;
13
- function promisify(func) {
14
- if (nativePromisify)
15
- return nativePromisify(func);
16
- // The simplest implementation of Promisify
17
- return (...args) => {
18
- return new Promise((resolve, reject) => {
19
- try {
20
- func(...args, (err, result) => {
21
- if (err)
22
- reject(err);
23
- else
24
- resolve(result);
25
- });
26
- }
27
- catch (err) {
28
- reject(err);
29
- }
30
- });
31
- };
32
- }
33
- exports.promisify = promisify;
@@ -1,53 +0,0 @@
1
- /// <reference types="node" />
2
- import { ServerRequest as Request, ServerResponse as Response } from 'http';
3
- import { OpenApiSpec } from '@loopback/openapi-spec';
4
- export declare type OperationArgs = any[];
5
- export declare type PathParameterValues = {
6
- [key: string]: any;
7
- };
8
- export declare type HandlerCallback = (err?: Error | string) => void;
9
- export declare type RequestHandler = (req: Request, res: Response, cb?: HandlerCallback) => void;
10
- export declare type ControllerFactory = (request: Request, response: Response, operationName: string) => Object;
11
- /**
12
- * SwaggerRouter - an express-compatible Router using OpenAPI/Swagger
13
- * to define routes and input parameters
14
- */
15
- export declare class SwaggerRouter {
16
- /**
17
- * The function handling incoming requests.
18
- * Pass it Node.js HttpServer or register it
19
- * as Express.js middleware.
20
- *
21
- * @param req {http.ServerRequest} The incoming request.
22
- * @param res {http.ServerResponse} The response object.
23
- * @param [cb] {Function} The callback to call when handling failed with an error,
24
- * or when there is no endpoint registered to handle the request URL.
25
- */
26
- readonly handler: RequestHandler;
27
- private readonly _routingTable;
28
- constructor();
29
- /**
30
- * Register a controller. The controller should be
31
- * a regular ES6/TS class, use @api decorator to describe
32
- * the REST API implemented by the controller.
33
- * TODO(bajtos) How to support ES6 where decorators are not available?
34
- *
35
- * @param controllerCtor {ControllerFactory} A factory function accepting (Request, Response) arguments
36
- * and returning the Controller instance to use.
37
- * @param spec {OpenApiSpec} The Swagger specification describing the methods provided by this controller.
38
- */
39
- controller(factory: ControllerFactory, spec: OpenApiSpec): void;
40
- private _handleRequest(request, response, next);
41
- private _finalHandler(req, res, err?);
42
- logError(req: Request, statusCode: number, err: Error | string): void;
43
- }
44
- export interface ParsedRequest extends Request {
45
- path: string;
46
- query: {
47
- [key: string]: string;
48
- };
49
- url: string;
50
- pathname: string;
51
- method: string;
52
- }
53
- export declare function parseRequestUrl(request: Request): ParsedRequest;
@@ -1,101 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const invoke_1 = require("../invoke");
8
- const parser_1 = require("../parser");
9
- const routing_table_1 = require("./routing-table");
10
- const assert = require("assert");
11
- const url = require("url");
12
- const debug = require('debug')('loopback:SwaggerRouter');
13
- /**
14
- * SwaggerRouter - an express-compatible Router using OpenAPI/Swagger
15
- * to define routes and input parameters
16
- */
17
- class SwaggerRouter {
18
- constructor() {
19
- this._routingTable = new routing_table_1.RoutingTable();
20
- // NOTE(bajtos) It is important to use an arrow function here to allow
21
- // users to pass "router.handler" around as a regular function,
22
- // e.g. http.createServer(router.handler)
23
- this.handler = (req, res, callback) => {
24
- this._handleRequest(req, res, (err) => {
25
- if (callback)
26
- callback(err);
27
- else
28
- this._finalHandler(req, res, err);
29
- });
30
- };
31
- }
32
- /**
33
- * Register a controller. The controller should be
34
- * a regular ES6/TS class, use @api decorator to describe
35
- * the REST API implemented by the controller.
36
- * TODO(bajtos) How to support ES6 where decorators are not available?
37
- *
38
- * @param controllerCtor {ControllerFactory} A factory function accepting (Request, Response) arguments
39
- * and returning the Controller instance to use.
40
- * @param spec {OpenApiSpec} The Swagger specification describing the methods provided by this controller.
41
- */
42
- controller(factory, spec) {
43
- assert(typeof factory === 'function', 'Controller factory must be a function.');
44
- this._routingTable.define(factory, spec);
45
- }
46
- _handleRequest(request, response, next) {
47
- const parsedRequest = parseRequestUrl(request);
48
- debug('Handle request "%s %s"', request.method, parsedRequest.path);
49
- const route = this._routingTable.find(parsedRequest);
50
- if (!route) {
51
- debug('Endpoint not found: "%s %s"', request.method, parsedRequest.path);
52
- next();
53
- return;
54
- }
55
- const controllerFactory = route.controller;
56
- const operationName = route.methodName;
57
- // tslint:disable-next-line:no-floating-promises
58
- Promise.resolve(controllerFactory(request, response, operationName))
59
- .then(controller => {
60
- return parser_1.parseOperationArgs(parsedRequest, route.spec, route.pathParams)
61
- .then(args => {
62
- invoke_1.invoke(controller, operationName, args, response, next);
63
- }, err => {
64
- debug('Cannot parse arguments of operation %s: %s', operationName, err.stack || err);
65
- next(err);
66
- });
67
- }, err => {
68
- debug('Cannot resolve controller instance for operation %s: %s', operationName, err.stack || err);
69
- next(err);
70
- });
71
- }
72
- _finalHandler(req, res, err) {
73
- // TODO(bajtos) cover this final handler by tests
74
- // TODO(bajtos) make the error-handling strategy configurable (e.g. via strong-error-handler)
75
- if (err) {
76
- res.statusCode = err.statusCode || err.status || 500;
77
- this.logError(req, res.statusCode, err);
78
- res.end();
79
- }
80
- else {
81
- this.logError(req, 404, 'Not found.');
82
- res.statusCode = 404;
83
- res.write(req.url + ' not found.\n');
84
- res.end();
85
- }
86
- }
87
- logError(req, statusCode, err) {
88
- console.error('Unhandled error in %s %s: %s %s', req.method, req.url, statusCode, err.stack || err);
89
- }
90
- }
91
- exports.SwaggerRouter = SwaggerRouter;
92
- function parseRequestUrl(request) {
93
- // TODO(bajtos) The following parsing can be skipped when the router
94
- // is mounted on an express app
95
- const parsedRequest = request;
96
- const parsedUrl = url.parse(parsedRequest.url, true);
97
- parsedRequest.path = parsedUrl.pathname || '/';
98
- parsedRequest.query = parsedUrl.query;
99
- return parsedRequest;
100
- }
101
- exports.parseRequestUrl = parseRequestUrl;
@@ -1,13 +0,0 @@
1
- import 'reflect-metadata';
2
- import { OpenApiSpec } from '@loopback/openapi-spec';
3
- /**
4
- * Decorate the given Controller constructor with metadata describing
5
- * the HTTP/REST API the Controller implements/provides.
6
- *
7
- * @param {OpenApiSpec} spec OpenAPI specification describing the endpoints
8
- * handled by this controller
9
- *
10
- * @decorator
11
- */
12
- export declare function api(spec: OpenApiSpec): (constructor: Function) => void;
13
- export declare function getApiSpec(constructor: Function): OpenApiSpec;
@@ -1,29 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const assert = require("assert");
8
- require("reflect-metadata");
9
- /**
10
- * Decorate the given Controller constructor with metadata describing
11
- * the HTTP/REST API the Controller implements/provides.
12
- *
13
- * @param {OpenApiSpec} spec OpenAPI specification describing the endpoints
14
- * handled by this controller
15
- *
16
- * @decorator
17
- */
18
- function api(spec) {
19
- return function (constructor) {
20
- assert(typeof constructor === 'function', 'The @api decorator can be applied to constructors only.');
21
- Reflect.defineMetadata('loopback:api-spec', spec, constructor);
22
- };
23
- }
24
- exports.api = api;
25
- // TODO(bajtos) Add unit-tests
26
- function getApiSpec(constructor) {
27
- return Reflect.getMetadata('loopback:api-spec', constructor);
28
- }
29
- exports.getApiSpec = getApiSpec;
@@ -1,13 +0,0 @@
1
- import { OpenApiSpec, OperationObject } from '@loopback/openapi-spec';
2
- import { PathParameterValues, ParsedRequest } from './SwaggerRouter';
3
- export declare class RoutingTable<ControllerType> {
4
- private readonly _routes;
5
- define(controller: ControllerType, spec: OpenApiSpec): void;
6
- find(request: ParsedRequest): ResolvedRoute<ControllerType> | undefined;
7
- }
8
- export interface ResolvedRoute<ControllerType> {
9
- readonly controller: ControllerType;
10
- readonly methodName: string;
11
- readonly spec: OperationObject;
12
- readonly pathParams: PathParameterValues;
13
- }
@@ -1,83 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const assert = require("assert");
8
- const debug = require('debug')('loopback:core:routing-table');
9
- // TODO(bajtos) Refactor this code to use Trie-based lookup,
10
- // e.g. via wayfarer/trie or find-my-way
11
- const pathToRegexp = require("path-to-regexp");
12
- class RoutingTable {
13
- constructor() {
14
- this._routes = [];
15
- }
16
- define(controller, spec) {
17
- assert(typeof spec === 'object' && !!spec, 'API specification must be a non-null object');
18
- if (!spec.paths || !Object.keys(spec.paths).length) {
19
- return;
20
- }
21
- debug('Registering Controller with API', spec);
22
- for (const path in spec.paths) {
23
- for (const verb in spec.paths[path]) {
24
- const opSpec = spec.paths[path][verb];
25
- // TODO(bajtos) handle the case where opSpec.parameters contains $ref
26
- debug(' %s %s -> %s(%s)', verb, path, opSpec['x-operation-name'], (opSpec.parameters || []).map(p => p.name).join(', '));
27
- this._routes.push(new RouteEntry(path, verb, opSpec, controller));
28
- }
29
- }
30
- }
31
- find(request) {
32
- for (const entry of this._routes) {
33
- const match = entry.match(request);
34
- if (match)
35
- return match;
36
- }
37
- return undefined;
38
- }
39
- }
40
- exports.RoutingTable = RoutingTable;
41
- class RouteEntry {
42
- constructor(path, verb, _spec, _controller) {
43
- this._spec = _spec;
44
- this._controller = _controller;
45
- this._verb = verb.toLowerCase();
46
- // In Swagger, path parameters are wrapped in `{}`.
47
- // In Express.js, path parameters are prefixed with `:`
48
- path = path.replace(/{([^}]*)}(\/|$)/g, ':$1$2');
49
- this._pathRegexp = pathToRegexp(path, [], { strict: false, end: true });
50
- }
51
- match(request) {
52
- debug('trying endpoint', this);
53
- if (this._verb !== request.method.toLowerCase()) {
54
- debug(' -> verb mismatch');
55
- return undefined;
56
- }
57
- const match = this._pathRegexp.exec(request.path);
58
- if (!match) {
59
- debug(' -> path mismatch');
60
- return undefined;
61
- }
62
- const pathParams = this._buildPathParams(match);
63
- debug(' -> found with params: %j', pathParams);
64
- return this._createResolvedRoute(pathParams);
65
- }
66
- _createResolvedRoute(pathParams) {
67
- return {
68
- controller: this._controller,
69
- methodName: this._spec['x-operation-name'],
70
- spec: this._spec,
71
- pathParams: pathParams,
72
- };
73
- }
74
- _buildPathParams(pathMatch) {
75
- const pathParams = Object.create(null);
76
- for (const ix in this._pathRegexp.keys) {
77
- const key = this._pathRegexp.keys[ix];
78
- const matchIndex = +ix + 1;
79
- pathParams[key.name] = pathMatch[matchIndex];
80
- }
81
- return pathParams;
82
- }
83
- }
@@ -1,17 +0,0 @@
1
- import { Context } from '@loopback/context';
2
- export declare class Server extends Context {
3
- config: ServerConfig;
4
- state: ServerState;
5
- constructor(config?: ServerConfig);
6
- start(): Promise<void>;
7
- }
8
- export interface ServerConfig {
9
- port: number;
10
- }
11
- export declare enum ServerState {
12
- cold = 0,
13
- starting = 1,
14
- listening = 2,
15
- crashed = 3,
16
- stopped = 4,
17
- }
package/lib/src/server.js DELETED
@@ -1,40 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const Sequence_1 = require("./Sequence");
8
- const context_1 = require("@loopback/context");
9
- const debug = require('debug')('loopback:Server');
10
- const http_1 = require("http");
11
- class Server extends context_1.Context {
12
- constructor(config = { port: 3000 }) {
13
- super();
14
- this.config = config;
15
- this.state = ServerState.cold;
16
- }
17
- async start() {
18
- this.state = ServerState.starting;
19
- const server = http_1.createServer(async (req, res) => {
20
- const sequence = new Sequence_1.Sequence();
21
- await sequence.run(this, req, res);
22
- });
23
- server.listen(this.config.port);
24
- // FIXME(bajtos) The updated port number should be part of "status" object,
25
- // we shouldn't be changing original config IMO.
26
- // Consider exposing full base URL including http/https scheme prefix
27
- this.config.port = server.address().port;
28
- await new Promise(resolve => server.once('listening', resolve));
29
- this.state = ServerState.listening;
30
- }
31
- }
32
- exports.Server = Server;
33
- var ServerState;
34
- (function (ServerState) {
35
- ServerState[ServerState["cold"] = 0] = "cold";
36
- ServerState[ServerState["starting"] = 1] = "starting";
37
- ServerState[ServerState["listening"] = 2] = "listening";
38
- ServerState[ServerState["crashed"] = 3] = "crashed";
39
- ServerState[ServerState["stopped"] = 4] = "stopped";
40
- })(ServerState = exports.ServerState || (exports.ServerState = {}));
package/lib/writer.d.ts DELETED
@@ -1,4 +0,0 @@
1
- /// <reference types="node" />
2
- import { ServerResponse as Response } from 'http';
3
- import { OperationRetval } from './internal-types';
4
- export declare function writeResultToResponse(response: Response, result: OperationRetval): void;
package/lib/writer.js DELETED
@@ -1,24 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- function writeResultToResponse(response, // not needed and responsibility should be in the sequence.send
8
- result) {
9
- if (result) {
10
- if (typeof result === 'object') {
11
- // TODO(ritch) remove this, should be configurable
12
- response.setHeader('Content-Type', 'application/json');
13
- // TODO(bajtos) handle errors - JSON.stringify can throw
14
- result = JSON.stringify(result);
15
- }
16
- else if (typeof result === 'string') {
17
- response.setHeader('Content-Type', 'text/plain');
18
- }
19
- response.write(result);
20
- }
21
- response.end();
22
- }
23
- exports.writeResultToResponse = writeResultToResponse;
24
- //# sourceMappingURL=writer.js.map
package/lib/writer.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;AAKhE,+BACE,QAAkB,EAAE,+DAA+D;IACnF,MAAuB;IAEvB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACX,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC;YAC/B,kDAAkD;YAClD,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YACvD,wDAAwD;YACxD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC;YACtC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,QAAQ,CAAC,GAAG,EAAE,CAAC;AACjB,CAAC;AAhBD,sDAgBC"}
@@ -1,2 +0,0 @@
1
- export interface Component {
2
- }
package/lib6/Component.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=component.js.map
@@ -1,14 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="http-errors" />
3
- import { ServerRequest, ServerResponse } from 'http';
4
- import { FindRoute, InvokeMethod, LogError, OperationRetval, ParsedRequest } from './internal-types';
5
- import { HttpError } from 'http-errors';
6
- export declare class Sequence {
7
- protected findRoute: FindRoute;
8
- protected invoke: InvokeMethod;
9
- protected logError: LogError;
10
- constructor(findRoute: FindRoute, invoke: InvokeMethod, logError: LogError);
11
- run(req: ParsedRequest, res: ServerResponse): Promise<void>;
12
- sendResponse(response: ServerResponse, result: OperationRetval): void;
13
- sendError(res: ServerResponse, req: ServerRequest, err: HttpError): void;
14
- }
package/lib6/Sequence.js DELETED
@@ -1,68 +0,0 @@
1
- "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
3
- // Node module: @loopback/core
4
- // This file is licensed under the MIT License.
5
- // License text available at https://opensource.org/licenses/MIT
6
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
- 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;
10
- return c > 3 && r && Object.defineProperty(target, key, r), r;
11
- };
12
- var __metadata = (this && this.__metadata) || function (k, v) {
13
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
14
- };
15
- var __param = (this && this.__param) || function (paramIndex, decorator) {
16
- return function (target, key) { decorator(target, key, paramIndex); }
17
- };
18
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
- return new (P || (P = Promise))(function (resolve, reject) {
20
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
23
- step((generator = generator.apply(thisArg, _arguments || [])).next());
24
- });
25
- };
26
- Object.defineProperty(exports, "__esModule", { value: true });
27
- const debug = require('debug')('loopback:core:sequence');
28
- const context_1 = require("@loopback/context");
29
- const parser_1 = require("./parser");
30
- const writer_1 = require("./writer");
31
- let Sequence = class Sequence {
32
- constructor(findRoute, invoke, logError) {
33
- this.findRoute = findRoute;
34
- this.invoke = invoke;
35
- this.logError = logError;
36
- }
37
- run(req, res) {
38
- return __awaiter(this, void 0, void 0, function* () {
39
- try {
40
- const { controller, methodName, spec, pathParams } = this.findRoute(req);
41
- const args = yield parser_1.parseOperationArgs(req, spec, pathParams);
42
- const result = yield this.invoke(controller, methodName, args);
43
- debug('%s.%s() result -', controller, methodName, result);
44
- this.sendResponse(res, result);
45
- }
46
- catch (err) {
47
- this.sendError(res, req, err);
48
- }
49
- });
50
- }
51
- sendResponse(response, result) {
52
- writer_1.writeResultToResponse(response, result);
53
- }
54
- sendError(res, req, err) {
55
- const statusCode = err.statusCode || err.status || 500;
56
- res.statusCode = statusCode;
57
- res.end();
58
- this.logError(err, statusCode, req);
59
- }
60
- };
61
- Sequence = __decorate([
62
- __param(0, context_1.inject('findRoute')),
63
- __param(1, context_1.inject('invokeMethod')),
64
- __param(2, context_1.inject('logError')),
65
- __metadata("design:paramtypes", [Function, Function, Function])
66
- ], Sequence);
67
- exports.Sequence = Sequence;
68
- //# sourceMappingURL=sequence.js.map