@mountainpass/waycharter 1.0.76 → 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 +6 -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 -118
  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 +4 -7
  56. package/dist/util/router-to-rfc6570.js.map +1 -1
  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 +473 -306
  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,327 +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
- var _routerToRfc = require("./util/router-to-rfc6570");
29
-
30
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
-
32
- class WayCharter {
33
- constructor() {
34
- this.router = (0, _express.Router)();
35
- }
36
-
37
- registerResourceType({
38
- path,
39
- loader,
40
- loaderVaries
41
- }) {
42
- // TODO: error handling for path not set
43
- // TODO: error handling for loader not set
44
- const lowerCaseLoaderVaries = new Set(loaderVaries ? loaderVaries.map(header => header.toLowerCase()) : []);
45
- const uriTemplate = (0, _routerToRfc.routerToRfc6570)(path);
46
- this.router.get(path, async function (request, response, next) {
47
- const filteredHeaders = Object.keys(request.headers).reduce((filtered, key) => lowerCaseLoaderVaries.has(key) ? { ...filtered,
48
- [key]: request.headers[key]
49
- } : filtered, {});
50
-
51
- try {
52
- const resource = await loader({ ...request.params,
53
- ...request.query
54
- }, filteredHeaders, request.url, request, response);
55
-
56
- if (loaderVaries) {
57
- 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];
58
8
  }
59
-
60
- sendResponse(resource, response, request.url, [{
61
- rel: 'self',
62
- uri: request.url
63
- }]);
64
- } catch (error) {
65
- // next(error)
66
- console.error(error);
67
- response.status(500);
68
- response.json({});
69
- }
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());
70
20
  });
71
- return {
72
- pathTemplate: uriTemplate,
73
- 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
+ }
74
93
  };
75
- }
76
-
77
- registerOperation({
78
- method,
79
- path,
80
- operation,
81
- bodyParameters,
82
- headerParameters
83
- }) {
84
- const upperCaseMethod = method.toUpperCase();
85
- const lowerCaseMethod = method.toLowerCase();
86
- const lowerCaseHeaderParameters = headerParameters && new Set(headerParameters.map(header => header.toLowerCase()));
87
- this.router[lowerCaseMethod](path, async (request, response, next) => {
88
- try {
89
- let filteredHeaders = request.headers;
90
-
91
- if ((0, _methodIsCacheable.methodIsCacheable)(upperCaseMethod) && headerParameters) {
92
- response.header('vary', [...lowerCaseHeaderParameters]);
93
- filteredHeaders = {};
94
-
95
- for (const headerName in request.headers) {
96
- if (lowerCaseHeaderParameters.has(headerName)) {
97
- 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; }
98
238
  }
99
- }
100
239
  }
101
-
102
- const resource = await operation({
103
- parameters: { ...request.params,
104
- ...request.query,
105
- ...((0, _methodCanHaveBody.methodCanHaveBody)(upperCaseMethod) && request.body)
106
- },
107
- requestHeaders: filteredHeaders,
108
- requestUrl: request.url,
109
- request,
110
- 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,
111
258
  });
112
- sendResponse(resource, response, request.url);
113
- } catch (error) {
114
- // next(error)
115
- console.error(error);
116
- response.status(500);
117
- response.json({});
118
- }
119
- });
120
- const uriTemplate = (0, _routerToRfc.routerToRfc6570)(path);
121
- const template = new _uriTemplateLite.URI.Template(uriTemplate);
122
- const pathParameters = template.match(uriTemplate);
123
- return {
124
- method: upperCaseMethod,
125
- ...((0, _methodCanHaveBody.methodCanHaveBody)(upperCaseMethod) && {
126
- bodyParameters
127
- }),
128
- pathParameters,
129
- ...((0, _methodIsCacheable.methodIsCacheable)(upperCaseMethod) && {
130
- headerParameters: lowerCaseHeaderParameters
131
- }),
132
- pathTemplate: uriTemplate,
133
- path: parameters => _uriTemplateLite.URI.expand(uriTemplate, parameters)
134
259
  };
135
- }
136
-
137
- registerStaticResource({
138
- path,
139
- body,
140
- links
141
- }) {
142
- // TODO: error handling for path not set
143
- // TODO: error handling for body not set
144
- return this.registerResourceType({
145
- path,
146
- loader: async () => {
147
- return {
148
- body,
149
- links
150
- };
151
- }
152
- });
153
- }
154
-
155
- registerCollection({
156
- itemEndpoint,
157
- itemPath,
158
- itemLoader,
159
- collectionPath,
160
- collectionLoader,
161
- filters = []
162
- }) {
163
- // TODO: error handling for itemPath set, but itemLoader isn't and visa-versa
164
- // TODO: error handling if itemEndpoint is set, and itemPath or itemLoader is set
165
- // TODO: error handling for collectionPath not set
166
- // TODO: error handling for collectionLoader not set
167
- // we need to handle collectionPath being parameterised
168
- const itemType = itemPath !== undefined && itemLoader !== undefined ? this.registerResourceType({
169
- path: `${collectionPath}${itemPath}`,
170
- loader: itemLoader
171
- }) : itemEndpoint;
172
- const linkTemplates = [];
173
-
174
- for (const filter of filters) {
175
- linkTemplates.push({
176
- rel: filter.rel,
177
- uri: `${collectionPath}{?${filter.parameters.join(',')}}`
178
- });
179
- }
180
-
181
- const uriTemplate = (0, _routerToRfc.routerToRfc6570)(collectionPath);
182
- const type = this.registerResourceType({
183
- path: collectionPath,
184
- loader: async ({
185
- page,
186
- ...otherParameters
187
- }, filteredHeaders, selfUri, request, response) => {
188
- const expandedCollectionPath = _uriTemplateLite.URI.expand(uriTemplate, request.params); // ${collectionPath}?page=0 should redirect to ${collectionPath}
189
-
190
-
191
- if (page === '0') {
192
- return {
193
- status: 308,
194
- headers: {
195
- location: expandedCollectionPath
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
+ });
196
272
  }
197
- };
198
- } // page should be >= 0
199
-
200
-
201
- const pageInt = Number.parseInt(page || '0');
202
-
203
- if (Number.isNaN(pageInt)) {
204
- return {
205
- status: 400,
206
- body: {
207
- error: "I don't understand what page you are trying to retrieve",
208
- page
273
+ }
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);
209
278
  }
210
- };
279
+ finally { if (e_2) throw e_2.error; }
211
280
  }
212
-
213
- if (page < 0) {
214
- return {
215
- status: 400,
216
- body: {
217
- error: "You've asked for a negative page. I don't know what that means",
218
- page
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
+ });
219
323
  }
220
- };
221
- } // we only want to include query params that are part of the filter,
222
- // but we can include all path params
223
-
224
-
225
- const filteredParameters = {};
226
-
227
- for (const filter of filters) {
228
- for (const parameter of filter.parameters) {
229
- if (request.query[parameter] !== undefined) {
230
- filteredParameters[parameter] = request.query[parameter];
324
+ });
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; }
231
375
  }
232
- }
233
376
  }
234
-
235
- const {
236
- body,
237
- arrayPointer,
238
- hasMore,
239
- headers,
240
- itemOperations,
241
- status
242
- } = await collectionLoader({
243
- page: pageInt,
244
- ...filteredParameters,
245
- ...request.params
246
- }, filteredHeaders, selfUri, request, response);
247
- const array = arrayPointer ? _jsonpointer.default.get(body, arrayPointer) : body;
248
- const {
249
- itemLinks,
250
- canonicalLinks
251
- } = (0, _builtItemLinks.builtItemLinks)(array, arrayPointer, itemType, selfUri, itemOperations);
252
- return {
253
- body,
254
- links: [...itemLinks, ...canonicalLinks, ...(0, _buildNextLink.buildNextLink)(hasMore, pageInt, expandedCollectionPath, filteredParameters), ...(0, _buildPreviousLink.buildPreviousLink)(pageInt, expandedCollectionPath, filteredParameters), ...(0, _buildFirstLink.buildFirstLink)(hasMore, pageInt, expandedCollectionPath, filteredParameters)],
255
- linkTemplates,
256
- headers,
257
- status
258
- };
259
- }
260
- });
261
- return { ...type,
262
- additionalPaths: linkTemplates
377
+ endpoint.addDefaultHandler(path, actions, itemActions);
378
+ return endpoint;
263
379
  };
264
- }
265
-
266
- registerStaticCollection({
267
- collectionPath,
268
- collection,
269
- pageSize,
270
- arrayPointer,
271
- headers
272
- }) {
273
- return this.registerCollection({
274
- collectionPath,
275
- collectionLoader: async ({
276
- page
277
- }) => {
278
- const items = pageSize ? collection.slice(page * pageSize, (page + 1) * pageSize) : collection;
279
- return {
280
- body: items,
281
- hasMore: pageSize && page < collection.length / pageSize - 1,
282
- arrayPointer,
283
- headers
284
- };
285
- }
286
- });
287
- }
288
-
289
- }
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;
290
478
  /**
291
479
  * @param resource
292
- * @param response
293
480
  * @param requestUrl
294
- * @param additionalLinks
481
+ * @param response
482
+ * @param pageInt
483
+ * @param expandedPath
484
+ * @param filteredParameters
485
+ * @param itemActions
486
+ * @param itemEndpoint
487
+ * @param staticLinks
295
488
  */
296
-
297
-
298
- exports.WayCharter = WayCharter;
299
-
300
- function sendResponse(resource, response, requestUrl, additionalLinks = []) {
301
- if (resource.links || additionalLinks.length > 0) {
302
- const links = (0, _convertResourceLinks.covertResourceLinks)([...additionalLinks, ...(resource.links || [])]);
303
- response.header('link', links.toString());
304
- }
305
-
306
- if (resource.linkTemplates) {
307
- const linkTemplates = (0, _convertResourceLinks.covertResourceLinks)(resource.linkTemplates);
308
- response.header('link-template', linkTemplates.toString());
309
- }
310
-
311
- if (resource.status) {
312
- response.status(resource.status);
313
- }
314
-
315
- if (resource.headers) {
316
- for (const header in resource.headers) {
317
- response.header(header, resource.headers[header]);
318
- }
319
- }
320
-
321
- if (resource.body) {
322
- response.json(resource.body);
323
- } else {
324
- response.end();
325
- }
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));
326
493
  }
327
494
  //# sourceMappingURL=waycharter.js.map