graphql-paper
Version:
A flexible in-memory store based on a GraphQL Schema
86 lines (84 loc) • 2.8 kB
JavaScript
;
var allDocuments = require('../store/all-documents.js');
var findDocument = require('../store/find-document.js');
var getDocumentKey = require('../document/get-document-key.js');
var create = require('./create.js');
var remove = require('./remove.js');
var justDiff = require('just-diff');
var modifyDocument = require('./modify-document.js');
function extractChanges(current, previous) {
const currentKeys = allDocuments.allDocuments(current).map(document => getDocumentKey.getDocumentKey(document));
const previousKeys = allDocuments.allDocuments(previous).map(document => getDocumentKey.getDocumentKey(document));
const created = currentKeys.filter(key => !previousKeys.includes(key));
const removed = previousKeys.filter(key => !currentKeys.includes(key));
const existing = currentKeys.filter(key => !created.includes(key));
const modifiedDocuments = existing
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
.map(key => ({
current: findDocument.findDocument(current, key),
previous: findDocument.findDocument(previous, key)
})).map(({
current,
previous
}) => {
const differences = justDiff.diff(current, previous);
const changes = differences.reduce((documentChange, {
path
}) => {
const [property] = path;
documentChange[property] = {
propertyName: property.toString(),
value: current[property],
previousValue: previous[property]
};
return documentChange;
}, {});
const hasChanges = Object.keys(changes).length > 0;
return hasChanges ? {
document: current,
changes
} : undefined;
}).filter(Boolean);
const createdDocuments = created.map(key => ({
document: findDocument.findDocument(current, key)
}));
const removedDocuments = removed.map(key => ({
document: findDocument.findDocument(previous, key)
}));
return {
createdDocuments: createdDocuments,
removedDocuments,
modifiedDocuments
};
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function createStoreEvents(previous, store) {
const {
createdDocuments,
removedDocuments,
modifiedDocuments
} = extractChanges(store, previous);
const createdEvents = createdDocuments.map(({
document
}) => new create.CreateEvent({
document,
store
}));
const modifiedEvents = modifiedDocuments.map(({
changes,
document
}) => new modifyDocument.ModifyEvent({
document,
store,
changes
}));
const removedEvents = removedDocuments.map(({
document
}) => new remove.RemoveEvent({
document,
store
}));
return [...createdEvents, ...modifiedEvents, ...removedEvents];
}
exports.createStoreEvents = createStoreEvents;
//# sourceMappingURL=dispatch.js.map