UNPKG

respond-framework

Version:
84 lines (83 loc) 2.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.createModel = void 0; var _modelClient = require("./model.client.js"); var _findClosestAncestorWith = require("../createModule/helpers/findClosestAncestorWith.js"); var _createSharedModels = require("./helpers/createSharedModels.js"); var _deterministicCounter = require("../helpers/deterministicCounter.js"); const createModels = ({ respond, mod, proto, parent, branch: branchRelative }) => { let { models } = mod; if (!models) { if (parent.models) return respond.models = proto.models = parent.models; mod = (0, _findClosestAncestorWith.default)('db', branchRelative, respond); // note: having a db defines the inherited ancestor when focusing a branch; therefore it's a requirement that models be paired with a db models = mod.models ?? {}; } models = (0, _createSharedModels.default)(models); const branch = mod.branchAbsolute; const { db } = respond; const extra = Object.defineProperties({}, { db: { enumerable: false, configurable: true, value: db }, replays: { enumerable: false, configurable: true, get: () => respond.replays } // respond.replays won't be defined until later by createReplays }); const prevModels = window.state?.respond?.modelsByBranchType ?? {}; const nextModels = {}; for (const k in models) { const key = branch + '_' + k; const prevModel = prevModels[key]; const Model = createModel(k, _modelClient.default, models[k], extra, prevModel); Model.create = doc => new Model(doc, true, key); Model.make = doc => new Model(doc, false, key); nextModels[k] = Model; respond.modelsByBranchType[key] = Model; } return respond.models = proto.models = nextModels; }; var _default = exports.default = createModels; const createModel = (k, mixin, methods, extra, Model) => { const base = { _name: k, _namePlural: k + 's' }; const descriptors = Object.assign(g(base), methods, g(extra)); Model ??= function Model(doc, genId = true, branchType) { if (doc) Object.defineProperties(this, g(doc)); // unlike Object.assign, this will allow assignment of instance properties of the same name as prototype getters without error if (branchType) this.__branchType = branchType; if (genId) this.id ??= (0, _deterministicCounter.generateId)(); this.__type = k; this.construct?.(); }; Object.defineProperty(Model, 'name', { value: k }); const Parent = createParent(mixin); Model.prototype = new Parent(); Object.defineProperties(Model.prototype, descriptors); return Model; }; exports.createModel = createModel; const g = obj => obj && Object.getOwnPropertyDescriptors(obj); const createParent = mixin => { function Model() {} Object.defineProperties(Model.prototype, g(mixin)); return Model; };