UNPKG

@prodo/core

Version:

Core package for [Prodo](https://prodo.dev). See [documentation](https://docs.prodo.dev) for more info.

211 lines 9.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); var immer_1 = require("immer"); var cloneDeep = require("lodash.clonedeep"); var React = require("react"); var _1 = require("."); var events_1 = require("./events"); var utils_1 = require("./utils"); var initPlugins = function (universe, config, plugins, store) { return immer_1.default(universe, function (u) { plugins.forEach(function (p) { if (p._internals.init != null) { p._internals.init(config, u, { dispatch: function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return store.createDispatch(p.name).apply(void 0, args); }, exposedUniverseVars: store.exposedUniverseVars, }); } }); }); }; var createProvider = function (store, plugins) { return plugins.reduce(function (next, plugin) { return plugin._internals.Provider ? function (_a) { var children = _a.children; return React.createElement(plugin._internals.Provider, { children: React.createElement(next, { children: children }), }); } : next; }, (function (_a) { var children = _a.children; return React.createElement(_1.ProdoProvider, { value: store, children: children, }); })); }; exports.createStore = function (config, plugins) { var initStore = { createDispatch: function () { return function () { throw new Error("Cannot use the store until all plugins have finished initialising."); }; }, exposedUniverseVars: plugins.reduce(function (acc, plugin) { return acc.concat(plugin._internals.exposedUniverseVars || []); }, []), }; var universe = initPlugins({ state: config.initState }, config, plugins, initStore); var watchTree = { subs: new Set(), esubs: new Set(), children: {}, }; var store = { config: config, history: [], universe: universe, watchTree: watchTree, trackHistory: true, plugins: plugins, exec: null, dispatch: null, }; var createRootDispatch = function (name) { return function (func) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return store.exec.apply(store, __spreadArrays([{ id: name, parentId: null }, func], args)); }; }; }; store.exec = function (origin, func) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } var event = events_1.startEvent(store, func.__name || "(unnamed)", func.__pluginName || "(user)", args, origin); utils_1.syncIfPossible(function () { return immer_1.default(store.universe, function (u) { var ctx = { state: u.state, dispatch: function (func) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } event.nextActions.push({ func: func, name: func.__name || "(unnamed)", args: args.map(function (arg) { return (immer_1.isDraft(arg) ? cloneDeep(arg) : arg); }), origin: { parentId: event.id, id: event.id + "/" + event.nextActions.length, }, }); }; }, }; plugins.forEach(function (p) { if (p._internals.actionCtx) { ctx.rootDispatch = createRootDispatch(p.name); p._internals.actionCtx({ ctx: ctx, universe: u, event: event, }, config); } }); return utils_1.syncIfPossible(function () { return func(ctx).apply(void 0, args); }, // tslint:disable-next-line:no-empty function () { })(); }, function (p) { event.patches = p; }); }, function () { events_1.completeEvent(event, store); plugins.forEach(function (p) { if (p._internals.onCompleteEvent) { p._internals.onCompleteEvent({ event: event, rootDispatch: createRootDispatch(p.name) }, config); } }); })(); }; store.dispatch = function (func) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return __awaiter(void 0, void 0, void 0, function () { var actionsCompleted; return __generator(this, function (_a) { switch (_a.label) { case 0: actionsCompleted = new Promise(function (r) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { store.watchForComplete = { count: 1, cb: r, }; return [2 /*return*/]; }); }); }); return [4 /*yield*/, store.exec.apply(store, __spreadArrays([{ id: "dispatch", parentId: null, }, func], args))]; case 1: _a.sent(); return [4 /*yield*/, actionsCompleted]; case 2: _a.sent(); store.watchForComplete = undefined; return [2 /*return*/, store.universe]; } }); }); }; }; initStore.createDispatch = createRootDispatch; var Provider = createProvider(store, plugins); return { store: store, Provider: Provider, }; }; //# sourceMappingURL=store.js.map