graphql-paper
Version:
A flexible in-memory store based on a GraphQL Schema
119 lines (117 loc) • 6.32 kB
JavaScript
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