ts-japi 1.6.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/Makefile +1 -27
- package/README.md +145 -75
- package/api-extractor.json +14 -0
- package/lib/classes/cache.d.ts +2 -2
- package/lib/classes/cache.js +26 -48
- package/lib/classes/cache.js.map +1 -1
- package/lib/classes/error-serializer.d.ts +6 -6
- package/lib/classes/error-serializer.js +58 -125
- package/lib/classes/error-serializer.js.map +1 -1
- package/lib/classes/linker.d.ts +5 -5
- package/lib/classes/linker.d.ts.map +1 -1
- package/lib/classes/linker.js +15 -41
- package/lib/classes/linker.js.map +1 -1
- package/lib/classes/metaizer.d.ts +4 -4
- package/lib/classes/metaizer.d.ts.map +1 -1
- package/lib/classes/metaizer.js +12 -38
- package/lib/classes/metaizer.js.map +1 -1
- package/lib/classes/paginator.d.ts +3 -3
- package/lib/classes/paginator.js +17 -16
- package/lib/classes/paginator.js.map +1 -1
- package/lib/classes/relator.d.ts +6 -6
- package/lib/classes/relator.d.ts.map +1 -1
- package/lib/classes/relator.js +70 -134
- package/lib/classes/relator.js.map +1 -1
- package/lib/classes/serializer.d.ts +9 -9
- package/lib/classes/serializer.js +213 -316
- package/lib/classes/serializer.js.map +1 -1
- package/lib/index.js +17 -10
- package/lib/index.js.map +1 -1
- package/lib/interfaces/cache.interface.d.ts +2 -2
- package/lib/interfaces/cache.interface.js +1 -1
- package/lib/interfaces/error-serializer.interface.d.ts +11 -11
- package/lib/interfaces/error-serializer.interface.js +1 -1
- package/lib/interfaces/error.interface.js +1 -1
- package/lib/interfaces/json-api.interface.js +1 -1
- package/lib/interfaces/linker.interface.d.ts +1 -1
- package/lib/interfaces/linker.interface.js +1 -1
- package/lib/interfaces/paginator.interface.js +1 -1
- package/lib/interfaces/relator.interface.d.ts +4 -4
- package/lib/interfaces/relator.interface.js +1 -1
- package/lib/interfaces/serializer.interface.d.ts +24 -24
- package/lib/interfaces/serializer.interface.js +1 -1
- package/lib/models/error.model.d.ts +1 -1
- package/lib/models/error.model.js +59 -22
- package/lib/models/error.model.js.map +1 -1
- package/lib/models/link.model.js +11 -10
- package/lib/models/link.model.js.map +1 -1
- package/lib/models/meta.model.js +5 -6
- package/lib/models/meta.model.js.map +1 -1
- package/lib/models/relationship.model.js +8 -6
- package/lib/models/relationship.model.js.map +1 -1
- package/lib/models/resource-identifier.model.js +11 -9
- package/lib/models/resource-identifier.model.js.map +1 -1
- package/lib/models/resource.model.js +13 -28
- package/lib/models/resource.model.js.map +1 -1
- package/lib/tsdoc-metadata.json +11 -0
- package/lib/types/global.types.js +1 -1
- package/lib/utils/is-error-document.d.ts +1 -1
- package/lib/utils/is-error-document.js +6 -8
- package/lib/utils/is-error-document.js.map +1 -1
- package/lib/utils/is-object.js +1 -1
- package/lib/utils/is-plain-object.js +4 -4
- package/lib/utils/is-plain-object.js.map +1 -1
- package/lib/utils/merge.d.ts +2 -2
- package/lib/utils/merge.js +16 -63
- package/lib/utils/merge.js.map +1 -1
- package/lib/utils/serializer.utils.js +56 -202
- package/lib/utils/serializer.utils.js.map +1 -1
- package/package.json +36 -30
- package/tools/generate_docs.ts +33 -0
- package/tools/internal/custom_markdown_action.ts +32 -0
- package/tools/internal/custom_markdown_documenter.ts +1337 -0
- package/tsconfig.json +60 -79
- package/CONTRIBUTING.md +0 -127
|
@@ -1,359 +1,256 @@
|
|
|
1
1
|
"use strict";
|
|
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];
|
|
8
|
-
}
|
|
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());
|
|
20
|
-
});
|
|
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 __read = (this && this.__read) || function (o, n) {
|
|
50
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
-
if (!m) return o;
|
|
52
|
-
var i = m.call(o), r, ar = [], e;
|
|
53
|
-
try {
|
|
54
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
-
}
|
|
56
|
-
catch (error) { e = { error: error }; }
|
|
57
|
-
finally {
|
|
58
|
-
try {
|
|
59
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
-
}
|
|
61
|
-
finally { if (e) throw e.error; }
|
|
62
|
-
}
|
|
63
|
-
return ar;
|
|
64
|
-
};
|
|
65
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
66
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
67
4
|
};
|
|
68
|
-
exports
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const resource_identifier_model_1 = __importDefault(require("../models/resource-identifier.model"));
|
|
7
|
+
const resource_model_1 = __importDefault(require("../models/resource.model"));
|
|
8
|
+
const merge_1 = __importDefault(require("../utils/merge"));
|
|
9
|
+
const serializer_utils_1 = require("../utils/serializer.utils");
|
|
10
|
+
const cache_1 = __importDefault(require("./cache"));
|
|
74
11
|
/**
|
|
75
|
-
* The {@
|
|
76
|
-
* (you can use the {@
|
|
12
|
+
* The {@link Serializer} class is the main class used to serializer data
|
|
13
|
+
* (you can use the {@link ErrorSerializer} class to serialize errors).
|
|
77
14
|
*
|
|
78
15
|
* Example:
|
|
79
16
|
* ```typescript
|
|
80
17
|
* [[include:serializer.example.ts]]
|
|
81
18
|
* ```
|
|
82
19
|
*/
|
|
83
|
-
|
|
20
|
+
class Serializer {
|
|
84
21
|
/**
|
|
85
|
-
*
|
|
22
|
+
* Default options. Can be edited to change default options globally.
|
|
23
|
+
*/
|
|
24
|
+
static defaultOptions = {
|
|
25
|
+
idKey: 'id',
|
|
26
|
+
version: '1.0',
|
|
27
|
+
onlyIdentifier: false,
|
|
28
|
+
nullData: false,
|
|
29
|
+
asIncluded: false,
|
|
30
|
+
onlyRelationship: false,
|
|
31
|
+
cache: false,
|
|
32
|
+
depth: 0,
|
|
33
|
+
projection: null,
|
|
34
|
+
linkers: {},
|
|
35
|
+
metaizers: {},
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The name to use for the type.
|
|
39
|
+
*/
|
|
40
|
+
collectionName;
|
|
41
|
+
/**
|
|
42
|
+
* The set of options for the serializer.
|
|
43
|
+
*/
|
|
44
|
+
options;
|
|
45
|
+
/**
|
|
46
|
+
* The set of helper functions for the serializer
|
|
47
|
+
*/
|
|
48
|
+
helpers;
|
|
49
|
+
/**
|
|
50
|
+
* Caching
|
|
51
|
+
*/
|
|
52
|
+
cache = new cache_1.default();
|
|
53
|
+
/**
|
|
54
|
+
* Creates a {@link Serializer}.
|
|
86
55
|
*
|
|
87
|
-
* @param collectionName The name of the collection of objects.
|
|
88
|
-
* @param options Options for the serializer.
|
|
56
|
+
* @param collectionName - The name of the collection of objects.
|
|
57
|
+
* @param options - Options for the serializer.
|
|
89
58
|
*/
|
|
90
|
-
|
|
91
|
-
if (options === void 0) { options = {}; }
|
|
92
|
-
/**
|
|
93
|
-
* Caching
|
|
94
|
-
*/
|
|
95
|
-
this.cache = new cache_1["default"]();
|
|
59
|
+
constructor(collectionName, options = {}) {
|
|
96
60
|
// Setting default options.
|
|
97
|
-
this.options = merge_1
|
|
61
|
+
this.options = (0, merge_1.default)({}, Serializer.defaultOptions, options);
|
|
98
62
|
this.helpers = new serializer_utils_1.Helpers(this.options);
|
|
99
|
-
if (this.options.cache && this.options.cache instanceof cache_1
|
|
63
|
+
if (this.options.cache && this.options.cache instanceof cache_1.default) {
|
|
100
64
|
this.cache = this.options.cache;
|
|
101
65
|
}
|
|
102
66
|
// Setting type name.
|
|
103
67
|
this.collectionName = collectionName;
|
|
104
68
|
}
|
|
105
69
|
/**
|
|
106
|
-
* Gets the {@
|
|
70
|
+
* Gets the {@link Relator}s associated with this serializer
|
|
107
71
|
*/
|
|
108
|
-
|
|
72
|
+
getRelators() {
|
|
109
73
|
return this.helpers.relators;
|
|
110
|
-
}
|
|
74
|
+
}
|
|
111
75
|
/**
|
|
112
|
-
* Sets the {@
|
|
76
|
+
* Sets the {@link Relator}s associated with this serializer
|
|
113
77
|
*/
|
|
114
|
-
|
|
78
|
+
setRelators(relators) {
|
|
115
79
|
this.options.relators = relators;
|
|
116
80
|
this.helpers = new serializer_utils_1.Helpers(this.options);
|
|
117
|
-
}
|
|
81
|
+
}
|
|
118
82
|
/** @internal Generates a `ResourceIdentifier`. */
|
|
119
|
-
|
|
83
|
+
createIdentifier(data, options) {
|
|
120
84
|
// Get options
|
|
121
85
|
if (options === undefined)
|
|
122
86
|
options = this.options;
|
|
123
|
-
|
|
87
|
+
const identifierOptions = {};
|
|
124
88
|
if (options.metaizers.resource) {
|
|
125
89
|
identifierOptions.meta = options.metaizers.resource.metaize(data);
|
|
126
90
|
}
|
|
127
|
-
return new resource_identifier_model_1
|
|
128
|
-
}
|
|
91
|
+
return new resource_identifier_model_1.default(data[options.idKey], this.collectionName, identifierOptions);
|
|
92
|
+
}
|
|
129
93
|
/** @internal Generates a `Resource`. */
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
var _b = __read(_a, 2), name = _b[0], relator = _b[1];
|
|
151
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
152
|
-
var relatedDataCache, _c, _d;
|
|
153
|
-
return __generator(this, function (_e) {
|
|
154
|
-
switch (_e.label) {
|
|
155
|
-
case 0:
|
|
156
|
-
if (relatorDataCache) {
|
|
157
|
-
relatedDataCache = relatorDataCache.get(relator) || [];
|
|
158
|
-
relatorDataCache.set(relator, relatedDataCache);
|
|
159
|
-
}
|
|
160
|
-
_c = relationships_1;
|
|
161
|
-
_d = name;
|
|
162
|
-
return [4 /*yield*/, relator.getRelationship(data, relatedDataCache)];
|
|
163
|
-
case 1:
|
|
164
|
-
_c[_d] = _e.sent();
|
|
165
|
-
return [2 /*return*/];
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
}))];
|
|
170
|
-
case 1:
|
|
171
|
-
_a.sent();
|
|
172
|
-
resourceOptions.relationships = relationships_1;
|
|
173
|
-
_a.label = 2;
|
|
174
|
-
case 2:
|
|
175
|
-
// Handling links
|
|
176
|
-
if (options.linkers.resource) {
|
|
177
|
-
resourceOptions.links = { self: options.linkers.resource.link(data) };
|
|
178
|
-
}
|
|
179
|
-
if (options.metaizers.resource) {
|
|
180
|
-
resourceOptions.meta = options.metaizers.resource.metaize(data);
|
|
181
|
-
}
|
|
182
|
-
return [2 /*return*/, new resource_model_1["default"](id, type, resourceOptions)];
|
|
94
|
+
async createResource(data, options, helpers, relatorDataCache) {
|
|
95
|
+
// Get options
|
|
96
|
+
if (options === undefined || helpers === undefined) {
|
|
97
|
+
options = this.options;
|
|
98
|
+
helpers = this.helpers;
|
|
99
|
+
}
|
|
100
|
+
const resourceOptions = {};
|
|
101
|
+
// Get ID before projections.
|
|
102
|
+
const id = data[options.idKey];
|
|
103
|
+
const type = this.collectionName;
|
|
104
|
+
// Get attributes
|
|
105
|
+
resourceOptions.attributes = helpers.projectAttributes(data);
|
|
106
|
+
// Handling relators
|
|
107
|
+
if (helpers.relators) {
|
|
108
|
+
const relationships = {};
|
|
109
|
+
await Promise.all(Object.entries(helpers.relators).map(async ([name, relator]) => {
|
|
110
|
+
let relatedDataCache;
|
|
111
|
+
if (relatorDataCache) {
|
|
112
|
+
relatedDataCache = relatorDataCache.get(relator) || [];
|
|
113
|
+
relatorDataCache.set(relator, relatedDataCache);
|
|
183
114
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
115
|
+
relationships[name] = await relator.getRelationship(data, relatedDataCache);
|
|
116
|
+
}));
|
|
117
|
+
resourceOptions.relationships = relationships;
|
|
118
|
+
}
|
|
119
|
+
// Handling links
|
|
120
|
+
if (options.linkers.resource) {
|
|
121
|
+
resourceOptions.links = { self: options.linkers.resource.link(data) };
|
|
122
|
+
}
|
|
123
|
+
if (options.metaizers.resource) {
|
|
124
|
+
resourceOptions.meta = options.metaizers.resource.metaize(data);
|
|
125
|
+
}
|
|
126
|
+
return new resource_model_1.default(id, type, resourceOptions);
|
|
127
|
+
}
|
|
187
128
|
/**
|
|
188
129
|
* The actual serialization function.
|
|
189
130
|
*
|
|
190
|
-
* @param data Data to serialize.
|
|
191
|
-
* @param options Options to use at runtime.
|
|
131
|
+
* @param data - Data to serialize.
|
|
132
|
+
* @param options - Options to use at runtime.
|
|
192
133
|
*/
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
if (o.linkers.paginator) {
|
|
272
|
-
pagination = o.linkers.paginator.paginate(data);
|
|
273
|
-
if (pagination) {
|
|
274
|
-
document.links = __assign(__assign({}, document.links), pagination);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
createIdentifier = function (datum) { return _this.createIdentifier(datum, o); };
|
|
278
|
-
createResource = function (datum) { return __awaiter(_this, void 0, void 0, function () {
|
|
279
|
-
var resource;
|
|
280
|
-
return __generator(this, function (_a) {
|
|
281
|
-
switch (_a.label) {
|
|
282
|
-
case 0: return [4 /*yield*/, this.createResource(datum, o, h, relatorDataCache)];
|
|
283
|
-
case 1:
|
|
284
|
-
resource = _a.sent();
|
|
285
|
-
keys.push(resource.getKey());
|
|
286
|
-
return [2 /*return*/, resource];
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
}); };
|
|
290
|
-
relators = h.relators;
|
|
291
|
-
dto = data;
|
|
292
|
-
_f.label = 3;
|
|
293
|
-
case 3:
|
|
294
|
-
if (dto === undefined) {
|
|
295
|
-
return [2 /*return*/, cache.set(data, document, options)];
|
|
296
|
-
}
|
|
297
|
-
if (o.nullData || dto === null) {
|
|
298
|
-
document.data = null;
|
|
299
|
-
return [2 /*return*/, cache.set(data, document, options)];
|
|
300
|
-
}
|
|
301
|
-
// Handle `onlyIdentifier` option
|
|
302
|
-
if (o.onlyIdentifier) {
|
|
303
|
-
document.data = Array.isArray(dto) ? dto.map(createIdentifier) : createIdentifier(dto);
|
|
304
|
-
return [2 /*return*/, cache.set(data, document, options)];
|
|
305
|
-
}
|
|
306
|
-
if (!Array.isArray(dto)) {
|
|
307
|
-
wasSingle = true;
|
|
308
|
-
dto = [dto];
|
|
309
|
-
}
|
|
310
|
-
if (!o.asIncluded) return [3 /*break*/, 5];
|
|
311
|
-
document.data = dto.map(createIdentifier);
|
|
312
|
-
_a = document;
|
|
313
|
-
return [4 /*yield*/, Promise.all(dto.map(createResource))];
|
|
314
|
-
case 4:
|
|
315
|
-
_a.included = _f.sent();
|
|
316
|
-
return [3 /*break*/, 7];
|
|
317
|
-
case 5:
|
|
318
|
-
_b = document;
|
|
319
|
-
return [4 /*yield*/, Promise.all(dto.map(createResource))];
|
|
320
|
-
case 6:
|
|
321
|
-
_b.data = _f.sent();
|
|
322
|
-
_f.label = 7;
|
|
323
|
-
case 7:
|
|
324
|
-
if (!(relators && o.depth > 0)) return [3 /*break*/, 9];
|
|
325
|
-
_c = document;
|
|
326
|
-
_e = (_d = (document.included || [])).concat;
|
|
327
|
-
return [4 /*yield*/, serializer_utils_1.recurseRelators(dto, relators, o.depth, keys, relatorDataCache)];
|
|
328
|
-
case 8:
|
|
329
|
-
_c.included = _e.apply(_d, [_f.sent()]);
|
|
330
|
-
_f.label = 9;
|
|
331
|
-
case 9:
|
|
332
|
-
if (wasSingle) {
|
|
333
|
-
document.data = document.data[0];
|
|
334
|
-
}
|
|
335
|
-
return [2 /*return*/, cache.set(data, document, options)];
|
|
134
|
+
async serialize(data, options) {
|
|
135
|
+
// Merge options.
|
|
136
|
+
let o = this.options;
|
|
137
|
+
let h = this.helpers;
|
|
138
|
+
if (options !== undefined) {
|
|
139
|
+
o = (0, merge_1.default)({}, o, options);
|
|
140
|
+
h = new serializer_utils_1.Helpers(o);
|
|
141
|
+
}
|
|
142
|
+
const cache = o.cache instanceof cache_1.default ? o.cache : this.cache;
|
|
143
|
+
if (o.cache) {
|
|
144
|
+
const storedDocument = cache.get(data, options);
|
|
145
|
+
if (storedDocument) {
|
|
146
|
+
return storedDocument;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Construct initial document and included data
|
|
150
|
+
const document = {};
|
|
151
|
+
// Document versioning
|
|
152
|
+
if (o.version) {
|
|
153
|
+
document.jsonapi = { ...document.jsonapi, version: o.version };
|
|
154
|
+
}
|
|
155
|
+
if (o.metaizers.jsonapi) {
|
|
156
|
+
document.jsonapi = { ...document.jsonapi, meta: o.metaizers.jsonapi.metaize() };
|
|
157
|
+
}
|
|
158
|
+
// Cache data fetched during resource creation
|
|
159
|
+
const relatorDataCache = new Map();
|
|
160
|
+
const keys = [];
|
|
161
|
+
let wasSingle = false;
|
|
162
|
+
let dto;
|
|
163
|
+
let createIdentifier;
|
|
164
|
+
let createResource;
|
|
165
|
+
let relators;
|
|
166
|
+
// Check if only a relationship is desired
|
|
167
|
+
if (o.onlyRelationship) {
|
|
168
|
+
// Validate options.
|
|
169
|
+
if (h.relators === undefined) {
|
|
170
|
+
throw new TypeError(`"relators" must be defined when using "onlyRelationship"`);
|
|
171
|
+
}
|
|
172
|
+
if (!data || Array.isArray(data)) {
|
|
173
|
+
throw new TypeError(`Cannot serialize multiple primary datum using "onlyRelationship"`);
|
|
174
|
+
}
|
|
175
|
+
const relator = h.relators[o.onlyRelationship];
|
|
176
|
+
if (relator === undefined) {
|
|
177
|
+
throw new TypeError(`"onlyRelationship" is not the name of any collection name among the relators listed in "relators"`);
|
|
178
|
+
}
|
|
179
|
+
// Handle related data
|
|
180
|
+
const relatedData = await relator.getRelatedData(data);
|
|
181
|
+
// Handle related links
|
|
182
|
+
const links = relator.getRelatedLinks(data, relatedData);
|
|
183
|
+
if (links)
|
|
184
|
+
document.links = links;
|
|
185
|
+
// Handle related meta
|
|
186
|
+
const meta = relator.getRelatedMeta(data, relatedData);
|
|
187
|
+
if (meta)
|
|
188
|
+
document.meta = meta;
|
|
189
|
+
createIdentifier = (datum) => relator.getRelatedIdentifier(datum);
|
|
190
|
+
createResource = async (datum) => {
|
|
191
|
+
const resource = await relator.getRelatedResource(datum);
|
|
192
|
+
keys.push(resource.getKey());
|
|
193
|
+
return resource;
|
|
194
|
+
};
|
|
195
|
+
relators = relator.getRelatedRelators();
|
|
196
|
+
dto = relatedData;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// Handle meta
|
|
200
|
+
if (o.metaizers.document) {
|
|
201
|
+
document.meta = o.metaizers.document.metaize(data);
|
|
202
|
+
}
|
|
203
|
+
// Handle links
|
|
204
|
+
if (o.linkers.document) {
|
|
205
|
+
document.links = { ...document.links, self: o.linkers.document.link(data) };
|
|
206
|
+
}
|
|
207
|
+
// Handle pagination links
|
|
208
|
+
if (o.linkers.paginator) {
|
|
209
|
+
const pagination = o.linkers.paginator.paginate(data);
|
|
210
|
+
if (pagination) {
|
|
211
|
+
document.links = { ...document.links, ...pagination };
|
|
336
212
|
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
213
|
+
}
|
|
214
|
+
createIdentifier = (datum) => this.createIdentifier(datum, o);
|
|
215
|
+
createResource = async (datum) => {
|
|
216
|
+
const resource = await this.createResource(datum, o, h, relatorDataCache);
|
|
217
|
+
keys.push(resource.getKey());
|
|
218
|
+
return resource;
|
|
219
|
+
};
|
|
220
|
+
relators = h.relators;
|
|
221
|
+
dto = data;
|
|
222
|
+
}
|
|
223
|
+
if (dto === undefined) {
|
|
224
|
+
return cache.set(data, document, options);
|
|
225
|
+
}
|
|
226
|
+
if (o.nullData || dto === null) {
|
|
227
|
+
document.data = null;
|
|
228
|
+
return cache.set(data, document, options);
|
|
229
|
+
}
|
|
230
|
+
// Handle `onlyIdentifier` option
|
|
231
|
+
if (o.onlyIdentifier) {
|
|
232
|
+
document.data = Array.isArray(dto) ? dto.map(createIdentifier) : createIdentifier(dto);
|
|
233
|
+
return cache.set(data, document, options);
|
|
234
|
+
}
|
|
235
|
+
if (!Array.isArray(dto)) {
|
|
236
|
+
wasSingle = true;
|
|
237
|
+
dto = [dto];
|
|
238
|
+
}
|
|
239
|
+
if (o.asIncluded) {
|
|
240
|
+
document.data = dto.map(createIdentifier);
|
|
241
|
+
document.included = await Promise.all(dto.map(createResource));
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
document.data = await Promise.all(dto.map(createResource));
|
|
245
|
+
}
|
|
246
|
+
if (relators && o.depth > 0) {
|
|
247
|
+
document.included = (document.included || []).concat(await (0, serializer_utils_1.recurseRelators)(dto, relators, o.depth, keys, relatorDataCache));
|
|
248
|
+
}
|
|
249
|
+
if (wasSingle) {
|
|
250
|
+
document.data = document.data[0];
|
|
251
|
+
}
|
|
252
|
+
return cache.set(data, document, options);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
exports.default = Serializer;
|
|
359
256
|
//# sourceMappingURL=serializer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/classes/serializer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/classes/serializer.ts"],"names":[],"mappings":"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"}
|