@mountainpass/waycharter 1.0.74 → 2.0.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.
Files changed (71) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -1
  3. package/dist/action.d.ts +8 -0
  4. package/dist/action.js +3 -0
  5. package/dist/action.js.map +1 -0
  6. package/dist/collections/build-first-link.d.ts +12 -0
  7. package/dist/collections/build-first-link.js +34 -19
  8. package/dist/collections/build-first-link.js.map +1 -1
  9. package/dist/collections/build-next-link.d.ts +11 -0
  10. package/dist/collections/build-next-link.js +24 -15
  11. package/dist/collections/build-next-link.js.map +1 -1
  12. package/dist/collections/build-previous-link.d.ts +11 -0
  13. package/dist/collections/build-previous-link.js +42 -27
  14. package/dist/collections/build-previous-link.js.map +1 -1
  15. package/dist/collections/built-item-links.d.ts +16 -0
  16. package/dist/collections/built-item-links.js +84 -114
  17. package/dist/collections/built-item-links.js.map +1 -1
  18. package/dist/handler.d.ts +21 -0
  19. package/dist/handler.js +3 -0
  20. package/dist/handler.js.map +1 -0
  21. package/dist/link.d.ts +17 -0
  22. package/dist/link.js +3 -0
  23. package/dist/link.js.map +1 -0
  24. package/dist/method.d.ts +28 -0
  25. package/dist/method.js +41 -0
  26. package/dist/method.js.map +1 -0
  27. package/dist/to-links.d.ts +9 -0
  28. package/dist/to-links.js +77 -0
  29. package/dist/to-links.js.map +1 -0
  30. package/dist/util/array-to-lower-case.d.ts +4 -0
  31. package/dist/util/array-to-lower-case.js +11 -0
  32. package/dist/util/array-to-lower-case.js.map +1 -0
  33. package/dist/util/check-page.d.ts +13 -0
  34. package/dist/util/check-page.js +75 -0
  35. package/dist/util/check-page.js.map +1 -0
  36. package/dist/util/convert-resource-links.d.ts +7 -0
  37. package/dist/util/convert-resource-links.js +73 -0
  38. package/dist/util/convert-resource-links.js.map +1 -0
  39. package/dist/util/extract-path-parameters.d.ts +6 -0
  40. package/dist/util/extract-path-parameters.js +13 -0
  41. package/dist/util/extract-path-parameters.js.map +1 -0
  42. package/dist/util/filter-headers.d.ts +9 -0
  43. package/dist/util/filter-headers.js +22 -0
  44. package/dist/util/filter-headers.js.map +1 -0
  45. package/dist/util/filter-parameters.d.ts +17 -0
  46. package/dist/util/filter-parameters.js +87 -0
  47. package/dist/util/filter-parameters.js.map +1 -0
  48. package/dist/util/method-can-have-body.d.ts +4 -0
  49. package/dist/util/method-can-have-body.js +11 -0
  50. package/dist/util/method-can-have-body.js.map +1 -0
  51. package/dist/util/method-is-cacheable.d.ts +4 -0
  52. package/dist/util/method-is-cacheable.js +11 -0
  53. package/dist/util/method-is-cacheable.js.map +1 -0
  54. package/dist/util/router-to-rfc6570.d.ts +4 -0
  55. package/dist/util/router-to-rfc6570.js +11 -0
  56. package/dist/util/router-to-rfc6570.js.map +1 -0
  57. package/dist/util/unique.d.ts +4 -0
  58. package/dist/util/unique.js +36 -0
  59. package/dist/util/unique.js.map +1 -0
  60. package/dist/waycharter.d.ts +71 -0
  61. package/dist/waycharter.js +474 -288
  62. package/dist/waycharter.js.map +1 -1
  63. package/package.json +18 -39
  64. package/dist/convert-resource-links.js +0 -44
  65. package/dist/convert-resource-links.js.map +0 -1
  66. package/dist/method-can-have-body.js +0 -14
  67. package/dist/method-can-have-body.js.map +0 -1
  68. package/dist/method-is-cacheable.js +0 -14
  69. package/dist/method-is-cacheable.js.map +0 -1
  70. package/dist/util/logger.js +0 -47
  71. package/dist/util/logger.js.map +0 -1
@@ -1,308 +1,494 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.WayCharter = void 0;
7
-
8
- var _express = require("express");
9
-
10
- var _uriTemplateLite = require("uri-template-lite");
11
-
12
- var _jsonpointer = _interopRequireDefault(require("jsonpointer"));
13
-
14
- var _methodCanHaveBody = require("./method-can-have-body");
15
-
16
- var _convertResourceLinks = require("./convert-resource-links");
17
-
18
- var _buildFirstLink = require("./collections/build-first-link");
19
-
20
- var _buildPreviousLink = require("./collections/build-previous-link");
21
-
22
- var _buildNextLink = require("./collections/build-next-link");
23
-
24
- var _builtItemLinks = require("./collections/built-item-links");
25
-
26
- var _methodIsCacheable = require("./method-is-cacheable");
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
30
- /**
31
- * @param url
32
- */
33
- function routerToRfc6570(url) {
34
- return url.replace(/:(\w*)/g, '{+$1}');
35
- }
36
-
37
- class WayCharter {
38
- constructor() {
39
- this.router = (0, _express.Router)();
40
- }
41
-
42
- registerResourceType({
43
- path,
44
- loader,
45
- loaderVaries
46
- }) {
47
- // TODO: error handling for path not set
48
- // TODO: error handling for loader not set
49
- const lowerCaseLoaderVaries = new Set(loaderVaries ? loaderVaries.map(header => header.toLowerCase()) : []);
50
- const uriTemplate = routerToRfc6570(path);
51
- this.router.get(path, async function (request, response, next) {
52
- const filteredHeaders = Object.keys(request.headers).reduce((filtered, key) => lowerCaseLoaderVaries.has(key) ? { ...filtered,
53
- [key]: request.headers[key]
54
- } : filtered, {});
55
-
56
- try {
57
- const resource = await loader({ ...request.params,
58
- ...request.query
59
- }, filteredHeaders, request.url);
60
-
61
- if (loaderVaries) {
62
- response.header('vary', [...lowerCaseLoaderVaries]);
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
63
8
  }
64
-
65
- sendResponse(resource, response, request.url, [{
66
- rel: 'self',
67
- uri: request.url
68
- }]);
69
- } catch (error) {
70
- // next(error)
71
- console.error(error);
72
- response.status(500);
73
- response.json({});
74
- }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
75
20
  });
76
- return {
77
- pathTemplate: uriTemplate,
78
- path: parameters => _uriTemplateLite.URI.expand(uriTemplate, parameters)
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __rest = (this && this.__rest) || function (s, e) {
50
+ var t = {};
51
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
+ t[p] = s[p];
53
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
+ t[p[i]] = s[p[i]];
57
+ }
58
+ return t;
59
+ };
60
+ var __read = (this && this.__read) || function (o, n) {
61
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
62
+ if (!m) return o;
63
+ var i = m.call(o), r, ar = [], e;
64
+ try {
65
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
66
+ }
67
+ catch (error) { e = { error: error }; }
68
+ finally {
69
+ try {
70
+ if (r && !r.done && (m = i["return"])) m.call(i);
71
+ }
72
+ finally { if (e) throw e.error; }
73
+ }
74
+ return ar;
75
+ };
76
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
77
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
78
+ if (ar || !(i in from)) {
79
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
80
+ ar[i] = from[i];
81
+ }
82
+ }
83
+ return to.concat(ar || Array.prototype.slice.call(from));
84
+ };
85
+ var __values = (this && this.__values) || function(o) {
86
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
87
+ if (m) return m.call(o);
88
+ if (o && typeof o.length === "number") return {
89
+ next: function () {
90
+ if (o && i >= o.length) o = void 0;
91
+ return { value: o && o[i++], done: !o };
92
+ }
79
93
  };
80
- }
81
-
82
- registerOperation({
83
- method,
84
- path,
85
- operation,
86
- bodyParameters,
87
- headerParameters
88
- }) {
89
- const upperCaseMethod = method.toUpperCase();
90
- const lowerCaseMethod = method.toLowerCase();
91
- const lowerCaseHeaderParameters = headerParameters && new Set(headerParameters.map(header => header.toLowerCase()));
92
- this.router[lowerCaseMethod](path, async (request, response, next) => {
93
- try {
94
- let filteredHeaders = request.headers;
95
-
96
- if ((0, _methodIsCacheable.methodIsCacheable)(upperCaseMethod) && headerParameters) {
97
- response.header('vary', [...lowerCaseHeaderParameters]);
98
- filteredHeaders = {};
99
-
100
- for (const headerName in request.headers) {
101
- if (lowerCaseHeaderParameters.has(headerName)) {
102
- filteredHeaders[headerName] = request.headers[headerName];
94
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
95
+ };
96
+ Object.defineProperty(exports, "__esModule", { value: true });
97
+ exports.EndPoint = void 0;
98
+ var uri_template_lite_1 = require("uri-template-lite");
99
+ var convert_resource_links_1 = require("./util/convert-resource-links");
100
+ var build_first_link_1 = require("./collections/build-first-link");
101
+ var build_previous_link_1 = require("./collections/build-previous-link");
102
+ var build_next_link_1 = require("./collections/build-next-link");
103
+ var built_item_links_1 = require("./collections/built-item-links");
104
+ var router_to_rfc6570_1 = require("./util/router-to-rfc6570");
105
+ var to_links_1 = require("./to-links");
106
+ var filter_headers_1 = require("./util/filter-headers");
107
+ var check_page_1 = require("./util/check-page");
108
+ var extract_path_parameters_1 = require("./util/extract-path-parameters");
109
+ var array_to_lower_case_1 = require("./util/array-to-lower-case");
110
+ var filter_parameters_1 = require("./util/filter-parameters");
111
+ var unique_1 = require("./util/unique");
112
+ /**
113
+ * @param resource
114
+ * @param response
115
+ * @param requestUrl
116
+ * @param additionalLinks
117
+ */
118
+ function sendHandlerResponse(resource, response, additionalLinks) {
119
+ if (resource.links || additionalLinks) {
120
+ var links = (0, convert_resource_links_1.covertResourceLinks)(__spreadArray(__spreadArray([], __read((additionalLinks || [])), false), __read((resource.links || [])), false));
121
+ response.header('link', links.toString());
122
+ }
123
+ if (resource.status) {
124
+ response.status(resource.status);
125
+ }
126
+ if (resource.headers) {
127
+ for (var header in resource.headers) {
128
+ response.header(header, resource.headers[header]);
129
+ }
130
+ }
131
+ if ('body' in resource) {
132
+ response.json(resource.body);
133
+ }
134
+ else {
135
+ response.end();
136
+ }
137
+ }
138
+ var EndPoint = /** @class */ (function () {
139
+ function EndPoint(_a) {
140
+ var e_1, _b;
141
+ var _this = this;
142
+ var router = _a.router, path = _a.path, headerParameters = _a.headerParameters, handler = _a.handler, actions = _a.actions, links = _a.links;
143
+ this.router = router;
144
+ this.handler = handler;
145
+ this.headerParameters = (0, unique_1.unique)((0, array_to_lower_case_1.arrayToLowerCase)(headerParameters));
146
+ this.pathTemplate = (0, router_to_rfc6570_1.routerToRfc6570)(path);
147
+ this.pathParameters = (0, extract_path_parameters_1.extractPathParameters)(this.pathTemplate);
148
+ this.links = links || [];
149
+ router.get(path, function (request, response, next) { return __awaiter(_this, void 0, void 0, function () {
150
+ var filteredHeaders, error_1;
151
+ var _this = this;
152
+ return __generator(this, function (_a) {
153
+ switch (_a.label) {
154
+ case 0:
155
+ _a.trys.push([0, 2, , 3]);
156
+ filteredHeaders = (0, filter_headers_1.filterHeaders)(request, response, this.headerParameters);
157
+ response.chart = function (resource) { return __awaiter(_this, void 0, void 0, function () {
158
+ return __generator(this, function (_a) {
159
+ this.sendResponse(resource, request, response, actions);
160
+ return [2 /*return*/];
161
+ });
162
+ }); };
163
+ response.chartError = function (resource) { return __awaiter(_this, void 0, void 0, function () {
164
+ return __generator(this, function (_a) {
165
+ this.sendResponse(resource, request, response, actions);
166
+ return [2 /*return*/];
167
+ });
168
+ }); };
169
+ response.chartRedirect = function (resource) { return __awaiter(_this, void 0, void 0, function () {
170
+ return __generator(this, function (_a) {
171
+ this.sendResponse(resource, request, response, actions);
172
+ return [2 /*return*/];
173
+ });
174
+ }); };
175
+ return [4 /*yield*/, this.handler({
176
+ pathParameters: request.params,
177
+ queryParameters: request.query,
178
+ requestHeaders: filteredHeaders,
179
+ request: request,
180
+ response: response,
181
+ next: next
182
+ })];
183
+ case 1:
184
+ _a.sent();
185
+ return [3 /*break*/, 3];
186
+ case 2:
187
+ error_1 = _a.sent();
188
+ next(error_1);
189
+ return [3 /*break*/, 3];
190
+ case 3: return [2 /*return*/];
191
+ }
192
+ });
193
+ }); });
194
+ for (var method in actions) {
195
+ var methodActions = actions[method];
196
+ var _loop_1 = function (action) {
197
+ router[method.toLowerCase()](path, function (request, response, next) { return __awaiter(_this, void 0, void 0, function () {
198
+ var parameters, handler_1, filteredBodyParameters;
199
+ var _this = this;
200
+ return __generator(this, function (_a) {
201
+ response.chart = function (resource) { return __awaiter(_this, void 0, void 0, function () {
202
+ return __generator(this, function (_a) {
203
+ this.sendResponse(resource, request, response, actions);
204
+ return [2 /*return*/];
205
+ });
206
+ }); };
207
+ try {
208
+ parameters = action.parameters, handler_1 = action.handler;
209
+ filteredBodyParameters = (0, filter_parameters_1.filterBodyParameters)(request, parameters);
210
+ handler_1({
211
+ pathParameters: request.params,
212
+ queryParameters: request.query,
213
+ bodyParameters: filteredBodyParameters,
214
+ request: request,
215
+ response: response,
216
+ next: next
217
+ });
218
+ }
219
+ catch (error) {
220
+ next(error);
221
+ }
222
+ return [2 /*return*/];
223
+ });
224
+ }); });
225
+ };
226
+ try {
227
+ for (var methodActions_1 = (e_1 = void 0, __values(methodActions)), methodActions_1_1 = methodActions_1.next(); !methodActions_1_1.done; methodActions_1_1 = methodActions_1.next()) {
228
+ var action = methodActions_1_1.value;
229
+ _loop_1(action);
230
+ }
231
+ }
232
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
233
+ finally {
234
+ try {
235
+ if (methodActions_1_1 && !methodActions_1_1.done && (_b = methodActions_1.return)) _b.call(methodActions_1);
236
+ }
237
+ finally { if (e_1) throw e_1.error; }
103
238
  }
104
- }
105
239
  }
106
-
107
- const resource = await operation({
108
- parameters: { ...request.params,
109
- ...request.query,
110
- ...((0, _methodCanHaveBody.methodCanHaveBody)(upperCaseMethod) && request.body)
111
- },
112
- requestHeaders: filteredHeaders,
113
- requestUrl: request.url,
114
- request,
115
- response
240
+ }
241
+ EndPoint.createStatic = function (_a) {
242
+ var _this = this;
243
+ var router = _a.router, path = _a.path, headerParameters = _a.headerParameters, actions = _a.actions, handlerResponse = __rest(_a, ["router", "path", "headerParameters", "actions"]);
244
+ return EndPoint.create({
245
+ router: router,
246
+ path: path,
247
+ headerParameters: headerParameters,
248
+ handler: function (_a) {
249
+ var response = _a.response;
250
+ return __awaiter(_this, void 0, void 0, function () {
251
+ return __generator(this, function (_b) {
252
+ response.chart(handlerResponse);
253
+ return [2 /*return*/];
254
+ });
255
+ });
256
+ },
257
+ actions: actions,
116
258
  });
117
- sendResponse(resource, response, request.url);
118
- } catch (error) {
119
- // next(error)
120
- console.error(error);
121
- response.status(500);
122
- response.json({});
123
- }
124
- });
125
- const uriTemplate = routerToRfc6570(path);
126
- const template = new _uriTemplateLite.URI.Template(uriTemplate);
127
- const pathParameters = template.match(uriTemplate);
128
- return {
129
- method: upperCaseMethod,
130
- ...((0, _methodCanHaveBody.methodCanHaveBody)(upperCaseMethod) && {
131
- bodyParameters
132
- }),
133
- pathParameters,
134
- ...((0, _methodIsCacheable.methodIsCacheable)(upperCaseMethod) && {
135
- headerParameters: lowerCaseHeaderParameters
136
- }),
137
- pathTemplate: uriTemplate,
138
- path: parameters => _uriTemplateLite.URI.expand(uriTemplate, parameters)
139
259
  };
140
- }
141
-
142
- registerStaticResource({
143
- path,
144
- body,
145
- links
146
- }) {
147
- // TODO: error handling for path not set
148
- // TODO: error handling for body not set
149
- return this.registerResourceType({
150
- path,
151
- loader: async () => {
152
- return {
153
- body,
154
- links
155
- };
156
- }
157
- });
158
- }
159
-
160
- registerCollection({
161
- itemPath,
162
- itemLoader,
163
- collectionPath,
164
- collectionLoader,
165
- filters = []
166
- }) {
167
- // TODO: error handling for itemPath set, but itemLoader isn't and visa-versa
168
- // TODO: error handling for collectionPath not set
169
- // TODO: error handling for collectionLoader not set
170
- const itemType = itemPath !== undefined && itemLoader !== undefined ? this.registerResourceType({
171
- path: `${collectionPath}${itemPath}`,
172
- loader: itemLoader
173
- }) : undefined;
174
- const linkTemplates = [];
175
-
176
- for (const filter of filters) {
177
- linkTemplates.push({
178
- rel: filter.rel,
179
- uri: `${collectionPath}{?${filter.parameters.join(',')}}`
180
- });
181
- }
182
-
183
- const type = this.registerResourceType({
184
- path: collectionPath,
185
- loader: async ({
186
- page,
187
- ...otherParameters
188
- }, filteredHeaders, selfUri) => {
189
- // ${collectionPath}?page=0 should redirect to ${collectionPath}
190
- if (page === '0') {
191
- return {
192
- status: 308,
193
- headers: {
194
- location: collectionPath
260
+ EndPoint.createCollection = function (_a) {
261
+ var e_2, _b, e_3, _c;
262
+ var _this = this;
263
+ var router = _a.router, path = _a.path, headerParameters = _a.headerParameters, filters = _a.filters, handler = _a.handler, actions = _a.actions, links = _a.links, itemActions = _a.itemActions, itemEndpoint = _a.itemEndpoint;
264
+ var filterLinks = [];
265
+ try {
266
+ for (var _d = __values(filters || []), _e = _d.next(); !_e.done; _e = _d.next()) {
267
+ var filter = _e.value;
268
+ filterLinks.push({
269
+ rel: filter.rel,
270
+ uri: "".concat(path, "{?").concat(filter.parameters.join(','), "}")
271
+ });
195
272
  }
196
- };
197
- } // TODO: page is not a number
198
- // page should be >= 0
199
-
200
-
201
- const pageInt = Number.parseInt(page || '0');
202
-
203
- if (page < 0) {
204
- return {
205
- status: 400
206
- };
207
273
  }
208
-
209
- const filteredParameters = {};
210
-
211
- for (const filter of filters) {
212
- for (const parameter of filter.parameters) {
213
- if (otherParameters[parameter] !== undefined) {
214
- filteredParameters[parameter] = otherParameters[parameter];
274
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
275
+ finally {
276
+ try {
277
+ if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
215
278
  }
216
- }
279
+ finally { if (e_2) throw e_2.error; }
217
280
  }
218
-
219
- const {
220
- body,
221
- arrayPointer,
222
- hasMore,
223
- headers,
224
- itemOperations
225
- } = await collectionLoader({
226
- page: pageInt,
227
- ...filteredParameters
281
+ var endpoint = new EndPoint({
282
+ router: router,
283
+ path: path,
284
+ headerParameters: headerParameters,
285
+ actions: actions,
286
+ links: __spreadArray(__spreadArray([], __read(links || []), false), __read(filterLinks), false),
287
+ handler: function (_a) {
288
+ var pathParameters = _a.pathParameters, queryParameters = _a.queryParameters, requestHeaders = _a.requestHeaders, request = _a.request, response = _a.response, next = _a.next;
289
+ return __awaiter(_this, void 0, void 0, function () {
290
+ var expandedPath, page, pageCheckResult, filteredQueryParameters_1;
291
+ var _this = this;
292
+ return __generator(this, function (_b) {
293
+ expandedPath = endpoint.path(__assign(__assign({}, pathParameters || {}), queryParameters || {}));
294
+ page = queryParameters.page;
295
+ pageCheckResult = (0, check_page_1.checkPage)(page, expandedPath);
296
+ if ('redirect' in pageCheckResult) {
297
+ response.chartRedirect(pageCheckResult.redirect);
298
+ }
299
+ else if ('pageValidationError' in pageCheckResult) {
300
+ response.chartError(pageCheckResult.pageValidationError);
301
+ }
302
+ else {
303
+ filteredQueryParameters_1 = (0, filter_parameters_1.filterParameters)(filters, request.query);
304
+ response.chartCollection = function (resource) { return __awaiter(_this, void 0, void 0, function () {
305
+ return __generator(this, function (_a) {
306
+ sendCollectionHandlerResponse(resource, request.url, response, pageCheckResult.pageInt, expandedPath, filteredQueryParameters_1, itemActions, itemEndpoint);
307
+ return [2 /*return*/];
308
+ });
309
+ }); };
310
+ handler({
311
+ page: pageCheckResult.pageInt,
312
+ pathParameters: request.params,
313
+ queryParameters: filteredQueryParameters_1,
314
+ requestHeaders: requestHeaders,
315
+ request: request,
316
+ response: response,
317
+ next: next
318
+ });
319
+ }
320
+ return [2 /*return*/];
321
+ });
322
+ });
323
+ }
228
324
  });
229
- const array = arrayPointer ? _jsonpointer.default.get(body, arrayPointer) : body;
230
- const {
231
- itemLinks,
232
- canonicalLinks
233
- } = (0, _builtItemLinks.builtItemLinks)(array, arrayPointer, itemType, selfUri, itemOperations);
234
- return {
235
- body,
236
- links: [...itemLinks, ...canonicalLinks, ...(0, _buildNextLink.buildNextLink)(hasMore, pageInt, collectionPath, otherParameters), ...(0, _buildPreviousLink.buildPreviousLink)(pageInt, collectionPath, otherParameters), ...(0, _buildFirstLink.buildFirstLink)(hasMore, pageInt, collectionPath, otherParameters)],
237
- linkTemplates,
238
- headers
239
- };
240
- }
241
- });
242
- return { ...type,
243
- additionalPaths: linkTemplates
325
+ for (var method in itemActions) {
326
+ var methodActions = itemActions[method];
327
+ var _loop_2 = function (action) {
328
+ router[method.toLowerCase()](path, function (request, response, next) { return __awaiter(_this, void 0, void 0, function () {
329
+ var parameters, handler_2, filteredBodyParameters;
330
+ var _this = this;
331
+ return __generator(this, function (_a) {
332
+ response.chart = function (resource) { return __awaiter(_this, void 0, void 0, function () {
333
+ return __generator(this, function (_a) {
334
+ endpoint.sendResponse(resource, request, response, actions, itemActions);
335
+ return [2 /*return*/];
336
+ });
337
+ }); };
338
+ response.chartError = function (resource) { return __awaiter(_this, void 0, void 0, function () {
339
+ return __generator(this, function (_a) {
340
+ endpoint.sendResponse(resource, request, response, actions, itemActions);
341
+ return [2 /*return*/];
342
+ });
343
+ }); };
344
+ try {
345
+ parameters = action.parameters, handler_2 = action.handler;
346
+ filteredBodyParameters = (0, filter_parameters_1.filterBodyParameters)(request, parameters);
347
+ handler_2({
348
+ pathParameters: request.params,
349
+ queryParameters: (0, filter_parameters_1.filterParameters)(filters, request.query),
350
+ bodyParameters: filteredBodyParameters,
351
+ request: request,
352
+ response: response,
353
+ next: next
354
+ });
355
+ }
356
+ catch (error) {
357
+ next(error);
358
+ }
359
+ return [2 /*return*/];
360
+ });
361
+ }); });
362
+ };
363
+ try {
364
+ for (var methodActions_2 = (e_3 = void 0, __values(methodActions)), methodActions_2_1 = methodActions_2.next(); !methodActions_2_1.done; methodActions_2_1 = methodActions_2.next()) {
365
+ var action = methodActions_2_1.value;
366
+ _loop_2(action);
367
+ }
368
+ }
369
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
370
+ finally {
371
+ try {
372
+ if (methodActions_2_1 && !methodActions_2_1.done && (_c = methodActions_2.return)) _c.call(methodActions_2);
373
+ }
374
+ finally { if (e_3) throw e_3.error; }
375
+ }
376
+ }
377
+ endpoint.addDefaultHandler(path, actions, itemActions);
378
+ return endpoint;
244
379
  };
245
- }
246
-
247
- registerStaticCollection({
248
- collectionPath,
249
- collection,
250
- pageSize,
251
- arrayPointer,
252
- headers
253
- }) {
254
- return this.registerCollection({
255
- collectionPath,
256
- collectionLoader: async ({
257
- page
258
- }) => {
259
- const items = pageSize ? collection.slice(page * pageSize, (page + 1) * pageSize) : collection;
260
- return {
261
- body: items,
262
- hasMore: pageSize && page < collection.length / pageSize - 1,
263
- arrayPointer,
264
- headers
265
- };
266
- }
267
- });
268
- }
269
-
270
- }
380
+ EndPoint.createStaticCollection = function (_a) {
381
+ var _this = this;
382
+ var router = _a.router, path = _a.path, headerParameters = _a.headerParameters, filters = _a.filters, actions = _a.actions, itemActions = _a.itemActions, itemEndpoint = _a.itemEndpoint, collectionHandlerResponse = __rest(_a, ["router", "path", "headerParameters", "filters", "actions", "itemActions", "itemEndpoint"]);
383
+ return EndPoint.createCollection({
384
+ router: router,
385
+ path: path,
386
+ headerParameters: headerParameters,
387
+ filters: filters,
388
+ handler: function (_a) {
389
+ var response = _a.response;
390
+ return __awaiter(_this, void 0, void 0, function () {
391
+ return __generator(this, function (_b) {
392
+ response.chartCollection(collectionHandlerResponse);
393
+ return [2 /*return*/];
394
+ });
395
+ });
396
+ },
397
+ actions: actions,
398
+ itemActions: itemActions,
399
+ itemEndpoint: itemEndpoint
400
+ });
401
+ };
402
+ EndPoint.create = function (_a) {
403
+ var router = _a.router, path = _a.path, headerParameters = _a.headerParameters, handler = _a.handler, actions = _a.actions, links = _a.links;
404
+ var endpoint = new EndPoint({
405
+ router: router,
406
+ path: path,
407
+ headerParameters: headerParameters,
408
+ handler: handler,
409
+ actions: actions,
410
+ links: links
411
+ });
412
+ endpoint.addDefaultHandler(path, actions);
413
+ return endpoint;
414
+ };
415
+ EndPoint.prototype.addDefaultHandler = function (path, actions, itemActions) {
416
+ var _this = this;
417
+ // default options handler
418
+ this.router.options(path, function (request, response, next) { return __awaiter(_this, void 0, void 0, function () {
419
+ return __generator(this, function (_a) {
420
+ this.sendResponse({
421
+ status: 204,
422
+ headers: {
423
+ allow: (0, unique_1.unique)(__spreadArray(__spreadArray([
424
+ 'GET',
425
+ 'HEAD',
426
+ 'OPTIONS'
427
+ ], __read((actions ? Object.keys(actions) : [])), false), __read((itemActions ? Object.keys(itemActions) : [])), false)).join(', ')
428
+ }
429
+ }, request, response, actions, itemActions);
430
+ return [2 /*return*/];
431
+ });
432
+ }); });
433
+ this.router.all(path, function (request, response, next) { return __awaiter(_this, void 0, void 0, function () {
434
+ return __generator(this, function (_a) {
435
+ this.sendResponse({
436
+ status: 406
437
+ }, request, response, actions, itemActions);
438
+ return [2 /*return*/];
439
+ });
440
+ }); });
441
+ };
442
+ EndPoint.prototype.sendResponse = function (resource, request, response, actions, itemActions) {
443
+ var actionLinks = __spreadArray(__spreadArray([], __read((actions ? (0, to_links_1.toLinks)(actions, request.url) : [])), false), __read((itemActions ? (0, to_links_1.toLinks)(itemActions, request.url) : [])), false);
444
+ if (this.headerParameters.length > 0) {
445
+ response.header('vary', this.headerParameters);
446
+ }
447
+ sendHandlerResponse(resource, response, __spreadArray(__spreadArray([
448
+ {
449
+ rel: 'self',
450
+ uri: request.url
451
+ }
452
+ ], __read(this.links), false), __read(actionLinks), false));
453
+ };
454
+ EndPoint.prototype.sendCollectionResponse = function (resource, request, response, actions, itemActions) {
455
+ var actionLinks = __spreadArray(__spreadArray([], __read((actions ? (0, to_links_1.toLinks)(actions, request.url) : [])), false), __read((itemActions ? (0, to_links_1.toLinks)(itemActions, request.url) : [])), false);
456
+ if (this.headerParameters.length > 0) {
457
+ response.header('vary', this.headerParameters);
458
+ }
459
+ sendHandlerResponse(resource, response, __spreadArray(__spreadArray([
460
+ {
461
+ rel: 'self',
462
+ uri: request.url
463
+ }
464
+ ], __read(this.links), false), __read(actionLinks), false));
465
+ };
466
+ EndPoint.prototype.path = function (parameters) {
467
+ return parameters
468
+ ? uri_template_lite_1.URI.expand(this.pathTemplate, parameters)
469
+ : this.pathTemplate;
470
+ };
471
+ EndPoint.prototype.linkTo = function (link) {
472
+ this.links.push(link);
473
+ return this;
474
+ };
475
+ return EndPoint;
476
+ }());
477
+ exports.EndPoint = EndPoint;
271
478
  /**
272
479
  * @param resource
273
- * @param response
274
480
  * @param requestUrl
275
- * @param additionalLinks
481
+ * @param response
482
+ * @param pageInt
483
+ * @param expandedPath
484
+ * @param filteredParameters
485
+ * @param itemActions
486
+ * @param itemEndpoint
487
+ * @param staticLinks
276
488
  */
277
-
278
-
279
- exports.WayCharter = WayCharter;
280
-
281
- function sendResponse(resource, response, requestUrl, additionalLinks = []) {
282
- if (resource.links || additionalLinks.length > 0) {
283
- const links = (0, _convertResourceLinks.covertResourceLinks)([...additionalLinks, ...(resource.links || [])]);
284
- response.header('link', links.toString());
285
- }
286
-
287
- if (resource.linkTemplates) {
288
- const linkTemplates = (0, _convertResourceLinks.covertResourceLinks)(resource.linkTemplates);
289
- response.header('link-template', linkTemplates.toString());
290
- }
291
-
292
- if (resource.status) {
293
- response.status(resource.status);
294
- }
295
-
296
- if (resource.headers) {
297
- for (const header in resource.headers) {
298
- response.header(header, resource.headers[header]);
299
- }
300
- }
301
-
302
- if (resource.body) {
303
- response.json(resource.body);
304
- } else {
305
- response.end();
306
- }
489
+ function sendCollectionHandlerResponse(resource, requestUrl, response, pageInt, expandedPath, filteredParameters, itemActions, itemEndpoint) {
490
+ var body = resource.body, collectionPointer = resource.collectionPointer, hasMore = resource.hasMore, links = resource.links, other = __rest(resource, ["body", "collectionPointer", "hasMore", "links"]);
491
+ var _a = (0, built_item_links_1.builtItemLinks)(collectionPointer, itemEndpoint, requestUrl, itemActions), itemLinks = _a.itemLinks, canonicalLinks = _a.canonicalLinks;
492
+ response.chart(__assign({ body: body, links: __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(itemLinks), false), __read(canonicalLinks), false), __read((0, build_next_link_1.buildNextLink)(hasMore, pageInt, expandedPath, filteredParameters)), false), __read((0, build_previous_link_1.buildPreviousLink)(pageInt, expandedPath, filteredParameters)), false), __read((0, build_first_link_1.buildFirstLink)(hasMore, pageInt, expandedPath, filteredParameters)), false), __read(links || []), false) }, other));
307
493
  }
308
494
  //# sourceMappingURL=waycharter.js.map