miragejs
Version:
A client-side server to help you build, test and demo your JavaScript app
102 lines (86 loc) • 2.8 kB
JavaScript
import Serializer from "../serializer";
import { underscore, dasherize, camelize } from "../utils/inflector";
export default Serializer.extend({
serializeIds: "always",
normalizeIds: true,
keyForModel(type) {
return underscore(type);
},
keyForAttribute(attr) {
return underscore(attr);
},
keyForRelationship(type) {
return this._container.inflector.pluralize(underscore(type));
},
keyForEmbeddedRelationship(attributeName) {
return underscore(attributeName);
},
keyForRelationshipIds(type) {
return `${underscore(this._container.inflector.singularize(type))}_ids`;
},
keyForForeignKey(relationshipName) {
return `${underscore(relationshipName)}_id`;
},
keyForPolymorphicForeignKeyId(relationshipName) {
return `${underscore(relationshipName)}_id`;
},
keyForPolymorphicForeignKeyType(relationshipName) {
return `${underscore(relationshipName)}_type`;
},
normalize(payload) {
let type = Object.keys(payload)[0];
let attrs = payload[type];
let modelName = camelize(type);
let modelClass = this.schema.modelClassFor(modelName);
let { belongsToAssociations, hasManyAssociations } = modelClass;
let belongsToKeys = Object.keys(belongsToAssociations);
let hasManyKeys = Object.keys(hasManyAssociations);
let jsonApiPayload = {
data: {
type: this._container.inflector.pluralize(type),
attributes: {}
}
};
if (attrs.id) {
jsonApiPayload.data.id = attrs.id;
}
let relationships = {};
Object.keys(attrs).forEach(key => {
if (key !== "id") {
if (this.normalizeIds) {
if (belongsToKeys.includes(key)) {
let association = belongsToAssociations[key];
let associationModel = association.modelName;
relationships[dasherize(key)] = {
data: {
type: associationModel,
id: attrs[key]
}
};
} else if (hasManyKeys.includes(key)) {
let association = hasManyAssociations[key];
let associationModel = association.modelName;
let data = attrs[key].map(id => {
return {
type: associationModel,
id
};
});
relationships[dasherize(key)] = { data };
} else {
jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];
}
} else {
jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];
}
}
});
if (Object.keys(relationships).length) {
jsonApiPayload.data.relationships = relationships;
}
return jsonApiPayload;
},
getCoalescedIds(request) {
return request.queryParams && request.queryParams.ids;
}
});