UNPKG

graphql-paper

Version:

A flexible in-memory store based on a GraphQL Schema

86 lines (84 loc) 2.8 kB
'use strict'; 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