@mountainpass/waycharter 1.0.75 → 2.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 (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 +13 -0
  7. package/dist/collections/build-first-link.js +30 -19
  8. package/dist/collections/build-first-link.js.map +1 -1
  9. package/dist/collections/build-next-link.d.ts +12 -0
  10. package/dist/collections/build-next-link.js +26 -15
  11. package/dist/collections/build-next-link.js.map +1 -1
  12. package/dist/collections/build-previous-link.d.ts +13 -0
  13. package/dist/collections/build-previous-link.js +52 -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 +62 -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 +73 -0
  61. package/dist/waycharter.js +475 -307
  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,328 +1,496 @@
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, request, response);
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
- itemEndpoint,
162
- itemPath,
163
- itemLoader,
164
- collectionPath,
165
- collectionLoader,
166
- filters = []
167
- }) {
168
- // TODO: error handling for itemPath set, but itemLoader isn't and visa-versa
169
- // TODO: error handling if itemEndpoint is set, and itemPath or itemLoader is set
170
- // TODO: error handling for collectionPath not set
171
- // TODO: error handling for collectionLoader not set
172
- const itemType = itemPath !== undefined && itemLoader !== undefined ? this.registerResourceType({
173
- path: `${collectionPath}${itemPath}`,
174
- loader: itemLoader
175
- }) : itemEndpoint;
176
- const linkTemplates = [];
177
-
178
- for (const filter of filters) {
179
- linkTemplates.push({
180
- rel: filter.rel,
181
- uri: `${collectionPath}{?${filter.parameters.join(',')}}`
182
- });
183
- }
184
-
185
- const type = this.registerResourceType({
186
- path: collectionPath,
187
- loader: async ({
188
- page,
189
- ...otherParameters
190
- }, filteredHeaders, selfUri, request, response) => {
191
- // ${collectionPath}?page=0 should redirect to ${collectionPath}
192
- if (page === '0') {
193
- return {
194
- status: 308,
195
- headers: {
196
- 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
+ });
197
272
  }
198
- };
199
- } // page should be >= 0
200
-
201
-
202
- const pageInt = Number.parseInt(page || '0');
203
-
204
- if (Number.isNaN(pageInt)) {
205
- return {
206
- status: 400,
207
- body: {
208
- error: "I don't understand what page you are trying to retrieve",
209
- 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);
210
278
  }
211
- };
279
+ finally { if (e_2) throw e_2.error; }
212
280
  }
213
-
214
- if (page < 0) {
215
- return {
216
- status: 400,
217
- body: {
218
- error: "You've asked for a negative page. I don't know what that means",
219
- 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.page, expandedPath, filteredQueryParameters_1, itemActions, itemEndpoint);
307
+ return [2 /*return*/];
308
+ });
309
+ }); };
310
+ handler({
311
+ page: pageCheckResult.page,
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
+ }
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
+ }
220
368
  }
221
- };
222
- } // we only want to include query params that are part of the filter,
223
- // but we can include all path params
224
-
225
-
226
- const filteredParameters = { ...request.params
227
- };
228
-
229
- for (const filter of filters) {
230
- for (const parameter of filter.parameters) {
231
- if (otherParameters[parameter] !== undefined) {
232
- filteredParameters[parameter] = otherParameters[parameter];
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; }
233
375
  }
234
- }
235
376
  }
236
-
237
- const {
238
- body,
239
- arrayPointer,
240
- hasMore,
241
- headers,
242
- itemOperations,
243
- status
244
- } = await collectionLoader({
245
- page: pageInt,
246
- ...filteredParameters
247
- }, filteredHeaders, selfUri, request, response);
248
- const array = arrayPointer ? _jsonpointer.default.get(body, arrayPointer) : body;
249
- const {
250
- itemLinks,
251
- canonicalLinks
252
- } = (0, _builtItemLinks.builtItemLinks)(array, arrayPointer, itemType, selfUri, itemOperations);
253
- return {
254
- body,
255
- links: [...itemLinks, ...canonicalLinks, ...(0, _buildNextLink.buildNextLink)(hasMore, pageInt, collectionPath, otherParameters), ...(0, _buildPreviousLink.buildPreviousLink)(pageInt, collectionPath, otherParameters), ...(0, _buildFirstLink.buildFirstLink)(hasMore, pageInt, collectionPath, otherParameters)],
256
- linkTemplates,
257
- headers,
258
- status
259
- };
260
- }
261
- });
262
- return { ...type,
263
- additionalPaths: linkTemplates
377
+ endpoint.addDefaultHandler(path, actions, itemActions);
378
+ return endpoint;
264
379
  };
265
- }
266
-
267
- registerStaticCollection({
268
- collectionPath,
269
- collection,
270
- pageSize,
271
- arrayPointer,
272
- headers
273
- }) {
274
- return this.registerCollection({
275
- collectionPath,
276
- collectionLoader: async ({
277
- page
278
- }) => {
279
- const items = pageSize ? collection.slice(page * pageSize, (page + 1) * pageSize) : collection;
280
- return {
281
- body: items,
282
- hasMore: pageSize && page < collection.length / pageSize - 1,
283
- arrayPointer,
284
- headers
285
- };
286
- }
287
- });
288
- }
289
-
290
- }
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;
291
478
  /**
292
479
  * @param resource
293
- * @param response
294
480
  * @param requestUrl
295
- * @param additionalLinks
481
+ * @param response
482
+ * @param pageInt
483
+ * @param pageCheckResult
484
+ * @param page
485
+ * @param expandedPath
486
+ * @param filteredParameters
487
+ * @param itemActions
488
+ * @param itemEndpoint
489
+ * @param staticLinks
296
490
  */
297
-
298
-
299
- exports.WayCharter = WayCharter;
300
-
301
- function sendResponse(resource, response, requestUrl, additionalLinks = []) {
302
- if (resource.links || additionalLinks.length > 0) {
303
- const links = (0, _convertResourceLinks.covertResourceLinks)([...additionalLinks, ...(resource.links || [])]);
304
- response.header('link', links.toString());
305
- }
306
-
307
- if (resource.linkTemplates) {
308
- const linkTemplates = (0, _convertResourceLinks.covertResourceLinks)(resource.linkTemplates);
309
- response.header('link-template', linkTemplates.toString());
310
- }
311
-
312
- if (resource.status) {
313
- response.status(resource.status);
314
- }
315
-
316
- if (resource.headers) {
317
- for (const header in resource.headers) {
318
- response.header(header, resource.headers[header]);
319
- }
320
- }
321
-
322
- if (resource.body) {
323
- response.json(resource.body);
324
- } else {
325
- response.end();
326
- }
491
+ function sendCollectionHandlerResponse(resource, requestUrl, response, page, expandedPath, filteredParameters, itemActions, itemEndpoint) {
492
+ var body = resource.body, collectionPointer = resource.collectionPointer, hasMore = resource.hasMore, prevPage = resource.prevPage, nextPage = resource.nextPage, links = resource.links, other = __rest(resource, ["body", "collectionPointer", "hasMore", "prevPage", "nextPage", "links"]);
493
+ var _a = (0, built_item_links_1.builtItemLinks)(collectionPointer, itemEndpoint, requestUrl, itemActions), itemLinks = _a.itemLinks, canonicalLinks = _a.canonicalLinks;
494
+ 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, page, nextPage, expandedPath, filteredParameters)), false), __read((0, build_previous_link_1.buildPreviousLink)(page, prevPage, expandedPath, filteredParameters)), false), __read((0, build_first_link_1.buildFirstLink)(expandedPath, filteredParameters)), false), __read(links || []), false) }, other));
327
495
  }
328
496
  //# sourceMappingURL=waycharter.js.map