UNPKG

graphql-paper

Version:

A flexible in-memory store based on a GraphQL Schema

119 lines (117 loc) 6.32 kB
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import { setAutoFreeze, setUseStrictShallowCopy, createDraft, finishDraft } from 'immer'; import { createStoreEvents } from './events/dispatch.mjs'; import * as index from './operations/index.mjs'; import { transaction } from './transaction/transaction.mjs'; import { createDocumentStore } from './store/create-document-store.mjs'; import { findDocument } from './store/find-document.mjs'; import { proxyWrap } from './store/proxy-wrap.mjs'; import { documentPropertyExistsAsFieldOnTypeValidator } from './validations/validators/document-property-exists-as-field-on-type.mjs'; import { captureTransactionResultKeys } from './transaction/capture-transaction-result-keys.mjs'; import { convertResultKeysToDocument } from './transaction/convert-result-keys-to-document.mjs'; import { createSchema } from './graphql/create-schema.mjs'; import { listFieldValidator } from './validations/validators/list-field.mjs'; import 'graphql'; import { nullDocument } from './document/null-document.mjs'; import { objectFieldValidator } from './validations/validators/object-field.mjs'; import { scalarFieldValidator } from './validations/validators/scalar-field.mjs'; import { uniqueIdFieldValidator } from './validations/validators/unique-id.mjs'; import { serialize } from './serialization-deserialization/serialize-store.mjs'; import { getDocumentKey } from './document/get-document-key.mjs'; import './document/generate-document-key.mjs'; import { deserialize } from './serialization-deserialization/deserialize-store.mjs'; import { validateStore } from './validations/validate-store.mjs'; import { assertValidSerializedPaper } from './serialization-deserialization/is-serialized-paper.mjs'; // Auto Freezing needs to be disabled because it interfers with using // of using js a `Proxy` on the resulting data, see: // > 18.5.5.7 Example: non-writable non-configurable target properties // > must be represented faithfully // > https://exploringjs.com/deep-js/ch_proxies.html setAutoFreeze(false); // Paper `Document` objects uses getters and non-enumerables, in order // to preserve this in immer >= 10 `setUseStrictShallowCopy(true)` is // required setUseStrictShallowCopy(true); class Paper { static deserialize(graphqlSchema, serializedPaper, options) { assertValidSerializedPaper(serializedPaper); var paper = new Paper(graphqlSchema, options); // eslint-disable-next-line @typescript-eslint/no-explicit-any paper.current = deserialize(serializedPaper.store, serializedPaper.__meta__); paper.validate(); return paper; } constructor(graphqlSchema, options) { _defineProperty(this, "history", []); _defineProperty(this, "current", void 0); _defineProperty(this, "sourceGraphQLSchema", void 0); _defineProperty(this, "operations", void 0); _defineProperty(this, "events", new EventTarget()); _defineProperty(this, "validators", { document: [documentPropertyExistsAsFieldOnTypeValidator], field: [listFieldValidator, objectFieldValidator, scalarFieldValidator, uniqueIdFieldValidator] }); _defineProperty(this, "hooks", { beforeTransaction: [], afterTransaction: [] }); var schema = createSchema(graphqlSchema); this.current = createDocumentStore(schema); this.sourceGraphQLSchema = schema; this.operations = _objectSpread(_objectSpread({}, options === null || options === void 0 ? void 0 : options.operations), index); // validate that anything that was deserialized is actually valid this.validate(); } get data() { return proxyWrap(this.sourceGraphQLSchema, this.current); } find(documentOrKey) { return findDocument(this.data, documentOrKey); } clear() { this.current = createDocumentStore(this.sourceGraphQLSchema); this.history = []; } serialize() { return { store: serialize(this.current), __meta__: { NULL_DOCUMENT_KEY: getDocumentKey(nullDocument) } }; } validate(_store) { var store = _store !== null && _store !== void 0 ? _store : this.current; validateStore(this.sourceGraphQLSchema, store, this.validators); } dispatchEvents(events) { var eventsTarget = this.events; events.forEach(event => eventsTarget.dispatchEvent(event)); } mutate(fn) { var schema = this.sourceGraphQLSchema; var current = this.current; var hooks = this.hooks; var operations = this.operations; var draft = createDraft(current); var { transactionResult, eventQueue: customEvents } = transaction(draft, schema, operations, hooks, fn); var resultKeys = captureTransactionResultKeys(transactionResult); var next = finishDraft(draft); this.validate(next); var storeEvents = createStoreEvents(current, next); this.dispatchEvents([...storeEvents, ...customEvents]); this.current = next; this.history.push(next); var mutateResult = convertResultKeysToDocument(schema, next, resultKeys); return mutateResult; } } export { Paper }; //# sourceMappingURL=paper.mjs.map