@jskit-ai/json-rest-api-core 0.1.2 → 0.1.3
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/package.descriptor.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jskit-ai/json-rest-api-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node --test"
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"hooked-api": "1.x.x",
|
|
13
13
|
"json-rest-api": "1.x.x",
|
|
14
|
-
"@jskit-ai/kernel": "0.1.
|
|
14
|
+
"@jskit-ai/kernel": "0.1.58"
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -63,6 +63,9 @@ function cloneJsonRestResourceValue(value, { writeSerializers = {} } = {}) {
|
|
|
63
63
|
|
|
64
64
|
if (isPlainJsonRestObject(next.storage)) {
|
|
65
65
|
const serializerKey = normalizeJsonRestText(next.storage.writeSerializer).toLowerCase();
|
|
66
|
+
if (next.storage.virtual === true) {
|
|
67
|
+
next.virtual = true;
|
|
68
|
+
}
|
|
66
69
|
if (serializerKey) {
|
|
67
70
|
const serializer = writeSerializers[serializerKey];
|
|
68
71
|
if (typeof serializer !== "function") {
|
|
@@ -195,16 +198,68 @@ function buildJsonRestQueryParams(resourceType = "", query = {}, { include = und
|
|
|
195
198
|
return queryParams;
|
|
196
199
|
}
|
|
197
200
|
|
|
198
|
-
function
|
|
199
|
-
const
|
|
201
|
+
function extractJsonApiInputRelationships(attributes = {}, resource = null, relationships = null) {
|
|
202
|
+
const normalizedAttributes = {
|
|
203
|
+
...normalizeJsonRestObject(attributes)
|
|
204
|
+
};
|
|
205
|
+
const normalizedRelationships = {
|
|
206
|
+
...normalizeJsonRestObject(relationships)
|
|
207
|
+
};
|
|
208
|
+
const resourceSchema = normalizeJsonRestObject(resource?.schema);
|
|
209
|
+
|
|
210
|
+
for (const [fieldName, fieldDefinition] of Object.entries(resourceSchema)) {
|
|
211
|
+
if (!Object.hasOwn(normalizedAttributes, fieldName)) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const normalizedFieldDefinition = normalizeJsonRestObject(fieldDefinition);
|
|
216
|
+
const relationshipType = normalizeJsonRestText(normalizedFieldDefinition.belongsTo);
|
|
217
|
+
if (!relationshipType) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const relationshipName = normalizeJsonRestText(normalizedFieldDefinition.as, {
|
|
222
|
+
fallback: fieldName
|
|
223
|
+
});
|
|
224
|
+
if (!relationshipName) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const relationshipValue = normalizedAttributes[fieldName];
|
|
229
|
+
delete normalizedAttributes[fieldName];
|
|
230
|
+
|
|
231
|
+
if (relationshipValue === undefined) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!Object.hasOwn(normalizedRelationships, relationshipName)) {
|
|
236
|
+
normalizedRelationships[relationshipName] = createJsonApiRelationship(
|
|
237
|
+
relationshipType,
|
|
238
|
+
relationshipValue
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return {
|
|
244
|
+
attributes: normalizedAttributes,
|
|
245
|
+
relationships: normalizedRelationships
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function createJsonApiInputRecord(
|
|
250
|
+
resourceType = "",
|
|
251
|
+
attributes = {},
|
|
252
|
+
{ id = null, relationships = null, resource = null } = {}
|
|
253
|
+
) {
|
|
254
|
+
const normalizedInput = extractJsonApiInputRelationships(attributes, resource, relationships);
|
|
200
255
|
return {
|
|
201
256
|
data: {
|
|
202
257
|
type: normalizeJsonRestText(resourceType),
|
|
203
258
|
...(id == null ? {} : { id: String(id) }),
|
|
204
|
-
attributes:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
259
|
+
attributes: normalizedInput.attributes,
|
|
260
|
+
...(Object.keys(normalizedInput.relationships).length < 1
|
|
261
|
+
? {}
|
|
262
|
+
: { relationships: normalizedInput.relationships })
|
|
208
263
|
}
|
|
209
264
|
};
|
|
210
265
|
}
|
|
@@ -165,6 +165,42 @@ test("shared query/document helpers build json-rest-api request shapes", () => {
|
|
|
165
165
|
}
|
|
166
166
|
);
|
|
167
167
|
|
|
168
|
+
assert.deepEqual(
|
|
169
|
+
createJsonApiInputRecord("products", {
|
|
170
|
+
serviceId: "9",
|
|
171
|
+
name: "Style Groom"
|
|
172
|
+
}, {
|
|
173
|
+
resource: {
|
|
174
|
+
schema: {
|
|
175
|
+
serviceId: {
|
|
176
|
+
type: "id",
|
|
177
|
+
belongsTo: "services",
|
|
178
|
+
as: "service"
|
|
179
|
+
},
|
|
180
|
+
name: {
|
|
181
|
+
type: "string"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}),
|
|
186
|
+
{
|
|
187
|
+
data: {
|
|
188
|
+
type: "products",
|
|
189
|
+
attributes: {
|
|
190
|
+
name: "Style Groom"
|
|
191
|
+
},
|
|
192
|
+
relationships: {
|
|
193
|
+
service: {
|
|
194
|
+
data: {
|
|
195
|
+
type: "services",
|
|
196
|
+
id: "9"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
|
|
168
204
|
assert.deepEqual(
|
|
169
205
|
simplifyJsonApiDocument({
|
|
170
206
|
data: [
|
|
@@ -237,6 +273,17 @@ test("createJsonRestResourceScopeOptions clones canonical resource metadata and
|
|
|
237
273
|
required: true
|
|
238
274
|
})
|
|
239
275
|
})
|
|
276
|
+
}),
|
|
277
|
+
bookingSteps: Object.freeze({
|
|
278
|
+
type: "array",
|
|
279
|
+
storage: Object.freeze({
|
|
280
|
+
virtual: true
|
|
281
|
+
}),
|
|
282
|
+
operations: Object.freeze({
|
|
283
|
+
output: Object.freeze({
|
|
284
|
+
required: false
|
|
285
|
+
})
|
|
286
|
+
})
|
|
240
287
|
})
|
|
241
288
|
}),
|
|
242
289
|
operations: Object.freeze({
|
|
@@ -258,7 +305,9 @@ test("createJsonRestResourceScopeOptions clones canonical resource metadata and
|
|
|
258
305
|
assert.notEqual(result.schema.createdAt, source.schema.createdAt);
|
|
259
306
|
assert.equal(result.schema.createdAt.storage.column, "created_at");
|
|
260
307
|
assert.equal(result.schema.createdAt.storage.serialize, serializer);
|
|
308
|
+
assert.equal(result.schema.createdAt.storage.serialize(null), null);
|
|
261
309
|
assert.equal(result.schema.createdAt.storage.writeSerializer, undefined);
|
|
310
|
+
assert.equal(result.schema.bookingSteps.virtual, true);
|
|
262
311
|
assert.equal(result.normalizeId, normalizeId);
|
|
263
312
|
assert.equal(result.schema.name.maxLength, 190);
|
|
264
313
|
assert.equal(result.schema.name.operations.output.required, true);
|