@orbit/jsonapi
Version:
JSON:API support for Orbit.
104 lines • 13.9 kB
JavaScript
import { Orbit, Assertion } from '@orbit/core';
import { JSONAPIBaseSerializer } from './jsonapi-base-serializer';
const { assert } = Orbit;
export class JSONAPIResourceIdentitySerializer extends JSONAPIBaseSerializer {
constructor(settings) {
const { serializerFor, deserializationOptions, schema, keyMap, getResourceKey } = settings;
super({
serializerFor,
deserializationOptions,
schema,
keyMap
});
this._resourceKeys = {};
this._getCustomResourceKey = getResourceKey;
}
getResourceKey(type) {
let key = this._resourceKeys[type];
if (key === undefined) {
if (this._getCustomResourceKey) {
key = this._getCustomResourceKey(type);
}
if (key === undefined) {
const model = this.schema.getModel(type);
if (model === null || model === void 0 ? void 0 : model.keys) {
let availableKeys = Object.keys(model.keys);
if (availableKeys.length === 1) {
key = availableKeys[0];
}
}
if (key === undefined) {
key = 'id';
}
}
assert("JSONAPIResourceIdentitySerializer requires a keyMap to support resource keys other than 'id'", key === 'id' || this.keyMap !== undefined);
this._resourceKeys[type] = key;
}
return key;
}
serialize(recordIdentity) {
const { type, id } = recordIdentity;
const resourceKey = this.getResourceKey(type);
const resourceType = this.typeSerializer.serialize(type);
const keyMap = this.keyMap;
const resourceId = resourceKey === 'id' ? id : keyMap.idToKey(type, resourceKey, id);
const resource = {
type: resourceType
};
if (resourceId !== undefined) {
resource.id = resourceId;
}
return resource;
}
deserialize(resource, customOptions) {
var _a;
const options = this.buildDeserializationOptions(customOptions);
const type = this.typeSerializer.deserialize(resource.type);
const resourceKey = this.getResourceKey(type);
if (resourceKey === 'id') {
const { id } = resource;
if (id) {
return { type, id };
}
else {
throw new Assertion(`Resource of type '${type}' is missing 'id'`);
}
}
else {
const keyMap = this.keyMap;
const primaryRecord = options === null || options === void 0 ? void 0 : options.primaryRecord;
let id;
let keys;
if (resource.id) {
keys = {
[resourceKey]: resource.id
};
id =
((_a = options.primaryRecord) === null || _a === void 0 ? void 0 : _a.id) ||
keyMap.idFromKeys(type, keys) ||
this.schema.generateId(type);
}
else {
keys = null;
id =
(primaryRecord && primaryRecord.id) || this.schema.generateId(type);
}
const record = { type, id };
if (keys) {
if (options.includeKeys) {
record.keys = keys;
keyMap.pushRecord(record);
}
else {
keyMap.pushRecord({
type,
id,
keys
});
}
}
return record;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1yZXNvdXJjZS1pZGVudGl0eS1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6ZXJzL2pzb25hcGktcmVzb3VyY2UtaWRlbnRpdHktc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUkvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdsRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBZXpCLE1BQU0sT0FBTyxpQ0FBa0MsU0FBUSxxQkFLdEQ7SUFrQ0MsWUFBWSxRQUFtRDtRQUM3RCxNQUFNLEVBQ0osYUFBYSxFQUNiLHNCQUFzQixFQUN0QixNQUFNLEVBQ04sTUFBTSxFQUNOLGNBQWMsRUFDZixHQUFHLFFBQVEsQ0FBQztRQUNiLEtBQUssQ0FBQztZQUNKLGFBQWE7WUFDYixzQkFBc0I7WUFDdEIsTUFBTTtZQUNOLE1BQU07U0FDUCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMscUJBQXFCLEdBQUcsY0FBYyxDQUFDO0lBQzlDLENBQUM7SUE5Q0QsY0FBYyxDQUFDLElBQVk7UUFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQzlCLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEM7WUFFRCxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FB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QUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNMLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ1osRUFBRTtvQkFDQSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdkU7WUFFRCxNQUFNLE1BQU0sR0FBc0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFFL0MsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO29CQUN2QixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDbkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLFVBQVUsQ0FBQzt3QkFDaEIsSUFBSTt3QkFDSixFQUFFO3dCQUNGLElBQUk7cUJBQ0wsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7WUFFRCxPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JiaXQsIEFzc2VydGlvbiB9IGZyb20gJ0BvcmJpdC9jb3JlJztcbmltcG9ydCB7IEluaXRpYWxpemVkUmVjb3JkLCBSZWNvcmRTY2hlbWEsIFJlY29yZEtleU1hcCB9IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IERpY3QgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZS1kb2N1bWVudCc7XG5pbXBvcnQgeyBKU09OQVBJQmFzZVNlcmlhbGl6ZXIgfSBmcm9tICcuL2pzb25hcGktYmFzZS1zZXJpYWxpemVyJztcbmltcG9ydCB7IFNlcmlhbGl6ZXJGb3JGbiB9IGZyb20gJ0BvcmJpdC9zZXJpYWxpemVycyc7XG5cbmNvbnN0IHsgYXNzZXJ0IH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBKU09OQVBJUmVzb3VyY2VJZGVudGl0eURlc2VyaWFsaXphdGlvbk9wdGlvbnMge1xuICBwcmltYXJ5UmVjb3JkPzogSW5pdGlhbGl6ZWRSZWNvcmQ7XG4gIGluY2x1ZGVLZXlzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKU09OQVBJUmVzb3VyY2VJZGVudGl0eVNlcmlhbGl6ZXJTZXR0aW5ncyB7XG4gIHNlcmlhbGl6ZXJGb3I6IFNlcmlhbGl6ZXJGb3JGbjtcbiAgZGVzZXJpYWxpemF0aW9uT3B0aW9ucz86IEpTT05BUElSZXNvdXJjZUlkZW50aXR5RGVzZXJpYWxpemF0aW9uT3B0aW9ucztcbiAgc2NoZW1hOiBSZWNvcmRTY2hlbWE7XG4gIGtleU1hcD86IFJlY29yZEtleU1hcDtcbiAgZ2V0UmVzb3VyY2VLZXk/OiAocmVjb3JkVHlwZTogc3RyaW5nKSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBKU09OQVBJUmVzb3VyY2VJZGVudGl0eVNlcmlhbGl6ZXIgZXh0ZW5kcyBKU09OQVBJQmFzZVNlcmlhbGl6ZXI8XG4gIEluaXRpYWxpemVkUmVjb3JkLFxuICBSZXNvdXJjZSxcbiAgdW5rbm93bixcbiAgSlNPTkFQSVJlc291cmNlSWRlbnRpdHlEZXNlcmlhbGl6YXRpb25PcHRpb25zXG4+IHtcbiAgcHJvdGVjdGVkIF9yZXNvdXJjZUtleXM6IERpY3Q8c3RyaW5nPjtcbiAgcHJvdGVjdGVkIF9nZXRDdXN0b21SZXNvdXJjZUtleT86IChyZWNvcmRUeXBlOiBzdHJpbmcpID0+IHN0cmluZztcblxuICBnZXRSZXNvdXJjZUtleSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBrZXkgPSB0aGlzLl9yZXNvdXJjZUtleXNbdHlwZV07XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fZ2V0Q3VzdG9tUmVzb3VyY2VLZXkpIHtcbiAgICAgICAga2V5ID0gdGhpcy5fZ2V0Q3VzdG9tUmVzb3VyY2VLZXkodHlwZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuc2NoZW1hLmdldE1vZGVsKHR5cGUpO1xuICAgICAgICBpZiAobW9kZWw/LmtleXMpIHtcbiAgICAgICAgICBsZXQgYXZhaWxhYmxlS2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsLmtleXMpO1xuICAgICAgICAgIGlmIChhdmFpbGFibGVLZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAga2V5ID0gYXZhaWxhYmxlS2V5c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAga2V5ID0gJ2lkJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhc3NlcnQoXG4gICAgICAgIFwiSlNPTkFQSVJlc291cmNlSWRlbnRpdHlTZXJpYWxpemVyIHJlcXVpcmVzIGEga2V5TWFwIHRvIHN1cHBvcnQgcmVzb3VyY2Uga2V5cyBvdGhlciB0aGFuICdpZCdcIixcbiAgICAgICAga2V5ID09PSAnaWQnIHx8IHRoaXMua2V5TWFwICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX3Jlc291cmNlS2V5c1t0eXBlXSA9IGtleTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBKU09OQVBJUmVzb3VyY2VJZGVudGl0eVNlcmlhbGl6ZXJTZXR0aW5ncykge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlcmlhbGl6ZXJGb3IsXG4gICAgICBkZXNlcmlhbGl6YXRpb25PcHRpb25zLFxuICAgICAgc2NoZW1hLFxuICAgICAga2V5TWFwLFxuICAgICAgZ2V0UmVzb3VyY2VLZXlcbiAgICB9ID0gc2V0dGluZ3M7XG4gICAgc3VwZXIoe1xuICAgICAgc2VyaWFsaXplckZvcixcbiAgICAgIGRlc2VyaWFsaXphdGlvbk9wdGlvbnMsXG4gICAgICBzY2hlbWEsXG4gICAgICBrZXlNYXBcbiAgICB9KTtcbiAgICB0aGlzLl9yZXNvdXJjZUtleXMgPSB7fTtcbiAgICB0aGlzLl9nZXRDdXN0b21SZXNvdXJjZUtleSA9IGdldFJlc291cmNlS2V5O1xuICB9XG5cbiAgc2VyaWFsaXplKHJlY29yZElkZW50aXR5OiBJbml0aWFsaXplZFJlY29yZCk6IFJlc291cmNlIHtcbiAgICBjb25zdCB7IHR5cGUsIGlkIH0gPSByZWNvcmRJZGVudGl0eTtcbiAgICBjb25zdCByZXNvdXJjZUtleSA9IHRoaXMuZ2V0UmVzb3VyY2VLZXkodHlwZSk7XG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gdGhpcy50eXBlU2VyaWFsaXplci5zZXJpYWxpemUodHlwZSkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGtleU1hcCA9IHRoaXMua2V5TWFwIGFzIFJlY29yZEtleU1hcDtcbiAgICBjb25zdCByZXNvdXJjZUlkID1cbiAgICAgIHJlc291cmNlS2V5ID09PSAnaWQnID8gaWQgOiBrZXlNYXAuaWRUb0tleSh0eXBlLCByZXNvdXJjZUtleSwgaWQpO1xuXG4gICAgY29uc3QgcmVzb3VyY2U6IFJlc291cmNlID0ge1xuICAgICAgdHlwZTogcmVzb3VyY2VUeXBlXG4gICAgfTtcblxuICAgIGlmIChyZXNvdXJjZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc291cmNlLmlkID0gcmVzb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBkZXNlcmlhbGl6ZShcbiAgICByZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgY3VzdG9tT3B0aW9ucz86IEpTT05BUElSZXNvdXJjZUlkZW50aXR5RGVzZXJpYWxpemF0aW9uT3B0aW9uc1xuICApOiBJbml0aWFsaXplZFJlY29yZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYnVpbGREZXNlcmlhbGl6YXRpb25PcHRpb25zKGN1c3RvbU9wdGlvbnMpO1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVTZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc291cmNlLnR5cGUpIGFzIHN0cmluZztcbiAgICBjb25zdCByZXNvdXJjZUtleSA9IHRoaXMuZ2V0UmVzb3VyY2VLZXkodHlwZSk7XG5cbiAgICBpZiAocmVzb3VyY2VLZXkgPT09ICdpZCcpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlc291cmNlO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGUsIGlkIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uKGBSZXNvdXJjZSBvZiB0eXBlICcke3R5cGV9JyBpcyBtaXNzaW5nICdpZCdgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5TWFwID0gdGhpcy5rZXlNYXAgYXMgUmVjb3JkS2V5TWFwO1xuICAgICAgY29uc3QgcHJpbWFyeVJlY29yZCA9IG9wdGlvbnM/LnByaW1hcnlSZWNvcmQ7XG4gICAgICBsZXQgaWQ6IHN0cmluZztcbiAgICAgIGxldCBrZXlzOiBEaWN0PHN0cmluZz4gfCBudWxsO1xuXG4gICAgICBpZiAocmVzb3VyY2UuaWQpIHtcbiAgICAgICAga2V5cyA9IHtcbiAgICAgICAgICBbcmVzb3VyY2VLZXldOiByZXNvdXJjZS5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIGlkID1cbiAgICAgICAgICBvcHRpb25zLnByaW1hcnlSZWNvcmQ/LmlkIHx8XG4gICAgICAgICAga2V5TWFwLmlkRnJvbUtleXModHlwZSwga2V5cykgfHxcbiAgICAgICAgICB0aGlzLnNjaGVtYS5nZW5lcmF0ZUlkKHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IG51bGw7XG4gICAgICAgIGlkID1cbiAgICAgICAgICAocHJpbWFyeVJlY29yZCAmJiBwcmltYXJ5UmVjb3JkLmlkKSB8fCB0aGlzLnNjaGVtYS5nZW5lcmF0ZUlkKHR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkID0geyB0eXBlLCBpZCB9O1xuXG4gICAgICBpZiAoa2V5cykge1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlS2V5cykge1xuICAgICAgICAgIHJlY29yZC5rZXlzID0ga2V5cztcbiAgICAgICAgICBrZXlNYXAucHVzaFJlY29yZChyZWNvcmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleU1hcC5wdXNoUmVjb3JkKHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGtleXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cbiAgfVxufVxuIl19